Linux 路由表
在学习 Linux 网络相关的知识时或者在定位网络相关的问题中,经常需要使用 route
命令查看路由表,本节主要记录该命令的输出及其含义。Linux 系统上一般有3张路由表,可以通过 ip rule
命令查看:
1 | # ip rule list |
路由表的配置可以通过 ip route list table {name}
输出,如果是查看 main
表,可以直接使用 route -n
,例如:
1 | root:/mnt/e/github/proto# ip route list table main |
各字段主要说明如下:
Destination
:目标网络或目标主机;Gateway
:网关,连接两个不同网络的设备;Genmask
:目的地址的子网掩码。255.255.255.255
表示目的主机,0.0.0.0
表示默认路由,其他情况Genmask
和Destination
组成目标网络;Flags
:标识U
表示路由生效,G
表示网关,H
表示目标地址是一个主机;Metric
:到目标地址的跳数;Ref
:路由被引用数;Use
: 路由被查询次数;Iface
:接口,去往目的地址所经出口;
对于第一条路由,目标地址 0.0.0.0
,表示没有明确指定的意思,既默认路由。路由匹配是按照掩码长短从长到端开始匹配,默认路由掩码也是 0.0.0.0
,表示最后匹配;
对于中间三条路由,Gateway
都是 0.0.0.0
,表示本条路由不经网关,网关是从一个网络进入另一个网络的边缘设备。换句话说,命中网关是 0.0.0.0
的报文,它的目标是可能是同一网络下的其它目标地址。这时候走的是二层直连,需要发起 ARP
请求换取 MAC
地址进行发送。这条路由通常是在网卡上配置 IP
时候自动生成的。在网卡上每绑定一个 IP
,就相应地生成一条这样的记录。可以看到本条路由的 Flags
并没有 G
标志。
第五条路由,标志为 H
,掩码是 255.255.255.255
,表示目标地址是 10.244.186.193
,直接发往 cali687d9beb32a
,而这个设备的另一端是容器内的 eth0
。这种情况也不需要网关,网关为 0.0.0.0
。
启用或者禁用 Linux 路由转发的方式如下:
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.ip_forward=0
或者
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/ip_forward
查看方式:
sysctl net.ipv4.ip_forward
或者
cat /proc/sys/net/ipv4/ip_forward