我遵循了这个答案:将所有非本地流量重定向到袜子代理
root@xxx:~# cat /proc/sys/net/ipv4/ip_forward
1
root@xxx:~# netstat -tapln | grep :4545 | grep LISTEN
tcp 0 0 127.0.0.1:4545 0.0.0.0:*
当我通过curl连接socks5时,端口工作正常:
root@xxx:~# curl -x socks5h://127.0.0.1:4545 ifconfig.co
1.2.3.4
当我运行启用 iptables 规则时,我看到我的计算机的 IP:
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports 4545
root@xxx:~# curl ifconfig.co
9.8.7.6
然而,第4545端口是socks5代理。它应该可以工作。
我不明白那里出了什么问题。
我尝试使用 FoxyProxy。效果很好。但我想通过socks5proxy重定向所有流量。我该怎么做?
PS:我的 iptables 中没有任何 DROP/REJECT 规则。我只有这 3 条规则。
答案1
首先:SOCKS 代理还必须能够在某种透明模式下工作(即:它不会接收使用 SOCKS 协议的请求,但必须使用边带信息来自iptables
'REDIRECT
行动)。这您链接的问答告诉同样的:
根据这些规则,请求到达的端口必须有配置良好的“东西”才能正常工作。
因此,不要指望此解决方案的功能超出您的要求:将所有内容重定向到 SOCKS 代理。
您缺少的是您正在从运行的主机进行测试iptables
REDIRECT
。这意味着它不是本地传出流量的路由器,因此PREROUTING
永远不会调用该链。
你必须使用(或另外)的是nat/OUTPUT
链(但请参阅后面描述的附加问题):
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports 4545
如果您单独尝试此操作,则会出现一个循环:SOCKS 代理(假设它确实能够透明地工作,请参见上文)现在将重定向到其自身,并且不会发生任何情况。避免这种情况的最简单方法是让代理与专用用户或组一起运行以进行例外处理。因此,我们假设代理以 user ... 身份运行proxy
,将上面的内容替换为:
iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy -j REDIRECT --to-ports 4545
和/或您也可以选择不重定向 root 用户,例如还添加此异常前(因此-I
这里)前一行:
iptables -t nat -I OUTPUT -p tcp -m owner --uid-owner root -j RETURN
最后备注:REDIRECT
已被废弃,取而代之的是TPROXY
, 但它的使用有点棘手并且仍然需要透明代理的(不同的)支持。