操作系统
Ubuntu 16.04
NetworkManager
Ubuntu16.04的网络配置由NetworkManager托管,有可视化界面方便用户操作,如下图。
Networking
除了NetworkManager配置网络,还有一种networking也可以配置,但是会和NetworkManager打架,所以首先禁用NetworkManager。
配置Networking流程大致是:
首先禁用Network Manager;
然后配置文件,如/etc/network/interfaces;
最后重启网络服务。
禁用Network Manager
systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
删除avahi-daemon和avahi-autoipd
彻底删除avahi-daemon和avahi-autoipd。这两个包是兼容苹果系统的自动网络发现服务,会干扰传统的dhcp运作。
sudo apt-get purge avahi-daemon avahi-autoipd // 注意不是apt-get remove而是apt-get purge,删除后需要重启。
interfaces与networking服务本质
interfaces路径:/etc/network/interfaces,是网络配置文件。
networking服务:系统启动、系统关闭和网线插拔时起作用。
比如这样一个interfaces文件:
#interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet dhcp
auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.56.111
gateway 192.168.56.2
dns-nameserver 8.8.8.8
dns-nameserver 192.168.56.254
第一行就提示我们,这个文件是与ifup/ifdown文件相配合的。
ifup与ifdown文件是用来手动启动或关闭某个网络接口的。
interfaces文件中,以下这几行是直接被ifup与ifdown文件使用的。
iface lo inet loopback
iface enp0s3 inet dhcp
iface enp0s8 inet static
address 192.168.56.111
gateway 192.168.56.2
dns-nameserver 8.8.8.8
dns-nameserver 192.168.56.254
而以下几行与Networking服务配置使用:
auto lo
auto enp0s3
allow-hotplug enp0s3
auto enp0s8
allow-hotplug enp0s8
Networking服务在系统启动、系统关闭和网线插拔时起作用。
在系统启动,会自动用ifup/ifdown去控制写了auto [...]的接口。
在网线插拔中,会自用调用ifup/ifdown去控制写了allow-hotplug [...]的接口。
因此,可以也可以不用restart networking,而是使用ifup/ifdown进行细粒度控制。
Networking配置
查看网口
接来下的配置都是针对网口,所以需要知道有哪些网口,网口名通常为eth0或者enp0s3,如果是无线网口名可能为wlan0。
ls /sys/class/net
ip addr
热插拔网口
sudo ifdown enp0s3 // 类似于拔下enp0s3的网线
sudo ifup enp0s3 // 类似于插上enp0s3网线
sudo ifdown -a // 类似于拔下所有网线
sudo ifup -a // 类似于插上所有网线
配置interfaces
文件路径:/etc/network/interfaces
#interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto enp0s3 // 在系统启动,会自动用ifup/ifdown去控制写了auto […]的接口
allow-hotplug enp0s3 // 在网线插拔中,会自用调用ifup/ifdown去控制写了allow-hotplug […]的接口
iface enp0s3 inet dhcp // 1.dhcp设置,自动获取ip
auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet static // 2.静态ip设置
address 192.168.56.111
#gateway 192.168.56.2 // 如果和dhcp的gateway冲突,就把这行删除
dns-nameserver 8.8.8.8 // 3.dns设置,生效后在/etc/resolv.conf会追加
dns-nameserver 192.168.56.254
bridge配置
网桥模式可以把两个不同网口的子网组合在一起,对外看上去好像是一个子网,所以也叫透明模式。
bridge配置依赖bridge-utils工具。
安装bridge-utils
sudo apt-get install bridge-utils
配置
配置1:br0只配置enp0s3
该配置在虚拟机上测试的。
#interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
#auto enp0s3
#iface enp0s3 inet dhcp
auto br0
iface br0 inet dhcp
bridge_ports enp0s3 // enp0s3的配置删除或注释
bridge_fd 5
bridge_stp off
enp0s3是连接的外网。
配置bridge后:
1.保留enp0s3设置,重启服务成功,ifconfig:既有enp0s3也有br0;ip route:enp0s3和br0是一样的;dns是enp0s3的dhcp分配的,但是不能上网。
2.删除enp0s3设置,重启服务成功,ifconfig:既有enp0s3也有br0;ip route:enp0s3和br0是一样的;dns是enp0s3的dhcp分配的,并且可以上网,但是网速慢。
3.删除enp0s3设置,重启电脑后,ifconfig:enp0s3没有ip地址,br0分配了ip地址;ip route:只有br0的;dns是dhcp分配的,可上网,网速快。
结论:bridge连接的网口enp0s3的配置应该删除,然后重启电脑ifconfig才生效。
配置2:dhcp配置:br0连接两个网口
该配置在虚拟机上测试的。
#interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports enp0s3 enp0s8 // 默认是enp0s8优先级更高
bridge_fd 5
bridge_stp off
#bridge_portprio enp0s3 129 // 可通过优先级属性设置哪个网口的优先级高
enp0s3是连接的外网,enp0s8是内网。
配置bridge后:
1.bridge_ports enp0s3 enp0s8,重启服务后,enp0s8优先级高,所以ifconfig:显示的是enp0s8 dhcp分配的ip地址;ip route:只有enp0s8分配的路由;dns:空,所以不能上网。
2.bridge_ports enp0s8 enp0s3,重启服务后,enp0s3优先级高,所以ifconfig:显示的是enp0s3 dhcp分配的ip地址;ip route:只有enp0s3分配的路由;dns:有,所以能上网。
3.bridge_portprio enp0s3 129,默认优先级是128,所以设置enp0s3优先级为129,那所有的现象就和2一样了。
结论:配置多个网口的bridge,一定要清楚优先级顺序。
配置3:静态配置:br0连接2个网口
该配置在工控机测试的。
#interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
bridge_ports enp3s0 enp4s0
bridge_fd 5
bridge_stp off
bridge_maxwait 0
address 192.168.40.2
netmask 255.255.255.0
dns-nameserver 192.168.40.9
post-up route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.40.1 // 静态路由
配置bridge后,拿两台电脑,一台连enp3s0口,另一台连enp4s0口,两台电脑配置的ip地址都是40网段,比如192.168.40.10和192.168.40.11。
1.两台电脑能相互ping通。
2.两台电脑ping bridge,即192.168.40.2,也能ping通。
配置4:手动配置:br0连接2个网口
该配置在工控机测试的。配置完后br0没有分配地址,这是最简单的配置。
#interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto br0
iface br0 inet manual
bridge_ports enp3s0 enp4s0
bridge_fd 5
bridge_stp off
bridge_maxwait 0
配置bridge后,拿两台电脑,一台连enp3s0口,另一台连enp4s0口,两台电脑配置的ip地址都是40网段,比如192.168.40.10和192.168.40.11。
1.两台电脑能相互ping通。
设置bridge命令
设置bridge连接网口
brctl addbr br0 #创建网桥
brctl addif br0 enp0s3 // 网口
brctl addif br0 enp0s8
设置bridge具体信息
ifconfig br0 XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX up // bridge ip
route add default gw XXX.XXX.XXX.XXX // bridge 路由网关
若ifconfig后没有br0信息,手动加载
ifup enp0s3
ifup enp0s8
ifup br0
重启服务
sudo systemctl restart networking
sudo /etc/init.d/networking restart
通过以上多种配置和实验,证明重启系统生效更彻底。
那我们在完成功能开发的时候,不可能每次文件配置(interfaces)之后,要求用户重启系统来让网络配置彻底生效。
所以我的解决办法是,通过ip命令配置立即生效(ip命令配置是临时的,重启系统之后会丢失,所以再配合文件配置),同时文件配置(interfaces)永久生效。
想知道ip命令如何配置请看《ip命令配置网络和网桥》,移步https://www.jianshu.com/p/26b4db8b1706。
错误日志
重启不一定会成功,查看报错日志很重要。
systemctl status networking.service // 显示执行过程
journalctl -xe // 更详细的执行过程
查看配置是否生效
所谓网络配置,可细分为三类:
A:接口的IP配置,即ifconfig显示的IP地址、子网掩码。
B:路由配置,即route中显示的默认网关。
C:域名解析配置,即/etc/resolv.conf中的域名服务器信息。
分别对应如下命令查看:
ifconfig
ip route
cat /etc/resolv.conf