示例场景

示例场景

我一整天都被这个问题困扰,并且祈祷一些 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 地址吗?

示例场景

  1. 我已将上面的 iptables 规则应用到我的 docker 主机
  2. 我有一个带有地址的 docker 容器172.20.0.2
  3. 在该容器内,我对 example.com 进行了卷曲操作
  4. 流量转发到172.17.0.1:12345(docker主机)
  5. 运行的服务器12345显示远程 IP 地址为“127.0.0.1”
  6. 我希望远程 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.1

  • ocks5代理?您需要一个代理协议桥才能将socks5 与iptables 结合使用。

    container -> host -> redsocks to socks5 bridge -> socks5
    
  • 最后,如果还是不行,可能是linux在NAT上的bug,就像我遇到的那样这里。我升级 Linux 后这个问题就解决了。我不知道,只是猜测

相关内容