prettyprint

2022年9月2日 星期五

Step by step to build a PPPoE DualStack(IPv6 & IPv4)Wi-Fi Router with FreeBSD 13.1

本文介紹使用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功能。
  1.  /etc/rc.conf的設定:
    ppp_nat="YES",可不設定,內定是開啟的。

  2. /etc/ppp/ppp.confg設定:
    ipcp與ipv6cp預設是開啟的,因此無須再額外指定,更改authname與authkey內容,
    set device PPPoE:em0,em0是連接ISP的網路介面名稱。

  3. /etc/ppp/ppp.linkup設定:
    此設定檔的目的是針對IPv6使用的,若僅是使用IPv4時無須設定此檔案內容。此設定檔的目的在Wi-Fi IPv6時再做說明。
  4. 在/etc/rc.conf增加:
    ipv6_activate_all_interfaces="YES"

    讓所有網路介面啟用IPv6功能。
  5. 重新啟動後,新增tun0已具有IPv4 nat功能,並透過ISP的IPv6 Router Advertisement(RA) 取得IPv6 address。

二、WiFi hostap設定:

  1. 查詢Wi-Fi介面driver是否具有hostap功能:
    檢查iwlwifi0與rtwn0兩個wifi介面,iwlwifi0不具有hostap功能。
  2. 在/etc/rc.conf中設定:
  3. 在/etc/hostap.conf設定ssid, key等:

  4. 使用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。

  5. /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:

  1. 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
  2. 安裝dhcpv6 client:
    # pkg install dhcp6
    安裝KAME DHCP6 client。
  3. /usr/local/etc/dhcp6c.conf設定內容:
  4. 在/etc/rc.conf設定啟用:
    紅框框內為啟用dhcp ipv6 client,黃框框為啟用ip forwarding,綠色框框為啟用ipfw firewall,若啟用firewall則需注意放行dhcp ipv6 udp port與ipv6-icmp ra,rs, na,ns的type。

  5. 重啟動後將會發現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

  1. ipv6-icmp types: RS(133), RA(134), NS(135), NA(136)
  2. ipv6 dhcp udp ports:  546, 547

五、Wi-Fi clients測試:

  1. android phone:

       

  2. iPhone:

       



  3. Windows:


六、完整設定檔:

  1. /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"


  2. /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


  3. /etc/ppp/ppp.linkup
    myISP:
    ! sh -c "/usr/sbin/service dhcp6c restart"


  4. /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


  5. /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;
     };
    };


  6. /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


七、相關影片連結:



沒有留言:

張貼留言