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 进行比对,然后选择符合条件最多的一个,对比顺序为:
- 目的地地址和路由条目 prefix 的相符程度;
- 数据包和路由条目 ToS 的匹配;
- 选择 ToS=0 的路由
举例来说,如果数据包匹配到了多个可选路由,则按下面的顺序来选择出一个路由:
- 选择包含子网掩码在内的,prefix 匹配长度最长的路由;
- 如果有一个路由的 ToS 与数据包的 ToS 相符,则直接使用这个路由;
- 选择 ToS=0 的路由;
- 如果没有 ToS=0 的路由,返回一个错误(不可达 unreachable);
- 若仍有多个 ToS=0 的路由,则选择偏好值(preference value)最大的路由;
- 选择最新的路由
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。
注:图中 “路由判断” 就是使用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
标签:ip,route,192.168,Linux,数据包,路由,路由表 From: https://www.cnblogs.com/Wangzx000/p/18092093