1. 前言 本文只講解實戰應用,不會涉及原理講解。如果想要瞭解iptables的工作流程或原理可參考如下博文。 具體操作是在PC機的VMware虛擬機上進行的,因此涉及的地址都是內網IP。在實際工作中也是一樣的操作流程,只需要把涉及外網的地址改為公網IP即可。 文章參考:iptables nat及端 ...
1. 前言
本文只講解實戰應用,不會涉及原理講解。如果想要瞭解iptables的工作流程或原理可參考如下博文。
具體操作是在PC機的VMware虛擬機上進行的,因此涉及的地址都是內網IP。在實際工作中也是一樣的操作流程,只需要把涉及外網的地址改為公網IP即可。
文章參考:iptables nat及埠映射
文章參考:企業軟體防火牆iptables
1.1. 為什麼有這篇文章?
原因是在日常工作中,我們都會在自己的電腦上安裝VMware虛擬機,並由此實現一些業務系統【如:LNMP】或模擬線上的網路環境等。
而本文模擬的就是IDC機房或辦公網的環境。機房內網伺服器不能上外網,只能通過網關伺服器上外網。而外網伺服器想要訪問機房內部的伺服器,也只能通過網關伺服器轉發實現訪問。
2. iptables表和鏈的工作流程
2.1. 常用操作
## 清空所有規則【預設是filter表】 iptables -F iptables -X iptables -Z iptables -t nat -F iptables -t nat -X iptables -t nat -Z ## 查看規則 iptables -nL iptables -nL -t nat ## 刪除指定表指定鏈的指定行數據 iptables -t nat -D POSTROUTING 1
3. 涉及虛擬機網路設置
3.1. 內部伺服器node01網路設置
3.1.1. 內網設置【只有一個網卡】
備註:
使用LAN區段,那麼本機登錄該虛擬機也不行,也ping不通,不在同一個網段不能互訪。只能通過網關伺服器ssh跳轉登錄訪問。
eth0配置:
[root@InnerNode01 network-scripts]# cat ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPV6INIT=yes USERCTL=no IPADDR=172.16.10.10 NETMASK=255.255.255.0 GATEWAY=172.16.10.5 # 阿裡雲DNS DNS1=223.5.5.5 DNS2=223.6.6.6
3.2. 網關伺服器網路設置
3.2.1. 內網設置
備註:
網關伺服器的內網地址和內部伺服器的地址在同一個網段。因此他們之間可以互訪。
eth0配置:
[zhang@gateway01 network-scripts]$ cat ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPV6INIT=yes USERCTL=no IPADDR=172.16.10.5 NETMASK=255.255.255.0
3.2.2. 外網設置【模擬的公網】
eth1配置:
[root@gateway01 network-scripts]# cat ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPV6INIT=yes USERCTL=no IPADDR=10.0.0.5 NETMASK=255.255.255.0 GATEWAY=10.0.0.2 # 阿裡雲DNS DNS1=223.5.5.5 DNS2=223.6.6.6
3.3. 外網伺服器設置
3.3.1. 外網設置【只有一個網卡】
eth0配置:
[root@internet01 network-scripts]# cat ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPV6INIT=yes USERCTL=no IPADDR=10.0.0.8 NETMASK=255.255.255.0 GATEWAY=10.0.0.2 # 阿裡雲DNS DNS1=223.5.5.5 DNS2=223.6.6.6
4. 簡單的NAT路由器
4.1. 網路架構
4.2. NAT需求介紹
網關2個網路介面
Lan口: 172.16.10.5/24 eth0
Wan口: 10.0.0.5/24 eth1
目的:實現內網中的節點伺服器node01 IP:172.16.10.10(網段:172.16.10.0/24)可控的訪問internet。
4.3. 網關伺服器操作
1、網關機器開啟linux的轉發功能
[root@gateway01 ~]# tail /etc/sysctl.conf # 添加如下內容 ………… net.ipv4.ip_forward = 1 [root@gateway01 ~]# sysctl -p # 生效
2、網關機器iptables操作
iptables -P FORWARD DROP
將FORWARD鏈的策略設置為DROP,這樣做的目的是做到對內網ip的控制,你允許哪一個訪問internet就可以增加一個規則,不在規則中的ip將無法訪問internet。
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
這條規則規定允許任何地址到任何地址的確認包和關聯包通過。一定要加這一條,否則你只允許lan IP訪問沒有用。
iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -j SNAT --to 10.0.0.5
這條規則做了一個SNAT,也就是源地址轉換,將來自172.16.10.0/24的地址轉換為10.0.0.5。
有這幾條規則,一個簡單的nat路由器就實現了。這時你可以將允許訪問的ip或網段添加至FORWARD鏈,他們就能訪問internet了。
iptables -A FORWARD -s 172.16.10.10 -j ACCEPT # 允許單個地址 或者如下命令 iptables -A FORWARD -s 172.16.10.0/24 -j ACCEPT # 允許該網段
比如我想讓172.16.10.10這個地址訪問internet,那麼你就加如上的命令就可以了。
3、保存iptables規則
iptables-save > /etc/sysconfig/iptables
4.4. 內部伺服器node01測試
[root@InnerNode01 ~]# ping www.baidu.com # 查看是否可以ping通 PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data. 64 bytes from 180.97.33.108 (180.97.33.108): icmp_seq=1 ttl=127 time=43.4 ms 64 bytes from 180.97.33.108 (180.97.33.108): icmp_seq=2 ttl=127 time=42.6 ms 64 bytes from 180.97.33.108 (180.97.33.108): icmp_seq=3 ttl=127 time=42.1 ms ^C --- www.a.shifen.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2005ms rtt min/avg/max/mdev = 42.114/42.735/43.420/0.561 ms [root@InnerNode01 ~]# [root@InnerNode01 ~]# telnet www.baidu.com 80 # telnet 是否可行 Trying 112.34.112.40... Connected to www.baidu.com. Escape character is '^]'.
5. 埠轉發
5.1. 網路架構
5.2. 埠轉發需求介紹
內部機器1個網路介面
Lan內web server: 172.16.10.10:80
網關2個網路介面
Lan口:172.16.10.5/24 eth0
Wan口:10.0.0.5/24 eth1
目的:對內部server進行埠轉發,實現internet 10.0.0.8(網段:10.0.0.0/24)用戶【模擬外網機器】訪問內網伺服器172.16.10.10:80。
5.3. 網關伺服器操作
1、網關機器開啟linux的轉發功能
[root@gateway01 ~]# tail /etc/sysctl.conf # 添加如下內容 ………… net.ipv4.ip_forward = 1 [root@gateway01 ~]# sysctl -p # 生效
2、網關機器iptables操作
iptables -P FORWARD DROP
將FORWARD鏈的策略設置為DROP,這樣做的目的是做到ip的控制,你允許哪一個訪問就可以增加一個規則,不在規則中的ip將無法訪問。
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
這條規則規定允許任何地址到任何地址的確認包和關聯包通過。一定要加這一條,否則你只允許lan IP訪問沒有用。
iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j DNAT --to 172.16.10.10:80
如果你要把訪問 10.0.0.5:80 的數據包轉發到Lan內web server,用上面的命令。
好了,命令完成了,埠轉發也做完了,本例能不能轉發呢?不能,為什麼呢?我下麵分析一下。
本例中我們的FORWARD策略是DROP。那麼也就是說,沒有符合規則的包將被丟棄,不管內到外還是外到內。因此,我們需要加入下麵的規則。
iptables -A FORWARD -d 172.16.10.10 -p tcp --dport 80 -j ACCEPT
3、保存iptables規則
iptables-save > /etc/sysconfig/iptables
5.4. 操作驗證
1、在內部伺服器監聽80埠
## xshell標簽1操作 [root@InnerNode01 ~]# nc -l 80 # 保持持續監聽 ## xshell標簽2操作 [root@InnerNode01 ~]# netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 808/rpcbind tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1971/nc ### 可見80埠已經監聽成功 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1099/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1355/master
2、在外網伺服器Telnet
[zhang@internet01 ~]$ telnet 10.0.0.5 80 Trying 10.0.0.5... Connected to 10.0.0.5. Escape character is '^]'. ^] telnet> quit Connection closed.
由上可知,外網伺服器(10.0.0.8)訪問內部伺服器(172.16.10.10:80)成功。