2012年1月26日 星期四

FreeBSD 單機使用光世代多個 IP

跟中華電信申請光世代網路,會有八個 public ip。八個動態IP 或是一個固定+七個動態IP。一台電腦用一個 IP,總覺得剩下的放著不用有點浪費…所以我嘗試一些設定方式希望能把剩下的 IP 拿來用。

小知識
setfib(1)
FreeBSD 自 7.1 開始,支援 multiple routing table。只要在 kernel config 裡加一行
options         ROUTETABLES=16          # max 16. 1 is back compatible.
 之後在執行程式前加上 setfib N 就能指定使用第 N 個 routing table (預設是 0)。譬如
$ setfib 1 route add default 192.168.1.1
$ setfib 1 netstat -rn
使用 setfib 命令不需 root 權限。

光世代 VDSL modem
從網路上可以找到許多教學,還有 admin default 帳號密碼。進入 http://192.168.1.1/ 管理介面發現可以動手設定的東西還不少。
(比較新的 modem 預設開啟無線網路,也設好了 modem 撥號+DHCP server。)
我用的這台型號是 ZyXEL VDSL2 P874。


1. 開多個 PPP 連線 (fail)
用光世代上網有兩種方式,一是從電腦 dial PPPoE,一是 VDSL modem 撥號再從電腦 DHCP。兩種方式可以共存。
我原本就是 dial PPPoE 上網的,因此直覺是能不能 dial 多個。將原本設定檔整段複製一份,device 從 re0 改成 re1 (我有兩張網路卡),但不知道為什麼不成功。

2. 一個 PPP 連線一個 DHCP
這個方式可以很簡單的使用兩個 IP。

第二個 IP 就用 dhcp 拿到。要注意 dhcp 跟 ppp 都會設 default gateway,不要互相蓋到了。可以寫 dhclient config 或 script 解決;一個簡單的方法是用 setfib 跑 dhclient,這樣剛好 gateway 設定分開設在不同的 routing table 上。

因為 ppp (public ip)跟 dhcp 的 ip (192.168.1.x)在不同的網段,所以只要 setfib 就能選用不同的 gateway,自然連出去的 ip 也就不同。也就是說
$ w3m http://www.whatismyip.com # 是用第一個 ip
$ setfib 1 w3m http://www.whatismyip.com # 是用第二個 ip
其實也不一定要用 DHCP,只要是 192.168.1.0/24 的 ip,gateway 設 192.168.1.1就會走 modem 自己撥號拿到的 ip 出去。

3. Modem dial PPPoE 兩次
延續先前的設定。在 modem 的 web 管理介面中,
Advanced Setup -> WAN 裡面可以新增 PPPoE 的連線,讓 modem 自己多撥幾個 IP 來。現在多加一組就好。假設新加的 interface 叫做 ppp1_4。
Advanced Setup -> LAN 裡面可以勾選,增加第二組 LAN IP,譬如 192.168.3.1。
Advanced Setup -> Routing -> Policy Routing 裡面可以設定符合某些條件的連線使用不同的 routing。這裡設定 192.168.3.0/24 走 ppp1_4。

在 FreeBSD 這邊, ifconfig alias 一個 192.168.3.x 的 IP, gateway 設 192.168.3.1 (可以用 setfib 2 設在第三個 routing table 上)。
$ setfib 2 w3m http://www.whatismyip.com 會用第三個 ip

4. Modem dial PPPoE 多次
以下內容我還沒試過。
在 modem 的 web 管理介面中新增 WAN 更多組 PPPoE 連線。
因為沒辦法新增更多 LAN ip,所以只能讓 FreeBSD 這邊的 ip 用相同的網段、相同的 gateway。譬如 192.168.1.2, 192.168.1.3, etc.
Policy Routing 就設 192.168.1.2/32 走 ppp1_5,192.168.1.3/32 走 ppp1_6…依此類推。

比較麻煩的是,都是相同的網段相同的 gateway,FreeBSD 上如何指定出去的 IP。
a. 如果程式是自己寫的,可以 bind socket 到指定的 address。也許可以用 LD_PRELOAD 幫別人寫的程式 bind,我猜這個方法不是每個程式都能成功。
b.  jail 可以不同 jail 使用不同的 ip。我覺得這很可行,只是要管理及使用 jail 稍麻煩一點。
c. 可能可以用 ipfw 或 pf 做 policy routing,以 user 或 group 當條件來 rewrite。我跟 pf 不熟,還試不出來。

其他
a. 我一開始想改 modem admin 帳號(cht) 的密碼,但不知為何改了之後並沒有完全生效 --- 有時要輸入我改的密碼,有時要輸入預設密碼,相當困擾,於是我又改回去。
b. modem 有些設定 save 之後去改其他東西,回頭來看竟然發現之前改的設定消失了,只好重改一次。有時設定要過好久才生效。於是我在測試時,就很難了解到底是我設錯還是 modem 發生什麼怪事。
c. 我還曾發現我連出去的 ip 不是 dial PPPoE 拿到的 ip,相當神秘。
d. modem 裡面預設就有一組 PPPoE 帳號密碼,但那組帳號不是我的 hinet 帳號。不知道這代表什麼。