在 AWS 中,我们在同一个子网/VPC 中有 3 个实例。我们希望客户端实例向第二个分析实例发出 DNS 请求,然后该分析实例将请求转发到运行 DNS 服务的第三个实例。然后 DNS 服务应向分析实例提供响应,然后分析实例应响应客户端。
目的是为了让分析实例可以拦截客户端和 DNS 实例之间的流量以进行分析。
客户端实例 -> 分析实例(NAT) -> DNS实例
当前设置允许客户端实例通过分析实例向 DNS 实例发送 DNS 请求。DNS 实例会响应分析实例,tcpdump
但客户端实例永远不会收到来自分析实例的响应。
我们在 AWS 中对执行 NAT 的分析实例进行了源/目标检查,并且已关闭。
我们首先在分析实例上启用转发:
sudo sysctl -w net.ipv4.ip_forward=1
然后我们将以下 IPTables 规则添加到分析实例
sudo iptables -A FORWARD -p udp --dport 53 -d 192.168.1.151 -j ACCEPT
sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.151
sudo iptables -t nat -A POSTROUTING -d 192.168.1.151 -s 192.168.1.156 -p udp --dport 53 -j SNAT --to 192.168.1.213
还尝试了其他POSTROUTING
规则,例如:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -p udp -d 192.168.1.151 --dport 53 -j SNAT --to-source 192.168.1.213
sudo iptables -t nat -A POSTROUTING -p udp -d 192.168.1.151 --dport 53 -j MASQUERADE
所有这些结果都一样,客户端实例从未收到 DNS 答复。想想是什么可能阻止分析实例返回响应?
答案1
问题是 FORWARD 链不允许返回流量,因此需要以下规则:
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
完整的解决方案如下:
sudo iptables -A FORWARD -p udp --dport 53 -d 192.168.1.151 -j ACCEPT
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.151
sudo iptables -t nat -A POSTROUTING -p udp --dport 53 -j SNAT --to 192.168.1.213