网络配置之利器
目录
下载及安装
# Redhat 下
yum install iproute*
# Ubuntu 下
apt install iproute*
# 网卡具有如下的几种工作模式:
1) 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。
2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。
4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。
一般来说,混杂模式不会影响网卡的正常工作,多在网络监听工具上使用。
# 打开与关闭网口的混杂模式
ip link set ens2f0 promisc on/down
常用功能配置
IP 命令查看命令帮助
# 第一种方式
[root@53_mach ~]# man ip-xxx
ip-address ip-fou ip-l2tp ip-macsec ip-monitor ip-mroute ip-netconf ip-nexthop ip-route ip-sr ip-token ip-vrf
ip-addrlabel ip-gue ip-link ip-maddress ip-mptcp ip-neighbour ip-netns ip-ntable ip-rule ip-tcp_metrics ip-tunnel ip-xfrm
# 第二种方式
[root@53_mach ~]# ip li help [ bareudp | bond | bond_slave | bridge | bridge_slave |
dummy | erspan | geneve | gre | gretap | ifb |
ip6erspan | ip6gre | ip6gretap | ip6tnl |
ipip | ipoib | ipvlan | ipvtap |
macsec | macvlan | macvtap |
netdevsim | nlmon | rmnet | sit | team | team_slave |
vcan | veth | vlan | vrf | vti | vxcan | vxlan | xfrm ]
[root@53_mach ~]# ip a help
常用信息查看
# 查看网口详细信息
ip -s a show ens3
# 查看路由表
ip ro 或 ip route show 或 ip route list 或 route -n
# 以 json 格式打印各网口信息
ip -j a
# 以缩略格式显示各网口 IP 地址配置
ip -br a 或显示颜色: ip -c -br a
# 查询路由包
ip route get 77.77.77.222
# 为每个地址设置一个字符串作为标签
ip addr add local 172.16.0.76 brd + label ens330:1 dev ens33
物理网口常用设置
# 开启与关闭网口
ip lin set ens3 up/down
# 清除指定网口的 所有 IP
ip a flush dev <网口名>
# 设置 Mac 地址
ip link set dev enp0s31f6 address XX:XX:XX:XX:XX:XX
# 设置网卡 mtu
ip link set eth0 mtu 9000 up
# 设置网卡队列长度
ip link set ens2f0 txqueuelen 1200
# 修改网口名
ip link set ens9 name e9
路由相关
# 添加 172.16.0.0网段转发到ens33
ip route add 172.16.0.0 dev ens33
ip neigh chg 172.16.0.4 dev ens33 nud reachable # 把状态改为可达
# 配置 ARP 表项
ip neigh add 33.33.33.13 dev ens5f0
ip neigh del 33.33.33.13 dev ens6f0
Bonding 相关
# 查看 bond 配置相关命令帮助
ip li help bond
# 创建bond口
# mode为1
ip link add bond0 type bond mode 1 miimon 100
# mode为2
ip link add bond0 type bond mode 2 xmit_hash_policy layer3+4 miimon 100
# mode为4
ip link add bond0 type bond mode 4 xmit_hash_policy layer2 miimon 100
ip link add bond0 type bond mode 4 xmit_hash_policy layer2+3 miimon 100
ip link add bond0 type bond mode 4 xmit_hash_policy layer3+4 miimon 100
# 删除 bond 口
ip -d link set bond0 type bond mode 2
ip link add bond0 type bond
ip link set bond0 down
ip link set enp4s0f0np0 down
ip link set enp4s0f1np1 down
ip link set enp4s0f0np0 nomaster
ip link set enp4s0f1np1 nomaster
ip link set enp4s0f0np0 master bond0
ip link set enp4s0f1np1 master bond0
# 添加两个内核口为成员口
ip link set ens1f2 down
ip link set ens1f3 down
ip link set enp4s0f0np0 type bond_slave
ip link set enp4s0f1np1 type bond_slave
ip link set ens1f2 master bond0
ip link set ens1f3 master bond0
# 删除成员口
ip link set ens1f2 nomaster
ip link set ens1f3 nomaster
# 删除bond
ip link delete bond0
# up bond 口
ip link set bond0 up
ifconfig bond0 101.73.0.2/24 up
ip -d link set bond0 type bond xmit_hash_policy layer3+4
# 查看bond信息
cat /proc/net/bonding/bond0
# 为bond 口设置 Mac 地址
ip link add bond0 type bond miimon 100 mode balance-rr xmit_hash_policy layer3+4
ip link set bond0 up
ip link set dev eth1 master bond0
ip link set dev eth2 master bond0
ip link set dev bond0 address 00:11:22:33:44:58
ip link set dev eth1 address 00:11:22:33:44:58
ip link set dev eth2 address 00:11:22:33:44:58
# 查看所有 bond 接口 IP 配置信息
ip -s a show type bond
ip -s li show type bond
# 查看所有 bond 子接口 IP 配置信息
ip -s a show type bond_slave
# 完整配置模板代码
ip link add bond4 type bond mode 4 xmit_hash_policy layer3+4 miimon 100
ifconfig ens22f0 down
ifconfig ens22f1 down
ip link set ens22f0 nomaster
ip link set ens22f1 nomaster
ip link set ens22f0 master bond4
ip link set ens22f1 master bond4
ip link set bond4 up
Vlan 相关
# 给指定网卡创建 vlan
ip link add link <网卡名> name <网卡名.ID> type vlan id <ID>
# 删除 vxlan 网口
ip li del <网卡名.ID> type vlan
VXlan 相关
# 创建 vxlan 网口
ip link add vxlan1 type vxlan id 1 remote 172.31.0.107 dstport 4789 dev eth0
ip link set vxlan1 up
ip addr add 10.0.0.106/24 dev vxlan1
# 删除 vxlan 网口
ip li del vxlan1 type vxlan
Gre 隧道
# 创建 Gre 接口, remote 的 IP, 也需提前配置好
ip a add 15.15.15.33/24 dev bond4
ip tunnel add gre1 mode gre local 15.15.15.33 remote 15.15.15.22 ttl 255 dev bond4
# 打开 Gre 接口
ip link set gre1 up
# 添加地址
ip addr add 10.10.10.1 peer 10.10.10.2 dev gre1
# 关闭 Gre 接口
ip link set gre1 down
# 删除 Gre 接口
ip tunnel del gre1
Geneve 隧道
# 创建 Geneve 接口, remote 的 IP, 也需提前配置好
ip a add 15.15.15.33/24 dev bond4
ip link add gnv1 type geneve id 100 remote 15.15.15.122 dstport 6081
# 打开 Geneve 接口
ip link set gnv1 up
# 添加地址
ip a add 16.16.16.133/24 dev gnv1
# 关闭 Geneve 接口
ip link set gnv1 down
# 删除 Geneve 接口
ip li del gnv1 type geneve
Netns 命名空间相关
# 显示所有的 netns
ip netns list
# 创建 netns 网口
ip netns add t11
# 添加物理网口到 netns
ip link set ${interface_name1} netns t11
# 在指定的 netns 中执行命令
ip netns exec t11 ip address add dev ${interface_name1} 1.1.1.2/24
ip netns exec t11 ip link set ${interface_name1} up
ip netns exec t11 iperf -s -p 45000 -P 6
# 对所有 netns 执行命令
ip -all netns exec ip -s a
# 删除 netns
ip netns del t11
# 一个 host 内两 PF 口自环或链接交换机实现打流
left_name="ens22f0np0"
right_name="ens22f1np1"
# 1. 创建 namespace
ip netns a ns1
ip netns a ns2
# 2. 分别将 2 个物理口添加到两个 netns
ip li set $left_name netns ns1
ip li set $right_name netns ns2
# 3. 给两个 ns 中的 eth 配置 IP 并启用
ip netns exec ns1 ip a add 10.1.1.2/24 dev $left_name
ip netns exec ns1 ip l s $left_name up
ip netns exec ns2 ip a add 10.1.1.3/24 dev $right_name
ip netns exec ns2 ip l s $right_name up
# 4. 分别开启 iperf 服务端和 客户端
ip netns exec ns1 iperf -s -p 3333 -D
ip netns exec ns2 iperf -c 10.1.1.2 -t 200 -i 2 -p 3333 -P 4 > /tmp/iperf.log &
neigh ---邻居表
# 查看邻居表
ip neigh
# 清空邻居表
ip neigh flush all
veth --- 虚拟设备
veth是linux的一种虚拟网络设备,它有点类似于两张网卡中间用一条网线连着,veth设备总是成对出现,通常用来连接不同网络命名空间(下面开始简称NS),一端连着NS1的内核协议栈,另一端连着NS2的内核协议栈,一端发送的数据会立刻被另一端接收;
# veth设备的特点
1. veth和其它的网络设备都一样,一端连接的是内核协议栈。
2. veth设备是成对出现的,另一端两个设备彼此相连
3. 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去
# 显示查看 所有 veth 口
ip li show type veth
# 删除所有 veth 设备
modprobe -r veth && modprobe veth
ip link add veth0 type veth peer name veth1
ip netns add ns1
ip link set veth0 netns ns1
ip netns exec ns1 ip a add 33.33.33.22/24 dev veth0
ip a add 33.33.33.11/24 dev veth1
bridge -- 虚拟桥接口
# 首先创建 bridge br0
ip l a br0 type bridge
ip l s br0 up
# 然后创建两对 veth-pair
ip l a veth0 type veth peer name br-veth0
ip l a veth1 type veth peer name br-veth1
# 分别将两对 veth-pair 加入两个 ns 和 br0
ip l s veth0 netns ns1
ip l s br-veth0 master br0
ip l s br-veth0 up
ip l s veth1 netns ns2
ip l s br-veth1 master br0
ip l s br-veth1 up
# 给两个 ns 中的 veth 配置 IP 并启用
ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0
ip netns exec ns1 ip l s veth0 up
ip netns exec ns2 ip a a 10.1.1.3/24 dev veth1
ip netns exec ns2 ip l s veth1 up
macvlan
# macvlan 的四种模式
1. private:过滤掉所有来自其他 macvlan 接口的报文,因此不同 macvlan 接口之间无法互相通信
2. vepa (Virtual Ethernet Port Aggregator) : 需要主接口连接的交换机支持 VEPA/802.1Qbg 特性。所有发送出去的报文都会经过交换机,交换机作为再发送到对应的目标地址(即使目标地址就是主机上的其他 macvlan 接口),也就是 hairpin mode 模式,这个模式用在交互机上需要做过滤、统计等功能的场景。
3. bridge:通过虚拟的交换机讲主接口的所有 macvlan 接口连接在一起,这样的话,不同 macvlan 接口之间能够直接通信,不需要将报文发送到主机之外。这个模式下,主机外是看不到主机上 macvlan interface 之间通信的报文的。
4. passthru:这种模式,只允许单个子接口连接主接口,且必须设置成混杂模式,一般用于子接口桥接和创建 VLAN 子接口的场景
# macvlan 的四种通信模式,常用模式是 bridge。
# 创建两个 macvlan 子接口, 以下 4 种方式都可
ip link set eth0 promisc on
ip link add link <网卡名> name mac01 type macvlan mode private
ip link add link <网卡名> dev mac1 type macvlan mode bridge
ip link add link <网卡名> dev mac2 type macvlan mode vepa
ip link add link <网卡名> mv2 type macvlan mode bridge
# 开启口
ip link set mac01 up
# 为 macvlan 口添加 IP
ip addr add 192.168.1.3/24 dev mv3
# 删除 macvlan 口
ip li del mac04 type macvlan
mactap
参考网址
tun/tap设备
在计算机网络中,TUN 与 TAP 是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部由软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。 TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN 模拟了网络层设备,操作第三层数据包比如 IP 数据封包。
操作系统通过 TUN/TAP 设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过 TUN/TAP 设备发送数据。在后种情况下,TUN/TAP 设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程
# tun/tap设备有什么用?
tun/tap设备的用处是将协议栈中的部分数据包转发给用户空间的应用程序,给用户空间的程序一个处理数据包的机会。于是比较常用的数据压缩,加密等功能就可以在应用程序B里面做进去,tun/tap设备最常用的场景是VPN,包括tunnel以及应用层的IPSec等,比较有名的项目是VTun,有兴趣可以去了解一下。
# tun和tap的区别
用户层程序通过tun设备只能读写IP数据包,而通过tap设备能读写链路层数据包,类似于普通socket和raw socket的差别一样,处理数据包的格式不一样。
# 总结一下,虚拟网卡的两个主要功能是:
•1.连接其它设备(虚拟网卡或物理网卡)和虚拟交换机(bridge)
•2.提供用户空间程序去收发虚拟网卡上的数据
基于这两个功能,tap设备通常用来连接其它网络设备(它更像网卡),tun设备通常用来结合用户空间程序实现再次封装。换句话说,tap设备通常接入到虚拟交换机(bridge)上作为局域网的一个节点,tun设备通常用来实现三层的ip隧道