在办公室,我们可以通过一个SOCKS服务器访问networking,该服务器使用以下命令启动:
ssh localhost -f -N -D *:8888 。
该服务器有2个IP(但只有一个网卡):
eth0 xx.yy.zz.1
eth0:1 xx.yy.zz.2
所以浏览器被configuration为使用socks代理xx.yy.zz.2:8888
当我检查网站看到的IP时,它给了我xx.yy.zz.1 (服务器的默认IP)。
但我希望它是另一个(xx.yy.zz.2)。
如何将传出连接绑定到第二个IP?
编辑:
这可以用iptables解决吗?
可能有一种方法可以告诉哪些数据包来自给定的SSH隧道,然后修改其目标IP?
EDIT2:
还有一个想法,是否有某种包装命令强制另一个命令绑定到一个给定的IP?
在进行dynamic端口转发时,SSH协议无法让客户端通知服务器绑定到某个地址,因此不能,您不能告诉SSH客户端执行此操作。 你不能告诉OpenSSH服务器也这样做。 它会盲目地使用getaddrinfo连接到您的远程主机。
唯一的解决办法就是configuration你的服务器,使其达到你想要的。 不幸的是,你无法从路由或iptables知道哪个连接是由OpenSSH服务器完成的。 问题很难:OpenSSH可能会打开连接,但也可能产生一个可以产生其他进程的shell,也可以打开连接。 区分这两种情况是困难的。 如果OpenSSH只设置一个标记或者任何东西,那将会容易得多,但事实并非如此。
所以你的解决scheme是有限的
使用一个单独的SOCKS服务器,允许您configuration绑定地址。
configuration你的内核,以便默认使用xx.yy.zz.2作为所有的出站连接,或者如果事先已知的话使用实际的目标IP地址。
要在没有地址的情况下分配一个源地址,内核将查找用于目标地址的已使用的路由条目,并且如果它有一个首选的源地址,它将使用它。 否则,它会select一些最适合该任务的地址。 无论它select什么,都可以通过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添加首选的源地址ip route change [...] src xx.yy.zz.2您甚至可以通过相同的网关添加更具体的路由,但使用不同的路由首选的源地址。
将OpenSSH放入只处理xx.yy.zz.2地址的networking命名空间。 这种解决方法是过度的,可能会改变你的服务器上的许多服务的configuration,因为它实质上隔离你的两个地址。 这个解决scheme将涉及到你的系统的许多变化,特别是关于sshd守护进程和你的socks服务器的启动方式。
与所有这一切无关:在Linux上不推荐使用“interfaces aliases”(例如eth0:1 )。 它们仍然可以作为ifconfig等历史工具的向后兼容性,但是您应该真正摆脱它们,并使用内核的本地function来获取每个接口的多个地址。 停止使用ifconfig , route并改用ip addr和ip route 。
使用ip addr add ... dev eth0将地址添加到eth0接口。 您可以根据需要添加任意数量的地址。 使用ip addr列出全部。 请参阅ip addr和ip route的手册页以获取更多信息。