摘自 man
手册:
ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |netns | l2tp | tcp_metrics | token | macsec }
OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link} | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] |-ts[hort] | -n[etns] name | -a[ll] | -c[olor] -br[ief] }
功能
Linux下的 ip
命令可以显示和操作路由表、网络设备、网络接口和隧道等。
举例
网口相关
显示当前接口信息
$ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether f0:de:f1:f0:08:60 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 44:6d:57:5e:28:6c brd ff:ff:ff:ff:ff:ff
这里,显示出有一个 eth0
网卡,一个无线网卡 wlan0
和一个回环 lo
,其中 eth0
卡处于 down
的状态(因为使用 ifconfig eth0 down
将其禁用,使用 ifconfig
无法再看见 eth0
只能用 ifconfig -a
或 ip link list
开查看)。
启用网口
$ip link set eth0 up
也可用 ifconfig eth0 up
,建议用较新的 ip
命令。
关闭网口
$ip link set eth0 down
也可用 ifconfig eth0 down
。
显示 neighbor/arp
表
$ip neigh show
192.168.1.1 dev wlan0 lladdr ec:17:2f:3e:5b:4e STALE
IP地址相关
删除 eth0
的一个 ip
地址
#ip addr del 192.168.1.222 dev eth0
注: 一个网卡是可以有多个 ip
地址的, ip
地址是吊链的结构, ip
会返回网卡的所有 ip
地址,而 ifconfig
只返回首次设置的, ip
使用 netlink
设置网卡,而 ifconfig
直接使用 ioctl
。
为 eth0
添加一个 ip
地址
#ip addr add 192.168.1.111 dev eth0
添加之后,在原有网址基础上,可以也可访问 192.168.1.111
到达本机,但是只有第一次添加的 addr
在 ifconfig
中显示。
查看 ip
地址
#ip addr show
查看网卡上的 ip
地址,相对 ifconfig
,此命令显示一个网卡上所有的 ip
,而 ifconfig
只显示第一个。
删除所有的 ip
地址
#ip addr flush dev eth0
路由表相关
显示所有路由表
$ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
表名和编号对应信息可以查看 /etc/iproute2/rttables
。
显示路由表信息
$ip route show
default via 192.168.1.1 dev wlan0 proto static
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.100 metric 2
这里,默认显示 main
的路由表信息。通过 ip route
显示内核路由表,比只用 route
更为强大,后者只能对系统确认默认路由操作,而前者可以实现策略路由。
显示指定路由表信息
$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 192.168.1.0 dev wlan0 proto kernel scope link src 192.168.1.100
local 192.168.1.100 dev wlan0 proto kernel scope host src 192.168.1.100
broadcast 192.168.1.255 dev wlan0 proto kernel scope link src 192.168.1.100
实践
一个实践问题
假设:
无线网卡:192.168.0.109
有线网卡:192.168.0.216
两者在同一网段。
一般内核默认配置的路由表在 route
命令下可以操作和查看,但是会有问题。例如,
#netstat -rn
Destination Gateway Genmask Flags MSS Window irtt Iface
default 192.168.0.1 255.255.255.0 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
拔网线之后,如果其 route
显示的路由还有 eth0
的选项,那么匹配的时候还是选择从 eth0
口发送数据,这时候将会导致网络不通。
所以采用如下:
$ip rule delete from 192.168.0.216
$ip rule delete from 192.168.0.109
$ip rule delete to 192.168.0.216
$ip rule delete to 192.168.0.109
$ip route flush table main
$ip route flush table 200
$ip route flush table 201
$ip route flush cache
这里,将所有内容清空。
$ip route add 192.168.0.0/24 dev eth0 table 200
$ip route add 192.168.0.0/24 dev ra0 table 201
$ip rule add from 192.168.0.216 table 200
$ip rule add from 192.168.0.109 table 201
$ip route flush cache
这里,添加路由规则,然后使用 ip route flush cache
使其立即生效。注意这里的 from
,表示数据发自哪里。这个例子表示,如果来自 192.168.0.216
则使用 table 200
指定的路由表,如果来自 192.168.0.109
则使用 table 201
指定的路由表。
$route add -net 192.168.0.0/24 dev ra0
$route add -net 192.168.0.0/24 dev eth0
$route add default gw 192.168.0.1 dev eth0
这里设置的实际是 main
路由,实际没有作用, 路由规则指定使用的是 table 200
或 table 201
。
如上设置之后,当外部
$ping 192.168.0.109
会使用201的路由。
当外部
$ping 192.168.0.216
会使用200的路由。
插拔网线不会影响ip rule建立的规则,所以不会影响网络的通畅。
例子总结
设置命令:
# ip rule delete from 192.168.0.216
# ip rule delete from 192.168.0.109
# ip route flush table main
# ip route flush table 200
# ip route flush table 201
# ip route flush cache
# ip route add 192.168.0.0/24 dev eth0 table 200
# ip route add 192.168.0.0/24 dev ra0 table 201
# ip rule add from 192.168.0.216 table 200
# ip rule add from 192.168.0.109 table 201
# ip route flush cache
# route add -net 192.168.0.0/24 dev ra0
# route add -net 192.168.0.0/24 dev eth0
# route add default gw 192.168.0.1 dev eth0
查看路由与规则设置
-
查看路由规则
# ip rule list 0: from all lookup local 32764: from 192.168.0.109 lookup 201 32765: from 192.168.0.216 lookup 200 32766: from all lookup main 32767: from all lookup default
规则的优先级小的靠前,(即由上到下依次进行), 找到匹配的路由则进入,无论是否可达目的,找不到则找下一条规则对应路由直至匹配。
-
查看指定路由
# ip route list table 200 192.168.0.0/24 dev eth0
这里,假设设置了:
ip route add to unreachable 192.168.0.0/24 table 200
,这样根据前面的rule
匹配规则,进行ping 192.168.0.216
也会进入这里,并且返回网络不可达(即便后面的main
中有正确的路由项信息也不会使用)。# ip route list table 201 192.168.0.0/24 dev ra0 # ip route list table main 192.168.0.0/24 dev eth0 192.168.0.0/24 dev ra0 default via 192.168.0.1 dev eth0
-
查看默认路由
这里, 对于前面最后的
main
默认table
,也可用如下三种命令查看:#ip route 192.168.0.0/24 dev eth0 192.168.0.0/24 dev ra0 default via 192.168.0.1 dev eth0 # netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ra0 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 # route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 192.168.0.0 * 255.255.255.0 U 0 0 0 ra0 default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
这里,
netstat -rn
比route
要快一些。 -
其它
注意:
ip route add
中的src
信息不太懂,还有使用ip addr del
删除ip
会导致所有表里对应内容消失。
其它
未整理
以下内容也是来自实际例子,尚未仔细整理仅供参考。
杂乱
创建两个路由表
创建主要有三个过程,如下。
-
(1)建立映射表。
#echo 200 T1 >>/etc/iproute2/rttables #echo 300 T2 >>/etc/iproute2/rttables
如果不建立映射,则在后面的命令中直接使用
table
的id
而非别名。 -
(2)添加路由表。
#ip rule add from 1.1.1.1 table T1 #ip rule add to 1.1.1.1 table T2
这里,指定了创建时使用该路由表的网络包对应的规则,这样符合特定规则的网络包,就可选择特定的路由表(main路由表无规则,所以没有匹配那个路由表的时候,就用main)。
例如此处来自
1.1.1.1
的包使用T1
路由表,通往1.1.1.1
的包使用T2
路由表。 -
(3)向指定路由表追加表项。
例如:
# ip route add 1.1.1.0/24 dev eth0 table T1 # ip route add 1.1.1.0/24 dev ra0 table T2
意思是,
T1
路由表通过eth0
网络设备传输(一般是有线网卡),T2
路由表通过ra0
网络设备传输(一般是无线网卡)。 -
默认路由表
如无特殊规则,会使用默认路由表,对于
main
默认路由表,也可如下添加# route add -net 1.1.1.0/24 dev ra0 # route add -net 1.1.1.0/24 dev eth0 # route add default gw 1.1.1.1 dev eth0
路由表项的意思是自动会以
1.1.1.1
为默认网关,通过eth0
来传输网络包,而1.1.1.0/24
网段的包,由于后添加的,在route
命令输出中显示在前面,所以有限采用eth0
传输。
双网卡机器的网络设置
假设当前状况是:
-
有线网卡
ETH0
:192.168.27.120
-
无线网卡
WLAN0
:192.168.1.100
-
向默认路由表
main
添加路由项# ip route add default via 192.168.27.1 dev eth0 # ip route add 192.168.27.0/24 src 192.168.27.120 dev eth0 # ip route add 192.168.1.0/24 src 192.168.1.100 dev wlan0
将相关的表项添加默认路由表中。这样,不同ip地址的数据包,会对应到对应的网卡上。
-
显示默认路由表
main
的内容# ip route default via 192.168.27.1 dev eth0 proto static 169.254.0.0/16 dev wlan0 scope link metric 1000 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.100 metric 2 192.168.27.0/24 dev eth0 proto kernel scope link src 192.168.27.120 metric 1
这里用
route
命令显示的就是main
路由表的内容。 -
设置其它路由表名称映射
# echo 300 eth_table >>/etc/iproute2/rttables # echo 400 wifi_table >>/etc/iproute2/rttables
这会为
id
为300
和400
的路由表分别建立两个名字映射eth_table
和wifi_table
。 -
为
eth_table
路由表添加规则和内容# ip rule add from $ETH_IP table eth_table # ip route add default via $ETHGATE_IP dev eth0 table eth_table # ip route add $ETH_NET src $ETH_IP dev eth0 table eth_table
这里,
ip rule
指定来源于$ETH_IP
的包,使用eth_table
这个路由表。添加之后使用ip route flush cache
才能立即生效。 -
显示
eth_table
路由表内容# ip route list table eth_table default via 192.168.27.1 dev eth0 192.168.27.0/24 dev eth0 scope link src 192.168.27.120
注意,这里显示特定的路由表(非默认)的时候,使用的是
ip route list table xxx
命令。 -
为
wifi_table
路由表添加规则和内容# ip rule add from $WIFI_IP table wifi_table # ip route add default via $WIFIGATE_IP dev wlan0 table wifi_table # ip route add 192.168.1.0/24 src 192.168.1.100 dev wlan0 table wifi_table
-
显示
witi_table
路由表内容#ip route list table wifi_table default via 192.168.1.1 dev wlan0 192.168.1.0/24 dev wlan0 scope link src 192.168.1.100
-
检查总路由规则
至此,我们看到规则:
# ip rule list 0: from all lookup local 32764: from 192.168.1.100 lookup wifi_table 32765: from 192.168.27.120 lookup eth_table 32766: from all lookup main 32767: from all lookup default
不同的情况,会使用不同的路由表。
-
测试结果
经过实践,我们可以得到如下测试结果:
PC->192.168.1.102 ok
经过
wifi_table
PC->192.168.3.16 ok
经过……(应该是
main
)192.168.1.102->192.168.1.100 ok 192.168.3.16-> 192.168.1.100 ok
NEXT 其它操作
以下是比较常用的操作,具体结果可能在不同环境有所不同,有待实践,这里仅供参考。
-
按照特定的优先权设置下一跳
#ip route add default scope global nexthop via 192.168.27.1 dev eth0 weight 50 nexthop via 192.168.1.1 dev wlan0 weight 50 #ip route add default scope global nexthop via 192.168.1.1 dev eth0 weight 50 nexthop via 192.168.1.1 dev ra0 weight 50
-
更换网段
-
删除路由
-
关于优先权
#ip rule add priority 100 xxx
priority
由高到低,越来越大。 -
清空路由
main
#ip route flush table main
-
添加一个不可达网络
#ip route add to unreachable 192.168.0.0/24
这里,不要指定
dev
。
在运行任何这些命令都需要发送 ip route flush cache
命令来刷新路由缓冲,否则命令在一段时间以后才会生效,这段时间的长短依赖于路由表结构的大小和负载。
网友评论