Linux命令学习手册-ip

摘自 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 -aip 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 到达本机,但是只有第一次添加的 addrifconfig 中显示。

查看 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 200table 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

查看路由与规则设置

  1. 查看路由规则

    # 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
    

    规则的优先级小的靠前,(即由上到下依次进行), 找到匹配的路由则进入,无论是否可达目的,找不到则找下一条规则对应路由直至匹配。

  2. 查看指定路由

    # 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
    
  3. 查看默认路由

    这里, 对于前面最后的 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 -rnroute 要快一些。

  4. 其它

    注意: ip route add 中的 src 信息不太懂,还有使用 ip addr del 删除 ip 会导致所有表里对应内容消失。

其它

未整理

以下内容也是来自实际例子,尚未仔细整理仅供参考。

杂乱

创建两个路由表

创建主要有三个过程,如下。

  1. (1)建立映射表。

    #echo 200 T1 >>/etc/iproute2/rttables
    #echo 300 T2 >>/etc/iproute2/rttables
    

    如果不建立映射,则在后面的命令中直接使用 tableid 而非别名。

  2. (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. (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 网络设备传输(一般是无线网卡)。

  4. 默认路由表

    如无特殊规则,会使用默认路由表,对于 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
  1. 向默认路由表 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地址的数据包,会对应到对应的网卡上。

  2. 显示默认路由表 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 路由表的内容。

  3. 设置其它路由表名称映射

    # echo 300 eth_table >>/etc/iproute2/rttables
    # echo 400 wifi_table >>/etc/iproute2/rttables
    

    这会为 id300400 的路由表分别建立两个名字映射 eth_tablewifi_table

  4. 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 才能立即生效。

  5. 显示 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 命令。

  6. 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
    
  7. 显示 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
    
  8. 检查总路由规则

    至此,我们看到规则:

    # 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
    

    不同的情况,会使用不同的路由表。

  9. 测试结果

    经过实践,我们可以得到如下测试结果:

    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 命令来刷新路由缓冲,否则命令在一段时间以后才会生效,这段时间的长短依赖于路由表结构的大小和负载。

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359