◎敘述
natd簡單的來說就是進行位址轉換,也就是說通常是用在真實ip位址不夠用時.
所採取的替代方案.
◎環境概說
___________________
| | _______________
| FreeBSD NATD |-( 對外介面 xl0 真實ip位址)---->| gateway |
|___________________| | 163.19.203.252 |
| -------|--------
| |
|(對內介面 rl0 虛擬ip位址) |
| internet
| 網際網路
_ _ _ _ _|_ _ _ _ _
| |
| 虛擬ip LAN |
|_ _ _ _ _ _ _ _ _ _ |
依照上圖,FreeBSD伺服器有兩張網卡,(非必要,後面會補充說明)
一張(xl0)對外設定真實ip位址(163.19.203.129)
一張(rl0)對內設定虛擬ip位址(192.168.10.254)
由於FreeBSD已內建natd服務,所以只需要進行一些小設定,
讓 FreeBSD 知道兩個區域網路,並且把虛擬ip LAN 的封包轉換過後由真實ip介面轉送出去.
有幾個步驟是必須的
0.設定兩張網卡,是基本也是必須!!
第一張網卡可以透過安裝時設定.此時並順便注意第二張網卡的代號.
第二張用手動設定會比較簡單.修改/etc/rc.conf
defaultrouter="163.19.203.252"
ifconfig_xl0="inet 163.19.203.129 netmask 255.255.255.128"
ifconfig_rl0="inet 192.168.10.254 netmask 255.255.255.0"
真實ip的那張網卡不用特別注意,設定正確可以連上網路即可.
我對內的網卡代號為rl0,且我需要把他設定為虛擬的ip位址.
為了方便,我設一整個虛擬的區段(192.168.10.0/24).
ip依照習慣定義為192.168.10.254
比較需要注意的是defaultrouter="163.19.203.252" 要設定為真實ip位址的閘道器ip位址.
簡而言之,只有紅色部分是額外加上的.
若您只有一張網卡,又不想再買一張... ~"~ (舉例我只有一張xl)
ifconfig_xl0_alias0="inet 192.168.10.254 netmask 255.255.255.0"
就可以把那一張卡額外再加上一個ip位址.
1.重新編譯 kernel , 並在kernel文字敘述檔,加上以下的參數:
options IPFIREWALL
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPDIVERT
加上這些參數是要讓kernel加上防火牆的功能.(原因在步驟4說明)
參照本站 更新ports/升級系統 > kernel 更新
並請注意 現在版本的LINT敘述檔 必須透過 make LINT 產生.
參照本站 FreeBSD改版訊息 > 4.x to 5.x
2.開機時自動啟動 gateway 功能 (也就是轉送封包的功能)
在/etc/rc.conf檔案末端新增
gateway_enable="YES" # Set to YES if this host will be a gateway.
或是 直接採用命令列方式轉送封包 (不建議這樣做,太麻煩)
sysctl net.inet.ip.forwarding=1
3.定義natd的對外介面卡.
在/etc/rc.conf檔案末端新增
natd_interface="xl0" # Public interface or IPaddress to use.
請注意 其中 xl0 是我對外的網卡,您可以透過 ifconfig -a 查看系統所抓取到的網卡代號.
4.把流量 導向到(divert)natd 服務.
必須透過防火牆把流量導過去,所以你必須完成步驟1的kernel編譯.
透過/etc/rc.firewall檔案設定防火牆達到這個目的.
不過若你對防火牆沒有太大的興趣. 直接在檔案*最末端*加上這幾行也可以.
/sbin/ipfw -f flush
/sbin/ipfw add divert natd all from any to any via xl0
/sbin/ipfw add pass all from any to any
說明: 第一行:清空防火牆規則.
第二行:把所有natd的流量透過 xl0 介面導出.請依照自己的實際狀況修改.
第三行:放行所有的封包.
只設定這三行,將會造成你的區域網路只要把電腦的gateway(閘道器)設到你這個ip位置
就可以把封包透過你這台機器轉送,所以..若有需要請把防火牆規則加上.
當你額外再設定相關防火牆規則時,請把第二行加在其他規則之前,
以確定natd可以接收到所有的封包.
且封包會在natd轉換後 重新進入防火牆規則進行過濾.
5.開機時自動啟動 防火牆 功能
在/etc/rc.conf檔案末端新增
firewall_enable="YES" # Set to YES to enable firewall functionality
若是手動執行 (sh /etc/rc.firewall)防火牆功能,請務必確認你的規則不會把你自己給過濾掉.
也就是說 可能的話在本機而非遠端執行此動作.
6.開機時自動啟動 nat 轉換功能
在/etc/rc.conf檔案末端新增
natd_enable="YES" # Enable natd (if firewall_enable == YES).
7.重新啟動伺服器,natd就完成設定了. Clinet端設定:
IP位址 : 192.168.10.0~255
子網路遮罩: 255.255.255.0
閘道器 : 192.168.10.254 (指定 natd對內網卡ip位址 作為閘道器位址)
這樣就可以節省很多ip位址嚕.
◎總結:
上述步驟是為了要把natd的流程寫出來,若只是要快速的建立natd服務.
且配合日後可能的防火牆設定.總結如下:
a.編譯完kernel
b.修改檔案:(請依照您實際狀況修改)/etc/rc.conf最後端加上這些參數:
defaultrouter="163.19.203.252"
ifconfig_xl0="inet 163.19.203.129 netmask 255.255.255.128"
ifconfig_rl0="inet 192.168.10.254 netmask 255.255.255.0"
firewall_enable="YES" # Set to YES to enable firewall functionality
firewall_type="OPEN" # Firewall type (see /etc/rc.firewall)
natd_enable="YES" # Enable natd (if firewall_enable == YES).
natd_interface="xl0" # Public interface or IPaddress to use.
gateway_enable="YES" # Set to YES if this host will be a gateway.
c.並且在 /etc/firewall 找到下方設定,新增紅色部分
case ${firewall_type} in
[Oo][Pp][Ee][Nn])
setup_loopback
${fwcmd} -f flush
${fwcmd} add 10000 divert natd all from any to any via xl0
# 可能擴充的防火牆規則放在這
${fwcmd} add 65000 pass all from any to any
;;
說明:由於先前firewall_type設定為OPEN所以我在OPEN這個地方加上設定.
d.重新啟動伺服器,設定clinet端,就完成了.
◎補充:上述/etc/rc.conf中新增的參數設定 /etc/defaults/rc.conf 中都有
養成好習慣用複製的,不要直接修改 /etc/defaults/rc.conf 檔案
◎作者: Archie Cobbs <archie@FreeBSD.org> (divert sockets)
Charles Mott <cm@linktel.net> (packet aliasing)
Eivind Eklund <perhaps@yes.no> (IRC support & misc additions)
Ari Suutari <suutari@iki.fi> (natd)
Dru Nelson <dnelson@redwoodsoft.com> (early PPTP support)
Brian Somers <brian@awfulhak.org> (glue)
Ruslan Ermilov <ru@FreeBSD.org> (natd, packet aliasing, glue)
◎資料來源: NATD(8)
|