将传出的 SOCKS 服务器流量绑定到特定 IP

将传出的 SOCKS 服务器流量绑定到特定 IP

在办公室,我们通过以下命令启动的 SOCKS 服务器访问网络:
ssh localhost -f -N -D *:8888

该服务器有2个IP(但只有一张网卡):
eth0xx.yy.zz.1
eth0:12

因此浏览器配置为使用 socks 代理xx.yy.zz.2:8888

当我检查网站看到的 IP 时,它给出了xx.yy.zz.1(服务器的默认 IP)。
但我希望它是另一个(xx.yy.zz.2)。

我如何将传出连接绑定到第二个 IP?

编辑:
可以用 iptables 解决这个问题吗?
有没有办法判断哪些数据包来自给定的 SSH 隧道,然后修改它们的目标 IP?

编辑2:
我想到了一个另一个想法,是否存在某种包装命令,可以强制另一个命令绑定到给定的 IP?

答案1

SSH 协议无法让客户端在进行动态端口转发时告诉服务器绑定到某个地址,所以您无法告诉 SSH 客户端这样做。您也无法告诉 OpenSSH 服务器这样做。它会盲目地使用来getaddrinfo连接到您的远程主机。

唯一的解决方法是配置服务器,让它按照你的要求运行。不幸的是,你无法从路由或iptablesOpenSSH 服务器建立的连接中判断出来。这个问题很难:OpenSSH 可能会打开连接,但也可能产生一个 shell,该 shell 可以产生其他进程,这些进程也可以打开连接。区分这两种情况很难。如果 OpenSSH 只是设置一个标记或任何东西,那就容易多了,但它没有。

所以你的解决方案是有限的:

  • 使用单独的 SOCKS 服务器,允许您配置绑定地址。

  • 配置您的内核,以便它默认对所有传出连接使用 xx.yy.zz.2,或者对于预先知道的实际目标 IP 使用 xx.yy.zz.2。

    当没有源地址时,为了分配源地址,内核会查看目标地址的已用路由条目,如果它有首选源地址,它将使用它。否则,它将选择一些看起来最适合该任务的地址。它选择的任何地址都可以通过命令ip route get (destination)src令牌后进行检查:

    $ ip route get 8.8.8.8 8.8.8.8 via (maybe your gateway) dev eth0 src xx.yy.zz.1 [...]

    您可以使用命令修改您的路由表ip route以添加首选源地址,ip route change [...] src xx.yy.zz.2您甚至可以添加通过相同网关但具有不同的首选源地址的更多具体路由。

  • 将 OpenSSH 放入仅处理 xx.yy.zz.2 地址的网络命名空间。此解决方案有点过头了,可能会更改服务器上许多服务的配置,因为它实际上隔离了两个地址。此解决方案将涉及系统中的许多更改,尤其是关于 sshd 守护程序和 socks 服务器的启动方式。


与所有这些无关:“接口别名”(例如eth0:1)在 Linux 上已弃用。它们仍可作为历史工具(如)的向后兼容性ifconfig,但您确实应该摆脱它们并使用内核的本机功能来获取每个接口的多个地址。停止使用ifconfigroute而改用ip addrip route

用于ip addr add ... dev eth0向接口添加地址eth0。您可以添加任意数量的地址。用于列出所有地址。请参阅和ip addr的手册页以获取更多信息。ip addrip route

相关内容