29
2024
10
00:25:52

linux 重启网络服务后路由表丢失问题的解决方案

服务器多块网卡,需要访问多个网段,因此需要手动添加路由信息到路由表。


 -----------------------------操作-----------------------------------------


一:使用 route 命令添加

使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法:

//添加到主机的路由(针对单个主机添加)

# route add –host 192.168.1.11 dev eth0

# route add –host 192.168.1.12 gw 192.168.1.1

//添加到网络的路由(针对某个网段添加)

# route add –net 192.168.1.11  netmask 255.255.255.0 eth0

# route add –net 192.168.1.11  netmask 255.255.255.0 gw 192.168.1.1

# route add –net 192.168.1.0/24 eth1

//添加默认网关

# route add default gw 192.168.2.1

//删除路由

# route del –host 192.168.1.11 dev eth0


 


 后来发现每次重启路由信息都会丢失,需要再次手动添加,于是把路由信息添加到rc.local里面的,服务器重启之后,执行"route -n" 命令查看,需要添加的路由表信息都有了,一切看似非常完美。


 


-----------------操作------------------------


在/etc/rc.local里添加


 


route add -net 192.168.3.0/24 dev eth0

route add -net 192.168.2.0/24 gw 192.168.2.254


 


 但是。。。。


 


后来发现时不时的服务器还是无法访问某个网段,自己技术不精,只能非常艰难的通过各种方式去查找原因。后来发现,是因为其中一块网卡故障,造成网卡重启了。因为有4快网卡,所以当时想法很简单,那就重新换一块。


 


之后又风平浪静了一段时间,但是(这两个字太可怕了。。。),某一天一个网段又访问不到了,查看message日志,果真,网卡服务又自动重启了。看来这种临时解决方案是不行的,需要保证在网卡重启以后要添加的路由信息能够自动添加上,rc.local里面的脚本写入只会在服务器重启的时候有效,看来还得找其他的路由表写入切入点。


 


一番搜索,发现需要在”/etc/sysconfig/static-routes“里头写入要添加的路由信息即可,static-routes这个文件就是保存静态路由表,重启后不会掉,如果文件目录下没有这个文件,自己手动建立一个。但是刚开始尝试使用这种方案,发现没有效果,要么语法写错了,要么是路由添加错了。


 


---------------------------------以下是引用-------------------


根据网上的说法,static-routes其实在被network这个脚本调用的,打开这个脚本:


/etc/rc.d/init.d/network 


里面有写到:


# Add non interface-specific static-routes.

  if [ -f /etc/sysconfig/static-routes ]; then

     grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do

         /sbin/route add -$args

      done

   fi


network在执行的时候到static-routes里面寻找any开头的行,然后执行


/sbin/route add -$args 相当于手动执行了route add脚本,那后面事情就简单了,回到了手动执行的方式,根据前面的说明,正确的脚本就是:


any host 10.0.0.10 gw 192.168.1.1


any net 192.168.3.0/24 gw 192.168.3.254 dev em2


network执行的时候把any去掉,获取后面的参数:host 10.0.0.10 gw 192.168.1.1


然后执行route add -host 10.0.0.10 gw 192.168.1.1


 


注意这里host前面的-是network自带的,不需要配置到static-routes文件中。


 ---------------------------------------------end----------------------------------


 在这位朋友的指导下,问题得到了解决,


也尝试了一下any net 192.168.3.0/24 gw 192.168.3.254的另外一种写法:


any net 192.168.3.0 netmask 255.255.255.0 gw 192.168.3.254  em2


此种写法也是正确的,因此可以理解为192.168.3.0/24=192.168.3.0 netmask 255.255.255.0


  


现在,好像万事大吉了,但是还有个疑问,那块内网网卡为什么会不定时重启呢?


 


 


最后也确认了另外一个问题,就是之前添加路由的时候,有时候会报错:


 


SIOCADDRT: No such process


 


这个问题是出在自己添加时候的网管号段写错了,应该是10.254,一直写成11.254。。。


 


另外,也发现网上对这个问题的另外一种解决方案:


 


1:一般是配置的IP地址有问题,注意检查ip与gateway是不是在一个网段内,还有是不是有拼写错误


2:如果你添加/修改默认网关时遇到这个问题。原因:你要添加的网关不在你主机所在的网段。比如你要添加的网关是10.57.50.1      


route add 10.57.50.1/32 dev em2(这句尝试没问题)


然后再     


route add default gw 10.57.50.1(尝试后好像直接把默认网关修改了,造成外网无法访问,远程无法操作了。。。,default gw 与外网映射,失误。。。)

————————————————


1、手动解决方案

通过其他服务器通过ssh IP 形式跳转到目标服务器执行route add -net 10.0.0.0/8 gw 10.0.82.1

但是这种方法在重启服务器或者重启网络服务后可能存在路由丢失问题。

2、通过在 /etc/init.d/network文件中自动调用添加路由命令

在服务器在重启或者重启网络服务后会执行文件 /etc/init.d/network ,通过在该文件添加route add -net 10.0.0.0/8 gw 10.0.82.1 (文件中除了方法内的任意位置,推荐放在最后一行)

3、通过添加static-routes文件保持静态路由表

在/etc/sysconfig/static-routes里头写入要添加的路由信息即可,static-routes这个文件就是保存静态路由表,重启后不会掉,如果文件目录下没有这个文件,通过vim /etc/sysconfig/static-routes 手动创建一个。然后将”any -net 10.0.0.0/8 gw 10.0.82.1“添加到该文件中 ,退出编辑模式 按:wq保存退出。

注意:注意这里net前面的-是network自带的,不需要配置到static-routes文件中。

该部分逻辑与方法2类似:

可以看到到/etc/init.d/network文件中的部分脚本逻辑

/etc/init.d/network在执行的时候到static-routes里面寻找any开头的行,然后取到any后面的内容执行/sbin/route add -$args命令 。即是/sbin/route add -net 10.0.0.0/8 gw 10.0.82.1。









因为一个服务器做了2个bond 0(em1,em2) bond1(em3,em4) 但是默认路由只生成了bond1的默认网关。但是bond1是数据库的心跳线。不是来做数据库数据传输用得。所以导致数据库无法访问。在rc.local 手动添加默认路由,但是系统重启后不生效。所以在网上找了一些办法。最终解决。

一:使用route 命令添加

 

1、使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法:

 

添加到主机的路由
 route add –host 192.168.1.11 dev eth0
 route add –host 192.168.1.12 gw 192.168.1.1
添加到网络的路由
route add –net 192.168.1.11 netmask 255.255.255.0 dev eth0
route add –net 192.168.1.11 netmask 255.255.255.0 gw 192.168.1.1
route add –net 192.168.1.0/24 dev eth1`

 

添加默认网关
route add default gw 192.168.2.1
删除主机路由:
route del –host 192.168.1.11 dev eth0
删除网络路由:
 route del -net 192.168.1.0 netmask 255.255.255.0
删除默认路由
route del default gw 192.168.1.1

   

二:在linux下设置永久路由的方法:
 1.在/etc/rc.local里添加

route add -net 192.168.3.0/24 dev eth0
route add -net 192.168.2.0/24 gw 192.168.2.254

 

2.在/etc/sysconfig/network里添加到末尾


GATEWAY=gw_ip  未尝试过


3./etc/sysconfig/static-routes:写入路由信息,如果没有这个文件自己创建 (尝试过十分好用)!


any net 192.168.3.0/24 gw 192.168.3.254
any net 0.0.0.0/0 gw 172.17.2.254  默认路由写法,这里的子网掩码为0
any net 10.250.228.128 netmask 255.255.255.192 gw 10.250.228.129

 


如果在rc.local中添加路由会造成NFS无法自动挂载问题,所以使用static-routes的方法是最好的。无论重启系统和service network restart 都会生效。   

解决NFS问题的描述:


 按照linux启动的顺序,rc.local里面的内容是在linux所有服务都启动完毕,最后才被执行的,也就是说,这里面的内容是在NFS之后才被执行的,那也就是说在NFS启动的时候,服务器上的静态路由是没有被添加的,所以NFS挂载不能成功。

 

4、在/etc/sysconfig/network-script/route-interface下添加路由(每个接口一个文件,如果没有就创建一个,只能添加针对该接口的路由)

格式如下:
  network/prefix via gateway dev intf

例如给eth0添加一个默认网关:
  vim /etc/sysconfig/network-scripts/route-eth0

添加如下内容(可以省略dev eth0)
  0.0.0.0/0 via 172.16.10.2 dev eth0 



ps:注意这里的掩码是0而不是32,因为这里是网段而不是路由。保存退出后,service network restart。
使用route -n或netstat -r查看路由表。

[root@localhost ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.10.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         172.16.10.2     0.0.0.0         UG    0      0        0 eth0



默认路由已经被添加到路由表里面了,注意如果有两块网卡,需要设置默认路由才能访问internet。




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/8224.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: