Linux网络配置与工具

规范Linux网卡名,路由配置,网络bonding,网络组,网桥,网络工具。

网卡配置

OpenEuler

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 配置文件内改名为eth0
mv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-eth0
vim /etc/sysconfig/network-scripts/ifcfg-ens33

# 修改grub启动配置文件
vim /etc/default/grub
# GRUB_CMDLINE_LINUX 增加 net.ifnames=0 biosdevname=0

# 配置文件重新生成
grub2-mkconfig -o /etc/grub2.cfg

新增网卡

1
2
3
4
5
6
7
# /etc/sysconfig/network-scripts添加配置文件


# 修改IP后,重启连接生效
nmcli connection down eth1
nmcli connection reload eth1
nmcli connection up eth1

Ubuntu24.04

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 修改网卡配置
vim /etc/netplan/50-cloud-init.yaml

netplan apply

# 修改grub启动配置文件
vim /etc/default/grub
# GRUB_CMDLINE_LINUX 增加 net.ifnames=0 biosdevname=0

grub-mkconfig -o /boot/grub/grub.cfg

新增网卡

1
2
3
# 修改/etc/netplan/50-cloud-init.yaml网卡配置

netplan apply

Rocky9

2,3顺序不能换,否则网络服务无法启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 1.配置文件内改名为eth0
mv /etc/NetworkManager/system-connections/ens33.nmconnection  /etc/NetworkManager/system-connections/eth0.nmconnection
vim /etc/NetworkManager/system-connections/ens33.nmconnection

# 2.绑定网卡名称与MAC
vim /etc/udev/rules.d/70-persistent-net.rules
# SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:50:56:24:09: bd ", ATTR{type}== "1", NAME = "eth0"

# 3.修改grub启动配置文件
vim /etc/default/grub
# GRUB_CMDLINE_LINUX 增加 net.ifnames=0 biosdevname=0

# 3.配置文件重新生成
grub2-mkconfig -o /etc/grub2.cfg

新增网卡

1
2
3
4
5
6
7
8
# /etc/sysconfig/network-scripts 添加配置文件
vim /etc/NetworkManager/system-connections/eth1.nmconnection

# 绑定网卡名称与 MAC
vim /etc/udev/rules.d/70-persistent-net.rules
# SUBSYSTEM =="net", ACTION== "add", ATTR{address}==" 00:0c:29:08:86:83 ", ATTR{type}== "1", NAME = "eth1"

reboot

命令

hostname/hostnamectl

1
2
hostnamectl status			# 查看配置
hostname -i					# IP 地址

ifconfig/ip

用于配置和显示网络接口参数的命令行工具。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 修改 ip
ifconfig eth1 10.0.0.55 netmask 255.255.255.0

# 清除网卡 IP 信息
ifconfig eth1 0.0.0.0
ip addr flush dev eth1

# 禁用网络设备
ifconfig eth1 down
# 启用网络设备
ifconfig eth1 up

# 物理接口 eth0 上创建逻辑网络接口 eth0:1,并分别分配 IP 地址。
# 添加/删除 ip 并取别名,临时
ip addr add 10.0.0.55/24 dev eth1 label eth0:1
ip addr del 10.0.0.55/24 dev eth1
ifconfig eth1:1 10.0.0.200/24 up
ifconfig eth1:1 down
1
2
# 流量信息
ifconfig -s

image-20241113095422977

route

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
route -n		# 以 IP 显示

Flg 字段说明
B                           #该设备已经设置了广播地址                    
L                           #该设备是一个回环设备                    
M                       	#该设备能接收所有经过它的数据包, 而不论其目的地址是否是它本身
N                        	#该设备不能被追踪                       
O                        	#在该设备上禁用 ARP                       
P                        	#这是一个点到点链接                       
R                          	#当前设备正在运行                     
U                         	#当前设备处于活动状态                      



# 添加路由
route add 10.0.0.99 gw 10.0.0.2 dev eth1
route del 10.0.0.99 dev eth1

ip route add 10.0.0.99 via 10.0.0.2 dev eth1
ip route del 10.0.0.99 dev eth1

# 路由表需要在 /etc/iproute2/rt_tables 定义。
# metric 	name
# 100 		eth1_rt
ip route add 10.0.0.99 via 10.0.0.2 dev eth1 table eth1_rt
ip rule from 10.0.0.21 dev eth1 table eth1_rt

软路由

基于软件实现的路由器技术

image-20241113143715654

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# iptables 配 NAT
iptables -t nat -A POSTROUTING -s 172.24.0.0/16 -o ethN -j MASQUERADE

# ubuntu 关闭 ufw
ufw disable

cat /proc/sys/net/ipv4/ip_forward

vim /etc/sysctl.conf
vim /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward=1

ip

1
2
3
4
5
ip link show
ip link set <interface> up
ip link set <interface> down
ip link set <interface> name <newname>
ip link set <interface> mtu <num>			# 最大传输单元
1
2
3
4
ip a
ip address add 10.0.0.114/24 dev ens160 label ens160:114
ip a del 10.0.0.114/24 dev ens160 label ens160:114
ip addr flush dev ens160
1
2
3
4
5
6
ip route
ip route add <TARGET> via <GW> dev <IFACE> src <SOURCE_IP>
ip route add default via <GW> dev <IFACE>
ip route del <TARGET>
ip route flush [dev IFACE] [via PREFIX]
ip route get <IP>												# 到达 IP 经过的路由过程

netstat/ss

1
2
3
4
5
6
-r			# route
-t			# tcp
-u			# udp
-n			# ip,端口数字
-p			# 进程相关信息
-l			# listening

nmcli

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
nmcli con [show]						# 查看网络连接
nmcli con show --active					# 查看活跃连接
nmcli con show ens160					# 查看指定设备
nmcli con del ens160					# 删除连接
nmcli con up ens160						# 启用连接
nmcli con down ens160					# 禁用连接
nmcli connection reload					# 刷新连接

nmcli dev status 						# 显示设备状态
nmcli dev show ens160					# 网络接口属性
1
2
# 新增网卡生成配置
nmcli connection add con-name con-eth1 ipv4.addresses 172.16.1.111/16 ipv4.method manual type ethernet ifname eth1

网络绑定 bounding(网络聚合)

将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP 地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址。

绑定模式

bonding 支持多种模式,可以通过 mode 参数进行设置。以下是常见的绑定模式:

  • mode: balance-rr (0):轮询模式,循环发送数据包,实现负载均衡
    • 数据包可能乱序传输
  • mode: active-backup (1):主备模式,只有一个接口处于活动状态,其他接口作为备份。
    • 容错
    • 无负载均衡
  • mode: balance-xor (2):XOR 负载均衡,根据 源和目标的 MAC 地址进行流量分配。
    • 容错
    • 负载均衡
    • 需要交换机配置链路聚合
    • 分配算法依赖于 MAC 地址,不适用于每个连接均匀分配带宽的场景。
  • mode: broadcast (3):广播模式,所有数据包通过所有接口发送,适用于高可靠性需求。
    • 容错
    • 带宽利用率低
  • mode: 802.3ad (4):IEEE 802.3ad 动态链接聚合(LACP)。
    • 需要交换机支持并配置为 LACP 模式;需要专业的网络设备和配置支持。
  • mode: balance-tlb (5):自适应传输负载均衡,根据负载自动调整发送流量。
    • 接收负载均衡不完善,只有发送流量能达到较好的负载均衡效果。
  • mode: balance-alb (6):自适应负载均衡,提供传输和接收方向的负载均衡。通过 ARP 协议实现接收负载均衡,主动协调负载,以动态优化带宽。
    • 在高负载场景下,性能可能不如 802.3ad 模式。
1
2
3
4
常用的模式为 0,1,3,6
mode 156 不需要交换机设置
mode 0234 需要交换机设置而且不同类型的交换机设置的时候会有不一样 Cisco 交换机需要在
0,2,3 模式中使用 EtherChannel 4 模式中需要使用 LACP  EtherChannel

openEuler

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 网卡绑定配置
cat > /etc/sysconfig/network-scripts/ifcfg-bond0 <<-eof
NAME = bond0
TYPE = bond
DEVICE = bond0
BOOTPROTO = none
IPADDR = 192.168.74.122
PREFIX = 24
BONDING_OPTS = "mode = 1 miimon = 100 fail_over_mac = 1"
eof
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 网卡 1 配置
cat > /etc/sysconfig/network-scripts/ifcfg-eth1 <<-eof
NAME = eth1
DEVICE = eth1
BOOTPROTO = none
MASTER = bond0
SLAVE = yes
ONBOOT = yes
eof

# 网卡 2 配置
cat > /etc/sysconfig/network-scripts/ifcfg-eth2 <<-eof
NAME = eth2
DEVICE = eth2
BOOTPROTO = none
MASTER = bond0
SLAVE = yes
ONBOOT = yes
eof
1
nmcli con reload

测试

1
2
3
4
nmcli device
nmcli conn
ip a
cat /proc/net/bonding/bond0
1
2
3
4
5
6
# 另一台主机
ping 192.168.74.122

# 网卡绑定主机
ip link set eth1 down
# 查看 ping 的情况

关闭绑定

1
2
3
4
5
nmcli conn down bond0

rm -rf /etc/sysconfig/network-scripts/ifcfg-{bond0, eth1, eth2}

nmcli conn reload

rocky9

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# bound 配置生成
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode = active-backup, miimon = 1000"
nmcli connection modify bond0 ipv4.addresses '192.168.8.123/24' ipv4.gateway '192.168.8.2' ipv4.method manual

# 网卡 1 配置生成
nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname ens224 master bond0

# 网卡 2 配置生成
nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname ens256 master bond0

# 之后同上

Ubuntu

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat /etc/netplan/bond0.yaml
# bound 与网卡配置
network:
  ethernets:
    ens37:
     addresses: []
     dhcp4: false
    ens38:
     addresses: []
     dhcp4: false
  version: 2
  bonds:
    bond0:
     addresses: [192.168.8.124/24]
     interfaces: [ens37, ens38]
     parameters:
       mode: balance-rr						 	 	      # 轮询模式

网络组

网络组( Network Teaming)是一种聚合物理和虚拟网络接口的方法,以提供高吞吐量或冗余的逻辑接口。网络组使用一个结合了内核模块用户空间服务来实现数据包流的快速处理。

高吞吐量:通过聚合多个接口,网络组能够增加可用带宽,从而提高数据传输的总吞吐量。

冗余性:在一个接口故障的情况下,网络流量会自动转移到其他接口,确保网络连接不中断,提高可靠性。

负载均衡:网络组能够在多个接口之间分配流量,以提高资源利用率并减少网络延迟。

灵活性:支持多种模式和策略,可满足不同的网络需求,例如高性能或高可用性场景。

Network Teaming的功能实现,依赖于两个非常重要的事情:teamd软件以及NetworkManager的 team插件。如果这两个软件不存在的话,导致后面网络组设备启动失败

1
2
3
yum install -y teamd NetworkManager-team

apt install libteam-utils -y

网络组的模式

  1. Broadcast(广播)
  2. RoundRobin(轮询)
  3. Random(随机)
  4. ActiveBackup(主动备份)
  5. LoadBalance(负载均衡)
  6. LACP(链路汇聚控制协议)
    • 基于 IEEE 802.3ad 协议的链路聚合,允许交换机和设备自动协商以实现链路聚合。

openEuler

1
2
3
4
5
6
7
# 配置网络组接口(对外)
nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "loadbalance", "hwaddr_policy": "by_active"}}' ipv4.addresses 192.168.74.22/24 ipv4.method manual 

# 配置网络组端口 1(网卡 1)
nmcli connection add con-name team0-eth1 type team-slave ifname eth1 master team0 
# 配置网络组端口 2(网卡 2)
nmcli connection add con-name team0-eth2 type team-slave ifname eth2 master team0 

测试

“hwaddr_policy”: “by_active” 不起效

1
2
3
4
teamdctl team0 state

ip link set eth1 down
ip link set eth2 down

关闭

1
2
3
4
nmcli con down team0
nmcli con del team0
nmcli con del team0-eth1
nmcli con del team0-eth2

ubuntu

1
2
3
4
5
6
7
nmcli con add type team con-name team0 ifname team0 config '{"runner":{"name": "activebackup"}}' ipv4.addresses 192.168.74.12/24 ipv4.method manual ipv6.method disabled

nmcli c modify team_conn config '{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}'

nmcli con add con-name team0-eth1 type team-slave ifname eth1 master team0

nmcli con add con-name team0-eth2 type team-slave ifname eth2 master team0

rocky9

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
nmcli connection add type team con-name team0 ifname team0 team.runner activebackup
nmcli connection modify team0 ipv4.addresses '192.168.8.123/24' ipv4.gateway '192.168.8.2' ipv4.method manual
nmcli c modify team_conn config '{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}'

nmcli connection modify team0 team.link-watchers "name = ethtool delay-up = 1000"

# 配置网络组端口 1(网卡 1)
nmcli connection add con-name team0-eth1 type team-slave ifname eth1 master team0 
# 配置网络组端口 2(网卡 2)
nmcli connection add con-name team0-eth2 type team-slave ifname eth2 master team0 

测试

1
2
3
4
nmcli connection down team0-eth1
nmcli connection down team0-eth2

nmcli connection up team0-eth1

网桥

桥接:把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他 网口并发送出去。以使得网口之间的报文能够互相转发。网桥就是这样一个设备,它有若干个网口,并且这些 网口是桥接起来的。与网桥相连的主机就能通过交换机的报文转发而互相通信。

image-20241115085754857

配置

1
2
3
4
5
nmcli con add type bridge con-name br0 ifname br0
nmcli con up br0

nmcli con add type bridge-slave con-name br0-port0 ifname ens160 master br0
nmcli con add type bridge-slave con-name br0-port1 ifname ens192 master br0

brctl

brctl 是用于管理以太网桥的命令行工具,它在 Linux 内核中建立、维护和检查网桥配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
brctl addbr <name>
	    创建一个名为 <name> 的桥接网络接口
brctl delbr <name>
    删除一个名为 <name> 的桥接网络接口但桥接网络接口必须先 down 掉后才能删除
brctl show
    显示当前系统中所有的桥接接口及其状态
brctl addif <brname> <ifname>
    将一个物理接口 <ifname> 加入桥接接口 <brname> 
brctl delif <brname> <ifname>
     <brname> 中脱离一个 <ifname> 接口
brctl stp <bridge> <state>
    STPSpanning Tree Protocol是一种网络协议用于在交换机网络中防止环路并确保网络拓扑的稳定性使用命令可以配置或显示指定网桥的 STP 状态
    <state> 可以是'on''off'表示是否加入 STP 树中

创建网桥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
brctl addbr br0

brctl show

brctl stp br0 on

brctl addif br0 ens33
brctl addif br0 ens37

ip link set br0 up
ip link set ens33 up
ip link set ens37 up

诊断工具

fping

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-s						# 显示报告
-b						# 包大小										
-c						# 发包数
-g						# 范围ping 子网 或 IPa IPb
-i						# 发包间隔

# 不忽略外部主机的ping动作
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 忽略外部主机的ping动作 -- 即使主机在线,也不会被ping通
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

tcpdump

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
-i <接口名>
-c <Num>				# 抓包数
-w ./target.cap			# 结果保存到文件
-nn						# 不要同时解析主机名和端口名

# 列出系统上所有可用于捕获数据包的网络接口
tcpdump -D

tcpdump host 10.0.0.100
tcpdump src host 10.0.0.13
tcpdump dst host 10.0.0.13
tcpdump port 3000
tcpdump tcp
tcpdump tcp port 22 and src host 10.0.0.100

nmap

image-20241115095301823

image-20241115095313616

1
2
--min-parallelism 指定并发扫描的数量为2000
nmap --min-parallelism 2000 10.0.0.12-15

nc

  • 端口侦听:nc可以作为server以TCP或UDP方式侦听指定端口。
  • 端口扫描:nc可以作为client发起TCP或UDP连接,进行端口扫描。
  • 文件传输:可以在机器之间方便地传输文件,无需使用scp和rsync等工具,从而避免了输入密码的操作。
  • 网络测速:通过传输文件的方式,可以测试两台机器之间的网络速度
1
2
3
4
# Centos系统:
yum install nc
# ubuntu系统:
apt install netcat-openbsd
1
2
3
4
5
6
7
8
# A机,监听8888
nc -l 8888

# B机发起连接
nc 127.0.0.1 8888

# 通过 -e 指定shell的命令解释器,恶意行为者获取访问权限的常见方法是在开放端口上创建此类后门
nc -l 8888 -e /bin/bash