因此,我们不关心“为什么”,更关心“如何”,我想看看是否有人知道我哪里出了问题。
基本上,我想转发所有发往 IP 上端口 80 的数据包,该 IP 已别名为环回设备 (169.254.169.254),以便转发到另一个 IP 上的端口 8080,该 IP 恰好是该 IP 的公共 IP同一个盒子(我们将使用 1.1.1.1 来解决这个问题)。在这样做时,我应该[表面上]能够运行
telnet 169.254.169.254 80
并达到 1.1.1.1:8080,但是,这并没有发生。
这是我在 iptables 中的 nat 表:
~# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 66 packets, 3857 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 169.254.169.254 tcp dpt:80 to:1.1.1.1:8080
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
我错过了什么吗?我已经遵循了 iptables 手册页以及下面的链接中的大部分信息,但是,在我的 telnet 尝试期间仍然收到“连接被拒绝”的消息。我尝试添加~#iptables -t nat -A POSTROUTING -j MASQUERADE
到我的 iptables,但无济于事:/
如果有人能指出我正确的方向,那就太棒了!
http://linux-ip.net/html/nat-dnat.html
https://www.frozentux.net/iptables-tutorial/chunkyhtml/x4033.html
编辑 我想补充一点,我确实启用了以下 sysctl 参数~# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
编辑2号 我能够通过将规则添加到 nat 表中的 OUTPUT 链(而不是我最初尝试的 PREROUTING 链)来解决此问题。
答案1
实际上,我通过确保内核模块“br_netfilter”已加载到主机上来实现此工作。事情就是这么简单,在被困了这么久之后,简单得令人恼火。
引导我找到解决方案的文档/文章:
1)
https://github.com/omribahumi/libvirt_metadata_api和https://thewiringcloset.wordpress.com/2013/03/27/linux-iptable-snat-dnat/
请参阅“设置 iptables”部分 – 我使用“DNAT”而不是“REDIRECT”,因为“REDIRECT”只是将流量重定向到本地系统上的接口,而不是像目标 NAT 那样转发到已删除的地址。
2)
https://serverfault.com/questions/179200/difference-beetween-dnat-and-redirect-in-iptables和https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html
帮助我理解 REDIRECT 和 DNAT 之间的区别,如上所述。
3)
https://github.com/omribahumi/libvirt_metadata_api/pull/4/files
这次提交使我找到了实际的解决方案(上述事情我之前已经做过,但没有成功)。
答案2
您应该将其放入链dnat
中,OUTUPT
因为本地生成的数据包不会通过 PREROUTING 链。