prettyprint

2022年6月23日 星期四

在Raspberry Pi 3B+安裝FreeBSD 13.1 並實作WiFi Client/Access Point/Wireless Router等功能

     本實驗在Raspberry Pi 3B+硬體上安裝FreeeBSD 13.1系統,用來實現並測試當作WiFi Client 、 Access Point(AP)與Wireless Router的功能,三種模式如下圖所示:




因為FreeBSD尚未支援Raspberry Pi內建無線網卡的Driver,所以本次實驗以外加一片usb網卡(TP-Link TL-WN725N)來測試。

👉安裝FreeBSD 13.1系統在Raspberry Pi 3B+上

從FreeBSD官網下載image檔案:FreeBSD-13.1-RELEASE-arm64-aarch64-RPI.img.xz

下載Raspberry Pi Imager(https://downloads.raspberrypi.org/imager/imager_latest.exe)燒錄FreeBSD image到SD(註1)上,過程可參閱文末成果影片連結。

FreeBSD使用Raspberry Pi硬體,螢幕輸出的介面有兩種: primary為TTL Serial, Secondary 為Vodeo(HDMI介面),本實驗使用USB-UART介面接到筆電的USB上,開啟PuTTY Serial Port,如下圖,Raspberry Pi pinout可參閱https://pinout.xyz/。[RPI: Gnd(6), TX(8), RX(10)]

  • 系統root內定的password為root

本實驗使用的TP-Link TL-WN725N在FreeBSD下的driver 為rtwn,使用指令dmesg查閱,如下圖所示:

但使用內定參數實測後,網路存取速度異常慢,調整設定,載入kdlload wlan_amrr模組或設定dev.rtwn.0.ratectl=0,即可獲得良好的網路存取速度,可在/boot/loader.conf設定如下:
dev.rtwn.0.ratectl=0
wlan_amrr_load="YES"


👉設定成為WiFi Client使用:

  • 在/etc/rc.conf設定
wlans_rtwn0="wlan0"
ifconfig_wlan0="WPA SYNCDHCP"
create_args_wlan0="country TW"

  • 增設/etc/wpa_supplicant.conf檔案,內容填入
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
        ssid="your ssid"
scan_ssid=1
key_mgmt=WPA-PSK
psk="your passwd"
}
更改正確的ssid與psk
重新啟用系統後即可連至WiFi網路


👉設定成為Access Point(Bridge)使用:
Raspberry Pi wifi介面改成hostap mode,再將有線網路介面ue0與無線網路介面wlan0,加入到bridge members中。如上圖,終端無線設備(手機、筆電等)連到 Raspberry Pi AP後,即可將無線網路橋接到ISP Router連到Internet。終端無線設備屬於同一個網段,本實驗的例子為192.168.1.0/24。
  • 在/etc/rc.conf設定如下
#WLAN hostap mode
wlans_rtwn0="wlan0"
create_args_wlan0="wlanmode hostap -apbridge country TW"
hostapd_enable="YES"
# create a bridge
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.1.61/24 addm ue0 addm wlan0 up"
ifconfig_ue0="up"
ifconfig_wlan0="up"
#enable geteway(net.inet.ip.forwarding)
gateway_enable="YES"

  • 在/etc/hostapd.conf下設定如下
interface=wlan0
debug=1
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=myAP_SSID                       #==>改成你的SSID
wpa=2
wpa_passphrase=PassW0rd      #==>改成你的passphrase
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP

重新啟用系統Raspberry Pi即成為無線網路的Access Point。
但在系統重新啟動後,並無法正常使用,bridge0並未將ue0與wlan0加入bridge0的members中。
以dmesg查看driver啟用順序,發現bridge0先啟用後,ue0與wlan0再啟用,推測因此bridge0才無法把加入ue0與wlan0正確加入到bridge0的members中。
以netstat -r 查看 route table並未正確產生

因此把bridge0建立時間延後到啟用local daemon時,再來create bridge並加入ue0與wlan0到members中,步驟如下:
  1. 取消/etc/rc.conf中的下面兩行
    cloned_interfaces="bridge0"
    ifconfig_bridge0="inet 192.168.1.61/24 addm ue0 addm wlan0 up"
  2. 在/etc/rc.local加入
    #!/bin/sh
    br=`ifconfig bridge create`
    ifconfig $br addm ue0 addm wlan0
    dhclient $br
修改後重啟系統即可正常使用AP功能了。

👉設定成為Wireless Router使用:
設定為router模式時,WiFi與有線LAN分別屬於不同網段,因此Raspberry Pi須具備路由器功能。如上圖所示,有線的LAN連接ISP Router為192.168.1.0/24,無線網路為10.10.200.0/24,Raspberry Pi Router無線網路介面設定IP為10.10.200.1。所以Raspberry Pi上需增加NAT(Firewall)、DHCP server與DNS server等功能(DNS server為選項)。
設定步驟如下:

➤DHCP Server使用isc-dhcp時:

執行指令
pkg install -y isc-dhcp44-server
加入hdcp server功能,啟用方式

  1. 在/etc/rc.conf中加入
    dhcpd_enable="YES"
    dhcpd_flags="-q"
    dhcpd_conf="/usr/local/etc/dhcpd.conf"
    dhcpd_ifaces="wlan0"
    dhcpd_withumask="022"
  2. 在/usr/local/etc/dhcpd.conf中加入
    option domain-name "mytest.org";
    default-lease-time 60;
    max-lease-time 72;
    # A slightly different configuration for an internal subnet.
     subnet 10.10.200.0 netmask 255.255.255.0 {
            range 10.10.200.10 10.10.200.20;
            option domain-name-servers 192.168.1.1;
            option routers 10.10.200.1;
            default-lease-time 600;
            max-lease-time 7200;
    }

➤DHCP Server使用dnsmasq時:

執行指令
pkg install -y dnsmasq
  1. 在/etc/rc.conf中加入
    dnsmasq_enable="YES"
  2. 在/usr/local/etc/dnsmasq.conf中加入
    interface=wlan0
    dhcp-range=10.10.200.90,10.10.200.100,255.255.255.0,24h

➤啟用Firewall(NAT)與hostap等功能:

本實驗使用IPFW與IN-Kernel NAT
  • 在/etc/rc.conf設定如下(使用dnsmasq)
ifconfig_ue0="DHCP"
#WLAN WiFi hostap
wlans_rtwn0="wlan0"
create_args_wlan0="wlanmode hostap -apbridge country TW"
ifconfig_wlan0="inet 10.10.200.1 netmask 255.255.255.0"
hostapd_enable="YES"

ifconfig_ue0="up"
ifconfig_wlan0="up"

#Filrewall and NAT enable
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_script="/etc/ipfw.rules"
gateway_enable="YES"

dnsmasq_enable="YES"

  • 在/etc/ipfw.rules下設定如下:

ipfw -q -f flush
cmd="ipfw -q add"
skip="skipto 1000"
pif=ue0
wif=wlan0
ks="keep-state"
good_tcpo="22,25,37,53,80,443,110"
ipfw disable one_pass
ipfw -q nat 1 config if $pif same_ports unreg_only reset
$cmd 005 allow all from any to any via $wif
$cmd 010 allow all from any to any via lo0 # exclude loopback traffic
$cmd 099 reass all from any to any in # reassemble inbound packets
$cmd 100 nat 1 ip from any to any in via $pif # NAT any inbound packets
# Allow the packet through if it has an existing entry in the dynamic rules table
$cmd 101 check-state
# Authorized outbound packets
$cmd 200 $skip tcp from any to any $good_tcpo out via $pif setup $ks
$cmd 210 $skip udp from any to any 53 out via $pif $ks
$cmd 220 $skip icmp from any to any out via $pif $ks
# allow all outbound
$cmd 230 $skip tcp from any to any out via $pif setup $ks
#Authorized inbound packets
$cmd 500 allow icmp from any to me via $pif
$cmd 501 allow tcp from any to me 22 via $pif setup $ks
# otherwise deny
$cmd 999 deny log all from any to any
$cmd 1000 nat 1 ip from any to any out via $pif # skipto location for outbound stateful rules
$cmd 1001 allow ip from any to any

詳細過程可觀看下列影片:




註1:

本次實驗使用不同SD卡安裝系統,若讀者發現系統DISK IO異常,也許可換不同廠牌SD卡試試看。


沒有留言:

張貼留言