1、问题背景
为了节省成本,购买了云服务器的时候只买了一个公网IP,但是有多台机器需要实现上网或者是被访问,一个IP只能绑定一个机器,就只能使用NAT网关或者是内网源进行下载,受限较大。
2、测试环境
测试环境:阿里云专有网络VPC下的两台服务器,一台有公网,一台没有公网,同内网
系统:linux系统
注:firewalld实现方案需要在红帽系列带有firewalld防火墙管理的系统上操作
3、实现方案
3.1 构建SNAT网络实现无公网机器上网(选用一种就可以)
3.1.1 iptables实现方式
3.1.1.1 创建专有网络并创建新机器
专有网络是:vpc-hp***********yomk 10.0.0.72是有公网的,10.0.0.73是内网机器
如上图,一台服务器是有公网的,一台服务器是没有公网的
3.1.1.2 设置路由表
进入专有网络路由表
添加路由
3.1.1.3 在带有公网的服务器内部设置(内网机器不需要配置)
开启IP转发:
在/etc/sysctl.conf添加net.ipv4.ip_forward = 1,然后执行
sysctl -p使其生效
iptables -t nat -I POSTROUTING -s VPC的IP段 -j SNAT --to-source 公网IP的ECS内网IP
注:10.0.0.0/8就是内网要上网的机器或者IP段,10.0.0.72就是公网的内网地址
3.1.1.4 测试
此时在没有内网的机器内部测试
3.1.2 firewalld实现方式
先根据3.1.1.1和3.1.1.2设置交换机配置路由表、设置转发。firewalld只是添加转发的规则需要使用富规则
firewalld设置了zone的概念,iptables是主机防火墙,firewalld可以为不同的网卡绑定不同的zone,然后实现访问控制
3.1.2.1、修改网卡的zone
sudo firewall-cmd --permanent --zone=external --change-interface=eth0
执行结果
sudo firewall-cmd --permanent --zone=external --change-interface=eth0
success
3.1.2.2、设置特定 区域的snat-IP伪装
sudo firewall-cmd --zone=external --add-masquerade --permanent
3.1.2.3、设置转发规则
sudo firewall-cmd --zone=external --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" masquerade'
执行结果:
sudo firewall-cmd --zone=external --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" masquerade'
Warning: ALREADY_ENABLED: rule family="ipv4" source address="10.0.0.0/8" masquerade
success
3.1.2.4、重新加载生效
sudo firewall-cmd --reload
3.1.2.5、测试
在内网机器上执行测试
ping -c 4 aliyun.com
PING aliyun.com (140.205.135.3) 56(84) bytes of data.
64 bytes from 220.181.38.251 (140.205.135.3): icmp_seq=1 ttl=52 time=14.1 ms
64 bytes from 220.181.38.251 (140.205.135.3): icmp_seq=2 ttl=52 time=14.0 ms
64 bytes from 220.181.38.251 (140.205.135.3): icmp_seq=3 ttl=52 time=14.0 ms
64 bytes from 220.181.38.251 (140.205.135.3): icmp_seq=4 ttl=52 time=14.0 m
3.2、DNAT实现
3.2.1 iptables实现
3.2.1.1 配置
在公网机器上执行
iptables -t nat -A PREROUTING -d 10.0.0.72 -p tcp --dport 80 -j DNAT --to 10.0.0.73:80
这个指令实现了当客户端访问10.0.0.72所对应的公网的80端口的时候,就会转发到10.0.0.73的80端口,实现访问内部服务
3.2.1.2 测试
3.2.2. firewalld实现
3.2.2.1 配置
1、设置转发规则
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=80:toaddr=10.0.0.73 --permanent
[root@ceshi~]# firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=80:toaddr=10.0.0.73 --permanent
success
2、重载生效
firewall-cmd --reload
[root@ceshi ~]# firewall-cmd --reload
success
3.2.2.2、测试
到此,自建SNAT和DNAT的过程全部结束