我想在Linux3.x上设置一个TCP DNAT,从127.0.0.1,端口4242到11.22.33.44,端口5353 (目前是3.2.52,但如果需要的话,我可以升级)。
看起来简单的DNAT规则设置不起作用,telnet 127.0.0.1 4242在Trying 127.0.0.1...中挂了一分钟,然后超时。可能是因为内核丢弃了返回的数据包(例如SYN+ACK),因为它认为它们是火星人。我不需要解释为什么简单的解决方案不能工作,我需要一个解决方案,即使它很复杂(例如,它涉及创建可能的规则)。
我可以从127.0.0.0/8网络之外的另一个本地IP地址建立一个通常的DNAT,但现在我需要127.0.0.1作为目标地址。我知道我可以设置一个用户级的端口转发过程,但是现在我需要一个可以使用iptables建立的解决方案,而不需要辅助进程。
我在谷歌上搜索了一个小时。它被问了多次,但我找不到任何可行的解决办法。
还有很多关于DNAT到127.0.0.1的问题,但我不需要,我需要的正好相反。
请注意,单个iptables -j REDIRECT规则不起作用,因为我需要将传出数据包的IP地址从127.0.0.1更改为11.22.33.44,而-j REDIRECT不能更改IP地址。
发布于 2016-03-30 16:33:51
这对我来说是可行的,将流量从localhost:8081路由到172.17.0.1:80,其中172.17.0.1是桥接口docker0后面的一个veth。
sysctl -w net.ipv4.conf.docker0.route_localnet=1
iptables -t nat -A OUTPUT -o lo -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.17.0.1:80
iptables -t nat -A POSTROUTING -o docker0 -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE拼图的一个关键部分是MASQUERADE规则。
进一步的启示:
发布于 2018-04-12 09:54:47
您必须运行以下三个命令才能使其工作:
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 4242 -j DNAT --to 11.22.33.44:5353
sysctl -w net.ipv4.conf.eth0.route_localnet=1
iptables -t nat -A POSTROUTING -p tcp -s 127.0.0.1 -d 11.22.33.44 --dport 5353 -j SNAT --to $your-eth0-ip这是详细的解释。
第一个命令将按预期执行DNAT。但是,如果您试图捕获只有此规则集的数据包,您将发现您没有得到任何信息:
tcpdump -i any -n port 5353这是因为linux内核默认丢弃这类数据包,如果数据包的一端是127.0.0.0/8,另一端是外部ip地址。
第二个命令更改内核参数,让这类数据包传递(当然,您应该相应地更改eth0 )。在此之后,当您在eth0上捕获数据包时,您将看到发送出去的数据包,但其中包含源地址127.0.0.1和目标地址11.22.33.44。无论此数据包能否到达目标服务器(中间路由器将丢弃此数据包),此数据包都无法返回。因此,您应该添加一个SNAT规则,将源地址更改为您的eth0's。现在,它应该可以工作了。
发布于 2013-11-07 22:09:32
你需要这样吗?无法在本地主机上工作的iptables端口重定向
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 443 -j REDIRECT --to-ports 8080阿德里安
https://serverfault.com/questions/551487
复制相似问题