Linux设置为虚拟网桥

场景

Dell笔记本电脑通过Buffalo无线路由器来上网。还有一个台式机,不想安装无线网卡,而是通过笔记本电脑来共享网络。可以让笔记本作为一个路由器,让台式机通过笔记本上网。

依赖条件

台式机、笔记本电脑和无线路由器在一个网段,如192.168.2.0/24。

网络结构

配置

笔记本路由:需要指定到台式机的路由。

default via 192.168.2.1 dev wlan0 proto static

169.254.0.0/16 dev eth1 scope link metric 1000

192.168.2.6 dev eth1 scope link

台式机路由:默认路由用192.168.2.1或192.168.2.5都可以。

default via 192.168.2.1 dev eth0 proto static

169.254.0.0/16 dev eth0 scope link metric 1000

192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.6 metric 1

现在,台式机是不能到达192.168.2.1的,通过tcpdump看到ARP不成功。还需要在笔记本上要开ip_forward,以及在笔记本的有线和无线网卡上打开Proxy ARP:

tux@dell:~$ sudo sysctl -a | grep ip_forward

net.ipv4.ip_forward = 1

tux@dell:~$ cat /proc/sys/net/ipv4/conf/eth1/proxy_arp

1

tux@dell:~$ cat /proc/sys/net/ipv4/conf/wlan0/proxy_arp

1

现在台式机就可以访问内网和外网的所有地址了。

如果没有启用Proxy ARP,或者只启用了某一个网卡上的Proxy ARP,那么可能出现台式机能访问互联网却不能访问本地网络的情况。通过tcpdump检查ARP包可以诊断出问题来。

注意

Network Manager v.s. interfaces

对于简单的网络,用NM就够了,但是NM不能胜任对路由、iptables等的设置,还是要用interfaces。我把路由设置用post-up、pre-down等加入到interfaces文件里面,然后在NetworkManager.conf里面启用ifupdown插件,这样NM就可以接管interfaces文件里面的配置了。但是这样还是不能正确设置路由。然后我把NM删除掉,只用interfaces文件。由于Ubuntu 11.10升级后出现的bug,系统启动时候要等待几分钟,也不行。而且用ifup和ifdown的启用interfaces里面的接口时,post-up等语句也没有生效。最后是在/etc/network/if-up.d/目录里面创建了路由设置的脚本搞定的。每次网络恢复后,这个脚本会自动执行,把路由设置好。

内核参数的修改

/proc/sys目录下的内核参数直接修改的话,重启后是不能保存设置的。可以通过sysctl.conf来修改,使参数在下次启动后也生效。但是对于/proc/sys/net/ipv4/conf/wlan0/proxy_arp等带网络接口的参数,我试验了是无效的。原因可能是启动过程内核参数的设置较早,这个时候网络接口还没有启用。可以用

/proc/sys/net/ipv4/conf/all/proxy_arp

来设置所有接口的参数,或者把参数设置的脚本写到/etc/network/if-up.d/目录里面。