这与某种程度上与更改界面相关的做whois
不同之处在于我想知道是否可以为特定程序指定默认接口 – 而不是系统范围。 例如:假设我的服务器有几个IP地址。 我想运行程序X(比如说wget),我希望它使用我的一个IP作为源地址。 它看起来像这样:
theprogram --use-interface=1.2.3.4 wget google.com
而wget会使用我的IP 1.2.3.4连接到google.com并获取html。 可能吗?
这里的人们有一些build议一些可行的select你想要做什么。 路由和源NAT可以提供帮助,但是可能解决或者可能解决不了你想要解决的问题。
如果你愿意多花一点钱,你可以按照你的要求去做。 您可以通过LD_PRELOAD使用函数插入的魔术来用您select的代码包装bind()系统调用。
以下页面提供了有关此解决scheme的更多详细信息:
这只会在你所运行的代码不是 SUID的情况下才起作用(由于安全原因SUID / SGID程序不能用LD_PRELOAD修改)。
用wget你可以使用–bind-address
否则,我认为你需要为目标IP地址指定一个路由,或者如果有决定绑定/源地址的方法,请查看你正在使用的程序。
许多,但绝不是所有的程序都可以select绑定到一个特定的地址。 有些像wget(正如fbh指出的那样)有一个命令行选项来指定要绑定的地址。 许多类似于服务器的程序(如apache和squid)在其configuration文件中控制这些程序。 它总是会是特定于程序的。
对于不支持绑定到特定地址的程序,您的选项可能会受到更多限制,具体取决于您正在处理的程序types。
对于服务器程序(接受传入连接),通常可以通过侦听所有地址(通常是默认值)来完成同样的事情,然后使用iptables或外部路由器来防护其他地址。
棘手的是出站连接。 在这里,你需要更多的东西在你的问题中链接到的答案中描述。 问题在于它依赖于目标地址,而不是源程序。
你可以用iptables和SNAT规则来完成你想要的。
iptables -A POSTROUTING -p tcp --dport 80 -j SNAT --to-source 1.2.3.4
这个iptables规则(我还没有testing过) 应该改变任何stream量到80端口的源地址。如果你需要tcp和udpstream量相同的行为,你需要创build两个规则, p tcp'和'-p udp'。