如何通过单台公网云服务器实现同子网的内网云服务器访问互联网

有用户在上云的过程中,购买了多台云服务器,并且考虑到成本的问题,只给其中一台云服务器购买了公网IP,但是用户又想要所有的云服务器都可以访问互联网。对云服务熟悉的都知道,有一个云产品叫做NAT网关,可以完美的解决这个问题。可是如果用户不愿意再多购买NAT网关呢?本文主要介绍如何使用iptables来手动实现上述需求,同时还可以将内网云服务器上的服务暴露到互联网上。

演示环境


主机名 内网IP 公网IP 角色
proxy 172.16.1.242 36.249.107.241 转发器
server 172.16.1.87 - 内网服务器

内网云服务器访问互联网(SNAT)


  1. proxy主机上开启路由转发功能
1
2
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl --system
  1. proxy主机上配置iptables规则
1
2
3
4
5
# iptables -t nat -I POSTROUTING  -o ${网卡名称} -s ${子网CIDR} -j MASQUERADE
iptables -t nat -I POSTROUTING -o eth0 -s 172.16.1.0/24 -j MASQUERADE
iptables-save
# 查看规则
iptables -t nat -nvL

说明
如果需要指定SNAT转换后的IP可使用以下命令

1
2
3
# iptables -t nat -I POSTROUTING  -o ${网卡名称} -s ${子网CIDR} -j SNAT --to-source ${指定SNAT转换后的IP}
iptables -t nat -I POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to-source 172.16.1.242
iptables-save
  1. 修改server主机的默认网关为proxy主机的IP
1
2
3
4
ip route del default
# ip route add default via ${proxy主机IP} dev ${网卡名称}
ip route add default via 172.16.1.242 dev eth0
ip route list

说明
上述方式在服务器发生重启后默认网关可能会恢复为默认的,建议直接修改网卡配置文件使其永久生效

  1. server主机执行以下命令进行测试验证
1
ping www.baidu.com

说明
大多数云平台为了安全默认会开启源地址校验功能,如果配置完发现无法正常访问就需要考虑是此原因导致的,建议提工单给云服务商,关闭proxy主机网卡的源地址校验功能。对于基于OpenStack的云平台,即是要对云服务器网卡设置allowed-address-pairs属性放通0.0.0.0/0网段,命令如下:

1
neutron port-update ${PORT_ID} --allowed-address-pairs list=true type=dict ip_address=0.0.0.0/0

互联网访问内网云服务器(DNAT)


  1. server主机上安装httpd服务用于演示(可选)

说明
如果实际业务已部署,使用实际业务即可,此处安装httpd服务仅为方便演示

1
2
3
4
yum install httpd -y
echo $HOSTNAME > /var/www/html/index.html
systemctl enable httpd
systemctl start httpd
  1. proxy主机上开启路由转发功能
1
2
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl --system
  1. proxy主机上配置iptables规则
1
2
3
4
5
# iptables -t nat -I PREROUTING -i ${网卡名称} -d ${proxy主机IP} -p tcp --dport ${转换前的目标端口} -j DNAT --to ${转换后的目的IP}:${转换后的目的端口}
iptables -t nat -I PREROUTING -i eth0 -d 172.16.1.242 -p tcp --dport 8000 -j DNAT --to 172.16.1.87:80
iptables-save
# 查看规则
iptables -t nat -nvL
  1. 访问http://36.249.107.241:8000进行测试验证,看是否可以正常访问部署在server主机上的httpd服务

说明
大多数云平台为了安全默认会开启源地址校验功能,如果配置完发现无法正常访问就需要考虑是此原因导致的,建议提工单给云服务商,关闭proxy主机网卡的源地址校验功能。对于基于OpenStack的云平台,即是要对云服务器网卡设置allowed-address-pairs属性放通0.0.0.0/0网段,命令如下:

1
neutron port-update ${PORT_ID} --allowed-address-pairs list=true type=dict ip_address=0.0.0.0/0