ssh localhost -f -N -D *:8888.
此服务器有2个IP(但只有一个网卡):
eth0 xx.yy.zz.1
eth0:1 xx.yy.zz.2
因此浏览器配置为使用socks代理xx.yy.zz.2:8888
当我检查网站看到的IP是什么时,它会给我xx.yy.zz.1(服务器的默认IP).
但我希望它是另一个(xx.yy.zz.2).
如何将传出连接绑定到第二个IP?
编辑:
这可以用iptables解决吗?
可能有一种方法可以判断哪些数据包来自给定的SSH隧道,然后修改其目标IP?
EDIT2:
我想到的另一个想法是,是否有某种包装命令强制另一个命令绑定到给定的IP?
解决方法
唯一的解决方法是配置您的服务器,使其达到您想要的效果.不幸的是,你无法从路由或iptables告诉OpenSSH服务器建立了什么连接.问题很难:OpenSSH可能会打开连接,但也可能产生一个shell,它可以产生其他进程也可以打开连接.区别于这两个案例很难.如果OpenSSH只是设置一个标记或任何东西会更容易,但事实并非如此.
所以你的解决方案有限:
>使用单独的SOCKS服务器,允许您配置绑定地址.
>配置内核,使其默认使用xx.yy.zz.2进行所有传出连接,或者预先知道所使用的实际目标IP.
要在没有源地址时分配源地址,内核会查看目标地址的已使用路由条目,如果它具有首选源地址,它将使用它.否则,它会选择一些最适合该任务的地址.无论选择什么,都可以在src令牌之后通过ip route get(destination)命令进行检查:
$ip route get 8.8.8.8
8.8.8.8 via(也许是你的网关)dev eth0 src xx.yy.zz.1
[…]
您可以使用ip route命令修改路由表,以使用ip route change […] src xx.yy.zz.2添加首选源地址.您甚至可以通过相同的网关添加更具体的路由,但使用不同的路由首选源地址.
>将OpenSSH放入仅处理xx.yy.zz.2地址的网络命名空间.这种解决方案有点过分,可能会更改服务器上许多服务的配置,因为它实际上隔离了您的两个地址.此解决方案将涉及系统中的许多更改,尤其是有关sshd守护程序和socks服务器启动方式的更改.
与所有这些无关:在Linux上不推荐使用“接口别名”(例如eth0:1).它们仍然可以作为ifconfig等历史工具的向后兼容性,但你应该真正摆脱它们并使用内核的本机功能来获得每个接口的多个地址.停止使用ifconfig,路由并使用ip addr和ip route代替.
使用ip addr add … dev eth0为eth0接口添加地址.您可以根据需要添加任意数量的地址.使用ip addr列出所有内容.有关详细信息,请参阅ip addr和ip route的手册页.