0
点赞
收藏
分享

微信扫一扫

云服务器SNAT访问互联网


场景

阿里云、华为云、腾讯云 …… 等云服务商上都有 ECS 服务器,高额的弹性IP和带宽费用使我们不可能为每一台服务器都购买和配置一个弹性IP。

一般我们为其中一台 ECS 服务器绑定弹性IP,但是我们更多时候还希望其他同一个私网的 ECS 机器也能访问互联网,比如和第三方API交互等。

方案

本例以华为云为例,其他云服务商逻辑相同。

1、拥有同一组私网网络的一组云服务器 ECS,这一组服务器引用了同一个私网vpc,我们需要给这个vpc添加一个路由。

2、需要借助有弹性公网IP的服务器做路由转发工作,所以要将这一台服务的 “源/目的检查” 选项关闭。

3、ssh 登录拥有弹性公网IP的服务器,通过命令开启 ip 转发并配置 iptables 规则。

整体拓扑图如下所示:

云服务器SNAT访问互联网_云服务


图中的内外网IP均为随便写的IP,如与第三方服务IP相同,纯属巧合。


步骤

对应 方案 中的 1、2、3,截图如下:

云服务器SNAT访问互联网_SNAT_02

云服务器SNAT访问互联网_云服务_03

编辑配置文件 ​​/etc/sysctl.conf​​,添加 ​​net.ipv4.ip_forward = 1​​(如果已经存在则修改 0为1),然后执行 ​​sysctl -p​​ 使之生效。

执行以下命令配置 iptables 的 SNAT 规则:

iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 192.168.0.138

【或者】如果你服务器有多个网口(单个也可以指定,多个则建议指定),你需要明确指定出口的网口名称,如下例通过 -o 参数明确 eth0 网卡:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 192.168.0.138

【或者】动态获取 eth0 网卡的IP地址,这样 eth0 的IP 地址就算变动也不受影响

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


其中 192.168.0.0/24 是VPC的网段,192.168.0.138 是VPC内绑定外网EIP的的内网IP。
其中 ​​iptables -I​​ 添加的规则放在现有规则的最前面,​​iptables -A​​ 放在现有规则的最后,是都可以的。


配置完成后,到其他同一个 vpc 私网的服务器上验证一下网络就正常了。

云服务器SNAT访问互联网_服务器_04

下面这一行是一个同时匹配源地址和目标地址范围的示例(其中 tun0 为某虚拟专网拨号后的网卡名称):

iptables -t nat -I POSTROUTING -s 172.16.0.0/24 -d 192.168.0.0/22 -o tun0 -j MASQUERADE

附-删除规则:

查看所有 iptables snat 清单并列出每条规则的序号,序号可以在删除规则时指定序号删除

iptables -nvL --line-number -t nat

删除指定的规则命令

iptables -t nat -D POSTROUTING 3

参数对应关系如下图所示:

云服务器SNAT访问互联网_华为云_05


注意:进行删除操作的时候,建议从序号大的开始删除,因为每删除一个后,所有的需求都会依序重新排列,比如你把 1 删除后,原来的 2 就变成 1 了。


(END)



举报

相关推荐

0 条评论