安裝kmod-tun for run tun0
opkg install kmod-tun
安裝coovachilli for captive portal
opkg install coova-chilli
harserl安裝 用來簡化cgi網關使用
opkg install haserl #for /etc/chilli/wwwsh
chilli重要文件
/etc/init.d/chilli
ifconfig $HS_LANIF 0.0.0.0
他會把br-lan的ip設成0.0.0.0,這行要拿掉,否則你起chilli的時候ethernet 就都不通了
/etc/chilli中
- defaults 默認參數,若無conf則找他定義參數
- main.conf 主配置文件,自動用定意參數產生,from ./function
- hs.conf 認證服務配置文件,自動用定意參數產生,from ./function
- local.conf 可以手動配置的任何其他設置
- www 認證網站
- wwwsh cgi網關腳本
- up.sh 網路接口啟動腳本,run iptables
- down.sh 網路接口關閉腳本,close iptables
- ipup.sh ,自定義開起chilli執行的iptable
- ipdown.sh ,自定義關閉chilli執行的iptable
chilli start
./config 讀取參數 || ./defaults 讀取參數
./function 配置參數,將參數轉換到下面三個檔案中
啟用tun0
chilli 執行順序
include main.conf
include hs.conf
include local.conf
./up.sh 啟動後,執行,chilli iptable work
./down.sh #chilli stop,執行,delete chilli iptable
chilli 幾個要點
- HS_LAN = wlan0,HS_WAN= < wan interface >
- 確定router能夠出wan, dns要通
- 通了以後再帶chilli
- 要接對 redirect 的AAA server 的網址包含chilli內部的變數都要填對才能轉向,chilli一開起就會跟AAA溝通
- 起chilli 以後 ifconfig 會有tun0 的介面
* 建議 先找free hotspot(AAA 管理平台,EX:http://www.worldspot.net/ ,來測試本身chiilli 是否可以通)
iptable部份
chilli 本身是靠iptables rule 來導到tun0,tun0開啟後執行在up.sh,注意iptable -I 與-A差別,順序很重要
- if $KNAME,預設是string no,若有定義此參數可以使用coova kernel module,用HS_KNAME參數設定
coova match options :
* --name name : Name of the table to be used. 'chilli' used if none given.
* --source : Indicates the source direction (lookup by source MAC/IP)
* --dest : Indicates the reply (lookup by dest address)
$KNAME 有定義則允許FORWARD從wlan0介面進來符合定義的table通過,允許FORWARD從wlan0介面出去符合定義table的回復通過,允許進出tun0介面的FORWARD通過
-I FORWARD -i wlan0 -m coova --name $KNAME -j ACCEPT
-I FORWARD -o wlan0 -m coova --name $KNAME --dest -j ACCEPT
-I FORWARD -i tun0 -j ACCEPT
-I FORWARD -o tun0 -j ACCEPT
- $HS_LAYER3 = "on" 則 "$LAYER3" == "1";預設"$LAYER3" != "1",if "$LAYER3" != "1"
layer2會做的事 :
HS_UAMPORT=3990 # HotSpot UAM Port (on subscriber network)
HS_UAMUIPORT=4990 # HotSpot UAM "UI" Port (on subscriber network, for embedded portal)
HS_UAMPORT存在 :
-I INPUT -d 10.1.0.1/32 -i tun0 -p tcp -m tcp --dport 3990 -j ACCEPT
HS_UAMUIPORT存在 :
-I INPUT -d 10.1.0.1/32 -i tun0 -p tcp -m tcp --dport 4990 -j ACCEPT
HS_TCP_PORT定義允許TCP port通過 :
-I INPUT -d 10.1.0.1/32 -i tun0 -p tcp -m tcp --dport 80 -j ACCEPT
允許從tun0介面進入要到10.1.0.1/32的icmp封包通過
-I INPUT -d 10.1.0.1/32 -i tun0 -p icmp -j ACCEPT
DNS查詢是利用UDP 53 port,允許從tun0介面進入要到10.1.0.1/32的udp封包port53通過
-I INPUT -d 10.1.0.1/32 -i tun0 -p udp -m udp --dport 53 -j ACCEPT
DHCP ARP protocol port 67:68,用來解析MAC地址,允許從tun0介面進入要到10.1.0.1/32的udp封包port67:68通過
-I INPUT -d 10.1.0.1/32 -i tun0 -p udp -m udp --dport 67:68 -j ACCEPT
允許從tun0介面進入要到255.255.255.255/32的udp封包port67:68通過
-I INPUT -d 255.255.255.255/32 -i tun0 -p udp -m udp --dport 67:68 -j ACCEPT
除了前面通過的,其餘從tun0介面進入要到10.1.0.1/32丟棄
-A INPUT -d 10.1.0.1/32 -i tun0 -j DROP
"$ONLY8021Q" != "1",從wlan0進來的drop
-I INPUT -i wlan0 -j DROP
if "$ONLY8021Q" != "1"
-I FORWARD -i wlan0 -j DROP -I FORWARD -o wlan0 -j DROP
-I FORWARD -i tun0 -j ACCEPT
-I FORWARD -o tun0 -j ACCEPTHelp out MTU issues with PPPoE or Mesh
為了達到最佳的傳輸效能,TCP在建立連接時會協商MSS值,取最小的MSS值為本次連接的最大MSS值,Iptables下TCPMSS模組即用来调整TCP封包中MSS数值
--clamp-mss-to-pmtu : 根據MTU自動調整MSS-I FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu -I FORWARD -t mangle -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
if "$HS_LAN_ACCESS" != "on" -a "$HS_LAN_ACCESS" != "allow"
tun0到非eth0.2的FORWARD DROP -I FORWARD -i tun0 ! -o eth0.2 -j DROP
-I FORWARD -i tun0 -o eth0.2 -j ACCEPT
if "$HS_LOCAL_DNS" = "on"
若使用自定DNS,從tun0進入的udp封包port53,將目的位置改成本地位置 -I PREROUTING -t nat -i tun0 -p udp --dport 53 -j DNAT --to-destination 10.1.0.1/32
ipup.sh存在,就去執行自定義的ipup.sh
chilli做的事
- chilli啟動後會叫起tun0
- iptable 將wlan0收到的轉到tun0,不在tun0上的drop
- 允許tun0中開放的port通過,其餘drop
iptables-save
確保eth0.2出去前轉址
*nat
-A POSTROUTING -o eth0.2 -j MASQUERADE
避免封包過大,根據MTU自動調整MSS
*mangle
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
*filter
-A INPUT -i wlan0 -j DROP
-A INPUT -d 10.1.0.1/32 -i tun0 -p icmp -j ACCEPT
-A INPUT -d 10.1.0.1/32 -i tun0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -d 10.1.0.1/32 -i tun0 -p udp -m udp --dport 67:68 -j ACCEPT
-A INPUT -d 255.255.255.255/32 -i tun0 -p udp -m udp --dport 67:68 -j ACCEPT
-A INPUT -d 10.1.0.1/32 -i tun0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -d 10.1.0.1/32 -i tun0 -j DROP
-A FORWARD -i tun0 -o eth0.2 -j ACCEPT
-A FORWARD -i tun0 ! -o eth0.2 -j DROP
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -o tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -o wlan0 -j DROP
-A FORWARD -i wlan0 -j DROP
chilli stop 執行down.sh
down.sh執行/var/run/chilli.tun0.sh,此檔案在up.sh裡面每新增一筆iptable規則,就在/var/run/chilli.tun0.sh寫入刪除該筆iptable規則,執行完/var/run/chilli.tun0.sh刪除該檔案,並去執行ipdown.sh(如果有存在)
Debug
chilli --fg --debug