pts*_*pts 3 iptables localhost dnat
我想在 Linux 3.x(当前为 3.2.52,但我可以根据需要升级)上设置从 127.0.0.1、端口 4242 到 11.22.33.44、端口 5353 的 TCP DNAT。
看起来简单的 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-j REDIRECT更改为 11.22.33.44,并且无法更改 IP 地址。
小智 6
这对我有用,从localhost:8081to路由流量172.17.0.1:80,其中172.17.0.1名为docker0.
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
Run Code Online (Sandbox Code Playgroud)
难题的一个关键部分是MASQUERADE规则。
进一步的灵感:
小智 5
您必须运行以下三个命令才能使其工作:
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
Run Code Online (Sandbox Code Playgroud)
这是详细的解释。
第一个命令将按预期执行 DNAT。但是,如果您尝试仅使用此规则集捕获数据包,您会发现您一无所获:
tcpdump -i any -n port 5353
Run Code Online (Sandbox Code Playgroud)
这是因为linux内核默认丢弃这种包,如果包的127.0.0.0/8一端是外部IP地址,另一端是外部IP地址。
第二个命令改变内核参数,让这种数据包通过(当然,你应该相应地改变eth0)。在此之后,当您在 eth0 上捕获数据包时,您将看到发送出去的数据包,但带有源地址127.0.0.1和目标地址11.22.33.44。无论这个数据包能否到达目标服务器(中间路由器都会丢弃这个数据包),这个数据包是没有办法返回的。所以你应该添加一个SNAT规则,将源地址更改为你的 eth0。现在它应该可以工作了。
| 归档时间: |
|
| 查看次数: |
6100 次 |
| 最近记录: |