有用户在上云的过程中,购买了多台云服务器,并且考虑到成本的问题,只给其中一台云服务器购买了公网IP,但是用户又想要所有的云服务器都可以访问互联网。对云服务熟悉的都知道,有一个云产品叫做NAT网关,可以完美的解决这个问题。可是如果用户不愿意再多购买NAT网关呢?本文主要介绍如何使用iptables来手动实现上述需求,同时还可以将内网云服务器上的服务暴露到互联网上。
演示环境
主机名 |
内网IP |
公网IP |
角色 |
proxy |
172.16.1.242 |
36.249.107.241 |
转发器 |
server |
172.16.1.87 |
- |
内网服务器 |
内网云服务器访问互联网(SNAT)
- 在
proxy
主机上开启路由转发功能
1 2
| echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl --system
|
- 在
proxy
主机上配置iptables规则
1 2 3 4 5
| 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 eth0 -s 172.16.1.0/24 -j SNAT --to-source 172.16.1.242 iptables-save
|
- 修改
server
主机的默认网关为proxy
主机的IP
1 2 3 4
| ip route del default
ip route add default via 172.16.1.242 dev eth0 ip route list
|
说明
上述方式在服务器发生重启后默认网关可能会恢复为默认的,建议直接修改网卡配置文件使其永久生效
- 在
server
主机执行以下命令进行测试验证
说明
大多数云平台为了安全默认会开启源地址校验功能,如果配置完发现无法正常访问就需要考虑是此原因导致的,建议提工单给云服务商,关闭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)
- 在
server
主机上安装httpd服务用于演示(可选)
说明
如果实际业务已部署,使用实际业务即可,此处安装httpd服务仅为方便演示
1 2 3 4
| yum install httpd -y echo $HOSTNAME > /var/www/html/index.html systemctl enable httpd systemctl start httpd
|
- 在
proxy
主机上开启路由转发功能
1 2
| echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl --system
|
- 在
proxy
主机上配置iptables规则
1 2 3 4 5
| 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
|
- 访问
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
|