【Linux网络】ip route 命令

1.ip route命令

1.1 ip查看已有路由

ip route list          # 列出默认路由表,和下面这句结果相同
ip route show table main

结果(以Ubuntu为例):

zx@ubuntu:~/Desktop/codes/muduo/build/release-cpp11/bin$ ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.133.166  netmask 255.255.255.0  broadcast 192.168.133.255
        inet6 fe80::baae:b89e:d17d:ef20  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:65:ca:56  txqueuelen 1000  (Ethernet)
        RX packets 300943  bytes 379050509 (379.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 51169  bytes 6183085 (6.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 13722  bytes 1693874 (1.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13722  bytes 1693874 (1.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:a6:68:06  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
zx@ubuntu:~/Desktop/codes/muduo/build/release-cpp11/bin$ ip route list 
default via 192.168.133.2 dev ens33 proto dhcp metric 100 
169.254.0.0/16 dev ens33 scope link metric 1000 
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown 
192.168.133.0/24 dev ens33 proto kernel scope link src 192.168.133.166 metric 100

以上路由信息表的意义:

default 第一行:

"default"会在没有找到更具体的路由(数据包目的地地址与路由条目更匹配)时使用。

"via 192.168.133.2"网关的IP地址是192.168.133.2

"proto dhcp"指的是使用dhcp协议分配

第二三四行:

"proto kernel": 说明该条路由是内核在系统网络接口配置阶段添加的,而不是由管理员手动添加或由路由协议动态添加的。

"scope link" 的意思是说该路由直接连接在当前主机上,即处于同一局域网内。

"src" 是指会使用该路由条目的数据包应有的源地址,也就是意味着本机在该局域网内的 IP 地址被设置为了 192.168.122.1。

1.2 路由表记录的格式

<目的地> via <网关> dev <接口> proto <协议> src <源地址> <附加信息>

<目的地>:目的地网络或主机,可以是具体的IP地址、网络地址或default等

via <网关>:可选字段,指的是到达目的地需要使用的网关的IP地址。发往这个路由条目对应的目的地的数据包,都会把这个网关设置为下一跳,经由此发往最终目的地。

dev <接口>: 要发往本条目对应目的地时所需要使用的网络接口(设备);

proto <协议>:添加本条条目的协议。常见的值有:kernel(本条目由内核添加)、static(手动添加)、dhcp(通过DHCP添加)。

src <源地址>:在使用本条路由,向目的地发送数据包时所需采用的IP地址。

<附加信息> 代表多个可选项,常见的有:

  • scope <scope>:定义这条路由的范围。global表示有网关的单播(unicast)路由,link表示直连的单播或广播(broadcast)路由,host表示本地(local)路由。该值可能是一个整数值或者是字符串值,字符串值应该能在/etc/iproute2/rt_scopes中找到
  • metric <整数>:表示路由的优先级,数字越小优先级越高。最小值为 0 ,最大值为 65535
  • table <表名/数字>:如果一条路由不属于 main 表,则会在这里指出该路由所属的路由表

路由记录还可以有个表示路由类型的前缀,该字段能说明路由用途以及特性。类型有下面这些:

1.unicast(单播):标准类型,表示把数据发往一个有特定的目的地IP地址。通常省略不显示

2.unreadchable(不可达):目的地不可达。发往该地址的数据包会被丢弃,ICMP会返回host unreadchable,发送代码会报错EHOSTUNREADCH

3.blackhole(黑洞):目的地不可达,数据包会被无声丢弃(discarded silently),发送代码会报错EINVAL

4.prohabit(禁止):目的地不可达,数据包会被丢弃,ICMP 会返回 communication administratively prohibited。发送代码会报错 EACCES

5.local(本地):目的地时当前主机,数据包会回环发送

6.boardcast(广播):目的地是广播地址,数据包作为链路广播发送,通常是向本地网络广播;

7.nat(网络转换地址):该路由已在 2.6 内核后停止支持。这是个特殊的 NAT 路由。目的地地址是假地址(外部地址),需要在转发前转换为真实(内部)地址;

8.nycast(任播):尚未实现。目的地是本主机的 anycast 地址。和 local 只有一个区别:该地址不能被用于任何数据包的源地址;

10.multicast(多播):用于多播路由的特殊路由。不会在普通的路由表中出现。

1.3 ip route添加新路由

如何向(main)路由表、已有的路由表中添加路由,以及如何创建一个新路由表并添加指向该路由表的规则。

创建新路由需要使用ip route命令:

ip route add [type] [prefix] via [下一跳(网关)] dev [接口名] table [路由表名/ID] src [源地址]

prefix:目的地IP地址,可以是具体IP形式也可以是包含子网掩码的网络地址(192.168.1.0/24)。若prefix设置为default则代表所有地址,等效于0.0.0.0/0

在一号表中添加默认路由为192.168.1.1****:

ip route add default via 192.168.1.1 table 1

在一号表中添加一条道192.168.0.0网段的路由为192.168.1.2:

ip route add 192.168.0.0/24 via 192.168.1.2 table 1 

1.4 向指定路由表添加路由

向指定路由表custom中添加路由:

ip route add default via 192.168.1.100 dev eth1 table custom

该路由会将无法匹配到更精确路由的流量都通过 eth1 网卡发送到网关路由器 192.168.1.100。

可以用下面的命令查看添加后的结果:

ip route show table custom

注意:所有的 RPDB 规则都是在系统启动时加载进内核内存的,因此还需要 flush 缓存。这会强制内核重新加载规则和路由数据库

ip route flush cache

1.5 向默认路由表添加路由

相比custom,只需要省略table即可:

ip route add default via 192.168.1.100 dev eth1

1.6 删除路由

ip route delete <路由信息>

路由信息足够匹配到路由条目即可,最简单的方式就是把整个路由条目全都写上去,比如:

ip route delete default via 192.168.1.100 dev eth1

最后需要flush一下

ip route flush cache

1.7 路由优先级处理

系统会使用数据包的目的地地址和 ToS 值(如果有)来和每个路由条目的 prefix 进行比对,然后选择符合条件最多的一个,对比顺序为:

  1. 目的地地址和路由条目 prefix 的相符程度;
  2. 数据包和路由条目 ToS 的匹配;
  3. 选择 ToS=0 的路由

举例来说,如果数据包匹配到了多个可选路由,则按下面的顺序来选择出一个路由:

  1. 选择包含子网掩码在内的,prefix 匹配长度最长的路由;
  2. 如果有一个路由的 ToS 与数据包的 ToS 相符,则直接使用这个路由;
  3. 选择 ToS=0 的路由;
  4. 如果没有 ToS=0 的路由,返回一个错误(不可达 unreachable);
  5. 若仍有多个 ToS=0 的路由,则选择偏好值(preference value)最大的路由;
  6. 选择最新的路由

1.8 其他几种ip rule的命令示例

Linux系统的路由表序号和表名的对应关系在/etc/iproute2/rt_tables文件中。

1.通过路由表inr.ruhep路由来自源地址192.203.80/24的数据包

ip rule add from 192.203.80/24 table inr.ruhep prio 220

2.把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由

ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320

2.ip rule,ip route,iptables三者之间的关系

iptables:iptables不是真正的防火墙,可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,框架名字叫netfilter。

image

注:图中 “路由判断” 就是使用ip rule,ip route设置的规则,其中ip route配置的路由表服务于ip rule配置的规则。

以一例子来说明:公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 (电信),其他IP使用 20.0.0.1 (网通)上网。

1,首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关:ip route add default gw 20.0.0.1

2,之后通过 ip route 添加一个路由表:ip route add table 3 via 10.0.0.1 dev ethX (ethx 是 10.0.0.1 所在的网卡, 3 是路由表的编号)

3,之后添加 ip rule 规则:ip rule add fwmark 3 table 3 (fwmark 3 是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用 table3 路由表)

4,之后使用 iptables 给相应的数据打上标记:iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK --set-mark 3

参考文章:

https://zhuanlan.zhihu.com/p/673039606

https://man7.org/linux/man-pages/man8/ip-route.8.html

posted @ 2024-03-24 10:02  Emma1111  阅读(1482)  评论(0编辑  收藏  举报