SNAT和DNAT原理和应用场景



问题

        最近我们在重新部署线上云主机的堡垒机环境,其中用到了OpenVPN。最后安装好了之后发现,客户端虽然可以连接服务端,但是无法访问外网等网站,也就是只能访问这一台堡垒机。

分析过程

        我个人对网络其实不怎么熟悉,我就和上海一个在拼多多的运维朋友请教。最开始他也挺懵逼的,我们自己都在自己公司内网配置VPN 都没有遇到过这个问题。我们就觉得有几个点会出出问题:

  1. 服务端配置有问题

  2. VPN客户端网络有问题

  3. 服务器网络有问题

  4. 服务器该虚拟网卡配置有问题


第1点 既然我们客户端工具可以连接上应该没问题排除 。第2点 我们在客户端连接的机器上面,可以通过内网地址直接登录到服务器说明,自己电脑网络没问题 排除。第3点 服务器本身可以访问外网,排除。

为了确定是第4点的问题,我们使用了 Wireshark 进行流量抓包。发现目前就是VPN虚拟网卡有问题。后面我就提了一个工单,让云服务器运维工程师帮忙看了看了(一语进行梦中人)。大家可以看一下如下图可以发现 192.168.8.0 通过网关0.0.0.0 出去,但是0.0.0.0出去的却是eth0这个网卡,而不是tun0。到这里我们就明白了为什么无法访问外网了

解决过程

        通过工单提醒发现是没有设置 SNAT,可以通过如下语句解决:大致意思是将 192.168.8.x 网段的请求组通过 eth0 转发出去

iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -o eth0 -j MASQUERADE

##还有一种写法不推荐
iptables -t nat -A POSTROUTING -s 192.168.8.0/24 -o eth0 -j SNAT --to-source 10.140.39.1

        上面两句命令有撒区别?

        第一条语句命令配置的话,不用指定SNAT的目标ip了,不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。

SNAT引发的思考

        由于我个人对于snat了解不多,就去搜索了下资料。然后一发不可收拾,发现snat和dnat是非常常用的两个手段。接下来我根据搜索文章按照我的理解给大家讲解下。

SNAT原理和应用

       应用场景主要是上网。其实这种方式我们常用的,大部分人都使用了,只是我们没有感觉。我在用通俗点的话描述下你可能就知道了:局域网主机共享公网IP进行上网。是不是一下子就想到运营商家里的光猫就是这样的一个过程。现在很多运营商不再给光猫分配公网IP,都是通过SNAT进行转发 很多家公用一个公网IP。大致原理过程如下

        

 局域网PC封装源、如:目ip(源地址:192.168.100.77,目的地址:172.16.16.101),到达网关路由器,SNAT将源地址转换成唯一的一个公网ip,此时源地址变成了公网IP 172.16.16.254(eth0),再把数据包重新封装。当外网服务器收到,进行数据回复的时候。源目对调,源地址是web服务器地址,目标地址是网关地址,找到网关路由之后,在网关路由中会有一个状态记录(局域网内或许不止一台主机访问外网),转发回去。

小知识扩展:一个IP地址做SNAT转换,一般可以让内网100到200台主机实现上网

DNAT原理和应用

        应用场景主要是端口映射。一般做办公室网络都会遇到这个,例如将办公室的内网服务器的某个端口映射到公网上,这样可以让外面的人可以通过指定端口访问内网的服务。

        注意:使用DNAT时,同时配合SNAT使用,才能实现响应数据包的正确返回

参考资料

centos openvpn
编程浪子走四方:CodeRonin