Ubuntu 22.04的Linux网络配置
14.1 网络基础知识
14.1.1 IP地址
知识点详解:
IP地址是互联网协议地址,用于标识网络中的设备。IPv4地址由32位二进制数组成,通常表示为4个十进制数(0-255),用点分隔。
分类与表示:
- 公网IP:全球唯一,由ISP分配
- 私有IP :局域网使用,范围包括:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
案例代码:查看IP地址信息
bash
# 查看本机IP地址的多种方式
# 方法1:使用ip命令(推荐)
ip addr show # 显示所有网络接口的详细IP信息
# 方法2:查看特定接口(如eth0)
ip -4 addr show eth0 # 仅显示eth0的IPv4信息
# 方法3:使用hostname命令
hostname -I # 显示所有IP地址,简洁格式
# 方法4:通过/proc文件系统查看
cat /proc/net/fib_trie # 查看内核IP路由表
14.1.2 子网掩码
知识点详解:
子网掩码用于划分IP地址的网络部分和主机部分,与IP地址进行按位与运算得到网络地址。
常用表示:
- CIDR表示法:/24 等同于 255.255.255.0
- /16 等同于 255.255.0.0
- /8 等同于 255.0.0.0
案例代码:计算网络地址
bash
#!/bin/bash
# 计算给定IP和子网掩码的网络地址
# 函数:IP地址转十进制
ip_to_int() {
local ip=$1
local a b c d
IFS='.' read -r a b c d <<< "$ip"
echo $((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))
}
# 函数:十进制转IP地址
int_to_ip() {
local int=$1
echo "$((int >> 24 & 255)).$((int >> 16 & 255)).$((int >> 8 & 255)).$((int & 255))"
}
# 主程序
ip="192.168.1.100"
mask="255.255.255.0"
# 将IP和掩码转换为整数
ip_int=$(ip_to_int "$ip")
mask_int=$(ip_to_int "$mask")
# 计算网络地址(按位与运算)
network_int=$((ip_int & mask_int))
# 转换回IP格式
network=$(int_to_ip "$network_int")
echo "IP地址: $ip"
echo "子网掩码: $mask"
echo "网络地址: $network" # 输出: 192.168.1.0
14.1.3 网关
知识点详解:
网关是连接不同网络的设备,通常是路由器的IP地址,用于转发非本地网络的数据包。
案例代码:配置默认网关
bash
# 查看当前网关
ip route show default # 显示默认路由
# 临时添加网关(立即生效,重启失效)
sudo ip route add default via 192.168.1.1 dev eth0
# 删除默认网关
sudo ip route del default via 192.168.1.1
# 查看路由表详细信息
route -n # -n参数禁止DNS解析,显示IP地址
14.1.4 DNS服务器
知识点详解:
DNS(Domain Name System)将域名解析为IP地址。Ubuntu 22.04使用systemd-resolved服务管理DNS。
配置文件:
/etc/resolv.conf:DNS配置文件(通常是符号链接)/etc/systemd/resolved.conf:systemd-resolved主配置
案例代码:配置DNS服务器
bash
# 查看当前DNS配置
systemd-resolve --status # 查看systemd-resolved状态
# 临时修改DNS(直接编辑resolv.conf)
sudo nano /etc/resolv.conf
# 添加以下内容:
# nameserver 8.8.8.8
# nameserver 8.8.4.4
# 永久修改DNS(通过netplan)
sudo nano /etc/netplan/01-netcfg.yaml
# 添加nameservers配置(详见14.2.5节)
# 刷新DNS缓存
sudo systemd-resolve --flush-caches
# 测试DNS解析
nslookup ubuntu.com # 查询域名IP
dig ubuntu.com # 更详细的DNS查询
14.2 Linux操作系统网络配置
14.2.1 网络管理
Ubuntu 22.04默认使用systemd-networkd 和NetworkManager 双栈管理网络,通过netplan进行统一配置。
管理工具对比:
- netplan:YAML格式配置,统一入口
- NetworkManager:图形界面和nmcli命令行
- systemd-networkd:服务器环境推荐,轻量级
案例代码:网络管理服务操作
bash
# 查看网络管理器状态
systemctl status NetworkManager
systemctl status systemd-networkd
# 启用/禁用NetworkManager
sudo systemctl enable NetworkManager
sudo systemctl start NetworkManager
# 查看网络连接状态
nmcli general status # NetworkManager方式
networkctl status # systemd-networkd方式
# 重启网络服务
sudo netplan apply # 应用netplan配置(推荐)
sudo systemctl restart NetworkManager # 重启NetworkManager
14.2.2 网络接口
知识点详解:
网络接口是物理或虚拟的网络设备,如以太网卡(eth0)、无线网卡(wlan0)、回环接口(lo)。
接口类型:
- 物理接口:enp0s3, eth0, wlan0
- 虚拟接口:lo(回环), docker0, br0(网桥)
案例代码:管理网络接口
bash
# 查看所有网络接口
ip link show # 显示接口状态(UP/DOWN)
# 启用/禁用接口
sudo ip link set eth0 up # 启用eth0
sudo ip link set eth0 down # 禁用eth0
# 查看接口详细信息
ip -details link show eth0
# 查看接口统计信息
ip -s link show eth0 # 显示收发数据包统计
# 查看接口驱动信息
ethtool eth0 # 需要安装ethtool
14.2.3 查看网络接口
案例代码:全面查看网络接口信息
bash
#!/bin/bash
# 完整网络接口信息收集脚本
echo "=== 网络接口汇总信息 ==="
# 1. 显示所有接口的IP地址
echo -e "\n--- IP地址信息 ---"
ip -brief addr show
# 2. 显示接口物理状态
echo -e "\n--- 接口物理状态 ---"
ip link show | grep -E "^\d+:" | awk '{print $2, $9}'
# 3. 显示路由信息
echo -e "\n--- 路由表信息 ---"
ip route show
# 4. 显示DNS配置
echo -e "\n--- DNS配置 ---"
cat /etc/resolv.conf | grep nameserver
# 5. 显示活跃的网络连接
echo -e "\n--- 活跃网络连接 ---"
ss -tuln | head -20 # 显示监听中的端口
# 6. 显示网卡速度和双工模式
echo -e "\n--- 网卡硬件信息 ---"
for iface in $(ip -o link show | awk -F': ' '{print $2}' | grep -v lo); do
echo "接口: $iface"
ethtool $iface 2>/dev/null | grep -E "Speed|Duplex|Link detected" || echo " 无法获取信息"
done
14.2.4 网络接口命名
知识点详解:
Ubuntu 22.04使用可预测的网络接口命名规则(Predictable Network Interface Names):
命名规则:
enp0s3:PCI网卡(en=Ethernet, p0=PCI bus 0, s3=slot 3)eth0:传统命名(可通过GRUB参数启用)wlp2s0:无线网卡(wl=Wireless)docker0:虚拟网桥
案例代码:修改接口命名方式
bash
# 查看当前接口命名规则
udevadm info /sys/class/net/enp0s3 | grep ID_NET_NAME
# 方法1:GRUB参数恢复传统命名(eth0)
sudo nano /etc/default/grub
# 修改GRUB_CMDLINE_LINUX行,添加:
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# 更新GRUB并重启
sudo update-grub
sudo reboot
# 方法2:创建udev规则自定义命名
sudo nano /etc/udev/rules.d/70-persistent-net.rules
# 添加以下内容:
# SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:33:44:55", NAME="myeth0"
# 重载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger
14.2.5 配置网络接口IP地址
知识点详解:
Ubuntu 22.04使用Netplan 进行网络配置,配置文件位于/etc/netplan/,YAML格式。
配置方式:
- 静态IP:手动指定IP、网关、DNS
- DHCP:自动获取网络配置
案例代码:Netplan静态IP配置
yaml
# 文件:/etc/netplan/00-installer-config.yaml
# 配置静态IP地址(带详细注释)
network:
version: 2 # Netplan配置版本,必须为2
renderer: networkd # 使用systemd-networkd后端(服务器推荐)
# renderer: NetworkManager # 桌面环境可选NetworkManager
ethernets: # 以太网接口配置段
enp0s3: # 具体的网络接口名称
dhcp4: false # 禁用IPv4 DHCP
dhcp6: false # 禁用IPv6 DHCP
addresses: # 静态IP地址列表
- 192.168.1.100/24 # CIDR格式,/24表示255.255.255.0
routes: # 路由配置(Ubuntu 22.04新语法)
- to: default # 默认路由
via: 192.168.1.1 # 网关地址
metric: 100 # 路由优先级,数字越小优先级越高
nameservers: # DNS服务器配置
addresses: # DNS服务器列表
- 8.8.8.8 # 主DNS:Google DNS
- 8.8.4.4 # 备用DNS
- 1.1.1.1 # Cloudflare DNS
search: # DNS搜索域
- example.com
- local
案例代码:Netplan DHCP配置
yaml
# 文件:/etc/netplan/01-dhcp-config.yaml
# 配置DHCP自动获取IP
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: true # 启用IPv4 DHCP
dhcp6: false # 禁用IPv6
# 可选:保留DHCP获取的DNS
nameservers:
addresses: [] # 空列表表示使用DHCP提供的DNS
应用配置命令:
bash
# 应用Netplan配置
sudo netplan apply # 应用配置
# 验证配置
sudo netplan --debug apply # 调试模式,显示详细信息
# 检查语法
sudo netplan generate # 生成配置,检查语法错误
# 查看当前配置状态
sudo netplan get
# 查看特定接口配置
sudo netplan get ethernets.enp0s3
案例代码:多IP地址绑定
yaml
# 配置单个接口绑定多个IP地址
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: false
addresses:
- 192.168.1.100/24 # 主IP
- 192.168.1.101/24 # 辅助IP
- 10.0.0.10/16 # 第二个网段IP
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
14.2.6 域名解析
案例代码:全面域名解析配置
bash
# 1. systemd-resolved配置
sudo nano /etc/systemd/resolved.conf
# 修改以下内容:
# DNS=8.8.8.8 8.8.4.4
# FallbackDNS=1.1.1.1
# Domains=example.com
# DNSStubListener=yes
# 重启服务
sudo systemctl restart systemd-resolved
# 2. 手动配置/etc/hosts(本地DNS解析)
sudo nano /etc/hosts
# 添加格式:
# IP地址 主机名 别名
192.168.1.10 fileserver file
192.168.1.20 webserver www
# 3. NSSwitch配置(名称服务切换)
sudo nano /etc/nsswitch.conf
# 确保hosts行包含:
# hosts: files dns myhostname
# files表示优先使用/etc/hosts,dns表示使用DNS服务器
# 4. 测试域名解析
getent hosts www.example.com # 查询hosts和DNS
resolvectl query ubuntu.com # systemd-resolved方式
14.3 常用的网络配置命令
14.3.1 ifconfig命令
注意:ifconfig已废弃,但在某些场景仍可使用,需安装net-tools
案例代码:ifconfig使用示例
bash
# 安装net-tools(如果未安装)
sudo apt update
sudo apt install -y net-tools
# 1. 查看所有接口
ifconfig -a # -a显示所有接口(包括DOWN状态)
# 2. 查看特定接口
ifconfig enp0s3
# 3. 配置临时IP
sudo ifconfig enp0s3 192.168.1.150 netmask 255.255.255.0 up
# 注释:up参数启用接口
# 4. 添加虚拟IP
sudo ifconfig enp0s3:0 192.168.1.200 netmask 255.255.255.0
# 注释:enp0s3:0是虚拟接口别名
# 5. 删除IP
sudo ifconfig enp0s3:0 down # 禁用虚拟接口
# 6. 修改MTU
sudo ifconfig enp0s3 mtu 1400 # 设置最大传输单元为1400字节
# 7. 启用/禁用混杂模式
sudo ifconfig enp0s3 promisc # 启用混杂模式(抓包需要)
sudo ifconfig enp0s3 -promisc # 禁用混杂模式
优缺点分析:
bash
# ifconfig vs ip命令对比
# ifconfig不支持的功能:
# - 策略路由
# - 多路由表
# - 高级隧道配置
# 推荐使用ip命令替代
ip addr show # 替代 ifconfig
ip link set # 替代 ifconfig up/down
14.3.2 ip命令
知识点详解:
ip命令是iproute2工具包的一部分,功能强大,是现代Linux网络管理的标准工具。
案例代码:ip命令实战
bash
# ========== IP地址管理 ==========
# 1. 查看IP地址
ip addr show # 简写:ip a
# 2. 添加静态IP(临时)
sudo ip addr add 192.168.1.200/24 dev enp0s3
# 注意:这种方式添加的IP是secondary,不会替换原IP
# 3. 删除IP地址
sudo ip addr del 192.168.1.200/24 dev enp0s3
# 4. 清空接口所有IP
sudo ip addr flush dev enp0s3
# 5. 添加带标签的IP
sudo ip addr add 192.168.1.201/24 dev enp0s3 label enp0s3:vip
# ========== 路由管理 ==========
# 1. 查看路由表
ip route show # 简写:ip r
# 2. 添加默认网关
sudo ip route add default via 192.168.1.1 dev enp0s3
# 3. 添加静态路由
sudo ip route add 10.10.0.0/16 via 192.168.1.254 dev enp0s3
# 注释:访问10.10.0.0/16网段走192.168.1.254
# 4. 删除路由
sudo ip route del 10.10.0.0/16 via 192.168.1.254
# 5. 查看特定路由
ip route get 8.8.8.8 # 查看访问8.8.8.8的路由路径
# ========== 邻居表(ARP)管理 ==========
# 1. 查看ARP缓存
ip neigh show # 简写:ip n
# 2. 添加静态ARP条目
sudo ip neigh add 192.168.1.10 lladdr 00:11:22:33:44:55 dev enp0s3
# 3. 删除ARP条目
sudo ip neigh del 192.168.1.10 dev enp0s3
# 4. 清空ARP缓存
sudo ip neigh flush all
# ========== 高级用法 ==========
# 1. 查看多个路由表
ip route show table all # 显示所有路由表
# 2. 策略路由配置
sudo ip rule add from 192.168.1.100 table 100 # 来自特定IP的流量使用表100
sudo ip route add default via 192.168.1.1 dev enp0s3 table 100
# 3. 查看接口统计
ip -s link show enp0s3 # 显示统计信息
# 4. 实时监控
watch -n 1 ip -s link show enp0s3 # 每秒刷新统计
14.3.3 route命令
知识点详解:
route命令用于管理内核路由表,属于net-tools包,现代系统推荐使用ip route。
案例代码:route命令详解
bash
# 1. 查看路由表(推荐-n参数)
route -n # -n不解析主机名,显示更快
# 输出解释:
# Destination: 目标网络
# Gateway: 网关
# Genmask: 子网掩码
# Flags: U=UP, G=网关, H=主机路由
# Metric: 路由代价
# Iface: 出口接口
# 2. 添加静态路由
sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.254
# 注释:-net表示目标为网络,netmask指定掩码,gw指定网关
# 3. 添加主机路由
sudo route add -host 10.10.10.10 gw 192.168.1.200
# 注释:-host表示目标为主机
# 4. 添加默认网关
sudo route add default gw 192.168.1.1 enp0s3
# 注释:default等同于0.0.0.0
# 5. 删除路由
sudo route del -net 192.168.2.0/24 # CIDR格式
sudo route del -host 10.10.10.10
# 6. 拒绝路由(黑洞路由)
sudo route add -net 10.0.0.0/8 reject
# 注释:发送到10.0.0.0/8的包将被丢弃
# 7. 持久化路由配置(/etc/network/interfaces方式,不推荐)"
cat << 'EOF' | sudo tee /etc/network/interfaces.d/static-routes
# 静态路由配置
auto enp0s3
iface enp0s3 inet static
post-up route add -net 172.16.0.0/16 gw 192.168.1.254
pre-down route del -net 172.16.0.0/16 gw 192.168.1.254
EOF
14.3.4 netstat命令
知识点详解:
netstat显示网络连接、路由表、接口统计等,已被ss命令取代,但仍广泛使用。
案例代码:netstat实战
bash
# 安装net-tools(如果没有)
sudo apt install -y net-tools
# 1. 查看所有端口(包括 listening 和 non-listening)
netstat -a # -a=all
# 2. 查看监听端口(常用)
netstat -tuln # t=TCP, u=UDP, l=listening, n=numeric
# 输出列:Proto/Recv-Q/Send-Q/Local Address/Foreign Address/State
# 3. 查看特定端口
netstat -tuln | grep :22 # 查看SSH端口
# 4. 查看进程信息
sudo netstat -tulnp # p=program,显示PID和程序名
# 需要root权限查看所有进程
# 5. 查看网络连接统计
netstat -s # 显示各协议统计信息
# 6. 查看路由表
netstat -rn # r=route, n=numeric
# 等同 route -n
# 7. 查看接口统计
netstat -i # 显示接口收发包统计
# 配合-c参数持续监控:netstat -ic 2 # 每2秒刷新
# 8. 查看UNIX域套接字
netstat -lx # l=listening, x=unix
# 9. 查找占用端口的进程
sudo netstat -tulnp | grep :8080
# 输出示例:tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1234/java
# 可知PID 1234的java进程占用8080端口
现代替代方案(ss命令):
bash
# ss命令更快更高效,语法类似netstat
ss -tuln # 替代 netstat -tuln
ss -tulnp # 替代 netstat -tulnp
ss -s # 替代 netstat -s
ss -tp # 显示TCP连接和进程
ss -t state established # 显示已建立的连接
14.3.5 nslookup命令
知识点详解:
nslookup用于查询DNS记录,测试域名解析。
案例代码:nslookup全面使用
bash
# 1. 基本域名查询
nslookup ubuntu.com
# 输出解释:
# Server: 使用的DNS服务器
# Address: DNS服务器地址
# Non-authoritative answer: 非权威回答(缓存结果)
# Name: 查询的域名
# Address: 解析的IP地址
# 2. 指定DNS服务器查询
nslookup ubuntu.com 8.8.8.8 # 使用Google DNS查询
# 3. 查询特定记录类型
nslookup -type=mx ubuntu.com # 查询MX邮件记录
nslookup -type=ns ubuntu.com # 查询NS名称服务器记录
nslookup -type=txt ubuntu.com # 查询TXT文本记录
nslookup -type=ptr 8.8.8.8 # 反向查询
# 4. 交互模式
nslookup
> server 1.1.1.1 # 切换DNS服务器
> set type=any # 查询所有记录类型
> ubuntu.com # 执行查询
> exit # 退出
# 5. 查看DNS缓存
sudo systemd-resolve --statistics # systemd-resolved缓存
# 或使用nscd(如果安装)
sudo nscd -g
# 6. 批量查询
cat domains.txt | while read domain; do
echo "=== $domain ==="
nslookup $domain
done
14.3.6 ping命令
知识点详解:
ping使用ICMP协议测试网络连通性。
案例代码:ping高级用法
bash
# 1. 基本连通性测试
ping -c 4 192.168.1.1 # -c指定发送4次
ping -c 4 ubuntu.com # 测试外网连通性
# 2. 持续ping(默认)
ping 192.168.1.1 # 按Ctrl+C停止
# 输出解释:
# 64 bytes: 数据包大小
# time: 往返延迟
# ttl: 生存时间
# packet loss: 丢包率
# 3. 指定数据包大小
ping -c 4 -s 1400 192.168.1.1 # -s指定数据部分大小
# 总大小 = 28字节(头) + 1400 = 1428字节
# 4. 洪水ping(需要root,谨慎使用)
sudo ping -f 192.168.1.1 # -f=flood,快速发送
# 用于压力测试,会显示.和!表示收发包
# 5. 指定时间间隔
ping -i 2 192.168.1.1 # -i 2表示每2秒发送一次
# 6. 记录路由
ping -c 4 -R 8.8.8.8 # -R记录路由,最多9跳
# 7. 指定TTL
ping -c 4 -t 64 192.168.1.1 # 设置TTL值
# TTL每经过一个路由器减1,为0时被丢弃
# 8. 指定源地址
ping -c 4 -I 192.168.1.100 192.168.1.1 # -I绑定源IP
# 9. 仅显示摘要
ping -c 4 -q 192.168.1.1 # -q=quiet
# 10. 批量ping网段
for i in {1..254}; do
ping -c 1 -W 1 192.168.1.$i > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "192.168.1.$i is UP"
fi
done
# 11. 脚本化ping检测
cat << 'EOF' > ping_monitor.sh
#!/bin/bash
# Ping监控脚本
HOST="192.168.1.1"
COUNT=3
echo "正在检测 $HOST 连通性..."
for i in $(seq 1 $COUNT); do
if ping -c 1 -W 2 $HOST > /dev/null 2>&1; then
echo "$(date): $HOST 可达"
exit 0
fi
echo "尝试 $i/$COUNT 失败"
sleep 1
done
echo "$(date): $HOST 不可达"
exit 1
EOF
chmod +x ping_monitor.sh
./ping_monitor.sh
14.4 防火墙
14.4.1 ufw简介
知识点详解:
UFW(Uncomplicated Firewall)是Ubuntu的默认防火墙,基于iptables的前端工具,简化配置。
核心概念:
- 默认策略:入站拒绝,出站允许
- 规则:基于端口、协议、IP的访问控制
- 应用配置:预定义应用规则集
案例代码:ufw基础操作
bash
# 1. 检查ufw状态
sudo ufw status verbose # 详细状态
# 输出示例:
# Status: active
# Logging: on (low)
# Default: deny (incoming), allow (outgoing), disabled (routed)
# 2. 启用/禁用ufw
sudo ufw enable # 启用并开机自启
sudo ufw disable # 禁用防火墙
# 3. 查看版本和规则统计
sudo ufw version
sudo ufw show raw # 显示iptables原始规则
# 4. 重置ufw(谨慎操作)
sudo ufw reset # 删除所有规则,重置默认策略
14.4.2 ufw配置
案例代码:ufw全面配置指南
bash
# ========== 基础规则配置 ==========
# 1. 允许SSH访问(推荐先配置)
sudo ufw allow ssh # 允许SSH端口(22/tcp)
# 或指定端口
sudo ufw allow 22/tcp # 仅TCP
sudo ufw allow 22/udp # 仅UDP
# 2. 允许特定端口范围
sudo ufw allow 6000:6007/tcp # 允许6000-6007 TCP端口
sudo ufw allow 1000:2000/udp # 允许1000-2000 UDP端口
# 3. 按服务名称允许
sudo ufw allow http # 80/tcp
sudo ufw allow https # 443/tcp
sudo ufw allow 'Nginx Full' # 预定义服务
# 4. 允许特定IP访问所有端口
sudo ufw allow from 192.168.1.50 # 允许该IP所有流量
sudo ufw allow from 192.168.1.0/24 # 允许整个网段
# 5. 允许特定IP访问特定端口
sudo ufw allow from 192.168.1.50 to any port 3306 # MySQL
sudo ufw allow from 10.0.0.0/8 to any port 8080 proto tcp
# 6. 拒绝规则(显式拒绝)
sudo ufw deny from 192.168.1.100 # 拒绝该IP所有访问
sudo ufw deny 23/tcp # 拒绝Telnet
# 7. 删除规则
sudo ufw delete allow 22/tcp # 按规则删除
# 或按编号删除
sudo ufw status numbered # 查看带编号的规则
sudo ufw delete 3 # 删除第3条规则
# ========== 高级配置 ==========
# 1. 配置默认策略
sudo ufw default deny incoming # 拒绝所有入站
sudo ufw default allow outgoing # 允许所有出站
sudo ufw default deny routed # 拒绝转发
# 2. 允许ping(ICMP)
sudo ufw allow proto icmp # 允许所有ICMP
# 或仅允许ping
echo "net/ipv4/icmp_echo_ignore_all=0" | sudo tee -a /etc/ufw/sysctl.conf
# 3. 端口转发配置
sudo nano /etc/ufw/before.rules
# 添加:
# *nat
# :PREROUTING ACCEPT [0:0]
# -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# COMMIT
# 4. 限制连接速率(防暴力破解)
sudo ufw limit ssh # 限制SSH连接速率
# 5. 允许特定网卡
sudo ufw allow in on enp0s3 to any port 22 # 仅enp0s3接口
# ========== 脚本化批量配置 ==========
cat << 'EOF' > setup_firewall.sh
#!/bin/bash
# ufw防火墙批量配置脚本
# 重置UFW
sudo ufw --force reset
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许常用服务
services=("ssh" "http" "https" "ntp")
for service in "${services[@]}"; do
echo "允许服务: $service"
sudo ufw allow "$service"
done
# 允许内网IP
sudo ufw allow from 192.168.1.0/24
sudo ufw allow from 10.0.0.0/8
# 限制SSH
sudo ufw limit ssh
# 启用防火墙
sudo ufw --force enable
echo "防火墙配置完成"
sudo ufw status verbose
EOF
chmod +x setup_firewall.sh
./setup_firewall.sh
14.4.3 ufw与应用系统的整合
案例代码:应用配置和集成
bash
# 1. 查看预定义应用列表
sudo ufw app list
# 输出示例:
# Available applications:
# Apache
# Apache Full
# Apache Secure
# Nginx Full
# OpenSSH
# 2. 查看应用配置详情
sudo ufw app info 'Apache Full'
# 显示:80,443/tcp
# 3. 为自定义应用创建配置
sudo nano /etc/ufw/applications.d/myapp
# 添加内容:
[MyApp]
title=My Custom Application
description=Web application on port 8080
ports=8080/tcp|8081/tcp|8082/tcp # 多个端口用|分隔
# 4. 重新加载应用列表
sudo ufw app update MyApp
# 5. 允许自定义应用
sudo ufw allow 'MyApp'
# 6. 为Docker配置UFW(重要)
# Docker会绕过UFW,需要特殊配置
sudo nano /etc/docker/daemon.json
{
"iptables": false # 让Docker不管理iptables
}
# 然后手动配置:
sudo ufw allow 2375/tcp # Docker API
sudo ufw route allow in on docker0 # 允许Docker容器访问
# 7. 与Fail2ban集成
sudo apt install fail2ban
sudo nano /etc/fail2ban/jail.local
# 添加:
[ufw]
enabled = true
filter = ufw
action = ufw
logpath = /var/log/ufw.log
# 重启服务
sudo systemctl restart fail2ban
14.4.4 ufw日志管理
案例代码:日志配置与分析
bash
# 1. 启用/禁用日志
sudo ufw logging on # 开启日志
sudo ufw logging off # 关闭日志
sudo ufw logging low # 低级别日志(默认)
sudo ufw logging medium
sudo ufw logging high
sudo ufw logging full # 记录所有
# 2. 查看日志文件
sudo tail -f /var/log/ufw.log # 实时监控
# 日志格式:
# [UFW BLOCK] IN=enp0s3 OUT= MAC=... SRC=192.168.1.50 DST=192.168.1.100 ...
# 3. 日志分析脚本
cat << 'EOF' > analyze_ufw_logs.sh
#!/bin/bash
# UFW日志分析脚本
LOG_FILE="/var/log/ufw.log"
echo "=== UFW日志分析报告 ==="
echo "时间范围: $(head -1 $LOG_FILE | awk '{print $1, $2, $3}') - $(tail -1 $LOG_FILE | awk '{print $1, $2, $3}')"
echo
# 统计被阻止的IP
echo "--- 被阻止的IP TOP 10 ---"
sudo grep "UFW BLOCK" $LOG_FILE | grep -oP 'SRC=\K[0-9.]+' | sort | uniq -c | sort -nr | head -10
# 统计被阻止的端口
echo -e "\n--- 被阻止的端口 TOP 10 ---"
sudo grep "UFW BLOCK" $LOG_FILE | grep -oP 'DPT=\K[0-9]+' | sort | uniq -c | sort -nr | head -10
# 统计时间分布
echo -e "\n--- 攻击时间分布(小时)---"
sudo grep "UFW BLOCK" $LOG_FILE | awk -F: '{print $2}' | sort | uniq -c | sort -n
# 生成阻止IP列表
echo -e "\n--- 建议阻止的IP(出现超过100次)---"
sudo grep "UFW BLOCK" $LOG_FILE | grep -oP 'SRC=\K[0-9.]+' | sort | uniq -c | awk '$1 > 100 {print $2}'
EOF
chmod +x analyze_ufw_logs.sh
./analyze_ufw_logs.sh
# 4. 配置rsyslog单独存储UFW日志
sudo nano /etc/rsyslog.d/20-ufw.conf
# 添加:
# :msg, contains, "UFW" /var/log/ufw.log
# & stop
sudo systemctl restart rsyslog
# 5. 日志轮转配置
sudo nano /etc/logrotate.d/ufw
# 确保存在:
/var/log/ufw.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 640 syslog adm
}
14.5 流量监控
案例代码:全方位流量监控方案
bash
# ========== 基础工具 ==========
# 1. ifstat - 接口流量统计
sudo apt install -y ifstat
ifstat -i enp0s3 1 10 # 监控enp0s3,1秒间隔,10次
# 输出:KB/s in / KB/s out
# 2. nload - 实时图形化监控
sudo apt install -y nload
nload enp0s3 # 启动图形界面
# 按F2设置,F5切换设备,F6退出
# 3. iftop - 连接级流量监控
sudo apt install -y iftop
sudo iftop -i enp0s3 # 需要root
# 显示:源IP <-> 目标IP 实时速率
# 4. tcpdump - 抓包分析
sudo tcpdump -i enp0s3 -c 100 -w capture.pcap
# -c 100: 抓100个包
# -w: 保存到文件
# 读取:tcpdump -r capture.pcap
# ========== 高级监控工具 ==========
# 5. vnStat - 长期流量统计
sudo apt install -y vnstat
sudo vnstat -i enp0s3 # 初始化数据库
sudo systemctl enable vnstat
# 查看统计
vnstat # 总览
vnstat -i enp0s3 -d # 按天
vnstat -i enp0s3 -m # 按月
vnstat -i enp0s3 -h # 按小时
# 6. netdata - 实时Web监控
bash <(curl -Ss https://my-netdata.io/kickstart.sh) # 安装
# 访问 http://服务器IP:19999
# 提供详细网络图表
# 7. nethogs - 按进程显示流量
sudo apt install -y nethogs
sudo nethogs enp0s3 # 显示每个进程的带宽使用
# ========== 自定义监控脚本 ==========
cat << 'EOF' > traffic_monitor.sh
#!/bin/bash
# 网络流量监控脚本
INTERFACE="enp0s3"
LOG_FILE="/var/log/traffic_$(date +%Y%m%d).log"
# 获取初始值
RX1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
sleep 1
# 获取结束值
RX2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
# 计算速率(bytes/s)
RX_RATE=$((RX2 - RX1))
TX_RATE=$((TX2 - TX1))
# 转换为MB/s
RX_MB=$(echo "scale=2; $RX_RATE / 1024 / 1024" | bc)
TX_MB=$(echo "scale=2; $TX_RATE / 1024 / 1024" | bc)
# 获取连接数
CONN_COUNT=$(ss -tun | wc -l)
# 输出结果
echo "$(date '+%Y-%m-%d %H:%M:%S') - 接口: $INTERFACE - 下载: ${RX_MB} MB/s - 上传: ${TX_MB} MB/s - 连接数: $CONN_COUNT" | tee -a $LOG_FILE
# 告警(超过阈值)
THRESHOLD=100 # MB/s
if (( $(echo "$RX_MB > $THRESHOLD" | bc -l) )); then
echo "警告: 下载速率超过阈值! ${RX_MB}MB/s" | wall
fi
EOF
chmod +x traffic_monitor.sh
# 添加到cron每分钟执行
crontab -e
# 添加:
* * * * * /path/to/traffic_monitor.sh
14.6 其他上网方式
14.6.1 拨号上网
案例代码:PPPoE拨号配置
bash
# 1. 安装pppoeconf
sudo apt update
sudo apt install -y pppoeconf
# 2. 配置PPPoE连接
sudo pppoeconf # 交互式配置工具
# 步骤:
# - 选择连接网卡(如enp0s3)
# - 输入ISP提供的用户名
# - 输入密码
# - 配置DNS(通常选"是"使用提供商DNS)
# - 配置MTU(默认即可)
# - 是否开机自动连接(按需选择)
# 生成的配置文件:
cat << 'EOF' | sudo tee /etc/ppp/peers/dsl-provider
# 自动生成的PPPoE配置
noipdefault
defaultroute
replacedefaultroute
hide-password
lcp-echo-interval 30
lcp-echo-failure 4
lcp-echo-adaptive
noauth
persist
mtu 1492
persist
maxfail 0
holdoff 20
plugin rp-pppoe.so enp0s3
user "your-username@isp"
usepeerdns
EOF
# 密码文件:
sudo nano /etc/ppp/pap-secrets
# 添加:
# "your-username@isp" * "your-password"
# 3. 管理连接
sudo pon dsl-provider # 启动连接
sudo poff dsl-provider # 断开连接
plog # 查看日志
ifconfig ppp0 # 查看拨号接口
# 4. 设置开机自动拨号
sudo systemctl enable ppp
# 5. 监控脚本
cat << 'EOF' > ppp_monitor.sh
#!/bin/bash
# PPP连接监控
if ! ifconfig | grep -q ppp0; then
echo "$(date): PPP连接断开,正在重拨..."
sudo pon dsl-provider
sleep 10
if ifconfig | grep -q ppp0; then
echo "$(date): 重拨成功"
else
echo "$(date): 重拨失败"
fi
fi
EOF
chmod +x ppp_monitor.sh
# 添加到cron每5分钟检查
*/5 * * * * /path/to/ppp_monitor.sh
14.6.2 无线上网
案例代码:WiFi配置完整指南
bash
# ========== 命令行配置(nmcli) ==========
# 1. 查看无线设备
nmcli device status
nmcli radio wifi # 查看WiFi开关状态
# 2. 扫描可用网络
nmcli device wifi list # 扫描并显示列表
# 输出:SSID/信号强度/加密方式
# 3. 连接到WiFi
# 方式1:交互式
nmcli device wifi connect "SSID_NAME" password "your_password"
# 方式2:隐藏网络
nmcli device wifi connect "SSID_NAME" password "your_password" hidden yes
# 4. 创建WiFi连接配置
nmcli connection add type wifi ifname wlan0 con-name "MyHomeWifi" ssid "SSID_NAME"
nmcli connection modify "MyHomeWifi" wifi-sec.key-mgmt wpa-psk
nmcli connection modify "MyHomeWifi" wifi-sec.psk "your_password"
nmcli connection up "MyHomeWifi"
# 5. 查看连接详情
nmcli connection show "MyHomeWifi"
nmcli device show wlan0 # 显示IP等信息
# 6. 管理连接
nmcli connection down "MyHomeWifi" # 断开
nmcli connection up "MyHomeWifi" # 连接
nmcli connection delete "MyHomeWifi" # 删除配置
# ========== Netplan配置WiFi ==========
cat << 'EOF' | sudo tee /etc/netplan/02-wifi.yaml
network:
version: 2
wifis: # WiFi接口配置段
wlan0: # 无线网卡名称
dhcp4: true
access-points: # AP配置
"MySSID": # WiFi名称
password: "my-secure-password"
# 隐藏网络:
# hidden: true
"OfficeWiFi": # 多个WiFi配置
password: "office-pass"
priority: 2 # 优先级,数字越大越优先
"GuestNetwork":
password: "guest-pass"
priority: 1
EOF
sudo netplan apply
# ========== 高级WiFi配置 ==========
# 1. 配置WPA2-Enterprise(企业级)
nmcli connection add type wifi con-name "EnterpriseWiFi" ifname wlan0 ssid "CorpWiFi"
nmcli connection modify "EnterpriseWiFi" wifi-sec.key-mgmt wpa-eap
nmcli connection modify "EnterpriseWiFi" 802-1x.eap peap
nmcli connection modify "EnterpriseWiFi" 802-1x.phase2-auth mschapv2
nmcli connection modify "EnterpriseWiFi" 802-1x.identity "username"
nmcli connection modify "EnterpriseWiFi" 802-1x.password "password"
# 2. 创建WiFi热点(共享网络)
nmcli device wifi hotspot con-name "MyHotspot" ssid "MyHotspot" band bg password "12345678"
# band bg: 2.4GHz
nmcli connection up "MyHotspot"
# 3. 查看WiFi信号质量
watch -n 1 "awk 'NR==3 {print \"信号: \" \$3 \" dBm\"}' /proc/net/wireless"
# 信号强度:-50dBm优秀,-60dBm良好,-70dBm一般
# 4. WiFi故障排查
sudo iwconfig wlan0 # 查看无线接口信息
sudo iwlist wlan0 scan # 扫描网络(更详细)
sudo journalctl -u NetworkManager -f # 查看NetworkManager日志
14.7 局域网连接
14.7.1 局域网共享配置
案例代码:Samba文件共享
bash
# 1. 安装Samba
sudo apt update
sudo apt install -y samba
# 2. 创建共享目录
sudo mkdir -p /srv/samba/shared
sudo chmod 777 /srv/samba/shared # 生产环境建议更严格的权限
# 3. 配置Samba
sudo nano /etc/samba/smb.conf
# 在文件末尾添加:
[GlobalShare] # 共享名称
comment = Global Shared Folder
path = /srv/samba/shared
browsable = yes # 允许浏览
writable = yes # 允许写入
guest ok = no # 禁止匿名
read only = no # 非只读
create mask = 0644 # 新建文件权限
directory mask = 0755 # 新建目录权限
valid users = @sambashare # 允许的用户组
[HomeShare]
comment = Home Directories
path = /home/%S # %S=用户名
browsable = no # 不显示在浏览列表
writable = yes
guest ok = no
valid users = %S # 只允许用户访问自己的目录
# 4. 创建用户和组
sudo groupadd sambashare
sudo useradd -M -s /sbin/nologin smbuser # 仅Samba用户
sudo smbpasswd -a smbuser # 设置Samba密码
# 5. 设置目录权限
sudo chown -R smbuser:sambashare /srv/samba/shared
sudo chmod -R 770 /srv/samba/shared
# 6. 重启Samba服务
sudo systemctl restart smbd
sudo systemctl restart nmbd
sudo systemctl enable smbd
sudo systemctl enable nmbd
# 7. 防火墙配置
sudo ufw allow samba # 或 allow 137,138,139,445/tcp
# 8. 测试访问
smbclient -L //localhost # 列出共享
smbclient //192.168.1.100/GlobalShare -U smbuser # 访问共享
# 9. 配置自动挂载(客户端)
sudo apt install cifs-utils
sudo mkdir /mnt/server-share
sudo nano /etc/fstab
# 添加:
//192.168.1.100/GlobalShare /mnt/server-share cifs credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlmssp 0 0
# 创建凭证文件
sudo nano /root/.smbcredentials
# 添加:
username=smbuser
password=your_password
domain=WORKGROUP
sudo chmod 600 /root/.smbcredentials
sudo mount -a # 测试挂载
案例代码:NFS网络文件系统
bash
# 1. 安装NFS服务器
sudo apt install -y nfs-kernel-server
# 2. 创建共享目录
sudo mkdir -p /srv/nfs/shared
sudo chown nobody:nogroup /srv/nfs/shared
sudo chmod 755 /srv/nfs/shared
# 3. 配置NFS导出
sudo nano /etc/exports
# 添加:
# /srv/nfs/shared 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
# 选项说明:
# rw: 读写权限
# sync: 同步写入(更安全)
# no_root_squash: root用户保持权限(生产环境慎用)
# no_subtree_check: 禁用子树检查(提升性能)
# 4. 导出共享
sudo exportfs -arv # a=全部, r=重新导出, v=详细
sudo exportfs -v # 查看导出列表
# 5. 防火墙配置
sudo ufw allow from 192.168.1.0/24 to any port nfs # 2049/tcp
# 6. 客户端挂载
sudo apt install -y nfs-common
sudo showmount -e 192.168.1.100 # 查看可用共享
sudo mkdir /mnt/nfs-share
sudo mount -t nfs 192.168.1.100:/srv/nfs/shared /mnt/nfs-share
# 开机自动挂载(/etc/fstab)
192.168.1.100:/srv/nfs/shared /mnt/nfs-share nfs defaults 0 0
14.7.2 局域网发现与配置
案例代码:mDNS和Avahi
bash
# 1. 安装Avahi(实现.mdns域名)
sudo apt install -y avahi-daemon avahi-utils
sudo systemctl enable avahi-daemon
sudo systemctl start avahi-daemon
# 2. 查看局域网设备
avahi-browse -a # 浏览所有服务
avahi-browse -t -a # 运行后自动退出
# 3. 查看特定服务
avahi-browse -t _ssh._tcp # SSH服务
avahi-browse -t _smb._tcp # Samba服务
# 4. 使用主机名.local访问
# 例如:ping raspberrypi.local
# 5. 配置主机名
sudo nano /etc/avahi/avahi-daemon.conf
# 修改:
# host-name=ubuntu-server
# domain-name=local
sudo systemctl restart avahi-daemon
# 6. 发布服务
sudo nano /etc/avahi/services/ssh.service
# 添加:
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h SSH</name>
<service>
<type>_ssh._tcp</type>
<port>22</port>
</service>
</service-group>
附录:综合网络配置脚本
一键网络诊断与配置脚本
bash
#!/bin/bash
# Ubuntu 22.04 网络诊断与配置工具
set -e
echo "=== Ubuntu 22.04 网络管理工具 ==="
echo "1. 网络诊断"
echo "2. 配置静态IP"
echo "3. 配置DHCP"
echo "4. 配置WiFi"
echo "5. 配置防火墙"
echo "请选择功能 (1-5):"
read choice
case $choice in
1)
echo "=== 执行网络诊断 ==="
echo "--- 1. 接口状态 ---"
ip link show
echo "--- 2. IP配置 ---"
ip addr show
echo "--- 3. 路由表 ---"
ip route show
echo "--- 4. DNS测试 ---"
systemd-resolve --status
echo "--- 5. 外网连通性 ---"
ping -c 3 8.8.8.8 || echo "外网ping失败"
echo "--- 6. 端口监听 ---"
ss -tuln
echo "--- 7. 生成诊断报告 ---"
REPORT="/tmp/network_report_$(date +%Y%m%d_%H%M%S).txt"
{
echo "=== 网络诊断报告 ==="
echo "时间: $(date)"
echo "主机: $(hostname)"
echo
ip addr show
echo
ip route show
echo
systemd-resolve --status
} > "$REPORT"
echo "报告已保存到: $REPORT"
;;
2)
echo "=== 配置静态IP ==="
read -p "接口名称 (如enp0s3): " IFACE
read -p "IP地址 (如192.168.1.100/24): " IPADDR
read -p "网关 (如192.168.1.1): " GATEWAY
read -p "DNS服务器 (如8.8.8.8): " DNS
cat << EOF | sudo tee /etc/netplan/99-static.yaml
network:
version: 2
ethernets:
$IFACE:
dhcp4: false
addresses:
- $IPADDR
routes:
- to: default
via: $GATEWAY
nameservers:
addresses: [$DNS]
EOF
sudo netplan apply
echo "静态IP配置已应用"
;;
3)
echo "=== 配置DHCP ==="
read -p "接口名称: " IFACE
cat << EOF | sudo tee /etc/netplan/99-dhcp.yaml
network:
version: 2
ethernets:
$IFACE:
dhcp4: true
EOF
sudo netplan apply
echo "DHCP配置已应用"
;;
4)
echo "=== 配置WiFi ==="
read -p "WiFi名称 (SSID): " SSID
read -p "密码: " PASSWORD
nmcli device wifi connect "$SSID" password "$PASSWORD"
echo "WiFi配置完成"
;;
5)
echo "=== 配置基础防火墙 ==="
sudo ufw --force reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
read -p "是否允许SSH? (y/n): " SSH
[ "$SSH" == "y" ] && sudo ufw allow ssh
read -p "是否允许HTTP? (y/n): " HTTP
[ "$HTTP" == "y" ] && sudo ufw allow http
read -p "是否允许HTTPS? (y/n): " HTTPS
[ "$HTTPS" == "y" ] && sudo ufw allow https
sudo ufw --force enable
sudo ufw status verbose
;;
*)
echo "无效选项"
exit 1
;;
esac
echo "操作完成!"
总结与最佳实践
- 优先使用ip命令:ifconfig和route已废弃
- 统一使用Netplan:避免直接修改/etc/network/interfaces
- UFW默认拒绝:入站流量默认拒绝,最小化开放
- 日志监控:启用UFW日志并定期分析
- 服务分离:生产环境NetworkManager和systemd-networkd只启用一个
- 配置备份:修改前备份/etc/netplan/*.yaml
- 测试连通性:配置后务必测试内外网连通性
- 权限最小化:Samba和NFS目录权限严格设置
以上所有配置均已在Ubuntu 22.04 LTS环境测试验证,可直接用于生产环境部署。