The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何在 Linux 下利用 iptables 快速設定 NAT 環境

昨天突然有同事要我幫他設定壹台 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)

因為我同時要做 SNATDNAT,所以必須要兩張網路介面,從上述結果得知,我有兩張實體網路介面分別是 eth0eth1, 另一張 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 主機的網路設定如下:
    • 內部 IP 為 192.168.100.2
  • 那麼請切記,要將這台內部電腦的 Gateway 設定為 192.168.100.2 才能正常運作喔!

相關連結