路由与 IP 命令
# 命令格式
ip [options] object 子命令
object | 缩写 | 作用 |
---|---|---|
link | l | 网络设备 |
address | a/addr | 设备上的协议(IP 或 IPv6)地址 |
addrlabel | addrl | 协议地址选择的标签配置 |
route | r | 路由表条目 |
rule | ru | 路由策略数据库中的规则 |
# 设备管理
也就是网络接口(网卡)管理,通过 ip link
命令进行创建、删除、修改等操作。
网络接口常见命名:
- eth0: ethernet 的简写,一般用于以太网接口。
- wifi0:wifi 是无线局域网,因此 wifi0 一般指无线网络接口。
- lo: local 的简写,一般指本地环回接口。
# 查看设备
ip link show
--------------------
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:1c:bf:5f brd ff:ff:ff:ff:ff:ff
2
3
4
5
# 创建设备
- link DEVICE:指定要操作的物理设备
- name NAME:指定新虚拟设备的名称
- type TYPE:指定新设备的类型
- bridge - Ethernet Bridge device
- veth - Virtual ethernet interface
- vlan - 802.1q tagged virtual LAN interface
ip l add link eth1 name eth1.2 type vlan id 2
--------------------------------------
eth1.2@eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 08:00:27:1c:bf:5f brd ff:ff:ff:ff:ff:ff
2
3
4
5
# 修改设备
# 开启网卡
ip link set eth1.2 up
# 关闭网卡
ip link set eth1.2 down
# 设置最大传输单元
ip link set eth1.2 mtu 1400
2
3
4
5
6
# 删除设备
ip l del eth1.2
# 地址管理
ip address
命令用于管理地址,比如给网卡绑定 / 删除一个 ip 地址的操作。
# 查看地址
<BROADCAST,MULTICAST,UP,LOWER_UP>
:BROADCAST
表示该接口支持广播;MULTICAST
表示该接口支持多播;UP
表示该网络接口已启用;LOWER_UP
表示网络电缆已插入,设备已连接至网络
mtu 1500
:最大传输单位(数据包大小)为 1,500 字节qdisc pfifo_fast
:用于数据包排队state UP
:网络接口已启用qlen 1000
:传输队列长度link/ether 08:00:27:1c:bf:5f
:接口的 MAC(硬件)地址brd ff:ff:ff:ff:ff:ff
:广播地址inet 192.168.31.58/24
:IPv4 地址brd 192.168.31.255
:广播地址scope global
:全局有效dynamic enp0s25
:地址是动态分配的valid_lft forever
:IPv4 地址的有效使用期限preferred_lft forever
:IPv4 地址的首选生存期inet6 fe80::a00:27ff:fe1c:bf5f/64
:IPv6 地址scope link
:仅在此设备上有效valid_lft forever
:IPv6 地址的有效使用期限preferred_lft forever
:IPv6 地址的首选生存期
ip addr show
ip a show eth1
------------------
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:1c:bf:5f brd ff:ff:ff:ff:ff:ff
inet 192.168.31.58/24 brd 192.168.31.255 scope global noprefixroute dynamic eth1
valid_lft 38805sec preferred_lft 38805sec
inet6 fe80::a00:27ff:fe1c:bf5f/64 scope link
valid_lft forever preferred_lft forever
2
3
4
5
6
7
8
9
10
# 添加地址
在 eth1 网卡上面再绑定一个 192.168.31.88
地址
ip addr add 192.168.31.88/24 dev eth1
---------------------------------
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:1c:bf:5f brd ff:ff:ff:ff:ff:ff
inet 192.168.31.58/24 brd 192.168.31.255 scope global noprefixroute dynamic eth1
valid_lft 39219sec preferred_lft 39219sec
inet 192.168.31.88/24 scope global secondary eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe1c:bf5f/64 scope link
valid_lft forever preferred_lft forever
2
3
4
5
6
7
8
9
10
11
# 删除地址
ip addr del 192.168.31.88/24 dev eth1
-------------------
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:1c:bf:5f brd ff:ff:ff:ff:ff:ff
inet 192.168.31.58/24 brd 192.168.31.255 scope global noprefixroute dynamic eth1
valid_lft 39219sec preferred_lft 39219sec
inet6 fe80::a00:27ff:fe1c:bf5f/64 scope link
valid_lft forever preferred_lft forever
2
3
4
5
6
7
8
9
# 路由规则管理
ip rule
用于管理路由规则。
- unicast:规则规定返回在规则引用的路由表中找到的路由
- blackhole:规则规定悄悄地丢弃数据包
- unreachable:规则规定生成“网络不可达”错误
- prohibit:规则规定生成“管理禁止通信”错误
- nat:规则规定将 IP 数据包的源地址转换为其他值
Usage: ip rule { add | del } SELECTOR ACTION
ip rule { flush }
ip rule [ list ]
SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ]
[ iif STRING ] [ oif STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ]
[ nat ADDRESS ]
[ realms [SRCREALM/]DSTREALM ]
[ goto NUMBER ]
TABLE_ID := [ local | main | default | NUMBER ]
2
3
4
5
6
7
8
9
10
# 添加路由规则
参数:
- type TYPE (default):规则类型
- from PREFIX:选择要匹配的源前缀
- to PREFIX:选择要匹配的目的前缀
- iif NAME:选择要匹配的传入设备。如果接口是环回,则该规则仅匹配源自此主机的数据包。这意味着您可以为转发的数据包和本地数据包创建单独的路由表,从而完全隔离它们。
- oif NAME:选择要匹配的传出设备。传出接口仅适用于来自绑定到设备的本地套接字的数据包
- tos TOS/dsfield TOS:选择要匹配的 TOS 值
- fwmark MARK:选择要匹配的标记值
- priority PREFERENCE:此规则的优先级。每个规则都应该有一个显式设置的唯一优先级值
- table TABLEID:如果规则选择器匹配,则要查找的路由表标识符。也可以使用查找而不是表格
- realms FROM/TO:选择规则是否匹配以及路由表查找是否成功的领域。 仅当路由未选择任何领域时才使用领域 TO
- nat ADDRESS:要转换的 IP 地址块的基础(用于源地址)。 地址可以是 NAT 地址块的开始(由 NAT 路由选择),也可以是本地主机地址(甚至为零)。 在最后一种情况下,路由器不转换数据包,而是将其伪装到该地址。使用 map-to 代替 nat 意味着同样的事情
# 通过路由表 inr.ruhep 路由来自源地址为192.203.80/24的数据包
ip rule add from 192.203.80/24 table inr.ruhep prio 220
# 把源地址为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
3
4
# 删除路由规则
ip rule del from 192.203.80/24 table inr.ruhep
# 刷新路由表缓存
ip rule flush cache
# 路由管理
ip route
命令用于管理静态路由表。
linux 系统中,可以自定义从 1-252 个路由表。其中,linux 系统维护了 4 个路由表:
- 0#表: 系统保留表
- 253#表: defulte table 没特别指定的默认路由都放在改表
- 254#表: main table 没指明路由表的所有路由放在该表
- 255#表: local table 保存本地接口地址,广播地址、NAT 地址 由系统维护,用户不得更改
路由表的查看可以通过 ip route list table table_number [table_name]
命令。路由表序号和表名的对应关系在 /etc/iproute2/rt_tables
文件中,可手动编辑,路由表添加完毕即时生效。
# 查看路由
ip route show
-------------
10.103.167.56/29 dev rmnet_data2 proto kernel scope link src 10.103.167.60
2
3
- dev 网卡
- proto 协议标志符号
- redirect: 路由是由于 ICMP 重定向而安装的
- kernel:路由是在自动配置期间由内核安装的
- boot:路由是在启动过程中安装的。如果路由守护进程启动,它将清除所有这些守护进程
- static:该路由由管理员安装,以覆盖动态路由。 路由守护程序将尊重它们,甚至可能将它们通告给其对等端。
- ra:路由是通过路由器发现协议安装的
- scope 生效范围
- link 该地址是本地链接,即仅在此设备上有效
- host 本机生效
- global 全局生效
# 创建路由
语法格式 :
- via 下一跳路由器的地址。 实际上,此字段的含义取决于路由类型。 对于普通的单播路由,它要么是真正的下一跳路由器,要么是以 BSD 兼容模式安装的直接路由,它可以是接口的本地地址。 对于 NAT 路由,它是已转换 IP 目标块的第一个地址
- dev 输出设备名称(网卡)
ip route add {NETWORK/MASK} via {GATEWAYIP}
ip route add {NETWORK/MASK} dev {DEVICE}
# 添加默认路由
ip route add default {NETWORK/MASK} dev {DEVICE}
ip route add default {NETWORK/MASK} via {GATEWAYIP}
2
3
4
5
# 查询路由
此命令获取到目标的单个路由,并按照内核所看到的方式打印其内容。 此操作不等同于 ip route show。 ip routeshow 会显示现有路线,而 get 解析它们并在必要时创建新克隆。基本上,get 相当于沿着此路径发送数据包。如果没有给出 iif 参数,内核将创建一个路由,以将数据包输出到请求的目的地。这相当于用后续的 ip 路由 ls 缓存 ping 目标,但是实际上没有发送任何数据包。使用 iif 参数,内核假装一个数据包从这个接口到达,并搜索一条路径来转发数据包
参数:
- to ADDRESS (default):目的地址
- from ADDRESS:源地址
- tos TOS:服务类型
- iif NAME:此数据包预期从中到达的设备
- oif NAME:强制将此数据包路由到的输出设备
- connected:如果未给出源地址(选项 from),则重新查找源设置为从第一次查找收到的首选地址的路由。 如果使用策略路由,则可能是其他路由
ip route get 169.254.0.0/16
# 删除路由
ip route del 192.168.4.0/24
# 保存路由表
将路由表信息保存到标准输出。该命令的行为类似于 ip route show,除了输出是适合传递给 ip route restore 的原始数据外。
ip route save
# 还原路由表
从 stdin 恢复路由表信息 该命令希望读取从 ip route save 返回的数据流。 它将尝试完全还原保存时的路由表信息,因此必须先完成流中信息的任何转换(例如设备索引)。 任何现有路线均保持不变。 表中已经存在的数据流中指定的任何路由都将被忽略。
ip route restore
# 清空路由表
# 删除特定路由
ip route flush 10.38.0.0/16
# 清空路由表
ip route flush table main
2
3
4
# 路由类型
- unicast:由路由前缀覆盖的目的地址的真实路径
- unreachable:目的路由无法到达。丢弃数据包并生成 ICMP 消息主机不可访问。本地发件人收到一个 EHOSTUNREACH 错误。
- blackhole:目的路由无法到达。数据包被悄悄丢弃。本地发件人收到 EINVAL 错误。
- prohibit:目的路由无法到达。数据包将被丢弃,并生成管理上禁止的 ICMP 消息通信。 本地发件人收到 EACCES 错误。
- local:目的地已分配给此主机。数据包被环回并在本地传递
- broadcast:目的路由是广播地址。数据包作为链接广播发送
- throw:与策略规则一起使用的特殊控制路径。 如果选择了这样的路由,则会在未找到路由的情况下终止此表中的查找。 如果没有策略路由,则等同于路由表中没有路由。 数据包被丢弃,并生成 ICMP 消息 net unreachable。 本地发件人收到 ENETUNREACH 错误
- nat:一条特殊的 NAT 路由。 前缀所覆盖的目的地被认为是虚拟(或外部)地址,在转发之前需要将其转换为真实(或内部)地址。 使用属性 via 选择要转换为的地址
- anycast:未分配给此主机的路由地址,它们主要等效于本地,只是有一个区别:这些地址用作任何数据包的源地址时都是无效的。
- multicast:一种用于多播路由的特殊类型。 它在常规路由表中不存在。