我一整天都被这个问题困扰,并且祈祷一些 iptables 专家读到这篇文章并能帮助我。
我想强制我的所有 docker 容器的出站流量都通过袜子5 代理。
这是我最接近的:
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -s 172.20.0.0/16 -p tcp -j DNAT --to-destination 172.17.0.1:12345
iptables -t nat -A OUTPUT -s 172.20.0.0/16 -j REDSOCKS
iptables -t nat -A PREROUTING -s 172.20.0.0/16 -j REDSOCKS
它工作得几乎完美,但是socks5代理无法识别原始IP地址。
远程地址始终为“127.0.0.1”
有什么办法可以保留原始 IP 地址吗?
示例场景
- 我已将上面的 iptables 规则应用到我的 docker 主机
- 我有一个带有地址的 docker 容器
172.20.0.2
- 在该容器内,我对 example.com 进行了卷曲操作
- 流量转发到
172.17.0.1:12345
(docker主机) - 运行的服务器
12345
显示远程 IP 地址为“127.0.0.1” - 我希望远程 IP 地址显示为
172.20.0.2
无论如何,感谢谁可以尝试帮助我解决这个问题。
答案1
从网络角度来看,如果源IP与目标IP相同,就会导致安全问题陆地攻击。
答案2
我已将上面的 iptables 规则应用到我的 docker 主机
在主机上,-t nat -A OUTPUT
重定向主机的出站流量。如果您只想重定向容器的流量,则不需要它。使用-t nat -I PREROUTING
足以重定向容器的流量。
这些是一些你可以尝试的技巧,但不确定。希望能有所帮助:
由于这是主机的 iptables,请尝试修改
-j DNAT --to-destination 172.17.0.1:12345
为-j DNAT --to-destination 127.0.0.1:12345
iptables -I INPUT -j ACCEPT
允许来自容器的输入流量。我猜你的主机不允许,所以原始 IP 始终(且只能是)127.0.0.1ocks5代理?您需要一个代理协议桥才能将socks5 与iptables 结合使用。
container -> host -> redsocks to socks5 bridge -> socks5
最后,如果还是不行,可能是linux在NAT上的bug,就像我遇到的那样这里。我升级 Linux 后这个问题就解决了。我不知道,只是猜测