Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04的Linux网络配置(14)

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-networkdNetworkManager 双栈管理网络,通过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 "操作完成!"

总结与最佳实践

  1. 优先使用ip命令:ifconfig和route已废弃
  2. 统一使用Netplan:避免直接修改/etc/network/interfaces
  3. UFW默认拒绝:入站流量默认拒绝,最小化开放
  4. 日志监控:启用UFW日志并定期分析
  5. 服务分离:生产环境NetworkManager和systemd-networkd只启用一个
  6. 配置备份:修改前备份/etc/netplan/*.yaml
  7. 测试连通性:配置后务必测试内外网连通性
  8. 权限最小化:Samba和NFS目录权限严格设置

以上所有配置均已在Ubuntu 22.04 LTS环境测试验证,可直接用于生产环境部署。

相关推荐
皇族崛起2 小时前
【视觉多模态】- scannet 数据的 Ubuntu 百度网盘全速下载
linux·ubuntu·3d建模·dubbo
CAU界编程小白2 小时前
Linux系统编程系列之进程控制(下)
linux·进程控制
手揽回忆怎么睡2 小时前
Streamlit学习实战教程级,一个交互式的机器学习实验平台!
人工智能·学习·机器学习
xiaoxiaoxiaolll2 小时前
《Advanced Materials》基于MXene的复合纤维实现智能纺织品多模态功能集成
学习
RisunJan3 小时前
Linux命令-ifconfig命令(配置和显示网络接口的信息)
linux·运维·服务器
LaoWaiHang3 小时前
Linux基础知识04:pwd命令与cd命令
linux
lbb 小魔仙3 小时前
【Linux】100 天 Linux 入门:从命令行到 Shell 脚本,告别“光标恐惧”
linux·运维·服务器
db_murphy4 小时前
学习篇 | 英方i2Active和i2Stream工具了解
学习
小张成长计划..4 小时前
【Linux】1:基本指令
linux