在实际现场遇到这样一个问题,双网卡添加多路由静态路由持久化的问题,后来经过尝试,最终使用一种比较挫的办法解决了,但我认为只是一个临时解决方案,这里暂时补录于下,下次再出现问题用于回朔。
一.问题:
客户现场的网络有一定限制,外网网段为:192.168.0.*网段,内网为 192.168.12.*网段,但内网需要和另外两台机器(192.168.104.198、192.168.254.111)互通,配置成 static ip_address=192.168.12.22/16 或者 static ip_address=192.168.12.22/8,结果并不生效;子网wlan限制比较麻烦;
而在树莓派上面配置的网络情况如下:
interface eth1static ip_address=192.168.12.22/24static routers=192.168.12.1interface eth2static ip_address=192.168.0.113/24static routers=192.168.0.1static domain_name_servers=192.168.0.1
网络重启之后,可见结果如下:
eth1 Link encap:Ethernet HWaddr 00:0e:c6:cc:2f:74 inet addr:192.168.12.22 Bcast:192.168.12.255 Mask:255.255.255.0 inet6 addr: fe80::7c6e:1e5d:52f0:7ec/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:635257 errors:0 dropped:0 overruns:0 frame:0 TX packets:692 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:53507871 (51.0 MiB) TX bytes:106496 (104.0 KiB)eth2 Link encap:Ethernet HWaddr 00:9a:9b:96:6a:a5 inet addr:192.168.0.113 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::3145:4033:dc2e:3588/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:296807 errors:0 dropped:3761 overruns:0 frame:0 TX packets:80909 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:17482980 (16.6 MiB) TX bytes:40364469 (38.4 MiB)
二.处理办法
尝试了如下解决办法:
1.直接修改/etc/dhcpcd.conf的配置信息:static ip_address=192.168.12.22/16 或者 static ip_address=192.168.12.22/8;
结果:不生效;
2.手动添加路由:
sudo route add -net 192.168.104.0/24 gw 192.168.12.1 eth1sudo route add -net 192.168.254.0/24 gw 192.168.12.1 eth1sudo route add default gw 192.168.0.1
添加之后,可见网络连通;
将这些内容写在 /etc/rc.local中,可见并无效果。
手动强制source:
sudo -s source /etc/rc.local
结果OK!
3.或者直接添加192.168.0.0网段,并编写配置开机启动脚本:
sudo route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.12.1 dev eth1
但是我们还需要能够自动添加,开机启动就增加,而不是需要每次人工去启动,于是增加在 /etc/rc.local中。
/sbin/route add -net 192.168.104.0/24 gw 192.168.12.1 eth1/sbin/route add -net 192.168.254.0/24 gw 192.168.12.1 eth1/sbin/route add default gw 192.168.0.1
但是重启之后,却并没有生效,持久化有问题,得继续处理。
开机启动脚本:
#! /bin/sh### BEGIN INIT INFO# Provides: rc.local# Required-Start: $all# Required-Stop:# Default-Start: 2 3 4 5# Default-Stop:# Short-Description: Run /etc/rc.local if it exist### END INIT INFOPATH=/sbin:/usr/sbin:/bin:/usr/bin. /lib/init/vars.sh. /lib/lsb/init-functionsdo_start() { if [ -x /etc/rc.local ]; then [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)" sudo -s source /etc/rc.local ES=$? [ "$VERBOSE" != no ] && log_end_msg $ES return $ES fi}case "$1" in start) do_start ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop|status) # No-op exit 0 ;; *) echo "Usage: $0 start|stop" >&2 exit 3 ;;esac
然后加入chkconfig中
sudo chkconfig --add netmu
重启之后,还是存在问题。
经过查询,问题在于树莓派Jessie版本有一定问题导致 /etc/rc.local不生效(可以参见 )
在这篇文章()中提到:
Be aware that the latest version of Raspbian Jessie (12/30/2016) contains a flaw in the second line of the interfaces file. The second line is missing the leading # symbol to designate the line as a comment. This problem causes the interfaces file to be unreadable by the system. I spent many hours trying to get my wifi to work before I found this error.
To fix it, simply add a # symbol to the start of the line.
这篇文章中()提到了:
需要配置dns之类信息,但其实我们之前早已做了配置。这些解释对有需要的人可以在读一读:
- interface = the name of the network connection; this should be either eth0 or wlan0 for 99% of us home users
- static ip_address = the address you want to force your Pi to use. It is unknown to me why we put the /24 at the end there. Maybe some kind soul can ELI5 in the comments here.
- static routers = your gateway / router on the LAN the Pi will connect to.
- static domain_name_servers = the DNS server you want the Pi to connect to when it can’t resolve a network address. 8.8.8.8 is the free Google DNS server but use whatever you prefer there.
看来和系统有一定关系,于是尝试 /etc/init.d/rc.local等文件修改。但是还没生效。
4.解决办法:
树莓派的配置信息在 /etc/network/interfaces 下:
/sbin/route add -net 192.168.104.0/24 gw 192.168.12.1 eth1/sbin/route add -net 192.168.254.0/24 gw 192.168.12.1 eth1
但是还需要开机自动执行。
最终采用crontab去实现,结果OK;
sudo vi /etc/network/netmu.sh
内容为:
#!/bin/bash#ifconfig eth1 down#ifconfig eth1 up/sbin/route add -net 192.168.104.0/24 gw 192.168.12.1 eth1/sbin/route add -net 192.168.254.0/24 gw 192.168.12.1 eth1
添加到crontab中:
0/2 * * * * root /etc/network/netmu.sh
保存退出。
三.其他补充:
redhat 或者fedora系列类,永久静态路由是添加在/etc/sysconfig/network-scripts目录下对应设备文件中。
关于添加路由的一些信息,可以参考:,部分参考如下:
添加临时的静态路由
route add命令可以用来添加一条新路由到你的服务器,直到下一次重启。这个方法的优势是在所有版本的Linux中都通用,而且在man里面都有详细的说明。在我们的例子里,10.0.0.0网络前面有-net参数,子网掩码和网关前面也分别有netmask和gw参数。
[root@bigboy tmp]# route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254 wlan0
如果你想为一个单独的服务器添加路由,那么应该使用-host参数,而且不设子网掩码值(route命令会自动知道子网掩码是255.255.255.255)。这里是为机器10.0.0.1添加路由的例子。
[root@bigboy tmp]# route add -host 10.0.0.1 gw 192.168.1.254 wlan0
如果想要这个变化在重启后也能持续,一个通用的方法是把route add命令添加到/etc/rc.d/rc.local
文件中,它会始终在启动过程结束前运行。
添加永久静态路由
在Fedora Linux中,永久静态路由是添加在/etc/sysconfig/network-scripts
目录下对应设备文件中的。文件名的格式是route-网络设备名称,所以wlan0
设备对应的文件名是route-wlan0
该文件的格式很直观,第一行是目标网络加上单词via和网关的IP地址。在我们的例子中,要设置一个到通过网关192.168.1.254 到网络10.0.0.0的路由,子网掩码是255.0.0.0(一个头8位都是1的掩码),我们像这样设置/etc/sysconfig/network-scripts/route-wlan0
文件:
## File /etc/sysconfig/network-scripts/route-wlan0# 10.0.0.0/8 via 192.168.1.254
注意: 文件名/etc/sysconfig/network-scripts/route-*
非常重要。在route-后面添加了错误的设备后缀会导致下次启动后路由不能被正确添加。而且不会在屏幕上报告错误或者在/var/log/
目录下生成任何日志文件。
你可以通过运行/etc/sysconfig/network-scripts/ifup-routes
命令加设备名作为参数测试新建的文件。在下面例子里,我们先检查路由表查看没有到网络10.0.0.0的路由,然后执行ifup-routes
命名把路由加上。
[root@bigboy tmp]# netstat -nr Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan00.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 wlan0[root@bigboy tmp]# ./ifup-routes wlan0[root@bigboy tmp]# netstat -nrKernel IP routing tableDestination Gateway Genmask Flags MSS Window irtt Iface192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan010.0.0.0 192.168.1.254 255.0.0.0 UG 0 0 0 wlan00.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 wlan0[root@bigboy tmp]#
注意: 在基于Debian的系统中,永久静态路由是配置在文件/etc/network/interfaces
中的。请参阅后面章节"Debian / Ubuntu网络配置"以了解更多详情。
怎样删除路由
这里介绍了怎样删除之前章节添加的路由。
[root@bigboy tmp]# route del -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254 wlan0
文件 /etc/sysconfig/network-scripts/route-wlan0
也需要被更新,这样你重启服务器後路由才不会被重新加回来。删除如下的行:
10.0.0.0/8 via 192.168.1.254
其余更多,在使用中再继续摸索吧。