昨天突然有同事要我幫他設定壹台 NAT 主機起來,好讓他的測試網站可以讓客戶直接連接至公司內部的其中壹台測試網站,於是我就隨手拿起公司其中壹台 Linux 主機直接設定好 NAT 環境,測試機就可以直接對外了,以下是快速設定的筆記。
第1步:先判斷本機的網路設定
先使用 ifconfig 指令查詢本機的網路卡設定情況:
root@mynat:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:fc:97:27:40
inet addr:192.168.100.3 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fe97:2740/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:44959848 errors:0 dropped:0 overruns:0 frame:0
TX packets:21265023 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2588336545 (2.4 GB) TX bytes:1464481539 (1.3 GB)
Interrupt:11 Base address:0xe000
eth1 Link encap:Ethernet HWaddr 00:e0:4c:77:00:cf
inet6 addr: fe80::2e0:4cff:fe77:cf/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:43561456 errors:0 dropped:0 overruns:0 frame:0
TX packets:49707027 errors:0 dropped:0 overruns:7 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3452815533 (3.2 GB) TX bytes:122773952 (117.0 MB)
Interrupt:10 Base address:0xdc00
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:122740 errors:0 dropped:0 overruns:0 frame:0
TX packets:122740 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9342090 (8.9 MB) TX bytes:9342090 (8.9 MB)
ppp0 Link encap:Point-to-Point Protocol
inet addr:212.xx.99.22 P-t-P:212.xx.99.254 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:4657320 errors:0 dropped:0 overruns:0 frame:0
TX packets:5904435 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:1183815201 (1.1 GB) TX bytes:1234470237 (1.1 GB)
因為我同時要做 SNAT 與 DNAT,所以必須要兩張網路介面,從上述結果得知,我有兩張實體網路介面分別是 eth0 與 eth1, 另一張 lo 是本地網路所以不用看,最後有一個 ppp0 代表此網路透過 PPPoE 撥接上的網路介面,由於 eth1 並沒有 inet addr (IP位址) 所以我研判此 ppp0 是使用 eth1 來上網,但我們之後的步驟都不會用到 eth1 介面,而是以對外的 ppp0 為主。
第2步:撰寫 iptables 指令碼 ( Shell Script )
我定義了 8 大步驟,語法應該淺顯易懂,如果看不懂那也只要改掉 IP 就可以用了:
# 1. Define variables
WAN_IF="ppp0"
WAN_IP="212.xx.99.22"
LAN_IF="eth0"
LAN_IP="192.168.100.0/24"
# 2. modprobe
/sbin/modprobe ip_tables
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ipt_state
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_REDIRECT
/sbin/modprobe ipt_LOG
# 3. Flush & Reset iptables settings
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -F -t nat
/sbin/iptables -X -t nat
/sbin/iptables -Z -t nat
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT
# 4. Accept connection from LOCALHOST ( loopback )
/sbin/iptables -A INPUT -i lo -j ACCEPT
# 5. Acception connection from some ports ( Firewall rules )
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -p tcp -s 210.xx.33.99 --dport 21 -j ACCEPT
# 6. Source NAT settings
/sbin/iptables -A INPUT -i $LAN_IF -j ACCEPT
echo "1" > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -A POSTROUTING -t nat -o $WAN_IF -s $LAN_IP -j SNAT --to $WAN_IP
# 7. Destination NAT settings
/sbin/iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 80 -j DNAT --to 192.168.100.104:80
# 8. Accept connection from ESTABLISHED and RELATED connection
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
淺顯易懂的設定,快速複製貼上就可以完成設定,讚喔! ^_^
注意事項
- 假設這台需要對外的內部電腦的網路設定如下:
- IP 為 192.168.100.104
- Gateway 是192.168.100.1
- 假設這台新架設的 NAT 主機的網路設定如下:
- 那麼請切記,要將這台內部電腦的 Gateway 設定為 192.168.100.2 才能正常運作喔!
相關連結