现在有一个两块网卡的电脑,我想让一个程序使用有线网卡访问网络,但是他一直通过无线网卡连接,用什么办法可以做到不让这个程序使用指定的网卡?
使用的发行版是ubuntu,两块网卡都是可以访问外网的,而且确实需要两块网卡都访问外网,所以不能简单的禁用某一块网卡。
eth0 Link encap:以太网 硬件地址 ac:16:2d:0b:0f:7b
inet6 地址: 2001:250:1006:5090:ae16:2dff:fe0b:f7b/64 Scope:Global
inet6 地址: fe80::ae16:2dff:fe0b:f7b/64 Scope:Link
inet6 地址: 2001:250:1006:5090:5125:3dce:2e39:3435/64 Scope:Global
inet6 地址: 2001:250:1006:5090:3986:8f63:3bc4:ed62/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:689138 错误:5 丢弃:96 过载:0 帧数:3
发送数据包:70167 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:96407419 (96.4 MB) 发送字节:12030321 (12.0 MB)
中断:20 Memory:fb100000-fb120000
eth0:avahi Link encap:以太网 硬件地址 ac:16:2d:0b:0f:7b
inet 地址:169.254.4.53 广播:169.254.255.255 掩码:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
中断:20 Memory:fb100000-fb120000
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 跃点数:1
接收数据包:18101 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:18101 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:1755000 (1.7 MB) 发送字节:1755000 (1.7 MB)
virbr0 Link encap:以太网 硬件地址 26:cd:4d:24:53:90
inet 地址:192.168.122.1 广播:192.168.122.255 掩码:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 跃点数:1
接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:0 (0.0 B) 发送字节:0 (0.0 B)
wlan0 Link encap:以太网 硬件地址 00:1d:0f:31:49:9c
inet 地址:192.168.1.102 广播:192.168.1.255 掩码:255.255.255.0
inet6 地址: fe80::21d:fff:fe31:499c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:544819 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:305276 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:481549142 (481.5 MB) 发送字节:54082231 (54.0 MB)
这个程序用 TCP/IP 协议和外部通信时, 用哪个网卡, 服务端的话是由 bind() 的参数决定的. 你可以把套接字绑定到你指定的 ip 地址和端口上. 如果你的 IP 地址指定的是 htonl(INADDR_ANY), 就由内核去选择 IP 地址. 如果你有这个程序的源码的话, 你可以通过自己指定套接字绑定的 IP 地址来实现你的需求. 如果是客户端, connect() 前一般不调用 bind(), 由内核确定使用哪块网卡. 内核如何选择网卡, 是由你的程序连接的目的地址和路由表决定的. linux 下, 你可以通过 route 等工具配置哪些地址段使用哪个网卡, 这并不是为一个程序所指定的, 而是对每一个连接都生效的. 具体你可以搜索下多网卡的路由配置方法.
除了利用 LD_PRELOAD 来 hack 程序外,我能想到的另一个方案是,建立一个新的网络名字空间(参见unshare(2)
),在那个名字空间里建立一块虚拟网卡来进行网络通信。然后,利用 iptables 将所有来自那个虚拟网卡的流量重定向到你指定的网卡上。
理论上可行,但是我也不知道虚拟网卡那块怎么搞……
通常情况,非特殊程序联网,不会指定使用有线还是无线网卡,更不会指定用哪个网卡。假如同时有两块网卡(笔记本就有无线有无线两块),在有线和无线都连上的情况下,使用哪个网线上网,是系统决定的,如果用户自己没对此时行特别设置的话,系统会默认使用有线的。如果你正在使用有图形界面的Linux,在托盘的网络图标就可以设置,把无线网卡禁掉。如果非图形界面,你要告诉大家你是用什么发行版的Linux,假设你两个网卡都可以联网了,那就试下在终端打入以下命令来禁无线网卡: ifconfig wlan0 down 如果执行完后,程序无法联网,就说明你的有线网卡没配置好,你要给大家提供更多的信息,比如可以打入: ifconfig -a 把输出粘上来给大家看。