简介
Iproute2 是Linux 下管理控制TCP/IP网络和流量控制的新一代工具包,旨在代替老派的工具包 net-tools(ifconfig,arp,route,netstat等命令)
这两套工具本质的区别是,net-tools 是通过 procfs(/proc)和 ioctl 系统调用去访问和改变内核中的网络配置,而 iproute2 则通过 netlink套接字接口与内核通讯
Iproute2 用来显示或操纵Linux主机的路由,网络设备,策略路由和隧道,是Linux下强大的网络配置工具
net-tools 和 iproute2 常用命令对比
功能 | 老用法 | 新用法 |
---|---|---|
网络连接 | netstat -a | ss |
路由表 | netstat -r/route | ip route |
网络接口统计信息 | netstat -I | ip -s link |
组播成员 | netstat -g | ip maddr |
伪连接 | netstat -M | ss |
网络接口地址和链路 | Ifconfig | ip addr /ip link |
ARP | arp | ip neigh |
隧道 | Iptunnel | ip tunnel |
命令安装
yum install -y iproute iproute-doc #安装工具包和文档
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]}
基本用法:
ip address show | ip a //显示分配给所有网络接口的地址
ip link show | ip l //显示所有网络设备的运行状态
ip neigh show | ip n //显示当前的邻居表
ip route show | ip r //显示核心路由表
ip rule show | ip ru //显示当前路由规则
ip address [add|del] 192.168.0.1/24 dev ens33 //为接口添加|删除IP地址
ip link set ens33 [up|down] //启动|关闭接口
ip -s link show ens33 //显示接口统计
ss -utpln //显示当前监听的进程
ip ro add blackhole 1.2.3.4/32 //黑洞路由,来自这个IP的数据包不做应答
iproute策略路由
iproute2 策略路由比传统路由在功能上更强大,使用更灵活。它能够根据目的地址或源地址,报文大小、应用等需求来选择数据包的转发路径。
iproute2 策略路由分为两个部分:路由转发表和路由匹配规则。通过编写路由匹配规则,选择相应的路由表,进行数据的查表转发
-
路由转发表:ip route
-
路由匹配规则:ip rule
策略路由是把数据信息从源穿过网络到达目的地的行为,有两个动作:
- 确定最佳路径:手动指定路由或自动学习路由
- 传输信息:隧道传输,流量整形
添加路由表
多路由表
策略路由一般手工添加路由表,在rt_tables文件中存放了表名和表号的对应关系,以数字来区分路由表。iproute2 默认存在编号为255、254、253三张表,表0为保留,iproute2 最多支持255张表
cat /etc/iproute2/rt_tables
# reserved values
255 local // 本地路由表,存有本地接口地址,广播地址,以及NAT地址
254 main // 主路由表,传统路由表,ip route若没有指定路由表,则默认操作该表(一般存在所有主机的路由条目)
253 default // 默认路由表一般存放默认路由
0 unspec // 系统保留
# local
#1 inr.ruhep
添加表名和表号的对应关系
vim /etc/iproute2/rt_tables
+ 252 table1
添加路由条目
ip route add 192.168.2.0/24 via 192.168.1.1 table table1 //添加静态路由到表1,优先匹配最小掩码
ip route add default via 192.168.1.1 table table1 //添加默认路由到表1,默认的路由是转发的最后保障,匹配不到路由时,会匹配默认路由
ip route flush cache //刷新路由缓冲,立即生效
查看路由表中的路由条目
ip route show table table1
default via 192.168.88.1 dev ens33
192.168.2.0/24 via 192.168.88.1 dev ens33
* 路由表中应当指明默认路由,尽量不回查路由表,路由添加完毕,即可在路由规则中应用
添加转发规则
路由在选路时,数据包根据路由规则进行匹配。按照优先级(pref)从高到低匹配(数字越小,优先级越大),直到找到合适的规则。如果没有匹配到合适的路由条目,则会匹配默认路由,所以在应用中配置默认路由是必要的。
添加转发规则
ip rule add pref 1000 from 192.168.1.0/24 lookup table1 //从192.168.1.0/24发来的包,按照编号为1的表进行匹配路由
ip rule add pref 1000 to 192.168.2.0/24 lookup table1 //去192.168.2.0/24的包,按照编号为1的表进行匹配路由
ip rule add pref 800 from 192.168.1.0/24 to 192.168.1.0/24 lookup table1 //从192.168.1.0/24来的,要去192.168.1.0/24的包,按照编号为1的表进行匹配路由
查看转发规则
ip rule show
0: from all lookup local
800: from 192.168.1.0/24 to 192.168.1.0/24 lookup table1
1000: from 192.168.1.0/24 lookup table1
1000: from all to 192.168.2.0/24 lookup table1
32766: from all lookup main
32767: from all lookup default
ip rule 参数详解:
from -- 源地址
to -- 目的地址(这里是选择规则时使用,查找路由表时也使用)
tos -- IP包头的TOS(type of sevice)域
dev -- 物理接口
fwmark -- 防火墙参数
采取的动作除了指定路由表外,还可以指定下面的动作:
nat -- 透明网关
prohibit -- 丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息
reject -- 单纯丢弃该包
unreachable -- 丢弃该包,并发送 NET UNREACHABLE的ICMP信息
数据包标记转发
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1 //将目的端口为tcp,80,8080,20,21,源IP为192.168.1.0/24的数据包标记为1
ip rule add fwmark 1 pref 1000 table table1 //标记为1的数据包进行查表转发
iptunnel隧道
GRE是通用路由封装协议,内部能封装二层,三层,MPLS……它能封装的报文类型很多,但一般都用于封装三层报文,所以也有叫三层隧道协议的,但这个说法也不严谨。例如:GRE能封装MPLS,ISIS等,这些都不是三层报文。
三层GRE
ip 命令创建(一次性,重启失效)
ip tunnel add gre01 mode gre remote 192.168.2.22 local 192.168.2.23 ttl 255 //创建ip隧道,类型为三层gre,名称为gre01,远程IP地址2.215,本地IP地址2.180
ip addr add 192.168.0.1/30 dev gre01 //给gre01配置IP地址
ip link set gre01 up //启动gre01接口
配置文件配置
vim /etc/sysconfig/network-scripts/ifcfg-gre01
DEVICE=gre01
BOOTPROTO=none
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=192.168.2.22
MY_OUTER_IPADDR=192.168.2.23
PEER_INNER_IPADDR=192.168.0.2/30
MY_INNER_IPADDR=192.168.0.1/30
TTL=255
二层GRE
ip link add gretap01 mode gretap remote 192.168.2.215 local 192.168.2.180 ttl 255 //创建ip隧道,类型为二层gretap,名称为gretap01,远程IP地址2.22,本地IP地址2.23
ip addr add 192.168.0.1/30 dev gretap01 //给gretap01配置IP地址
ip link set dev gretap01 up //启动gretap01接口
ps:
如果源目地址相同,想要创建多条gre隧道,需要添加key值的选项
ip link add gretap01 mode gretap remote 192.168.2.215 local 192.168.2.180 ttl 255 key 1
删除隧道
ip link del <隧道名称>