《UNIX/Linux系统管理技术手册-读书笔记-第十三章

TCP/IP连网

1. TCP/IP与Internet基础

1.1 核心管理组织

组织 职责
ICANN Internet名称与数字地址分配,全球IP地址和域名管理(唯一有实际强制力
ISOC Internet协会,监督IETF技术工作
IETF Internet工程任务组,制定技术标准(RFC)
IGF 联合国下设,国际性政策讨论

1.2 RFC(请求评议)文档

类型 说明
RFC 协议标准、修改提议、信息公告,顺序编号,一经发布永不修改
FYI 面向大众的介绍性文档(如RFC1713同时也是FYI27)
BCP 最佳当前实践,含管理建议(对系统管理员最有价值
STD 已正式采纳为标准的协议

阅读RFC不要被技术细节吓跑,简介和原理阐述对管理员也很有用。

2. TCP/IP协议栈

5层模型:物理层 → 链路层 → 网络层(IP) → 传输层(TCP/UDP) → 应用层(HTTP/SSH/DNS)

协议 功能
IP 网络层 分组路由(RFC791)
ICMP 网络层 错误消息、路由协助、调试(RFC792)——ping和traceroute的基础
ARP 链路层 IP→MAC地址转换(IPv4)
ND 链路层 IP→MAC地址转换(IPv6),RFC4861
UDP 传输层 无连接、不可靠、快速(RFC768)——DNS查询常用
TCP 传输层 面向连接、可靠、流量控制(RFC793)——HTTP/SSH/数据库连接

2.1 IPv4 vs IPv6

对比 IPv4 IPv6
地址长度 32位(4字节) 128位(16字节)
地址数量 ~43亿 3.4×10³⁸
子网划分 可变掩码(CIDR) 固定/64主机部分
NAT 常用(缓解地址枯竭) 不需要(地址充足)
广播 支持 无广播,使用多播
现状 全球主流 覆盖率~14%(2017),仍需同时支持

现实建议:目前必须同时支持IPv4和IPv6(双栈)。纯IPv6服务仍不现实,因为大量主流站点(Amazon、Twitter、Apple等)2017年仍不支持IPv6。

3. IPv4寻址(核心技能)

3.1 地址格式与分类

IPv4地址 = 网络部分 + 主机部分,点分十进制:192.168.1.100

分类 第一个字节范围 默认掩码 主机数 说明
A类 1–127 /8 (255.0.0.0) 16,777,214 大型网络,已耗尽
B类 128–191 /16 (255.255.0.0) 65,534 中型网络,稀缺
C类 192–223 /24 (255.255.255.0) 254 小型网络,易获得
D类 224–239 多播地址
E类 240–255 实验地址

特殊地址127.0.0.1 = localhost(环回),0.0.0.0 = 任意地址,全0主机部分=网络地址,全1主机部分=广播地址。

3.2 子网划分与CIDR(超网)

子网掩码:32位,1=网络部分,0=主机部分,必须从左边连续。

CIDR记法192.168.1.0/24 等价于掩码 255.255.255.0(前24位为网络部分)

计算技巧

  • 主机数 = 2^(32-掩码位数) - 2(网络地址和广播地址)
  • 块大小 = 256 − 掩码发生变化那一字节的掩码值
  • 掩码最后一个字节 = 256 - 主机数
  • 广播地址 = 本子网网络地址 + 块大小 − 1
  • 网络地址 = IP & 子网掩码(万能公式)
  • 网络地址在变化的那个字节,一定可以被【块大小】整除

示例128.138.243.100/26(掩码255.255.255.192

  • 网络地址:IP & 掩码128.138.243.64
  • 广播地址:64 + 64‑1 =127128.138.243.127
  • 可用主机:65–126(62台)
  • 块大小:256‑192 = 64
  • 网络地址变化字节(第 4 字节)6464 % 64 =0,可以被块大小整除

备注:掩码发生变化那一字节的掩码值,既前面一串字节都是 255,直到某一个字节不再是 255,这个字节,就是掩码发生变化那一字节

实用工具

1
2
ipcalc 192.168.1.100/24   # 计算网络/广播/主机范围(Debian/Ubuntu)
bc                        # 进制转换备用工具

3.3 私有地址(RFC1918)与NAT

地址范围 CIDR 说明
10.0.0.0 – 10.255.255.255 10.0.0.0/8 A类私有(最常用)
172.16.0.0 – 172.31.255.255 172.16.0.0/12 B类私有
192.168.0.0 – 192.168.255.255 192.168.0.0/16 C类私有(家用路由器默认)

NAT(网络地址转换)

  • 私有地址 → 公网地址转换,多个主机共享单个公网IP
  • 隐藏内部结构,但不是真正的安全措施
  • NAT会破坏某些嵌入IP地址的应用(如FTP、SIP)
  • 可配合PAT(端口地址转换)复用端口

3.4 IPv6寻址要点

格式:8组16位,冒号分隔,十六进制

2607:f8b0:000a:0806:0000:0000:0000:200e

简化规则(RFC5952)

  1. 前导0可省略:000aa0806806
  2. 连续0组用::替换(仅一次):2607:f8b0:a:806::200e
  3. 字母用小写

特殊地址

  • ::1 = IPv6环回地址(等价于127.0.0.1)
  • fe80::/64 = 本地链路地址(不路由)

主机自动编号(SLAAC)

  • 从MAC地址自动生成64位主机ID(EUI-64算法)
  • 路由器通告(RA)提供网络前缀
  • 无需DHCP即可获得IP地址(但DNS仍需DHCPv6)

4. 路由基础

4.1 路由表查看

1
2
netstat -rn          # 数字形式查看路由表(全平台)
ip route show        # Linux推荐命令

路由表字段

  • Destination:目标网络
  • Gateway:下一跳网关(必须相邻)
  • Genmask:网络掩码
  • Iface:出口接口
  • UG标志:U=Up,G=Gateway(默认路由)

4.2 路由操作命令

操作 Linux (ip) FreeBSD (route)
添加默认路由 ip route add default via 192.168.1.1 dev eth0 route add default gw 192.168.1.1
添加静态路由 ip route add 10.0.0.0/8 via 192.168.1.254 dev eth1 route add -net 10.0.0.0/8 192.168.1.254
删除路由 ip route del 10.0.0.0/8 route del -net 10.0.0.0/8
刷新路由表 ip route flush route flush

4.3 ICMP重定向

  • 路由器通知主机:”你应该用另一个网关,而不是我“
  • 安全风险:可被恶意利用篡改路由
  • 建议在路由器上禁用:Linux accept_redirects=0,FreeBSD net.inet.icmp.drop_redirect=1

5. ARP与邻居发现

协议 功能 查看命令
ARP(IPv4) IP→MAC地址映射 ip neigh show(Linux),arp -a(FreeBSD)
ND(IPv6) IP→MAC地址映射 ip neigh showndp -a(FreeBSD)

安全警告:ARP欺骗/ARP缓存投毒可劫持流量,需警惕局域网内攻击。

6. DHCP(动态主机配置协议)

概念 说明
功能 自动分配IP地址、掩码、网关、DNS、NTP等参数
租约 定期续租,过期回收
推荐实现 ISC DHCP(开源参考实现,跨平台一致)
备选 Dnsmasq(轻量级DHCP+DNS转发)

ISC DHCP服务器配置/etc/dhcp/dhcpd.conf):

option domain-name "example.com";
option domain-name-servers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.51 192.168.1.60;
    option routers 192.168.1.254;
}

host fixed-host {
    hardware ethernet 08:00:07:12:34:56;
    fixed-address 192.168.1.10;
}

7. 网络安全相关IP特性

特性 风险 建议配置
IP转发 可作为路由器转发第三方流量 仅路由器启用,其他关闭
ICMP重定向 可被恶意篡改路由表 路由器忽略并记录
源路由 可绕过防火墙过滤 禁用(IPv6已废除)
广播ping Smurf攻击(反射放大) 忽略广播ping
IP欺骗 伪造源地址发起攻击 边界路由器过滤出站源地址
uRPF 检查入站分组源地址合理性 单出口网络启用(多出口需评估)

Linux安全参数/proc/sys/net/ipv4/):

1
2
3
4
ip_forward=0                    # 关闭转发
conf/all/accept_redirects=0     # 忽略重定向
conf/all/accept_source_route=0  # 禁用源路由
icmp_echo_ignore_broadcasts=1   # 忽略广播ping

FreeBSD安全参数/etc/sysctl.conf):

net.inet.ip.forwarding=0
net.inet.icmp.drop_redirect=1
net.inet.ip.accept_sourceroute=0

8. 网络接口配置(Linux/FreeBSD)

8.1 Linux(iproute2)

操作 命令
查看接口 ip link showip address show
配置IP ip address add 192.168.1.13/26 dev eth0
启用/禁用 ip link set eth0 up/down
查看路由 ip route show
查看套接字 ss -tulpn(替代netstat)

Debian/Ubuntu配置文件/etc/network/interfaces):

auto lo eth0
iface lo inet loopback
iface eth0 inet static
    address 192.168.1.102
    netmask 255.255.255.0
    gateway 192.168.1.254
# DHCP版本
iface eth0 inet dhcp

RedHat/CentOS配置文件/etc/sysconfig/network-scripts/ifcfg-eth0):

DEVICE=eth0
IPADDR=192.168.1.13
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
ONBOOT=yes
BOOTPROTO=static      # 或 dhcp

8.2 FreeBSD(ifconfig)

配置文件/etc/rc.conf):

hostname="freebeer"
ifconfig_em0="inet 192.168.0.48 netmask 255.255.255.0"
defaultrouter="192.168.0.1"
# DHCP版本
ifconfig_em0="DHCP"

手动配置

1
2
ifconfig em0 192.168.1.13/26 up
ifconfig em0 down

8.3 硬件参数调整(ethtool - Linux)

命令 功能
ethtool eth0 查看链路状态、速率、双工、自动协商
ethtool -s eth0 speed 100 duplex full 强制100M全双工(关闭自动协商
ethtool -r eth0 强制重新协商
ethtool -k eth0 查看硬件分担(校验和、TCP分段)
ethtool -K eth0 tx off 关闭发送校验和分担

9. 网络故障诊断工具

9.1 ping:检查主机可达性

1
2
3
4
ping 192.168.1.1              # 持续ping(Ctrl+C停止)
ping -c 5 192.168.1.1         # 发送5个
ping -s 1500 192.168.1.1      # 大分组(测试分片/MTU)
ping6 2001:db8::1             # IPv6

解读

  • 序列号中断 = 分组丢失
  • RTT变化大 = 网络拥塞或路径变化
  • 全部丢包 = 网络不通或防火墙拦截ICMP

9.2 traceroute:跟踪路径

1
2
3
traceroute google.com         # 显示到目标的每一跳
traceroute -n google.com      # 不解析DNS(更快)
mtr google.com                # 实时交互式跟踪(推荐)

输出符号

  • * * * = 无响应(可能防火墙丢弃ICMP)
  • !N = 网络不可达,!H = 主机不可达
  • 星号偶尔出现 = 正常(路由器低优先级处理ICMP)

9.3 tcpdump:分组嗅探

1
2
3
4
5
6
tcpdump -i eth0                # 监听eth0
tcpdump host 192.168.1.100     # 过滤特定主机
tcpdump src net 192.168.1.0/24 and dst port 80  # 复杂过滤器
tcpdump -w capture.pcap        # 保存到文件
tcpdump -r capture.pcap        # 读取文件
tcpdump -n -vv                 # 不解析DNS,详细输出

安全警告:tcpdump可看到明文密码,仅root可运行。

9.4 Wireshark / TShark

  • 图形化分组分析,内置大量协议解析器
  • 可重组TCP流查看完整会话
  • 支持多种跟踪文件格式

10. 防火墙(iptables / IPFilter)

10.1 Linux iptables(Netfilter)

表与链

  • filter表(默认):INPUT(入站)、OUTPUT(出站)、FORWARD(转发)
  • nat表:PREROUTING(目标NAT)、POSTROUTING(源NAT)
  • mangle表:修改分组内容

常用目标:ACCEPT(允许)、DROP(丢弃,静默)、REJECT(丢弃+返回ICMP)、LOG(记录)

规则管理

1
2
3
4
5
6
iptables -L -v                # 查看规则(含匹配计数)
iptables -F                   # 清空所有规则
iptables -P INPUT DROP        # 默认策略:丢弃
iptables -A INPUT -p tcp --dport 22 -j ACCEPT   # 允许SSH
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT  # 状态化
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4  # NAT

防欺骗规则(放在nat表PREROUTING):

1
2
3
iptables -t nat -A PREROUTING -i eth1 -s 10.0.0.0/8 -j DROP
iptables -t nat -A PREROUTING -i eth1 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i eth1 -s 192.168.0.0/16 -j DROP

保存与恢复

1
2
iptables-save > /etc/iptables.rules   # 保存
iptables-restore < /etc/iptables.rules  # 恢复

10.2 FreeBSD IPFilter

配置文件/etc/ipf/ipf.conf

规则语法

# 默认行为
block in quick all
pass out quick all

# 允许特定服务
pass in quick proto tcp from any to 10.0.0.0/24 port = 80 keep state
pass in quick proto tcp from any to 10.0.0.0/24 port = 443 keep state

# NAT(map关键字)
map em0 10.0.0.0/24 -> 0/32

管理命令

1
2
3
4
ipf -Fa -f /etc/ipf/ipf.conf    # 清除并加载新规则
ipfstat                          # 查看统计
ipmon                            # 监控日志
ipnat -l                         # 查看NAT映射

11. 云联网(AWS VPC重点)

11.1 AWS VPC核心概念

组件 说明
VPC 私有虚拟网络(RFC1918地址),地域级
子网 VPC内的网段,可用区级(需跨AZ部署实现高可用)
Internet网关(IGW) VPC连接到Internet
NAT网关 私有子网访问Internet(出站)
安全组 实例级防火墙(有状态)——默认拒绝所有
NACL 子网级防火墙(无状态)——默认允许所有
路由表 子网关联,决定流量走向
VPC对等连接 两个VPC间私有路由(同地域)

公共子网 vs 私有子网判断

  • 默认路由0.0.0.0/0指向igw-xxx = 公共子网
  • 默认路由指向nat-xxxi-xxx = 私有子网

11.2 典型安全组规则

方向 协议 端口 说明
入站 TCP 22 10.110.0.0/16 内网SSH
入站 TCP 80 0.0.0.0/0 HTTP(公网)
入站 TCP 443 0.0.0.0/0 HTTPS(公网)
入站 ICMP type 3/4 0.0.0.0/0 必须允许(路径MTU发现)
出站 ALL ALL 0.0.0.0/0 全部允许(最简单)

11.3 Terraform创建VPC

 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
# 定义VPC
resource "aws_vpc" "default" {
  cidr_block = "10.110.0.0/16"
  enable_dns_hostnames = true
}

# Internet网关
resource "aws_internet_gateway" "default" {
  vpc_id = aws_vpc.default.id
}

# 公共子网
resource "aws_subnet" "public" {
  vpc_id = aws_vpc.default.id
  cidr_block = "10.110.0.0/24"
  availability_zone = "us-west-2a"
}

# 路由表(默认路由→IGW)
resource "aws_route_table" "public" {
  vpc_id = aws_vpc.default.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.default.id
  }
}
1
2
terraform apply      # 创建
terraform destroy    # 销毁

11.4 GCP VPC

  • 全局VPC,子网地域级
  • 默认防火墙允许ICMP、SSH、RDP,内部所有流量
  • 最小特权建议:限制SSH源IP为自己,关闭RDP

11.5 DigitalOcean

  • 无私有网络概念,同一地域droplet间有私有接口但共享给所有客户
  • IPv4和IPv6直接分配给eth0,无NAT转换
  • 适合小规模/开发环境

12. 本章核心命令速查表

命令 功能
ip address show 查看IP地址(Linux)
ip link set eth0 up/down 启用/禁用接口(Linux)
ifconfig -a 查看所有接口(FreeBSD)
netstat -rn 查看路由表(全平台)
ip route show 查看路由表(Linux)
ethtool eth0 查看链路参数(Linux)
ping -c 5 8.8.8.8 测试连通性
traceroute -n google.com 跟踪路由(不解析DNS)
mtr google.com 实时路由+延迟(推荐)
tcpdump -i eth0 host 1.2.3.4 捕获特定主机流量
iptables -L -v 查看防火墙规则(Linux)
iptables -F 清空规则(谨慎
ipf -Fa -f /etc/ipf.conf 加载IPFilter规则(FreeBSD)
terraform apply/destroy 创建/销毁云资源
ipcalc 192.168.1.100/24 子网计算

DBA视角补充

  • 数据库监听端口:Oracle 1521、MySQL 3306、PostgreSQL 5432均需在防火墙/安全组中开放(仅限应用服务器IP,绝不对公网开放)。云环境安全组规则应限制源IP为应用子网。
  • 私有子网部署数据库:生产数据库应部署在私有子网,无公网IP,通过应用服务器或跳板机访问。AWS RDS默认就在VPC内,安全组控制访问。
  • 网络性能诊断:数据库连接慢可能是网络延迟或丢包。用ping测延迟/RTT,用traceroute看路径,用mtr持续监控。跨AZ部署数据库需考虑区间网络延迟(通常<1ms,但仍有影响)。
  • MTU问题:数据库服务器若出现“packet too large”错误,检查MTU设置。VPN隧道场景需降低MTU(如1400)避免分片。
  • 端口耗尽:高并发数据库连接池可能耗尽本地端口,需调大net.ipv4.ip_local_port_range并降低tcp_fin_timeout
  • 云VPC设计:多AZ部署数据库(如AWS RDS Multi-AZ)需在每个AZ创建子网,跨AZ复制流量会产生网络费用,需纳入成本评估。数据库备份流量(如跨区域复制)同样会产生费用。
  • 安全审计:数据库服务器入站规则应仅允许应用服务器IP和特定端口,定期审查安全组规则,移除“0.0.0.0/0”等过度开放配置。