如何在Ubuntu Server中设置静态路由?


51

我从Ubuntu 8.10开始使用Ubuntu。今天,我正在使用Ubuntu 12.04 Server。

我在引导时难以保持静态路由。我通常会把路线命令

/sbin/route add -net <IP>/<MASK> <GW> dev <ethX>

/etc/rc.local否则我会routes在目录内创建一个文件(名为)/etc/network/if-up/,但是我注意到在Ubuntu 12.04上它不起作用。

如果我在外壳中键入命令,它们将起作用,但是当它们位于指定文件中时,相同的命令将不起作用。

我已经尝试将文件名更改为其他名称,以为我的文件名(routes)在Ubuntu 12.04中可能是错误的,但这也行不通。

我还注意到该命令/sbin/ifconfig有效,而不是/sbin/route

网络设置发生了什么变化?

如何在Ubuntu 12.04上定义静态路由?


只是检查一下:rc.local是否可执行,并且从shebang行开始?可能是您的命令有问题。您可以尝试将stderr重定向到文件(your_command > stderr.txt 2>&1)并检查其输出...
Salem

您应该在/ etc / network / interfaces中设置路由,而不是在/etc/rc.local中设置路由。您应该使用的新命令是ip addip route。一个命令来统治网络。:)
Anders 2012年

绝对man 5 interfaces
值得一

Answers:


65

您可以将静态路由放入/etc/network/interfaces

auto eth0
iface eth0 inet static
      address 192.168.1.2
      netmask 255.255.255.0
      up route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1
      up route add -net 172.16.0.0 netmask 255.240.0.0 gw 192.168.1.1

13
/ sbin / ip的语法:up ip route add 192.168.0.0/24 via 192.168.1.1
w00t 2014年

1
您是否愿意解释答案中的最后两行,或者提供指向知识来源的链接?谢谢!
itsols 2014年

您可以将-net 192.68.0.0作为通配符查看,说所有发往192.168。*。*的数据包都应通过默认网关192.168.1.1进行路由。然后,内核将尝试解析该默认网关,但是如果它已经具有ARP条目,则它将把数据包从已获悉网关驻留在该下一跳的目标MAC所在的接口发送出去。希望有点帮助。
尼尔·麦吉尔

还有/etc/network/interfaces.d/,可能是放置路由的更好位置。
伊利亚·林恩

此方法有效,但在网络接口的手册页中未进行描述。这是标准吗?
BЈовић

18

我经常发现在/ etc / network / interfaces中定义静态路由的正确位置,例如,要使用/etc/init.d/networking restart全局重启网络是可以的。但是,如果要使用ifdown和ifup分别关闭接口,则ifup将以错误结束:

ifup eth1

RTNETLINK answers: File exists
Failed to bring up eth1.

因为它试图定义一条路线,但是它已经被定义了。该界面无论如何都会打开,但是,如果upup不会更新/ run / network / ifstate,那么下次您将使用ifdown时,除非使用--force标志,否则您将无法进行操作。

为了使ifup即使已经定义了路由也可以继续配置,可以在/ etc / network / interfaces中定义路由时使用此格式

up ip route add 172.16.0.0/24 via 192.168.10.1 || true
up ip route add 192.168.0.0/16 via 192.168.10.1 || true

这样,您将在输出中显示警告,但接口配置将完成

ifup eth1

RTNETLINK answers: File exists
RTNETLINK answers: File exists
ssh stop/waiting
ssh start/running, process 18553

1
为什么不简单地在配置中添加“通过192.168.10.1的向下ip路由del 192.168.0.0/16”?
w00t 2014年

因为人们做的事情像ifconfig手动使用,而不是运行ifdown,所以希望能够使用正确的工具进行恢复。因此,如果这些工具在尝试修复状态时能够抵御意外状态,则将很有帮助。这个|| true建议是一个好建议。添加下线也是有帮助的。
Phil P

5
来自随机用户:在ip命令中使用“替换”而不是“添加”。例如:up ip route replace 172.16.0.0/24 via 192.168.10.1“替换”将添加该路由(如果该路由尚不存在),但是如果存在具有相同选择器的路由,则即使它们具有相同的目的地,也将被当前路由替换。
Xen2050 '16

10

您可以尝试将其添加到中/etc/network/interfaces,这几乎是设置路由的完整方法:

auto eth0
iface eth0 inet static
    post-up /sbin/route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1
    post-up /bin/mount -t nfs 192.168.0.203:/motd/ /motd/

6

在Ubuntu中有一个ifupdown-extra软件包。
它提供了自动脚本(安装在中/etc/network/*/),其中之一用于添加静态路由。

为此的配置文件是 /etc/network/routes

此配置文件的顶部有一个很好的描述:

静态路由if-updown脚本和/etc/init.d/networking-routes脚本读取此配置文件,以设置与给定接口或全局路由关联的路由列表。

我使用的示例路由是:

192.168.240.0 255.255.255.0 192.168.130.3 em3

1

对我们有用的是

sudo route add -net 192.168.0.2/32 gw 192.168.1.1 netmask 255.255.0.0

我曾经在Mac上运行:

sudo route -n add -net 192.168.0.2/32 192.168.1.1

但是在ubuntu上,IP和最后一个“ netmask”部分之间的“ gw”丢失了(在ubuntu上也不需要-n)


10
这非常适合临时(非持久)路线,问题在于要保持路线的持久性
anneb

0

我更喜欢使用nmcli

nmcli device modify <device-name> ipv4.routes "<ip>/<mask> <gw>" ipv4.route-metric 25

例如:

nmcli device modify wlp2s0 ipv4.routes "1.1.1.0/24 192.168.0.1" ipv4.route-metric 25

之后,通过重新启动NetworkManager服务来应用更改:

sudo systemctl restart NetworkManager.service

0

使用nmcli我能够运行一个持久解决方案(@isapir解决方案在我的设备上不起作用)。

sudo nmcli connection modify <conection-name> +ipv4.routes "<ip>/<mask> <gw> <mt>"

例如:

sudo nmcli connection modify ssid-name +ipv4.routes "1.1.1.0/24 192.168.0.1 100"

之后,可以通过上下设置连接来应用更改(无需完全重启NetworkManager):

sudo nmcli con down ssid-name ; sudo nmcli con up ssid-name

要查看当前的连接运行:

sudo nmcli connection
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.