经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
VMware实现iptables NAT及端口映射
来源:cnblogs  作者:踏歌行666  时间:2019/3/25 9:08:53  对本文有异议

 

1. 前言

本文只讲解实战应用,不会涉及原理讲解。如果想要了解iptables的工作流程或原理可参考如下博文。

具体操作是在PC机的VMware虚拟机上进行的,因此涉及的地址都是内网IP。在实际工作中也是一样的操作流程,只需要把涉及外网的地址改为公网IP即可。

 

文章参考:iptables nat及端口映射

文章参考:企业软件防火墙iptables

 

1.1. 为什么有这篇文章?

原因是在日常工作中,我们都会在自己的电脑上安装VMware虚拟机,并由此实现一些业务系统【如:LNMP】或模拟线上的网络环境等。

而本文模拟的就是IDC机房或办公网的环境。机房内网服务器不能上外网,只能通过网关服务器上外网。而外网服务器想要访问机房内部的服务器,也只能通过网关服务器转发实现访问。

 

 

2. iptables表和链的工作流程

 

2.1. 常用操作

  1. ## 清空所有规则【默认是filter表】
  2. iptables -F
  3. iptables -X
  4. iptables -Z
  5. iptables -t nat -F
  6. iptables -t nat -X
  7. iptables -t nat -Z
  8. ## 查看规则
  9. iptables -nL
  10. iptables -nL -t nat
  11. ## 删除指定表指定链的指定行数据
  12. iptables -t nat -D POSTROUTING 1

  

 

3. 涉及虚拟机网络设置

3.1. 内部服务器node01网络设置

3.1.1. 内网设置【只有一个网卡】

备注:

使用LAN区段,那么本机登录该虚拟机也不行,也ping不通,不在同一个网段不能互访。只能通过网关服务器ssh跳转登录访问。

 

eth0配置:

  1. [root@InnerNode01 network-scripts]# cat ifcfg-eth0
  2. DEVICE=eth0
  3. TYPE=Ethernet
  4. ONBOOT=yes
  5. NM_CONTROLLED=yes
  6. BOOTPROTO=none
  7. IPV6INIT=yes
  8. USERCTL=no
  9. IPADDR=172.16.10.10
  10. NETMASK=255.255.255.0
  11. GATEWAY=172.16.10.5
  12. # 阿里云DNS
  13. DNS1=223.5.5.5
  14. DNS2=223.6.6.6

  

3.2. 网关服务器网络设置

3.2.1. 内网设置

备注:

网关服务器的内网地址和内部服务器的地址在同一个网段。因此他们之间可以互访。

 

eth0配置:

  1. [zhang@gateway01 network-scripts]$ cat ifcfg-eth0
  2. DEVICE=eth0
  3. TYPE=Ethernet
  4. ONBOOT=yes
  5. NM_CONTROLLED=yes
  6. BOOTPROTO=none
  7. IPV6INIT=yes
  8. USERCTL=no
  9. IPADDR=172.16.10.5
  10. NETMASK=255.255.255.0

  

3.2.2. 外网设置【模拟的公网】

eth1配置:

  1. [root@gateway01 network-scripts]# cat ifcfg-eth1
  2. DEVICE=eth1
  3. TYPE=Ethernet
  4. ONBOOT=yes
  5. NM_CONTROLLED=yes
  6. BOOTPROTO=none
  7. IPV6INIT=yes
  8. USERCTL=no
  9. IPADDR=10.0.0.5
  10. NETMASK=255.255.255.0
  11. GATEWAY=10.0.0.2
  12. # 阿里云DNS
  13. DNS1=223.5.5.5
  14. DNS2=223.6.6.6

  

3.3. 外网服务器设置

3.3.1. 外网设置【只有一个网卡】

eth0配置:

  1. [root@internet01 network-scripts]# cat ifcfg-eth0
  2. DEVICE=eth0
  3. TYPE=Ethernet
  4. ONBOOT=yes
  5. NM_CONTROLLED=yes
  6. BOOTPROTO=none
  7. IPV6INIT=yes
  8. USERCTL=no
  9. IPADDR=10.0.0.8
  10. NETMASK=255.255.255.0
  11. GATEWAY=10.0.0.2
  12. # 阿里云DNS
  13. DNS1=223.5.5.5
  14. 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的转发功能

  1. [root@gateway01 ~]# tail /etc/sysctl.conf # 添加如下内容
  2. …………
  3. net.ipv4.ip_forward = 1
  4. [root@gateway01 ~]# sysctl -p # 生效

  

2、网关机器iptables操作

  1. iptables -P FORWARD DROP

将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet。

 

  1. iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用。

 

  1. 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了。

 

  1. iptables -A FORWARD -s 172.16.10.10 -j ACCEPT # 允许单个地址 或者如下命令
  2. iptables -A FORWARD -s 172.16.10.0/24 -j ACCEPT # 允许该网段

比如我想让172.16.10.10这个地址访问internet,那么你就加如上的命令就可以了。

 

3、保存iptables规则

  1. iptables-save > /etc/sysconfig/iptables

  

4.4. 内部服务器node01测试

  1. [root@InnerNode01 ~]# ping www.baidu.com # 查看是否可以ping通
  2. PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data.
  3. 64 bytes from 180.97.33.108 (180.97.33.108): icmp_seq=1 ttl=127 time=43.4 ms
  4. 64 bytes from 180.97.33.108 (180.97.33.108): icmp_seq=2 ttl=127 time=42.6 ms
  5. 64 bytes from 180.97.33.108 (180.97.33.108): icmp_seq=3 ttl=127 time=42.1 ms
  6. ^C
  7. --- www.a.shifen.com ping statistics ---
  8. 3 packets transmitted, 3 received, 0% packet loss, time 2005ms
  9. rtt min/avg/max/mdev = 42.114/42.735/43.420/0.561 ms
  10. [root@InnerNode01 ~]#
  11. [root@InnerNode01 ~]# telnet www.baidu.com 80 # telnet 是否可行
  12. Trying 112.34.112.40...
  13. Connected to www.baidu.com.
  14. 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的转发功能

  1. [root@gateway01 ~]# tail /etc/sysctl.conf # 添加如下内容
  2. …………
  3. net.ipv4.ip_forward = 1
  4. [root@gateway01 ~]# sysctl -p # 生效

  

2、网关机器iptables操作

  1. iptables -P FORWARD DROP

将FORWARD链的策略设置为DROP,这样做的目的是做到ip的控制,你允许哪一个访问就可以增加一个规则,不在规则中的ip将无法访问。

 

  1. iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用。

 

  1. 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。那么也就是说,没有符合规则的包将被丢弃,不管内到外还是外到内。因此,我们需要加入下面的规则。

  1. iptables -A FORWARD -d 172.16.10.10 -p tcp --dport 80 -j ACCEPT

 

3、保存iptables规则

  1. iptables-save > /etc/sysconfig/iptables

  

5.4. 操作验证

1、在内部服务器监听80端口

  1. ## xshell标签1操作
  2. [root@InnerNode01 ~]# nc -l 80 # 保持持续监听
  3. ## xshell标签2操作
  4. [root@InnerNode01 ~]# netstat -lntup
  5. Active Internet connections (only servers)
  6. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  7. tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 808/rpcbind
  8. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1971/nc ### 可见80端口已经监听成功
  9. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1099/sshd
  10. tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1355/master

  

2、在外网服务器Telnet

  1. [zhang@internet01 ~]$ telnet 10.0.0.5 80
  2. Trying 10.0.0.5...
  3. Connected to 10.0.0.5.
  4. Escape character is '^]'.
  5. ^]
  6. telnet> quit
  7. Connection closed.

由上可知,外网服务器(10.0.0.8)访问内部服务器(172.16.10.10:80)成功。

 

原文链接:http://www.cnblogs.com/zhanglianghhh/p/10589477.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号