Tuesday, November 27, 2007

對稱路由的後記

話說昨天才寫完這個 FreeBSD 對稱路由的小帖, 今天聊天的時候就有朋友跟我抱怨他遇到某個工程師在 server 上面裝了兩個網卡, 結果每次要加新的 client 的時候都有麻煩, 我朋友身為 PM 就要為了工程師的虛弱無能到處去道歉.... XD

中文的文章 google 到的量是比較少啦, 但是既然要裝 server 那總該加減看一點東西, 不想看 man page 的話, google 上面一狗票英文文章, 文法也都寫的很簡單啊~~

Monday, November 26, 2007

FreeBSD 上的 Loopback port mapping

小公司的 NAT Server 有時候經常沒有劃分 DMZ... 可能是成本考量 (維護, 設備, 等等...). Public server 跟 LAN PC 放在一起, 撇開 Security 的問題不管 (很多小公司不管這個的), 眼前馬上會遇到的麻煩是 LAN PC 的使用者連不上這些 public server.

會有這樣的問題是因為 NAT 上面做了 port mapping (即 port redirect), 把某個 public ip 的某個 port 做對應到 LAN 裡面的某個機器的某個 port, 比如說 www.test.com 的 DNS 登記 IP 是 100.101.102.103, 而實際的網頁放在下面的 10.11.12.13 機器上. 這時候 port mapping 規則就是,
~~~~~~~~~~~~
map 100.101.102.103:80 to 10.11.12.13:80
~~~~~~~~~~~~
這時候外面的人從 Internet 連過來看網頁沒問題, 但是 LAN 裡面的人怎麼連就是連不上!

原因是因為通常 port redirect 的動作會在 NAT Server 的 external interface 上面的 inbound 做, 可是裡面的人網上連線, 只會經過 internal interface 的 inbound.

在 FreeBSD 的解決方法是利用 PF (Packet Filter) 的 Loopback RDR 方式, 以下是範例,
~~~~~~~~~~~~~~~~~~~~~~
$ExtNIC="em1" ##對外的網卡##
$ExtSRVip="100.101.102.103"
$ExtSRVport="80"
$IntNIC="em2" ##對內的網卡##
$IntSRVip="10.11.12.13"
$IntSRVport="80"
$IntNET="10.11.12.0/24" ##內部網段##

no nat on $IntNIC from $IntNIC to $IntNET
nat on $IntNIC proto tcp from $IntNET to $IntSRVip port $IntSRVport -> ($IntNIC)

rdr on $IntNIC proto tcp from $IntNET to $ExtSRVip port $ExtSRVport -> $IntSRVip port $IntSRVport
~~~~~~~~~~~~~~~~~~~~~~

FreeBSD 上的對稱路由 (Symmetric Routing)

機器上如果插兩片以上的網路卡 (NIC), 比如說同時連接兩個 ISP.

通常有個麻煩是會碰到不對稱路由 (Asymmetric Routing), 也就是從 NIC1 進來的連線, 卻是從 NIC2 回應回去. 如果上面的 ISP 有開 anti spoof 那連線就會掛掉... 解決的方法是 client 的連線從哪個網卡進來, 就從哪個網卡回應回去.

以下是用 FreeBSD 內建的 PF (Packet Filter) 達成的方法,
~~~~~~~~~~~~~
pass in quick on $NIC1 reply-to ($NIC1 $GW1) from any to ($NIC1) keep state
pass in quick on $NIC2 reply-to ($NIC2 $GW2) from any to ($NIC2) keep state
~~~~~~~~~~~~~

p.s. 這跟 policy routing 並不相同....