先说一些关于路由的基础知识:
适用环境:一般用于网络规模很小、拓扑结构固定的网络中。
适用环境:一般应用在只有一个出口的末端网络中或作为其他路由的补充
源IP和目标IP不发生变化,在网络的每一段传输时,源和目标MAC发生变化,进行重新封装,分别是每一段的源和目标地址
route -n
命令查看Linux内核路由表[root@dev ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.17 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
10.1.32.14 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
10.1.32.12 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
10.4.8.2 192.168.9.254 255.255.255.255 UGH 0 0 0 eth0
10.4.9.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
192.168.9.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
10.2.0.0 0.0.0.0 255.255.0.0 U 0 0 0 tun0
10.0.0.0 0.0.0.0 255.255.0.0 U 0 0 0 tun0
10.1.0.0 0.0.0.0 255.255.0.0 U 0 0 0 tun0
192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 tun0
0.0.0.0 192.168.9.254 0.0.0.0 UG 0 0 0 eth0
主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H
。例如,在下面的示例中,本地主机通过IP地址192.168.1.1
的路由器到达IP地址为10.0.0.10
的主机。
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ------ --- --- -----
10.0.0.10 192.168.1.1 255.255.255.255 UH 0 0 0 eth0
网络路由是代表主机可以到达的网络。网络路由的Flags字段为N
。例如,在下面的示例中,本地主机将发送到网络192.19.12的数据包转发到IP地址为192.168.1.1的路由器。
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ----- --- --- -----
192.19.12 192.168.1.1 255.255.255.0 UN 0 0 0 eth0
当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上。默认路由的Flags字段为G
。例如,在下面的示例中,默认路由是IP地址为192.168.1.1的路由器。
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ------ --- --- -----
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
设置和查看路由表都可以用 route
命令,设置内核路由表的命令格式是:
route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
命令 | 说明 |
---|---|
add | 添加一条路由规则 |
del | 删除一条路由规则 |
-net | 目的地址是一个网络 |
-host | 目的地址是一个主机 |
target | 目的网络或主机 |
netmask | 目的地址的网络掩码 |
gw | 路由数据包通过的网关 |
dev | 为路由指定的网络接口 |
-host 标志用于指定一个具体的目标主机,也就是一个特定的IP地址。当你使用 -host 标志时,route 命令将会显示或配置与这个特定主机相关的路由信息。
-net 标志用于指定一个目标网络,也就是一个IP地址范围。当你使用 -net 标志时,route 命令将会显示或配置与这个特定网络相关的路由信息。
举例来说:
如果你使用 -host
标志并指定目标IP地址为 192.168.1.1,那么 route 命令将提供与仅这个IP地址(192.168.1.1)相关的路由信息。
如果你使用 -net
标志并指定目标网络为 192.168.1.0,那么 route 命令将提供与整个IP地址范围(192.168.1.0/24)相关的路由信息。
简而言之,区别在于你是关注一个单独的IP地址还是一个IP地址范围(网络)。
# 添加到主机的路由
route add -host 192.168.1.2 dev eth0:0
route add -host 10.20.30.148 gw 10.20.30.40
# 添加到网络的路由
route add -net 10.20.30.40 netmask 255.255.255.248 eth0
route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
route add -net 192.168.1.0/24 eth1
# 添加默认路由
route add default gw 192.168.1.1
# 删除路由
route del -host 192.168.1.2 dev eth0:0
route del -host 10.20.30.148 gw 10.20.30.40
route del -net 10.20.30.40 netmask 255.255.255.248 eth0
route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
route del -net 192.168.1.0/24 eth1
route del default gw 192.168.1.1 // route del default 删除所有的默认路由
# 添加一条默认路由
route add default gw 10.0.0.1 // 默认只在内存中生效
# 开机自启动可以追加到 /etc/rc.local 文件里
echo "route add default gw 10.0.0.1" >>/etc/rc.local
# 添加一条静态路由
route add -net 192.168.2.0/24 gw 192.168.2.254
# 要永久生效的话要这样做:
echo "any net 192.168.2.0/24 gw 192.168.2.254" >>/etc/sysconfig/static-routes
# 添加到一台主机的静态路由
route add -host 192.168.2.2 gw 192.168.2.254
# 要永久生效的话要这样做:
echo "any host 192.168.2.2 gw 192.168.2.254 " >>/etc/sysconfig/static-routes
注:Linux 默认没有这个文件 ,得手动创建一个
在Linux中默认的内核配置已经包含了路由功能,但默认并没有在系统启动时启用此功能;
开启Linux的路由功能可以通过调整内核的网络参数来实现,方法如下:
# 临时开启路由功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
或者
sysctl -w net.ipv4.ip_forward=1
# 永久开启路由功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
添加静态路由到路由表的语法如下:
ip route [destination_network] [mask] [next-hop_address] administrative_distance]
命令 | 描述 |
---|---|
ip route | 用于创建静态路由的命令。 |
Destination_network | 需要发布到路由表中的网段。 |
Mask | 在这一网络上使用的子网掩码。 |
Next-hop_address | 下一跳路由器的地址。 |
administrative_distance | 默认时,静态路由有一个取值为1 的管理性距离。在这个命令的尾部添加管理权来修改这个默认值。 |
例如
ip route 172.16.1.0 255.255.255.0 172.16.2.1
查看路由表除了使用route -n
命令外,还可以使用ip route
。
[root@dev ~]# ip route
192.168.1.17 dev ppp0 proto kernel scope link src 192.168.1.190
10.1.32.14 dev tun0 scope link
10.1.32.12 dev tun0 scope link
10.4.8.2 via 192.168.9.254 dev eth0 src 192.168.9.200 mtu 1500 advmss 1460
10.4.9.0/24 dev tun0 scope link
192.168.9.0/24 dev eth0 proto kernel scope link src 192.168.9.200 metric 1
10.2.0.0/16 dev tun0 scope link
10.0.0.0/16 dev tun0 scope link
10.1.0.0/16 dev tun0 scope link
192.168.0.0/16 dev tun0 scope link
default via 192.168.9.254 dev eth0
---------------------------------------- 实例1--------------------------------------------
如上图所示,PC0机器和PC1机器之间经过两个路由器,要想使这两台机器通信,路由设置如下:
ip add 192.168.1.1 255.255.255.0
ip add 192.168.2.1 255.255.255.0
ip route 192.168.3.0 255.255.255.0 192.168.2.2
ip add 192.168.2.2 255.255.255.0
ip add 192.168.3.1 255.255.255.0
ip route 192.168.1.0 255.255.255.0 192.168.2.1
----------------------------------------实例2--------------------------------------------
如上图所示,使用A主机192.168.1.2能够ping通E主机192.168.4.2,这两台机能够通信。
操作记录:
1)A主机上操作:ip为192.168.1.2,设置网关为192.168.1.1
# route add default gw 192.168.1.1
2)B主机上操作:第一块网卡为192.168.1.1,第二块网卡为192.168.2.1
# ifconfig eth0 192.168.1.1
# ifconfig eth1 192.168.2.1 //可以在一块网卡上设置两个ip,比如是eth0,eth0:0
B主机设置默认路由,下一跳为192.168.2.2
# route add default gw 192.168.2.2
B主机开启路由转发功能
# echo 1 > /proc/sys/net/ipv4/ip_forward //临时转发,可以在/etc/sysctl.conf里设置永久转发
3)C主机上操作:第一块网卡为192.168.2.2,第二块网卡为192.168.3.1
# ifconfig eth0 192.168.2.2
# ifconfig eth1 192.168.3.1 //如果就一块网卡,可以设置ifconfig eth0:0 192.168.3.1
C主机设置2条默认路由
# route add -net 192.168.1.0/24 gw 192.168.2.1
# route add -net 192.168.4.0/24 gw 192.168.3.2
C主机开启路由转发功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
4)D主机上操作:第一块网卡为192.168.3.2,第二块网卡为192.168.4.1
# ifconfig eth0 192.168.3.2
# ifconfig eth1 192.168.4.1
D主机设置默认路由,下一跳为192.168.3.1
# route add default gw 192.168.3.1
D主机开启路由转发功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
5)E主机上操作:ip为192.168.4.2,设置网关为192.168.4.1
# route add default gw 192.168.4.1