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
~~~~~~~~~~~~~~~~~~~~~~

No comments: