本文介紹使用FreeBSD建構一個透過PPPoE連線ISP,具有IPv6與IPv4的Wi-Fi Router。架構如下圖所示:
FreeBSD有一張有線網卡連接ISP,無線網卡設成hostap模式,讓client連線。並同時具有IPv6與IPv4模式。
一、PPPoE連線設定:
使用FreeBSD內定的ppp程式連線,設定擋在/etc/ppp/ppp.conf 、 /etc/ppp/ppp.linkup和/etc/ppp/ppp.linkdown。ppp提供IPv4 nat功能,所以無須在防火牆開啟nat功能。
- /etc/rc.conf的設定:
ppp_nat="YES",可不設定,內定是開啟的。 - /etc/ppp/ppp.confg設定:
- 在/etc/rc.conf增加:
ipv6_activate_all_interfaces="YES"
讓所有網路介面啟用IPv6功能。
二、WiFi hostap設定:
- 查詢Wi-Fi介面driver是否具有hostap功能:
檢查iwlwifi0與rtwn0兩個wifi介面,iwlwifi0不具有hostap功能。 - 在/etc/rc.conf中設定:
- 在/etc/hostap.conf設定ssid, key等:
- 使用dnsmasq作為Wi-Fi client的DNS, DHCP:
# pkg install dnsmasq
安裝dnsmasq package,dnsmasq可用來作為dns, IPv6 & IPv4 DHCP與Router Advertisement(RA),因此不用啟用FreeBSD內建的rtadvd的RA功能。
在/etc/rc.conf中設定
dnsmasq_enable="YES"
啟用dnsmasq。 - /usr/local/etc/dnsmasq.conf設定內容:
enable-ra: 在wlan0啟用IPv6 RA功能,因此不用啟用rtadvd。
dhcp-range:分別為IPv4 range與IPv6 使用網路prefix自動建立IPv6 address。
三、使用DHCP-PD取得Wi-Fi端的IPv6 prefix delegation:
- wlan0介面無法直接透夠RS(router solicitation)向ISP取得IPv6 prefix,因此使用dhcp-pd透過tun0取得prefix delegation(PD),再自動設定wlan0的IPv6 address。然後在wlan0上執行RA(dnsmasq 的RA功能),則Wi-Fi Client連上AP時就可自動取得IPv6 Address
- 安裝dhcpv6 client:
# pkg install dhcp6
安裝KAME DHCP6 client。 - /usr/local/etc/dhcp6c.conf設定內容:
- 在/etc/rc.conf設定啟用:
紅框框內為啟用dhcp ipv6 client,黃框框為啟用ip forwarding,綠色框框為啟用ipfw firewall,若啟用firewall則需注意放行dhcp ipv6 udp port與ipv6-icmp ra,rs, na,ns的type。 - 重啟動後將會發現wlan0無法取得IPv6 address。因此所有Wi-Fi Clients無法使用IPv6。因為系統啟動後執行dhcp6c(dhcp6c_enable="YES")要取得wlan0 的PD時,有可能tun0尚未自ISP透過RA取得IPv6 address, 因此執行dhcp6c失敗。所以在/etc/ppp/ppp.linkup 設定當tun0 link正常啟用後restart dhcp6c service,透過DHCP-PD取得IPv6 prefix delegation。
四、firewall要放行的ports
- ipv6-icmp types: RS(133), RA(134), NS(135), NA(136)
- ipv6 dhcp udp ports: 546, 547
五、Wi-Fi clients測試:
- /etc/rc.conf
#=== PPPoE ===
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="myISP"
#==== ipv6 dhcp client ===
dhcp6c_enable="YES"
dhcp6c_interfaces="tun0"
ipv6_activate_all_interfaces="YES"
#=== Firewall ====
firewall_enable="YES"
firewall_script="/etc/ipfw.rules"
firewall_logging="YES"
gateway_enable="YES"
ipv6_gateway_enable="YES"
#=== WiFi hostap===
wlans_rtwn0="wlan0"
create_args_wlan0="wlanmode hostap"
ifconfig_wlan0="inet 192.168.2.1 netmask 255.255.255.0"
hostapd_enable="YES"
dnsmasq_enable="YES" - /etc/ppp/ppp.conf
default:
set log Phase tun IPV6CP command
set timeout 180 # 3 minute idle timer (the default)
#=== myISP PPPoE
myISP:
set device PPPoE:em0 #em0 is your interface connected to ISP
set authname your_ISP_authname
set authkey your_ISP_authkey
set dial
set login
set mru 1492
set mtu 1492
delete ALL
resolv reload
enable dns
add! default HISADDR # Add a (sticky) default route
add! default HISADDR6 - /etc/ppp/ppp.linkup
myISP:
! sh -c "/usr/sbin/service dhcp6c restart"
- /etc/hostapd.conf
interface=wlan0
debug=1
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=myAP_SSID
wpa_passphrase=passw0rd
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
- /usr/local/etc/dhcp6c.conf
interface tun0 {
send ia-pd 0;
send rapid-commit;
request domain-name-servers;
};
id-assoc pd 0 {
# prefix ::/64 1800;
prefix-interface wlan0 {
sla-id 0;
sla-len 0;
};
};
- /usr/local/etc/dnsmasq.conf
interface=wlan0
dhcp-range=192.168.2.100,192.168.2.200,255.255.255.0,12h
dhcp-range=::,constructor:wlan0,ra-only,12h
enable-ra
七、相關影片連結:
沒有留言:
張貼留言