近期在做让两个在私网网段的主机通过公网实现相互通信的项目,也是我看了很多资料、翻了很多博客才实现了主机互通,现拿出来与大家分享。本博客仅做自己的学习笔记,不足之处请大佬多多斧正。


该图就是网络拓扑图,预实现主机A与主机B通过两个服务器(service 1 && service 2)实现数据通信。


在nat表的配置之前我们要先了解一下nat表的常用的命令,及其各个含义。

源地址转换
iptables -t nat -A POSTROUTING -p tcp -o eth2 -s 192.168.1.0/24 -j SNAT --to-source 10.79.2.1

-t nat: 使用nat表

-A POSTROUTING:使用路由后规则转换POSTROUTING,在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口

-p tcp:tcp协议

-o eth2:匹配外网输出端口eno2

-s 192.168.1.0/24: 源地址为192.168.1网段

-j SNAT:源网络地址转换

--to-source 10.79.2.2:转换地址为10.79.2.2

目的地址转换
iptables -t nat -A PREROUTING -i eth1 -d 192.168.2.2 -p tcp -j DNAT --to-destination 10.79.2.2

-t nat: 使用nat表

-A PREROUTING:使用路由前规则转换PREROUTING,在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址、源端口

-i eth1:匹配内网输入端口eno1

-d 192.168.2.2: 目的地址为192.168.2.2

-p tcp:tcp协议

-j DNAT:使用目的地址转换

--to-destination 10.79.2.2:转换的地址为10.79.2.2

nat表配置
第一部分,主机A -->主机B的数据通信
  • 首先 在service 1里配置源地址与目的地址转换的相关参数

  1. 由于我们的主机A 与主机B不在同一网段,所以我们先在service 1 上将(主机A-->主机B)的源地址请求改到 service 1 --> service 2这个网段上来。(即:将主机A-->主机B的源地址改为:10.79.2.1)

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to-source 10.79.2.1
  1. 同理,我们也需要在service 1 上将主机A 的目的地址转换成service 2 的ip地址。(将主机A-->主机B的目的地址改为:10.79.2.2)。

iptables -t nat -A  PREROUTING -i eth2 -d 192.168.2.2 -j DNAT --to-destination 10.79.2.2
  • 然后 我们需要在service 2 里配置与service 1 相对应的源地址与目的地址转换

在上一步的过程中,我们将主机A的源地址转换成了service 1 的ip地址(10.79.2.1),将主机A的目的地址转换成了service 2 的ip地址(10.79.2.2)。那么接下来我们就需要在service上做相同的事情。

  1. 我们需要对转换到service 1上的源地址进行转换,即将service 1 接收到的源地址转换成我们主机 A的地址,做这一步工作是为了让主机B知道我们的数据是从主机A过来的。

iptables -t nat -A POSTROUTING -o eth1 -s 10.79.2.1 -j SNAT --to-source 192.168.1.2
  1. 以上源地址转换工作已经完成,但是我们数据的目的地址还是service 2啊,那么要不要改呢?答案是必须的,如果不对目的地址进行转换的话我们的数据是没办法走过去的。

iptables -t nat -A  PREROUTING -i eth2 -d 10.79.2.2  -j DNAT --to-destination 192.168.2.2

以上就完成了我们主机A -->主机B的单程通信。但是,我们的目标是实现主机A与主机B实现互通。所以接下来的步骤就和上面的步骤如出一辙。

第二部分:主机B-->主机A的数据通信
  • 因为我们的主机B是与service 2 的eth1网口直连的,所以我们这次先在service 2上做源地址与目的地址转换。

  1. 源地址转换就是将主机B的地址转换成service 2 的ip地址

iptables -t nat -A POSTROUTING -o eth2 -s 192.168.2.0/24 -j SNAT --to-source 10.79.2.2
  1. 目的地址转换就是将主机B的目的地址(主机A的地址)转换成service 1的ip地址

iptables -t nat -A  PREROUTING -i eth1 -d 192.168.1.2 -j DNAT --to-destination 10.79.2.1
  • 接下来我们就需要再回到service 1上做出相对应的nat表配置了

  1. 将主机B的源地址从service 2 的地址转换回去

iptables -t nat -A POSTROUTING -o eth1 -s 10.79.2.2 -j SNAT --to-source 192.168.2.2
  1. 将主机B的目的地址从service 1 的地址转换为主机A的地址

iptables -t nat -A  PREROUTING -i eth2 -d 10.79.2.1  -j DNAT --to-destination 192.168.1.2

以上就完成了我们主机B-->主机A的单程通信,将上述两部分结合起来,我们就实现了主机A<---->主机B的相互通信啦。

  • 当我们遇到数据通信不成功时,这需要将我们查看我们的路由转发功能是否开启了(Linux默认是不生效的),以下是开启办法。

sudo vim /etc/sysctl.conf
//在文档末尾添加上
net.ipv4.ip_forward = 1
//然后在保存退出
//最后在终端输入 sudo sysctl -p 让路由转发立即生效就好了
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐