Linux ip
命令用来在 Linux操作系统
中为网络接口分配地址
和配置网络接口参数
,用于替代 ifconfig
命令。ip
命令由 iproute
包提供,ifconfig
命令由 net-tools
包提供。
help
$ ip --help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |
vrf }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } | -br[ief] |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}
$ rpm -qal iproute
/usr/sbin/arpd
/usr/sbin/bridge
/usr/sbin/cbq
/usr/sbin/ctstat
/usr/sbin/devlink
/usr/sbin/genl
/usr/sbin/ifcfg
/usr/sbin/ifstat
/usr/sbin/ip
/usr/sbin/lnstat
/usr/sbin/nstat
/usr/sbin/rdma
/usr/sbin/routef
/usr/sbin/routel
/usr/sbin/rtacct
/usr/sbin/rtmon
/usr/sbin/rtpr
/usr/sbin/rtstat
/usr/sbin/ss
/usr/sbin/tc
demo
ip link show type bridge # 查看 bridge
ip link delete docker0 type bridge # 删除 bridge
ip link show type veth # 查看 veth pair
ip link show type bond # 查看 bond
ip link show type team # 查看 team
ip link show type vlan # 查看 vlan
ip link show type vxlan # 查看 vxlan
# add tap
ip link add tap1-1 type veth peer name tap1-2
ip addr add 172.20.0.10/16 dev tap1-1
ip addr del 172.20.0.10/16 dev tap1-2
# add br
ip link add name br1 type bridge
ip link set br0 up
# 显示网卡IP信息
ip addr show
# 设置 ens33 网卡IP地址 172.20.1.10
ip addr add 172.20.1.10/24 dev ens33
# 删除 ens33 网卡IP地址
ip addr del 172.20.1.10/24 dev ens33
# 清理网卡的配置信息,包括 IP 路由信息
ip addr flush dev ens33
# 显示网络接口信息
ip link show
# 开启网卡
ip link set ens33 up
ip link set dev ens33 up
# 关闭网卡
ip link set ens33 down
ip link set dev ens33 down
# 开启网卡的混合模式
ip link set ens33 promisc on
# 关闭网卡的混个模式
ip link set ens33 promisc off
# 设置网卡队列长度
ip link set ens33 txqueuelen 1200
# 设置网卡最大传输单元
ip link set ens33 mtu 1400
# 查看路由信息
ip route list
# 显示系统路由
ip route show
# 设置默认网关为 172.20.0.1,等同于 route add default gw 172.20.0.1
ip route add default via 172.20.0.1
ip route add default via 172.20.0.1 dev ens33
# 设置 172.20.1.0 网段的网关为 172.20.1.1 数据走 ens38 接口
ip route add 172.20.1.0/24 via 172.20.1.1 dev ens38
# 删除默认路由
ip route del default
# 删除172.20.1.0网段的网关
ip route del 172.20.1.0/24
ip route delete 172.20.1.0/24 dev ens33
# 更改
ip route change 172.20.1.1/24 via 0.0.0.0 dev ens33
# 获取
$ ip route get 1.1.1.1
1.1.1.1 via 172.17.0.1 dev eth0 src 172.17.0.2 uid 0
- 多 default route,METRIC 指越小,优先级越高
ip route add default via {IP1} dev {DEVICE1} metric {METRIC1}
ip route add default via {IP2} dev {DEVICE2} metric {METRIC2}
添加时,若提示 RTNETLINK answers: File exists
可能是因为 METRIC 值相同引起的
# 显示 arp 表,cat /proc/net/arp
ip neigh
ip -s link
ip -s link ls ens33
ip -s -h link
# 显示更详细的信息
ip -s -s link
ip -s -s link ls ens33
策略路由
策略路由按实现的方式大体可以分为三类:
- 第一种是按目的地址进行路由,即根据目的地不同选择不同的出口。
- 由于这种按目的地址进行路由的方法特别适合做双线服务器,因此在国内使用的较多。
- 第二种是按源地址进行路由,即根据发出数据包的计算机地址决定选择哪个出口,这种方法适用于多种环境,例如多线机房、客户定制的更快速的网络等。
- 第三种是智能均衡策略路由,这是一种出现时间较晚的方式,在这种方式下会自动识别网络带宽及负载,根据带宽和负载动态地决定数据包从哪个出口发出
路由表管理
# 使用命令 ip rule list 或 ip rule show 查看路由表
$ ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
[root@localhost ~]# ip route list table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 172.16.45.0 dev eno16777736 proto kernel scope link src 172.16.45.13
local 172.16.45.13 dev eno16777736 proto kernel scope host src 172.16.45.13
broadcast 172.16.45.255 dev eno16777736 proto kernel scope link src
172.16.45.13
[root@localhost ~]# ip route list table main
default via 172.16.45.1 dev eno16777736 proto static metric 100
172.16.45.0/24 dev eno16777736 proto kernel scope link src 172.16.45.13
172.16.45.0/24 dev eno16777736 proto kernel scope link src 172.16.45.13
metric 100
[root@localhost ~]# ip route list table default
[root@localhost ~]#
- 创建路由表:建立一个名为 test1 的路由表
- 系统重启后,规则将失效,如需继续生效可以将设置规则的相关语句写入
/etc/rc.local
中
[root@localhost ~]# echo 100 test1 >> /etc/iproute2/rt_tables
# 建立一个规则,规定所有来自192.168.19.0/24的数据包都使用路由表 test1中的条目路由
[root@localhost ~]# ip rule add from 192.168.19.0/24 table test1
#列出规则
[root@localhost ~]# ip rule list
0: from all lookup local
32765: from 192.168.19.0/24 lookup test1
32766: from all lookup main
32767: from all lookup default
[root@localhost ~]# ip rule add from 192.168.18.0/24 table 2 pref 1500 prohibit
# 删除规则和 rt_tables 中的相关内容
[root@localhost ~]# ip rule del table test1
[root@localhost ~]# cat /etc/iproute2/rt_tables
#
# reserved values
……
#
#1 inr.ruhep
# 验证结果
[root@localhost ~]# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
规则管理
ip rule [add|del] SELECTOR ACTION
[add|del]
表示添加或删除一条规则
SELECTOR
表示数据包选择部分,常见选项如下所示:
from
:源地址
to
:目的地址
tos
:数据包的 TOS(Type of Service)域,用于标明数据包的用途
fwmark
:防火墙参数
dev
:参与设备,具体包括两个选项 iif 和 oif,分别表示接收和发送设置匹配
pref
:指定优先级
ACTION
表示执执行的动作,也有多种:
table
:指明使用的 table ID 或表名
nat
:透明网关,同 NAT 相似
prohibit
:丢弃包并返回 Communication is administratively prohibited
的错误消息
unreachable
:丢弃包并返回 Network is unreachable
的错误消息
realms
:指定数据包分类,此选项主要用于配合 tc 做流量整形
# 以源地址作为路由依据
ip rule add from 192.168.19.0/24 table test1
ip rule add from 192.168.17.100/32 table test1
# 以源地址和 tos 作为路由依据
ip rule add from 192.168.0.0/16 tos 0x10 table test1
# 以目标地址作为路由依据
ip route add to 192.168.100.100/32 table test1
ip route add to 192.168.101.0/24 table test1
# 以防火墙标记为路由依据,需要防火墙使用选
ip rule add fwmark 1 table 1
路由管理
ip route add ipaddress via ipaddress1 table table_name
说明:
ipaddress
参数表示网络号
via
选项指定的参数
ipaddress1
表示网关 ip 地址,即下一跳地址
table_name
表示路由表名
# 添加到 test1的默认路由
ip route add default via 192.168.11.1 table test1
# 发往192.168.15.0/24网络的包下一跳地址是192.168.11.1
ip route add 192.168.15.0/24 via 192.168.11.1 table test1
示例 1
Linux 主机连接了两个(内部)子网:
- 192.168.1.0/24
- 192.168.2.0/24
拥有两个出口(互联网):
- 172.16.33.2,对端网关为 172.16.33.1,互联网出口 1:eno16,内部子网的默认出口
- 172.16.34.2,对端网关为 172.16.34.1,互联网出口 2:eno33,速度比出口 1 更快(VIP 用户)
需求:假定有 VIP 用户的 IP 地址为 192.168.1.52 和 192.168.2.54,现需要配置这两个地址的流量,使用出口 2 以获得更快的速度
配置过程(建议加到开机启动中):
# 建立路由表 T1
[root@localhost ~]# echo 200 T1 >> /etc/iproute2/rt_tables
# 设置 VIP 用户的数据包,使用路由表 T1 路由
[root@localhost ~]# ip rule add from 192.168.1.52/32 table T1
[root@localhost ~]# ip rule add from 192.168.2.54/32 table T1
[root@localhost ~]# ip rule ls
0: from all lookup local
32764: from 192.168.2.54 lookup T1
32765: from 192.168.1.52 lookup T1
32766: from all lookup main
32767: from all lookup default
# 为路由表 T1 添加出口2的默认路由
[root@localhost ~]# ip route add default via 172.16.34.1 table T1
[root@localhost ~]# ip route list table T1
default via 172.16.34.1 dev eno33554984
示例 2:负载均衡
负载均衡的配置方法与选择出口的配置方法略有不同,因为负载均衡时需要考虑一个新的
问题,需要保证连接的持续性,即从互联网出口 1 进来的数据包返回时也从出口 1 返回;出口
2 亦相同
# 添加两个路由表 table1和 table2
[root@localhost ~]# echo 100 table1 >> /etc/iproute2/rt_tables
[root@localhost ~]# echo 200 table2 >> /etc/iproute2/rt_tables
# 分别添加返回路由
[root@localhost ~]# ip route add default via 172.16.33.1 dev eno16777736 src
172.16.33.2 table1
[root@localhost ~]# ip rule add from 172.16.33.2 table table1
[root@localhost ~]# ip route add default via 172.16.34.1 dev eno33554984 src
172.16.34.2 table2
[root@localhost ~]# ip rule add from 172.16.34.2 table table2
# 设置负载均衡策略
[root@localhost ~]# ip route add default scope global nexthop via 172.16.33.2
dev eno16777736 weight 1 netxthop via 172.16.34.2 dev eno33554984 weight 1
F&Q
RTNETL answers network is unreachable
ip router add
时出现,说明添加路由的网络不通