05 网络基础
目录
1 网络基础
常见的网络物理组件
路由器(Router):负责在不同网络之间,互联。
交换机(Switch):实现局域网内,互联。
集线器(Hub):早期的网络设备,用于集中连接多个设备,但不具备交换功能。
网卡(Network Interface Card, NIC):硬件设备,用于与网络进行通信。
调制解调器(Modem):将数字信号转换为模拟信号,以便在电话线上传输,或在计算机上处理。
光纤收发器(Fiber Optic Transceiver):发送和接收光信号的设备。
防火墙(Firewall):保护网络安全的设备,有硬件也有软件。
负载均衡器(Load Balancer):分配网络流量,有硬件也有软件。
1.2 OSI七层模型
这种分层结构使得不同层次之间的通信更加清晰和模块化,便于维护和扩展。每一层都依赖于下一层提供的服务,同时也为上层提供服务。
应用层(Application):负责处理应用程序,如HTTP、FTP、SMTP等。
表示层(Presentation):负责数据的格式转换、加密和解密等操作。
会话层(Session):负责管理会话,确保数据在各个系统之间可靠传输。
传输层(Transport):负责提供端到端的数据传输服务,如TCP和UDP协议。
网络层(Network):负责数据包的路由选择和转发,如IP协议。
数据链路层(Data Link):负责在物理层面上进行数据帧的发送和接收,如以太网协议。
物理层(Physical):负责传输比特流,包括电压、线路标准等物理特性。
1.3 TCP/IP 四层模型
TCP/IP四层模型(简化OSI七层)包括:
应用层(Application):负责处理特定的应用程序逻辑,如HTTP、FTP、SMTP等;
包含OSI的应用层、表示层、会话层。
传输层(Transport):负责提供端到端的数据传输服务,如TCP和UDP协议。
网络层(Internet):负责数据包的路由选择和转发,如IP协议。
链路层(Link):负责在物理层面上进行数据帧的发送和接收,如以太网协议;包含OSI的数据链路层、物理层。
2 局域网
集线器(Hub)
用于将多台计算机连接在一起,实现网络共享和数据传输。
集线器的特点包括:
信号广播:集线器会将接收到的信号广播到所有端口,不适用于大型网络,因为信号的广播会导致网络拥堵。
半双工通信:即数据只能在一个方向上传输。同一时间,数据只能发送或接收。
碰撞域:将所有连接到它的设备视为同一个碰撞域,当多个设备同时发送数据时,会发生碰撞,导致数据包丢失。
物理地址表:集线器没有物理地址表,只能将数据包广播到所有端口。
应用场景:
它主要用于小型网络和家庭网络。在大型网络中,通常会使用交换机(Switch)来代替集线器,因为交换机可以提供更好的性能和稳定性。
交换机(Switch)
用于连接多台计算机或其他网络设备,实现数据的传输和共享。
交换机的特点包括:
全双工通信:在同一时间,数据可以在发送和接收之间同时进行传输。
碰撞域:每个交换机端口都是一个独立的碰撞域,这意味着当多个设备同时发送数据时,不会发生碰撞。
物理地址表:会记录物理地址,并根据物理地址将数据包准确地转发到目标设备。
VLAN支持:交换机支持虚拟局域网(VLAN),可以将不同的设备划分到不同的VLAN中,从而实现网络的划分和隔离。
链路聚合:交换机支持链路聚合,可以将多个端口组合成一个逻辑端口,从而提高网络的带宽和可靠性。
应用场景:
从小型办公室到大型企业网络。在大型网络中,通常会使用多层交换机来实现更复杂的网络结构和功能。
路由器(Router)
用于将数据包从一个网络传输到另一个网络。路由器根据数据包的目标IP地址和路由表中的信息,选择最佳的路径来传输数据包。
路由器的特点包括:
网络互联:路由器可以连接不同类型的网络,如以太网、光纤网络等。
路由选择:根据路由表,选择最佳的路径来传输数据包。
IP地址管理:分配和管理IP地址,为网络中的设备提供唯一的IP地址。
防火墙功能:许多路由器具备防火墙功能。
VPN支持:路由器支持虚拟私人网络(VPN),可以建立安全的远程连接。
应用场景:
路由器广泛应用于各种规模的网络,从家庭网络到大型企业网络。
3 TCP/IP协议栈
3.1 传输层,TCP/UDP
TCP
面向连接的、可靠的、基于字节流的传输层通信协议。
TCP三次握手:
第一次握手:客户端发送一个带有SYN标志的TCP报文到服务器。
第二次握手:服务器返回一段带有SYN和ACK标志的TCP报文给客户端。
第三次握手:最后客户端发送一个带有ACK标志的TCP报文给服务器。
通过三次握手,双方都确认连接。
TCP四次挥手:
第一次挥手:当主机A向主机B发送一个带有FIN标志的TCP报文。
第二次挥手:主机B返回一个带有ACK标志的TCP报文,确认收到断开请求。
第三次挥手:当主机B也没有数据要发送了,会向主机A发送一个带有FIN标志的TCP报文。
第四次挥手:主机A收到主机B发来的FIN报文后,返回一个带有ACK标志的TCP报文。
通过四次挥手,就完成了TCP断开连接的过程。
挥手比握手多了一次,主机B数据发送完毕的确认才断开。
常见的TCP应用:
HTTP、HTTPS、FTP、SMTP(邮件服务)、IMAP(邮件服务)、SSH、DNS、MySQL/MariaDB、PostgreSQL、VPN、NTP等。
UDP
一种无连接的传输层协议,它不保证数据包的顺序到达或可靠性。
UDP适用于那些不需要可靠传输的应用,如实时通信、流媒体传输等。
UDP通常用于以下场景:
实时应用:如VoIP电话、视频会议等,这些应用对延迟敏感,需要快速传输数据。
游戏:许多在线游戏使用UDP进行数据传输,因为它可以提供较低的延迟和较高的吞吐量。
DNS查询。
对于那些需要可靠传输的应用,如文件传输、电子邮件等,通常会使用TCP(传输控制协议)作为替代方案。
范例:TCP内核参数优化
##逐步修改,观察
##先备份
[root@rocky-41 ~]$sysctl -a > sysctl-20240628.bak
[root@rocky-41 ~]$cat >>/etc/sysctl.conf <<EOF
net.ipv4.tcp_fin_timeout = 2
##这个参数设置了TCP连接在关闭后,处于TIME-WAIT状态的持续时间(单位:秒)。默认值为60秒,这里设置为2秒,可以加快资源回收的速度。
net.ipv4.tcp_tw_reuse = 1
##这个参数开启了TCP连接的TIME-WAIT重用功能,允许在TIME-WAIT状态的连接被快速回收。这有助于提高系统资源的利用率。
#net.ipv4.tcp_tw_recycle = 1
##这个参数开启了TCP连接的快速回收功能,它比TIME-WAIT重用更激进,可以在连接进入TIME-WAIT状态之前就进行回收。这有助于进一步提高系统资源的利用率。
net.ipv4.tcp_syncookies = 1
##这个参数开启了TCP的SYN Cookies功能,用于防止SYN Flooding攻击(一种拒绝服务攻击)。当系统资源不足时,可以使用SYN Cookies来处理新的TCP连接请求。
net.ipv4.tcp_keepalive_time = 600
##这个参数设置了TCP连接的保活时间(单位:秒),即在多长时间内没有数据传输时,发送保活包来检测连接的可用性。默认值为7200秒,这里设置为600秒。
net.ipv4.ip_local_port_range = 2000 65000
##这个参数设置了TCP连接的本地端口范围,用于分配给客户端的本地端口。默认值为32768到61000,这里设置为2000到65000。
net.ipv4.tcp_max_syn_backlog = 16384
##这个参数设置了TCP连接的最大半连接数(SYN队列长度)。默认值为1024,这里设置为16384。
net.ipv4.tcp_max_tw_buckets = 36000
##这个参数设置了TCP连接的最大TIME-WAIT状态的数量。默认值为18000,这里设置为36000。
net.ipv4.route.gc_timeout = 100
##这个参数设置了IP路由表的垃圾收集超时时间(单位:秒)。默认值为300秒,这里设置为100秒。
net.ipv4.tcp_syn_retries = 1
##这个参数设置了TCP连接的SYN重传次数。默认值为6,这里设置为1。
net.ipv4.tcp_synack_retries = 1
##这个参数设置了TCP连接的SYN+ACK重传次数。默认值未明确设置,这里设置为1。
net.ipv4.tcp_max_orphans = 16384
##这个参数设置了TCP连接的最大孤儿数量(已关闭但尚未从内存中删除的连接)。默认值为32768,这里设置为16384。
net.core.somaxconn = 16384
##这个参数设置了TCP连接的最大句柄数(系统中允许存在的最大TCP连接数)。默认值为128,这里设置为16384。
net.core.netdev_max_backlog = 16384
##这个参数设置了网络设备的最大积压包数量(即未被内核处理的包数量)。默认值为300,这里设置为16384。
EOF
##-p生效
[root@rocky-41 ~]$sysctl -p
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_orphans = 16384
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
3.2 Internet网络层IP地址组成网络+主机
网络 ID:标识网络,每个网段分配一个网络ID,处于高位
主机 ID:标识单个主机,由组织分配给各设备,处于低位
全为0:网段地址,不适用主机ID
全为1:广播地址,不适用主机ID
局域网IP
10.0.0.0.0到10.255.255.255:10.0.0.0/8
172.16.0.0到172.31.255.255:172.16.0.0/12
192.168.0.0到192.168.255.255:192.168.0.0/18
特殊IP
0.0.0.0:所有不清楚的主机和目的网络
127.0.0.1:环回地址,本机测试
*.*.*.255:广播地址
*.*.*.0/24每个子网的第一个地址:网络地址
子网掩码划分
IP/网络ID位数
如10.0.0.31/24:前24位二进制即10.0.0为网络ID,31为主机ID
网上搜索IP计算器直接划分
相同网段:即网络ID相同
范例:网络工具,iftop/ping/iptables/tcpdump
##环境说明:31恶意ping41,41观察到网络流量剧增后,启用防火墙阻止31访问
##41安装iftop软件包,监控网络流量
[root@rocky-41 ~]$iftop
rocky-41 => 10.0.0.51 13.2Kb 10.7Kb 24.6Kb
<= 13.0Kb 10.8Kb 11.2Kb
rocky-41 => 10.0.0.1 816b 874b 1.16Kb
<= 184b 184b 552b
##31 ping -c1 发送一个ICMP回显请求数据包 -w1 等待回应时间1秒,如果目标41能连接,则-f 不分段发送-s 65507 大小的数据包给41
[root@anolis-31 ~]$ping -c1 -w1 10.0.0.41 &> /dev/null;echo $?;
1
[root@anolis-31 ~]$ping -f -s 65507 10.0.0.41
##41马上发现31连接,流量很高
[root@rocky-41 ~]$iftop
rocky-41 => 10.0.0.31 220Mb 184Mb 45.9Mb
<= 220Mb 184Mb 45.9Mb
rocky-41 => 10.0.0.51 4.93Kb 23.3Kb 25.1Kb
<= 5.71Kb 9.91Kb 11.8Kb
rocky-41 => 10.0.0.1 1.55Kb 1.33Kb 952b
<= 184b 245b 199b
##41使用iptables防火墙规则,拒绝31访问
##iptables -F清除规则
[root@rocky-41 ~]$iptables -A INPUT -s 10.0.0.31 -j REJECT
[root@rocky-41 ~]$iftop
rocky-41 => 10.0.0.31 4.50Kb 31.4Mb 159Mb
<= 41.5Mb 68.8Mb 168Mb
rocky-41 => 10.0.0.51 14.2Kb 24.7Kb 24.9Kb
<= 14.3Kb 11.1Kb 11.6Kb
rocky-41 => 10.0.0.1 1.05Kb 1.48Kb 1.33Kb
<= 184b 411b 320b
##可以开两个窗口使用ping、tcpdump查看网络连接,证明网络通,但是拒绝访问
[root@rocky-41 ~]$ping 10.0.0.31
[root@rocky-41 ~]$tcpdump -i any -nn icmp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size262144 bytes
12:45:10.418465 IP 10.0.0.41 > 10.0.0.31: ICMP echo request, id 26, seq 1, length 64
12:45:10.419194 IP 10.0.0.31 > 10.0.0.41: ICMP echo reply, id 26, seq1, length 64
12:45:10.419254 IP 10.0.0.41 > 10.0.0.31: ICMP 10.0.0.41 protocol 1 port 57830 unreachable, length 92
范例:arp请求获取IP、MAC地址
##ARP请求广播到局域网络上的所有主机,收到返回消息后IP、MAC存入本机ARP缓存中并保留一定时间。
##已经过期或不再有效(STALE)
##目前可达(REACHABLE)
[root@rocky-41 ~]$ip neighbo
10.0.0.51 dev ens160 lladdr 00:0c:29:05:2f:24 REACHABLE
10.0.0.2 dev ens160 lladdr 00:50:56:e7:91:b2 STALE
10.0.0.31 dev ens160 lladdr 00:0c:29:a2:4e:64 STALE
10.0.0.1 dev ens160 lladdr 00:50:56:c0:00:08 REACHABLE
4 网络配置工具ip/ss/nmcli
IP地址配置
主机名:最好使用主机名描述IP
IP地址:DHCP自动获取/static手动设置
子网掩码:如24位==255.255.255.0
默认网关:连接外部网络,交换机或路由器
DNS服务器:将域名转换为IP地址的服务器地址
##ip命令
##来自于iproute包
##ip [ OPTIONS ] OBJECT { COMMAND | help }
## OBJECT:link addr route管理连接、地址、路由
##ip a 显示ip信息
[root@anolis-31 ~]$ip a
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:a2:4e:64 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 10.0.0.31/24 brd 10.0.0.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea2:4e64/64 scope link noprefixroute
valid_lft forever preferred_lft forever
##关闭/启动网络接口ip link set dev <interface> up 或 down
[root@anolis-31 ~]$ip link set lo down
[root@anolis-31 ~]$ip link set lo up
##添加/删除地址ip addr add/del <IP/MASK> dev <interface>
##新增ip地址201,label增加标签ens160:1
[root@anolis-31 ~]$ip addr add 10.0.0.201/24 ens160 label ens160:1
[root@anolis-31 ~]$ip addr del 10.0.0.201/24 dev ens160
##管理路由表
##ip route add/del <destination> via <gateway>
##添加一个默认网关ip route add default via 192.168.1.254
[root@anolis-31 ~]$ip route
default via 10.0.0.2 dev ens160 proto static metric 100
10.0.0.0/24 dev ens160 proto kernel scope link src 10.0.0.31 metric 100
[root@anolis-31 ~]$ip route add 10.0.0.51 via 10.0.0.2
[root@anolis-31 ~]$ip route del 10.0.0.51 via 10.0.0.2
##查看路由过程
[root@anolis-31 ~]$ip route get 8.8.8.8
8.8.8.8 via 10.0.0.2 dev ens160 src 10.0.0.31 uid 0
cache
[root@anolis-31 ~]$ip route get 10.0.0.41
10.0.0.41 dev ens160 src 10.0.0.31 uid 0
cache
ss命令
来自iproute包,常用选项
-t: tcp协议相关
-u: udp协议相关
-l: listen状态的连接
-a: 所有
-n: 数字格式
-p: 相关的程序及PID
##查看在监听的tu协议的端口
[root@anolis-31 ~]$ss -ntul
Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
##常用组合-tan, -tanl, -tanlp, -uan
##查看所有tcp协议的sshd相关程序
[root@anolis-31 ~]$ss -ntap | grep sshd
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=835,fd=3))
ESTAB 0 36 10.0.0.31:22 10.0.0.1:59977 users:(("sshd",pid=1467,fd=4),("sshd",pid=1465,fd=4))
ESTAB 0 0 10.0.0.31:22 10.0.0.1:59993 users:(("sshd",pid=1498,fd=4),("sshd",pid=1496,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=835,fd=4))
nmcli网络配置工具
NetworkManager服务,此服务是管理和监控网络设置的守护进程
修改配置文件执行生效
nmcli con reload
nmcli con up con-name
范例:修改网络配置文件
##局域网时,有很多不需要的内容可以简化
##如需要DNS服务器,可以有多个DNS0=8.8.8.8;DNS1=...
##DOMAIN 主机不完整时,自动搜索的域名后缀
##HWADDR 对应的设备的MAC地址
##NETMASK 子网掩码,如:255.255.255.0
##PREFIX 网络ID的位数, 如:24
##默认红帽系列配置文件目录/etc/sysconfig/network-scripts
[root@anolis-31 ~]$cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet: 指定了网络连接的类型为以太网。
PROXY_METHOD=none: 没有使用代理服务器。
BROWSER_ONLY=no: 该设置允许网络接口用于不仅仅是浏览,还包括其他网络通信。
BOOTPROTO=static: IP地址的分配方式是静态的,即IP地址需要手动配置而不是通过DHCP自动获取。
IPADDR=10.0.0.31: 网络接口的IPv4地址是10.0.0.31。
PREFIX=24: 子网掩码的长度是24位,对应于子网掩码255.255.255.0。
GATEWAY=10.0.0.2: 默认网关的IPv4地址是10.0.0.2。
DEFROUTE=yes: 表示启用默认路由。
IPV4_FAILURE_FATAL=no: 如果IPv4配置失败,系统不会因此而停止启动。
IPV6INIT=yes: 启用IPv6支持。
IPV6_AUTOCONF=yes: 启用IPv6的自动配置。
IPV6_DEFROUTE=yes: 启用IPv6的默认路由。
IPV6_FAILURE_FATAL=no: 如果IPv6配置失败,系统不会因此而停止启动。
IPV6_ADDR_GEN_MODE=eui64: IPv6地址生成模式是基于EUI-64格式,这通常意味着将从网络接口的MAC地址生成IPv6地址的一部分。
NAME=ens160: 网络接口的名称是ens160。
UUID=5ca74eaf-077a-4dc9-9db7-9cc08f45ea5c: 网络连接的唯一标识符。
DEVICE=ens160: 网络设备的名称与网络接口名称相同,这里是ens160。
ONBOOT=yes: 网络接口将在系统启动时自动启用。
##简化后
[root@anolis-31 ~]$cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
BOOTPROTO=static
IPADDR=10.0.0.31
PREFIX=24
GATEWAY=10.0.0.2
DEVICE=ens160
NAME=ens160
ONBOOT=yes
##执行nmcli生效
[root@anolis-31 ~]$nmcli connection reload
[root@anolis-31 ~]$nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
范例:修改DNS
##/etc/resolv.conf,解析域名的服务器地址:nameserver 114.114.114.114。
##/etc/hosts,用于本地主机数据库,它可以将主机名映射到IP地址:10.0.0.41 rocky41.wang.org。
##hosts优先于resolv
[root@anolis-31 ~]$cat >>/etc/hosts<<EOF
> 10.0.0.41 rocky41.wang.org
> EOF
[root@anolis-31 ~]$ping rocky41.wang.org
PING rocky41.wang.org (10.0.0.41) 56(84) bytes of data.
##能解析域名,是因为/etc/resolv有DNS服务器ip,或有连外网的ip,注释掉,就无法解析域名;
[root@anolis-31 ~]$ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) bytes of data.
[root@anolis-31 ~]$sed -i.bak -E '/nameserver/s/(.*)/#\1/' /etc/resolv.conf
[root@anolis-31 ~]$ping www.baidu.com
ping: www.baidu.com: Name or service not known
##还原后能解析域名
[root@anolis-31 ~]$sed -i.bak -E '/nameserver/s/#(.*)/\1/' /etc/resolv.conf
[root@anolis-31 ~]$ping www.baidu.com
PING www.a.shifen.com (183.2.172.185) 56(84) bytes of data.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!