我正在 AWS EC2 上设置 NAT 实例。 我从 fck-nat 一个旨在取代默认 nat-gateway 的项目中获得灵感。
到目前为止,我有两个工作实例,每个实例都位于单独的子网中。 一个实例具有公共 IP 并连接到互联网网关。 另一个位于“私有”子网中,路由到第一个实例。
我可以从 nat-instance ping 1.1.1.1(这是我用于测试的地址)。 我可以从私有子网 ping nat-instance。
但是转发似乎不起作用,我遵循了上述脚本以及aws文档nat实例中的说明(相当不推荐使用)。
我确定:
sysctl -p file_name
和 net.ipv4.ip_forward=1
允许 ip 转发。iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
我怀疑是安全组,但从 nat-instance 执行 ping 操作正常,并且对私有实例应用相同的安全性并不能解决问题。
我怀疑我不知道的底层安全性,或者我的 nat 设置不完整。
根据我获取的一些日志,显示了我在 nat 实例上从 tcpdump 获得的内容。
XX.XX.AA.AA
将是 nat 实例的 IP。XX.XX.AA
将是 nat-instance 子网的网络。XX.XX.BB.BB
将是私有子网中实例的 IP。XX.XX.BB
将是私有子集的网络。[user_name@ip-XX-XX-AA-AA ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 06:1e:58:67:bb:a9 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-033f1bdf14d0a2f0a
altname device-number-0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:f5:9d:a2:cf brd ff:ff:ff:ff:ff:ff
[user_name@ip-XX-XX-AA-AA ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:51678
DROP all -- !127.0.0.0/8 127.0.0.0/8 ! ctstate RELATED,ESTABLISHED,DNAT
DROP tcp -- anywhere anywhere tcp dpt:51678
DROP all -- !127.0.0.0/8 127.0.0.0/8 ! ctstate RELATED,ESTABLISHED,DNAT
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target prot opt source destination
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
[user_name@ip-XX-XX-AA-AA ~]# tcpdump -n net XX.XX.BB
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), snapshot length 262144 bytes
09:50:12.566281 IP XX.XX.BB.BB > 1.1.1.1: ICMP echo request, id 7, seq 4, length 64
09:50:13.606290 IP XX.XX.BB.BB > 1.1.1.1: ICMP echo request, id 7, seq 5, length 64
09:50:14.646280 IP XX.XX.BB.BB > 1.1.1.1: ICMP echo request, id 7, seq 6, length 64
--- 编辑 --- 添加
tracepath
所需的输出以及驻留在私有子网中的实例的路由表。
[user_name@ip-XX-XX-BB-BB ~]# tracepath 1.1.1.1
1?: [LOCALHOST] pmtu 9001
1: XX.XX.AA.AA 0.986ms asymm 2
1: XX.XX.AA.AA 0.883ms asymm 2
2: no reply
3: no reply
[user_name@ip-XX-XX-BB-BB ~]# ip route
default via XX.BB.BB.1 dev ens5 proto dhcp src XX.XX.BB.BB metric 512
XX.XX.0.2 via XX.XX.BB.1 dev ens5 proto dhcp src XX.XX.BB.BB metric 512
XX.XX.BB.0/24 dev ens5 proto kernel scope link src XX.XX.BB.BB metric 512
XX.XX.BB.1 dev ens5 proto dhcp scope link src XX.XX.BB.BB metric 512
10.42.0.0/24 dev cni0 proto kernel scope link src 10.42.0.1
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
如果路由表看起来不正确,我会使用 AWS 路由表并将 nat-instance 指定为
0.0.0.0/0
的网关
像这样:
在调查和阅读一些帖子后,我发现我忘记允许数据包通过:
iptables -A FORWARD -i ens5 -o ens5 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens5 -o ens5 -j ACCEPT
添加执行这些命令后,私有子网内的实例会收到 ping 响应,并且使用
config.io
和 tracepath
进行快速检查表明它正在使用来自 nat 实例的公共 IP。