VMware实现iptables NAT及端口映射
1. 前言
本文只讲解实战应用,不会涉及原理讲解。如果想要了解iptables的工作流程或原理可参考如下博文。
具体操作是在pc机的vmware虚拟机上进行的,因此涉及的地址都是内网ip。在实际工作中也是一样的操作流程,只需要把涉及外网的地址改为公网ip即可。
文章参考:
文章参考:
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)成功。