ip 是个命令, ip 命令的功能很多!基本上它整合了 ifconfig 与 route 这两个命令,不过 ip 的功能更强大。属于iproute2包的一个命令,功能很强大。
官网:http://www.policyrouting.org/
ip [ OPTIONS ] OBJECT [ COMMAND [ ARGUMENTS ]]
ip(选项)(参数)
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 | | fou | macsec | tcp_metrics | token | netconf | ila |
vrf | sr }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec | -j[son] | -p[retty] |
-f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
-4 | -6 | -I | -D | -M | -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]}
-V:显示指令版本信息;
-s:-stats, -statistics输出更详细的信息;可以使用多个-s来显示更多的信息
-f:-family {inet, inet6, link} 强制使用指定的协议族;
-4:-family inet的简写,指定使用的网络层协议是IPv4协议;
-6:-family inet6的简写,指定使用的网络层协议是IPv6协议;
-0:shortcut for -family link.
-o:-oneline,输出信息每条记录输出一行,即使内容较多也不换行显示;
-r:-resolve,显示主机时,不使用IP地址,而使用主机的域名。
link :网卡信息
address:IP地址信息
neighbour:邻居表
route:路由表
rule:IP策略
maddress:多播地址
mourte:组播路由缓存条目
tunnel:IP隧道
add, delete, and show 之类的操作指令
ARGUMENTS是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev 是ip link 命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0。
ip link show
ip link show ens32
qdisc(queuing discipline)显示这个网络接口使用的排队算法。noqueue表示不对数据包进行排队;noop 表示这个网络接口出于黑洞模式,也就是所有进入本网络设备的数据会直接被丢弃。qlen 是网络接口传输队列的默认长度。
ip -s -s link show
ip -s -s link show ens32
ip link set设备接口属性
路由条目保存在内核的路由表中,它们包含寻找到其它网络节点的路径信息。路由表条目都包括一对网络地址/掩码长度以及可选的TOS值等信息。如果数据包目的地址位于属于路由条目的的范围,以及路由的TOS等于0或者等于数据包的TOS,它就匹配路由条目。
如果一个数据包匹配多个路由条目,系统内核将按照以下规则决定选择哪个路由:
路由表table TABLEID
从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。另外,为了方便,还可以在/etc/iproute2/rt_tables 中为路由表命名。
* table 0:系统保留
* table 253:称为默认路由表,表名为default。一般来说默认的路由都放在这张表。
* table 254:默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。 main表中路由记录都是普通的路由记录。而且,使用ip route配置路由时,如果不明确制定要操作的路由表,默认情况下也是主路由表(表254)进行操作。我们使用ip route list 或 route -n 或 netstat -rn查看的路由记录,也都是main表中记录。
* table 255:local。这个表保存本地和广播路由。内核会自动维护这个路由
表,通常系统管理员没有必要对它进行修改,甚至不必看到。
ip route show
ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254
ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关
ip route del default # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由
ip route change 0.0.0.0/0 via 192.168.10.2
在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、IP协议、传输层端口甚至数据包的负载。这就叫做:策略路由(policy routing)。
基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径。简单地来说,linux系统有多张路由表,而路由策略会根据一些条件,将路由请求转向不同的路由表。例如源地址在某些范围走路由表A,另外的数据包走路由表,类似这样的规则是有路由策略rule来控制。
在linux系统中,一条路由策略rule主要包含三个信息,即rule的优先级,条件,路由表。其中rule的优先级数字越小表示优先级越高,然后是满足什么条件下由指定的路由表来进行路由。在linux系统启动时,内核会为路由策略数据库配置三条缺省的规则,即rule 0,rule 32766, rule 32767(数字是rule的优先级),如下:
root@debian:/home/test# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
root@debian:/home/test# cat /etc/iproute2/rt_tables |grep -v "^#"
255 local
254 main
253 default
0 unspec
备注:在linux系统中是按照rule的优先级顺序依次匹配。假设系统中只有优先级为0,32766及32767这三条规则。那么系统首先会根据规则0在本地路由表里寻找路由,如果目的地址是本网络,或是广播地址的话,在这里就可以找到匹配的路由;如果没有找到路由,就会匹配下一个不空的规则,在这里只有32766规则,那么将会在主路由表里寻找路由;如果没有找到匹配的路由,就会依据32767规则,即寻找默认路由表;如果失败,路由将失败。
Usage: ip rule [ list | add | del ] SELECTOR ACTION
SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型][ dev STRING 物理接口]
[ pref NUMBER 优先级 ] [fwmark MARK iptables 标签]
ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换][ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | NUMBER ]
SELECTOR具体参数如下:
ACTION动作:
第一条命令将向规则链增加一条规则,规则匹配的对象是所有的数据包,动作是选用路由表1的路由,这条规则的优先级是32800.
第二条命令将向规则链增加一条规则,规则匹配的对象是IP为192.168.3.112, tos等于0x10的包,使用路由表2,这条规则的优先级是32801,动作是丢弃。
root@debian:~# ip rule add from 0/0 table 1 pref 32800
root@debian:~# ip rule add from 192.168.3.112/32 tos 0x10 table 2 pref 32801 prohibit
root@debian:~# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
32800: from all lookup 1
32801: from 192.168.3.112 tos 0x10 lookup 2 prohibit
而添加策略时,是可以不指定pref 优先级的,那么系统就会默认创建rule的ID,在main的前面往前移一位。
root@debian:~# ip rule add from 171.43.122.52 tab 200
root@debian:~# ip rule
0: from all lookup local
32765: from 171.43.122.52 lookup 200
32766: from all lookup main
32767: from all lookup default
还可以借助iptables来实现其他不一样的功能。
使用Netfilter的managle机制针对特定的数据包设置MARK值,在此将3389端口的数据包的MARK值设置为1,然后将fwmark 1的规则应用到ip rule上即可。这样就可以实现特定程序的流量走不同的路线。
root@debian:~# iptables -t mangle -A OUTPUT -p tcp --dport 8080 -j MARK --set-mark 1
root@debian:~# ip rule add fwmark 1 table 20 pref 20
root@debian:~# ip route add default via 171.43.122.52 table 20
root@debian:~# ip rule
0: from all lookup local
20: from all fwmark 0x1 lookup 20
32765: from 171.43.122.52 lookup 200
32766: from all lookup main
32767: from all lookup default
root@debian:~# iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 MARK set 0x1
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
公司内网要求192.168.0.100以内的使用 10.0.0.1 网关上网(电信),其他IP使用 20.0.0.1 (网通)上网。假定10.0.0.1以及20.0.0.1都是在同一张网卡上面。
ip route add default via 20.0.0.1 #添加默认网关,未指定table id,就是main表,
ip route add default via 10.0.0.1 table 20
ip rule add fwmark 20 table 20
iptable -t mangle -I PREROUTING -s 192.168.0.0-192.168.0.100 -j MARK --set-mark 2 #将源IP192.168.0.0~100在PREROUTING链就加上标记0x2
因为mangle的处理是优先于 nat 和fiter表的,所以相应数据包到达之后先打上标记,上例的标记为0x2,之后再通过ip rule规则。对应的数据包使用相应的路由表进行路由,查到有符合相应的ip rule规则,最后读取路由表id为2的信息,将数据包送出网关。
不要混淆路由表(route)和规则(rule):ip rule规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。
经典用法:
ip route add default via 192.168.10.1 dev eth2 table 200
ip rule add from 192.168.10.100 lookup 200
IP隧道技术:是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程。IP 隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。移动IPv4主要有三种隧道技术,它们分别是:IP in IP、最小封装以及通用路由封装。
Linux系统内核实现的IP隧道技术主要有三种(PPP、PPTP和L2TP等协议或软件不是基于内核模块的):ipip、gre、sit 。这三种隧道技术都需要内核模块 tunnel4.ko 的支持。
[root@test ~]# modinfo sit
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/net/ipv6/sit.ko.xz
alias: netdev-sit0
alias: rtnl-link-sit
license: GPL
retpoline: Y
rhelversion: 7.6
srcversion: DEA388D7EAE8B589CC2FA9C
depends: ip_tunnel,tunnel4
intree: Y
vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo: sha256
parm: log_ecn_error:Log packets received with corrupted ECN (bool)
[root@test ~]# modinfo ipip
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/net/ipv4/ipip.ko.xz
alias: netdev-tunl0
alias: rtnl-link-ipip
license: GPL
retpoline: Y
rhelversion: 7.6
srcversion: 48AB6E8CCBFD23E0B62DD2A
depends: ip_tunnel,tunnel4
intree: Y
vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo: sha256
parm: log_ecn_error:Log packets received with corrupted ECN (bool)
[root@test ~]# modinfo ip_gre
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/net/ipv4/ip_gre.ko.xz
alias: netdev-gretap0
alias: netdev-gre0
alias: rtnl-link-gretap
alias: rtnl-link-gre
license: GPL
retpoline: Y
rhelversion: 7.6
srcversion: 9D42148975517E1A9D81DD6
depends: ip_tunnel,gre
intree: Y
vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo: sha256
parm: log_ecn_error:Log packets received with corrupted ECN (bool)
首先在https://tunnelbroker.net/ 注册一个账号,然后create tunnel即可。
modprobe ipv6
ip tunnel add he-ipv6 mode sit remote 66.220.18.42 local 66.98.118.159 ttl 255
ip link set he-ipv6 up
ip addr add 2001:470:c:1ad6::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr
配置完成之后,可以在nginx开启监听ipv6的80口,就可以实现ipv6的通信了。
server
{
listen 80;
listen [::]:80;
server_name www.xmxyk.net xmxyk.net w6.xmxyk.net;
邻接(neighbour)对象实现同一网段协议地址和链路层地址的绑定。在内核中,这些条目被组织到表中。IPv4的相邻表也被叫做ARP表。ip neighbour命令支持对条目及其属性的显示、添加和删除。
ip [ OPTIONS ] neigh { COMMAND | help }
ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR ] [ nud { permanent | noarp | stale | reachable } ] | proxy ADDR } [ dev DEV ]
ip neigh { show | flush } [ proxy ] [ to PREFIX ] [ dev DEV ] [ nud STATE ]
ip neighbour add -- 添加一个新的邻接条目
ip neighbour change--修改一个现有的条目
ip neighbour replace--替换一个已有的条目
root@debian:~# ip neigh
192.168.10.2 dev ens34 lladdr 00:50:56:f4:bc:b3 STALE
192.168.10.100 dev ens34 lladdr 00:50:56:c0:00:08 DELAY
192.168.10.254 dev ens34 lladdr 00:50:56:ec:b2:95 DELAY
192.168.10.2 dev ens32 lladdr 00:50:56:f4:bc:b3 STALE
root@debian:~# ip ne show nud all
192.168.10.2 dev ens34 lladdr 00:50:56:f4:bc:b3 STALE
192.168.10.100 dev ens34 lladdr 00:50:56:c0:00:08 DELAY
192.168.10.254 dev ens34 lladdr 00:50:56:ec:b2:95 STALE
192.168.10.2 dev ens32 lladdr 00:50:56:f4:bc:b3 STALE
ff02::16 dev ens32 lladdr 33:33:00:00:00:16 NOARP
ff02::16 dev ens34 lladdr 33:33:00:00:00:16 NOARP
ff02::2 dev ens34 lladdr 33:33:00:00:00:02 NOARP
ff02::2 dev ens32 lladdr 33:33:00:00:00:02 NOARP
ff02::1:ff4c:bbdb dev ens34 lladdr 33:33:ff:4c:bb:db NOARP
ff02::1:ff4c:bbd1 dev ens32 lladdr 33:33:ff:4c:bb:d1 NOARP
root@debian:~# ip neigh add 192.168.10.3 lladdr 0:0:0:0:0:1 dev ens32 nud perm
root@debian:~# ip neigh show
192.168.10.2 dev ens34 lladdr 00:50:56:f4:bc:b3 STALE
192.168.10.100 dev ens34 lladdr 00:50:56:c0:00:08 REACHABLE
192.168.10.3 dev ens32 lladdr 00:00:00:00:00:01 PERMANENT
192.168.10.254 dev ens34 lladdr 00:50:56:ec:b2:95 STALE
192.168.10.2 dev ens32 lladdr 00:50:56:f4:bc:b3 STALE
root@debian:~# ip neigh chg 192.168.10.3 dev ens32 nud reachable
root@debian:~# ip neigh show
192.168.10.2 dev ens34 lladdr 00:50:56:f4:bc:b3 STALE
192.168.10.100 dev ens34 lladdr 00:50:56:c0:00:08 REACHABLE
192.168.10.3 dev ens32 lladdr 00:00:00:00:00:01 REACHABLE
192.168.10.254 dev ens34 lladdr 00:50:56:ec:b2:95 STALE
192.168.10.2 dev ens32 lladdr 00:50:56:f4:bc:b3 STALE
执行了删除命令之后,被删除的条目不会马上消失,它会在系统的下次垃圾收集时被删除。如果被操作的条目正在使用,将不能被删除。
root@debian:~# ip neigh del 192.168.10.100 dev ens34
root@debian:~# ip neigh show
192.168.10.100 dev ens34 lladdr 00:50:56:c0:00:08 REACHABLE
192.168.10.254 dev ens34 lladdr 00:50:56:ec:b2:95 STALE
如果试图删除或者手工修改一个由内核建立的noarp 条目,会导致一些不可预知的行为。
也可以使用flash这个命令来删除,其参数和ip neigh sh相同。不同之处是,如果没有参数,它什么也不会做。而且,默认情况下,被删除的条目不包括处于permanent和noarp状态的条目。
root@debian:~# ip -s -s neigh flush 10.0.0.3
Nothing to flush.