1. 方案介绍
方案1: 使用阿里云的公网 NET 网关
方案2: 使用阿里云的公网 NET 网关 + IPV4 网关
方案3: 通过有公网 IP 的 ECS 进行 IP 转发
方案对比
方案名称 | 优点 | 缺点 |
---|---|---|
1.使用阿里云的公网 NET 网关 | 阿里云提供的 SNAT 服务,使用稳定 | 需要购买 NET 网关,价格较贵,每年 2000 左右 |
2.使用阿里云的 公网NET网关 + IPV4 网关 | 基于方案1再加个 IPV4 网关, 可对 VPC 下所有 ECS 访问公网的流量进行管控, 可以将流量转发至防火墙 | 1. 需要购买 NET 网关,价格较贵,每年 2000 左右 2. 配置麻烦 |
3.通过有公网 IP 的 ECS 进行 IP 转发 | 无需购买额外服务 | 需要自己在 ECS 配置,稳定性较差,取决于运维能力 |
2. 实现步骤
2.1 方案1: 使用阿里云的 公网 NET 网关
- 直接购买一个公网 NET 网关+弹性 IP
- 配置公网NET网关的 SNET 服务, 这里可选 整个 VPC , 某个交换机, 某个 ECS 。需要说明,并不是这里配置完, 对应的云服务就有公网访问能力了, 还需完成步骤3。
- 将需要获取公网访问能力的 ECS 对应的交换机,配置路由表的下一跳地址, 0.0.0.0/0 跳到 NET 网关
2.2 方案2:使用公网 NET 网关 + IPV4 网关
方案二需要两个交换机
sw1: 有公网 IP 服务器的交换机
sw2: 存内网服务器的交换机
- 在 sw1 下创建NET网关
- 配置 sw2 的路由条目(需要新建), 0.0.0.0/0 跳到 NET 网关
- 新增 IPV4 网关, 关联到 sw1 的路由表, 激活
到这一步, 私网服务器已经可以访问公网了, 为实现流量管控(需要配合虚拟防火墙), 可以加上以下步骤
- 新增一张路由表, 类型选择边界网关
- 将该路由表绑定到 IPV4 网关
这个边界网关类型的路由表, 无法自定义路由条目, 只可编辑非默认的系统路由条目, 即, 管理该 vpc 下的全部交换机的下一跳流量, 若有防火墙, 可以将下一跳流量转发至防火墙的弹性网卡
2.3 通过有公网 IP 的 ECS 进行 IP 转发
在阿里云控制台配置交换机的路由条目, 将 0.0.0.0/0 的下一跳地址设置为带公网 IP 的 ECS
-
在公网 ECS上操作: 开启公网 ECS 的 IP 转发功能
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
-
在公网 ECS上操作: 设置 iptables 的 NAT 转发规则
# 命令 iptables -t nat -I POSTROUTING -s {CIDR} -j SNAT --to-source {PUB_IP} # {CIDR}: VPC 或交换机的网段, 如 172.16.0.0/16 # {PUB_IP}: 公网 ECS 的内网 IP # 示例, VPC网段是 172.16.0.0/16 , 公网 ECS 的内网 IP 是 172.16.211.72 iptables -t nat -I POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 172.16.211.72
-
在公网 ECS上操作: 到这一步基本就可以在内网 ECS 上访问公网了, 若还是不行, 关闭 ufw 防火墙, 即使防火墙状态已经是 inactive, 也执行一下关闭命令
ufw disable
排错方式
在内网服务器上
ping www.baidu.com
在公网服务器上使用以下命令抓包:
tcpdump host {内网服务器IP} -i eth0 |grep ICMP
成功的配置应该有 公网 IP 到内网 IP 的流量, 和内网 IP 到 公网 IP 的流量