Traceroute 有一个-i
标志,
-i
接口,--interface=interface
指定traceroute 应通过其发送数据包的接口。默认情况下,根据路由表选择接口。
ping
还提供了这个-I
。 Netcat 没有这样的标志。有一个简单的解决方法吗nc
?
答案1
一个很好的解决方法网猫:socat
。这个工具可以做任何事网猫可以做的,还有更多。
在Linux上socat
提供了与socket选项so-bindtodevice=
相匹配的选项SO_BINDTODEVICE
。
例如,监听绑定到接口的 tcp 端口 4444veth0(强制操作系统使用与此接口相关的路由),其他选项类似于使用(OpenBSD 变体)nc -k -l -p 4444
:
socat tcp4-listen:4444,so-bindtodevice=veth0,reuseaddr,fork -
例如可以这样检查:
$ ss -tln sport == 4444
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 0.0.0.0%veth0:4444 0.0.0.0:*
如果需要的话,也可以作为客户端绑定,或者如果使用两个套接字作为参数,甚至可以以不同的方式绑定到左侧套接字和右侧套接字。
如果知道在其他类似 *NIX 的操作系统上有其他等效的套接字选项可以实现相同的功能,并且socat
没有明确实现它,那么仍然可以使用通用setsockopt
和setsockopt-listen
选项来激活它(在从足够的常量中检索足够的常量之后)包括文件)。