问题
最近我们在重新部署线上云主机的堡垒机环境,其中用到了OpenVPN。最后安装好了之后发现,客户端虽然可以连接服务端,但是无法访问外网等网站,也就是只能访问这一台堡垒机。
分析过程
我个人对网络其实不怎么熟悉,我就和上海一个在拼多多的运维朋友请教。最开始他也挺懵逼的,我们自己都在自己公司内网配置VPN 都没有遇到过这个问题。我们就觉得有几个点会出出问题:
服务端配置有问题
VPN客户端网络有问题
服务器网络有问题
服务器该虚拟网卡配置有问题
第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使用,才能实现响应数据包的正确返回
参考资料
不错
回复 @ apanly: 非常不错