第七部分:常用命令参考

21. WireGuard命令

21.1 wg show(查看状态)

21.1.1 基本用法

查看所有接口:

sudo wg show

输出示例:

interface: wg0
  public key: rUEB9pR7DO7qgkbo6Ylerrh/Fvl1XA8RJuALBdlkFkk=
  private key: (hidden)
  listening port: 51820

peer: QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
  endpoint: 192.168.1.100:54231
  allowed ips: 10.8.0.2/32
  latest handshake: 1 minute, 23 seconds ago
  transfer: 1.23 MiB received, 856.78 KiB sent
  persistent keepalive: every 25 seconds

查看特定接口:

sudo wg show wg0

21.1.2 查看特定信息

仅查看公钥:

sudo wg show wg0 public-key

输出:

rUEB9pR7DO7qgkbo6Ylerrh/Fvl1XA8RJuALBdlkFkk=

仅查看私钥:

sudo wg show wg0 private-key

输出:

8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=

⚠️ 安全警告:私钥是敏感信息,不要在不安全的环境中显示。

查看监听端口:

sudo wg show wg0 listen-port

输出:

51820

查看所有peer:

sudo wg show wg0 peers

输出:

QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=

查看peer端点:

sudo wg show wg0 endpoints

输出:

QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=	192.168.1.100:54231

查看允许的IP:

sudo wg show wg0 allowed-ips

输出:

QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=	10.8.0.2/32

查看最新握手时间:

sudo wg show wg0 latest-handshakes

输出(Unix时间戳):

QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=	1711180800

查看传输统计:

sudo wg show wg0 transfer

输出(字节):

QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=	1290240	877568

格式:公钥 接收字节数 发送字节数

查看保活设置:

sudo wg show wg0 persistent-keepalive

输出:

QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=	25

21.1.3 格式化输出

dump格式(适合脚本解析):

sudo wg show wg0 dump

输出格式:

私钥	公钥	监听端口	fwmark
公钥	预共享密钥	endpoint	允许的IP	最新握手	接收字节	发送字节	保活间隔

示例:

8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=	rUEB9pR7DO7qgkbo6Ylerrh/Fvl1XA8RJuALBdlkFkk=	51820	off
QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=	(none)	192.168.1.100:54231	10.8.0.2/32	1711180800	1290240	877568	25

解析dump输出:

#!/bin/bash
# 解析WireGuard状态

sudo wg show wg0 dump | while IFS=$'\t' read -r col1 col2 col3 col4 col5 col6 col7 col8; do
    # 跳过第一行(接口信息)
    if [[ $col1 == *"="* ]] && [[ ! $col2 == "(none)" ]]; then
        continue
    fi
    
    # 解析peer信息
    if [[ $col1 == *"="* ]]; then
        echo "Peer: ${col1:0:10}..."
        echo "  Endpoint: $col3"
        echo "  Allowed IPs: $col4"
        echo "  Transfer: RX=$col6 TX=$col7"
    fi
done

21.1.4 实时监控

持续监控状态:

watch -n 1 'sudo wg show wg0'

监控特定peer:

watch -n 1 'sudo wg show wg0 | grep -A 5 "peer: QcDI"'

监控握手时间:

while true; do
    clear
    echo "=== WireGuard 握手监控 ==="
    echo "时间: $(date '+%H:%M:%S')"
    echo ""
    sudo wg show wg0 | grep -E "(peer:|latest handshake)"
    sleep 5
done

监控流量:

#!/bin/bash
# 流量监控脚本

prev_rx=0
prev_tx=0

while true; do
    # 获取当前流量
    transfer=$(sudo wg show wg0 transfer | head -1)
    curr_rx=$(echo $transfer | awk '{print $2}')
    curr_tx=$(echo $transfer | awk '{print $3}')
    
    # 计算速率(每秒字节数)
    if [ $prev_rx -ne 0 ]; then
        rx_rate=$((curr_rx - prev_rx))
        tx_rate=$((curr_tx - prev_tx))
        
        echo "$(date '+%H:%M:%S') - 下载: $((rx_rate / 1024)) KB/s, 上传: $((tx_rate / 1024)) KB/s"
    fi
    
    prev_rx=$curr_rx
    prev_tx=$curr_tx
    
    sleep 1
done

21.2 wg-quick(快速管理)

21.2.1 启动接口

启动wg0接口:

sudo wg-quick up wg0

输出示例:

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE

从非默认配置启动:

sudo wg-quick up /path/to/custom.conf

21.2.2 停止接口

停止wg0接口:

sudo wg-quick down wg0

输出示例:

[#] ip link delete dev wg0
[#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE

强制停止:

sudo wg-quick down wg0 || true

21.2.3 重启接口

重启wg0:

sudo wg-quick down wg0 && sudo wg-quick up wg0

或使用脚本:

#!/bin/bash
# restart-wg.sh

echo "停止WireGuard..."
sudo wg-quick down wg0

sleep 2

echo "启动WireGuard..."
sudo wg-quick up wg0

echo "完成!"
sudo wg show wg0

21.2.4 重新加载配置

方法1:使用strip(推荐)

sudo wg syncconf wg0 <(wg-quick strip wg0)

这个命令会:

  1. 读取配置文件
  2. 移除PostUp/PostDown等无关配置
  3. 应用到运行中的接口
  4. 不会断开现有连接

方法2:完全重启

sudo wg-quick down wg0
sudo wg-quick up wg0

缺点:会断开所有客户端连接

比较:

方法断开连接执行PostUp/PostDown适用场景
syncconf修改peer配置
完全重启修改接口配置

21.2.5 save和strip命令

save - 保存当前配置:

sudo wg-quick save wg0

将运行时配置保存到 /etc/wireguard/wg0.conf

strip - 移除脚本命令:

wg-quick strip wg0

输出不包含PostUp/PostDown的纯WireGuard配置:

[Interface]
PrivateKey = 8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=
ListenPort = 51820
Address = 10.8.0.1/24

[Peer]
PublicKey = QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
AllowedIPs = 10.8.0.2/32

strip与syncconf结合使用:

# 编辑配置文件
sudo nano /etc/wireguard/wg0.conf

# 不重启直接应用
sudo wg syncconf wg0 <(wg-quick strip wg0)

21.3 wg genkey(生成密钥)

21.3.1 生成私钥

基本用法:

wg genkey

输出(随机32字节Base64编码):

eKX7A+ZxHanItaMVdEIwB3ENUZpQhX0VdPCL1CCWCmE=

保存到文件:

wg genkey > private.key

保存到变量:

PRIVATE_KEY=$(wg genkey)
echo $PRIVATE_KEY

21.3.2 批量生成密钥

生成10个密钥对:

#!/bin/bash
# generate-keys.sh

for i in {1..10}; do
    private=$(wg genkey)
    public=$(echo $private | wg pubkey)
    
    echo "Keypair $i:"
    echo "  Private: $private"
    echo "  Public:  $public"
    echo ""
done

保存到文件:

#!/bin/bash
# generate-and-save-keys.sh

mkdir -p keys

for i in {1..10}; do
    private=$(wg genkey)
    public=$(echo $private | wg pubkey)
    
    echo $private > keys/client${i}_private.key
    echo $public > keys/client${i}_public.key
    
    echo "Generated keypair for client${i}"
done

21.3.3 从文件读取私钥

读取私钥文件:

cat private.key

在配置中使用:

PRIVATE_KEY=$(cat /etc/wireguard/server_private.key)

cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = $PRIVATE_KEY
Address = 10.8.0.1/24
ListenPort = 51820
EOF

21.4 wg pubkey(提取公钥)

21.4.1 从私钥生成公钥

标准用法:

echo "eKX7A+ZxHanItaMVdEIwB3ENUZpQhX0VdPCL1CCWCmE=" | wg pubkey

输出:

QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=

从文件生成:

cat private.key | wg pubkey

生成并保存:

cat private.key | wg pubkey > public.key

21.4.2 生成密钥对(一条命令)

生成并同时保存:

wg genkey | tee private.key | wg pubkey > public.key

解释:

查看生成的密钥:

echo "Private key:"
cat private.key

echo ""
echo "Public key:"
cat public.key

21.4.3 批量生成服务器和客户端密钥

完整脚本:

#!/bin/bash
# setup-wireguard-keys.sh

# 创建密钥目录
mkdir -p /etc/wireguard/keys
cd /etc/wireguard/keys

# 生成服务器密钥对
echo "生成服务器密钥对..."
wg genkey | tee server_private.key | wg pubkey > server_public.key

# 生成客户端密钥对
NUM_CLIENTS=5

for i in $(seq 1 $NUM_CLIENTS); do
    echo "生成客户端${i}密钥对..."
    wg genkey | tee client${i}_private.key | wg pubkey > client${i}_public.key
done

# 设置权限
chmod 600 *.key

# 显示密钥
echo ""
echo "=== 服务器密钥 ==="
echo "私钥: $(cat server_private.key)"
echo "公钥: $(cat server_public.key)"

echo ""
echo "=== 客户端密钥 ==="
for i in $(seq 1 $NUM_CLIENTS); do
    echo "客户端${i}:"
    echo "  私钥: $(cat client${i}_private.key)"
    echo "  公钥: $(cat client${i}_public.key)"
done

使用:

sudo bash setup-wireguard-keys.sh

21.5 wg set(动态配置)

21.5.1 修改接口配置

设置私钥:

sudo wg set wg0 private-key /etc/wireguard/server_private.key

设置监听端口:

sudo wg set wg0 listen-port 51820

设置fwmark:

sudo wg set wg0 fwmark 0x1234

21.5.2 添加/修改peer

添加新peer:

sudo wg set wg0 peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= \
    allowed-ips 10.8.0.2/32

修改peer的endpoint:

sudo wg set wg0 peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= \
    endpoint 192.168.1.100:51820

修改allowed-ips:

sudo wg set wg0 peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= \
    allowed-ips 10.8.0.2/32,10.8.0.3/32

设置保活间隔:

sudo wg set wg0 peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= \
    persistent-keepalive 25

禁用保活:

sudo wg set wg0 peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= \
    persistent-keepalive 0

设置预共享密钥(可选):

sudo wg set wg0 peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= \
    preshared-key /path/to/psk

21.5.3 删除peer

删除指定peer:

sudo wg set wg0 peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= remove

删除所有peer:

for peer in $(sudo wg show wg0 peers); do
    sudo wg set wg0 peer $peer remove
done

21.5.4 复杂配置示例

添加完整peer配置:

sudo wg set wg0 \
    peer QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= \
    allowed-ips 10.8.0.2/32 \
    endpoint 192.168.1.100:51820 \
    persistent-keepalive 25

批量添加peer:

#!/bin/bash
# add-peers.sh

# Peer列表(公钥:IP)
PEERS=(
    "QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=:10.8.0.2"
    "AbC1234567890XYZabcdefghijklmnopqrstuvwxyz=:10.8.0.3"
    "DefGhi789012345678901234567890123456789012=:10.8.0.4"
)

for peer_info in "${PEERS[@]}"; do
    pubkey="${peer_info%:*}"
    ip="${peer_info#*:}"
    
    echo "添加peer: $ip"
    sudo wg set wg0 peer "$pubkey" allowed-ips "$ip/32"
done

echo "完成!当前peer列表:"
sudo wg show wg0 peers

⚠️ 注意wg set的修改是临时的,重启后会丢失。永久修改需要编辑配置文件。

21.6 wg syncconf(重载配置)

21.6.1 基本用法

从配置文件重载:

sudo wg syncconf wg0 /etc/wireguard/wg0.conf

使用strip清理配置:

sudo wg syncconf wg0 <(wg-quick strip wg0)

21.6.2 与setconf的区别

setconf - 替换所有配置:

sudo wg setconf wg0 /etc/wireguard/wg0.conf

特点:

syncconf - 同步配置:

sudo wg syncconf wg0 <(wg-quick strip wg0)

特点:

21.6.3 使用场景

场景1:添加新客户端

# 1. 编辑配置文件
sudo nano /etc/wireguard/wg0.conf

# 添加新[Peer]段
# [Peer]
# PublicKey = ...
# AllowedIPs = 10.8.0.3/32

# 2. 重载配置(不断开现有连接)
sudo wg syncconf wg0 <(wg-quick strip wg0)

场景2:修改peer的allowed-ips

# 1. 修改配置文件
sudo nano /etc/wireguard/wg0.conf

# 修改AllowedIPs
# AllowedIPs = 10.8.0.2/32,10.8.0.100/32

# 2. 应用更改
sudo wg syncconf wg0 <(wg-quick strip wg0)

场景3:删除离职员工

# 1. 从配置文件删除对应[Peer]段
sudo nano /etc/wireguard/wg0.conf

# 2. 重载配置
sudo wg syncconf wg0 <(wg-quick strip wg0)

21.6.4 自动化脚本

配置更新脚本:

#!/bin/bash
# reload-wireguard.sh

CONFIG_FILE="/etc/wireguard/wg0.conf"

# 备份当前配置
sudo cp $CONFIG_FILE ${CONFIG_FILE}.bak

# 显示当前peer列表
echo "当前peer列表:"
sudo wg show wg0 peers

# 提示确认
read -p "确定要重载配置吗?(y/n) " -n 1 -r
echo

if [[ $REPLY =~ ^[Yy]$ ]]; then
    # 重载配置
    echo "重载配置中..."
    if sudo wg syncconf wg0 <(wg-quick strip wg0); then
        echo "✓ 配置重载成功"
        echo ""
        echo "新peer列表:"
        sudo wg show wg0 peers
    else
        echo "✗ 配置重载失败"
        echo "恢复备份..."
        sudo cp ${CONFIG_FILE}.bak $CONFIG_FILE
        exit 1
    fi
else
    echo "取消重载"
fi

使用:

sudo bash reload-wireguard.sh

22. 网络诊断命令

22.1 ping(连通性测试)

22.1.1 基本ping测试

测试VPN服务器:

ping 10.8.0.1

发送指定数量的包:

ping -c 10 10.8.0.1

输出示例:

PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=0.071 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=0.068 ms
...

--- 10.8.0.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9001ms
rtt min/avg/max/mdev = 0.032/0.065/0.173/0.020 ms

22.1.2 高级ping选项

设置间隔(秒):

ping -i 0.2 10.8.0.1  # 每0.2秒发送一次

设置包大小(字节):

ping -s 1400 10.8.0.1  # 发送1400字节数据

设置TTL:

ping -t 64 10.8.0.1

设置超时(秒):

ping -W 2 10.8.0.1  # 等待2秒响应

洪水ping(需要root):

sudo ping -f 10.8.0.1

⚠️ 警告:洪水ping会占用大量网络资源。

仅统计,不显示每个包:

ping -c 100 -q 10.8.0.1

输出:

--- 10.8.0.1 ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 99001ms
rtt min/avg/max/mdev = 0.032/0.065/0.173/0.020 ms

22.1.3 MTU测试

测试最大MTU(Linux):

# -M do: 禁止分片
# -s: 数据大小
ping -M do -s 1472 10.8.0.1

如果成功,最大MTU = 1472 + 28 (IP+ICMP头) = 1500

如果失败(Frag needed),降低数值重试:

ping -M do -s 1400 10.8.0.1
ping -M do -s 1300 10.8.0.1

测试WireGuard隧道MTU:

# WireGuard推荐MTU = 1420
# 测试数据大小 = 1420 - 28 = 1392
ping -M do -s 1392 10.8.0.1

自动查找最优MTU脚本:

#!/bin/bash
# find-optimal-mtu.sh

TARGET="10.8.0.1"
MIN_SIZE=1200
MAX_SIZE=1500

for size in $(seq $MAX_SIZE -10 $MIN_SIZE); do
    if ping -M do -s $size -c 1 -W 1 $TARGET > /dev/null 2>&1; then
        optimal_mtu=$((size + 28))
        echo "最优MTU: $optimal_mtu"
        echo "数据大小: $size"
        break
    fi
done

22.1.4 持续监控脚本

监控延迟和丢包:

#!/bin/bash
# monitor-ping.sh

TARGET="10.8.0.1"
LOG_FILE="/var/log/wireguard-ping.log"

while true; do
    timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    # 发送5个包
    result=$(ping -c 5 -q $TARGET 2>&1)
    
    if [ $? -eq 0 ]; then
        # 提取统计信息
        loss=$(echo "$result" | grep "packet loss" | awk '{print $6}')
        rtt=$(echo "$result" | grep "rtt" | awk -F'/' '{print $5}')
        
        echo "$timestamp - 延迟: ${rtt}ms, 丢包: $loss" | tee -a $LOG_FILE
    else
        echo "$timestamp - 连接失败" | tee -a $LOG_FILE
    fi
    
    sleep 60
done

22.2 traceroute(路由跟踪)

22.2.1 基本用法

跟踪到VPN服务器的路径:

traceroute 10.8.0.1

输出示例:

traceroute to 10.8.0.1 (10.8.0.1), 30 hops max, 60 byte packets
 1  10.8.0.1 (10.8.0.1)  0.065 ms  0.051 ms  0.048 ms

跟踪到互联网的路径(通过VPN):

traceroute 8.8.8.8

输出示例:

traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  10.8.0.1 (10.8.0.1)  0.065 ms  0.051 ms  0.048 ms
 2  192.168.1.1 (192.168.1.1)  2.123 ms  2.098 ms  2.076 ms
 3  * * *
 4  8.8.8.8 (8.8.8.8)  15.234 ms  15.201 ms  15.189 ms

22.2.2 高级选项

使用ICMP而非UDP:

traceroute -I 10.8.0.1

使用TCP:

sudo traceroute -T 10.8.0.1

设置最大跳数:

traceroute -m 10 8.8.8.8

设置探测包数量:

traceroute -q 5 8.8.8.8

不解析主机名(更快):

traceroute -n 8.8.8.8

22.2.3 mtr(更好的traceroute)

安装mtr:

sudo apt install mtr

实时路由跟踪:

mtr 10.8.0.1

输出示例:

HOST: localhost              Loss%   Snt   Last   Avg  Best  Wrst StDev
  1. 10.8.0.1                 0.0%    10    0.1   0.1   0.0   0.2   0.1

报告模式(发送10个包后退出):

mtr -r -c 10 8.8.8.8

保存报告到文件:

mtr -r -c 100 8.8.8.8 > mtr-report.txt

JSON格式输出:

mtr -j -c 10 8.8.8.8

22.3 ip addr(查看IP)

22.3.1 查看所有接口

列出所有网络接口:

ip addr

或简写:

ip a

输出示例:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    
2: pnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
    link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.66/24 brd 192.168.1.255 scope global pnet0
    
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN
    link/none
    inet 10.8.0.1/24 scope global wg0

22.3.2 查看特定接口

查看wg0接口:

ip addr show wg0

或简写:

ip a s wg0

仅显示IPv4地址:

ip -4 addr show wg0

仅显示IPv6地址:

ip -6 addr show wg0

22.3.3 添加/删除IP地址

添加IP地址:

sudo ip addr add 10.8.0.100/24 dev wg0

删除IP地址:

sudo ip addr del 10.8.0.100/24 dev wg0

清空接口所有IP:

sudo ip addr flush dev wg0

22.3.4 提取IP地址(脚本用)

提取wg0的IP地址:

ip addr show wg0 | grep "inet " | awk '{print $2}' | cut -d/ -f1

输出:

10.8.0.1

提取所有接口的IP:

ip addr | grep "inet " | grep -v "127.0.0.1" | awk '{print $2}'

函数封装:

get_ip() {
    local iface=$1
    ip addr show $iface 2>/dev/null | grep "inet " | awk '{print $2}' | cut -d/ -f1
}

# 使用
WG_IP=$(get_ip wg0)
echo "WireGuard IP: $WG_IP"

22.4 ip route(查看路由)

22.4.1 查看路由表

显示所有路由:

ip route

或简写:

ip r

输出示例:

default via 192.168.1.1 dev pnet0 proto static
10.8.0.0/24 dev wg0 proto kernel scope link src 10.8.0.1
192.168.1.0/24 dev pnet0 proto kernel scope link src 192.168.1.66

查看特定路由表:

ip route show table main
ip route show table local

22.4.2 查询路由

查询到特定IP的路由:

ip route get 8.8.8.8

输出:

8.8.8.8 via 192.168.1.1 dev pnet0 src 192.168.1.66 uid 0
    cache

查询通过VPN的路由:

ip route get 10.8.0.2

输出:

10.8.0.2 dev wg0 src 10.8.0.1 uid 0
    cache

22.4.3 添加/删除路由

添加静态路由:

sudo ip route add 192.168.100.0/24 via 10.8.0.2

删除路由:

sudo ip route del 192.168.100.0/24

添加默认路由:

sudo ip route add default via 192.168.1.1 dev pnet0

删除默认路由:

sudo ip route del default

22.4.4 策略路由

查看路由规则:

ip rule

输出示例:

0:	from all lookup local
32766:	from all lookup main
32767:	from all lookup default

添加路由规则:

sudo ip rule add from 10.8.0.0/24 table 100

创建路由表:

sudo ip route add default via 10.8.0.1 table 100

删除路由规则:

sudo ip rule del from 10.8.0.0/24 table 100

22.5 netstat(查看端口)

22.5.1 查看监听端口

查看所有TCP/UDP监听:

sudo netstat -tulnp

参数说明:

输出示例:

Proto Recv-Q Send-Q Local Address   Foreign Address   State       PID/Program name
tcp        0      0 0.0.0.0:22      0.0.0.0:*         LISTEN      1234/sshd
tcp        0      0 0.0.0.0:5000    0.0.0.0:*         LISTEN      5678/python3
tcp        0      0 0.0.0.0:8000    0.0.0.0:*         LISTEN      9012/python3
udp        0      0 0.0.0.0:51820   0.0.0.0:*                     3456/wireguard

22.5.2 查看特定端口

查看51820端口:

sudo netstat -tulnp | grep :51820

查看所有WireGuard相关:

sudo netstat -tulnp | grep -i wire

22.5.3 查看连接状态

查看所有TCP连接:

netstat -tan

查看ESTABLISHED连接:

netstat -tan | grep ESTABLISHED

统计连接状态:

netstat -tan | awk '{print $6}' | sort | uniq -c

输出:

      1 CLOSE_WAIT
      5 ESTABLISHED
      2 FIN_WAIT2
     10 LISTEN
      1 State
      3 TIME_WAIT

22.6 ss(查看连接)

22.6.1 基本用法

查看所有TCP/UDP监听:

sudo ss -tulnp

查看TCP监听:

sudo ss -tlnp

查看UDP监听:

sudo ss -ulnp

22.6.2 过滤特定端口

查看51820端口:

sudo ss -ulnp | grep :51820

查看特定状态的连接:

ss -tan state established

22.6.3 显示统计信息

显示摘要统计:

ss -s

输出:

Total: 123
TCP:   45 (estab 10, closed 5, orphaned 0, timewait 3)
UDP:   8

显示详细统计:

ss -tan | awk '{print $1}' | sort | uniq -c

22.7 tcpdump(抓包)

22.7.1 基本抓包

抓取wg0接口所有包:

sudo tcpdump -i wg0

抓取10个包后停止:

sudo tcpdump -i wg0 -c 10

显示详细信息:

sudo tcpdump -i wg0 -vv

22.7.2 过滤条件

仅抓取ICMP包(ping):

sudo tcpdump -i wg0 icmp

抓取特定IP:

sudo tcpdump -i wg0 host 10.8.0.2

抓取特定端口:

sudo tcpdump -i pnet0 udp port 51820

抓取特定源IP:

sudo tcpdump -i wg0 src 10.8.0.2

抓取特定目标IP:

sudo tcpdump -i wg0 dst 8.8.8.8

22.7.3 保存和分析

保存到文件:

sudo tcpdump -i wg0 -w capture.pcap

读取文件:

tcpdump -r capture.pcap

过滤后保存:

sudo tcpdump -i wg0 icmp -w ping-capture.pcap

保存时显示:

sudo tcpdump -i wg0 -w capture.pcap -v

22.7.4 高级用法

查看WireGuard握手包:

sudo tcpdump -i pnet0 'udp port 51820'

监控VPN流量:

sudo tcpdump -i wg0 -nn -c 100 | awk '{print $3, $5}' | sort | uniq -c | sort -nr

抓取DNS查询:

sudo tcpdump -i wg0 'udp port 53'

23. 系统管理命令

23.1 systemctl(服务管理)

23.1.1 启动/停止服务

启动WireGuard:

sudo systemctl start wg-quick@wg0

停止WireGuard:

sudo systemctl stop wg-quick@wg0

重启WireGuard:

sudo systemctl restart wg-quick@wg0

重新加载配置(如果服务支持):

sudo systemctl reload wg-quick@wg0

23.1.2 查看服务状态

查看详细状态:

sudo systemctl status wg-quick@wg0

输出示例:

[email protected] - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: active (exited) since Wed 2025-03-23 10:00:00 UTC; 2h 30min ago
       Docs: man:wg-quick(8)
             man:wg(8)
   Main PID: 1234 (code=exited, status=0/SUCCESS)
        CPU: 123ms

Mar 23 10:00:00 server systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
Mar 23 10:00:00 server wg-quick[1234]: [#] ip link add wg0 type wireguard
Mar 23 10:00:00 server wg-quick[1234]: [#] wg setconf wg0 /dev/fd/63
Mar 23 10:00:00 server systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

仅查看运行状态:

systemctl is-active wg-quick@wg0

输出:activeinactive

检查是否启用开机自启:

systemctl is-enabled wg-quick@wg0

输出:enableddisabled

23.1.3 开机自启动

启用开机自启:

sudo systemctl enable wg-quick@wg0

输出:

Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected].

禁用开机自启:

sudo systemctl disable wg-quick@wg0

启用并立即启动:

sudo systemctl enable --now wg-quick@wg0

禁用并立即停止:

sudo systemctl disable --now wg-quick@wg0

23.1.4 查看日志

查看服务日志(最近):

sudo journalctl -u wg-quick@wg0

实时跟踪日志:

sudo journalctl -u wg-quick@wg0 -f

查看最近N行:

sudo journalctl -u wg-quick@wg0 -n 50

查看今天的日志:

sudo journalctl -u wg-quick@wg0 --since today

查看指定时间范围:

sudo journalctl -u wg-quick@wg0 --since "2025-03-23 10:00" --until "2025-03-23 12:00"

23.1.5 重新加载systemd

重新加载systemd配置:

sudo systemctl daemon-reload

使用场景:

列出所有失败的服务:

systemctl --failed

列出所有启用的服务:

systemctl list-unit-files --state=enabled

23.2 journalctl(查看日志)

23.2.1 基本用法

查看所有日志:

sudo journalctl

查看内核日志:

sudo journalctl -k

查看启动日志:

sudo journalctl -b

查看上次启动日志:

sudo journalctl -b -1

23.2.2 过滤日志

按服务过滤:

sudo journalctl -u wg-quick@wg0

按优先级过滤:

# 仅错误
sudo journalctl -p err

# 错误和警告
sudo journalctl -p warning

优先级级别:

按时间过滤:

# 最近1小时
sudo journalctl --since "1 hour ago"

# 今天
sudo journalctl --since today

# 指定日期
sudo journalctl --since "2025-03-23" --until "2025-03-24"

# 相对时间
sudo journalctl --since "10 min ago"

23.2.3 格式化输出

JSON格式:

sudo journalctl -u wg-quick@wg0 -o json-pretty

详细格式:

sudo journalctl -u wg-quick@wg0 -o verbose

简短格式:

sudo journalctl -u wg-quick@wg0 -o short

仅显示消息:

sudo journalctl -u wg-quick@wg0 -o cat

23.2.4 实时监控

实时跟踪:

sudo journalctl -f

跟踪特定服务:

sudo journalctl -u wg-quick@wg0 -f

跟踪多个服务:

sudo journalctl -u wg-quick@wg0 -u vpn-api -f

23.2.5 搜索日志

搜索关键字:

sudo journalctl | grep -i wireguard

搜索错误:

sudo journalctl -p err | grep -i wireguard

统计错误数量:

sudo journalctl -p err | grep -i wireguard | wc -l

23.2.6 清理日志

查看日志占用空间:

sudo journalctl --disk-usage

清理旧日志(保留最近1周):

sudo journalctl --vacuum-time=7d

清理旧日志(保留最大1GB):

sudo journalctl --vacuum-size=1G

验证日志完整性:

sudo journalctl --verify

23.3 iptables(防火墙)

23.3.1 查看规则

查看filter表所有规则:

sudo iptables -L -n -v

参数说明:

查看nat表:

sudo iptables -t nat -L -n -v

查看带行号:

sudo iptables -L -n -v --line-numbers

查看特定链:

sudo iptables -L FORWARD -n -v --line-numbers

23.3.2 添加规则

允许WireGuard转发:

sudo iptables -A FORWARD -i wg0 -j ACCEPT

允许特定端口:

sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT

插入规则到第一位:

sudo iptables -I INPUT 1 -p udp --dport 51820 -j ACCEPT

23.3.3 删除规则

按行号删除:

sudo iptables -D INPUT 5

按规则删除:

sudo iptables -D INPUT -p udp --dport 51820 -j ACCEPT

清空整条链:

sudo iptables -F FORWARD

清空所有规则:

sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F

⚠️ 警告:清空所有规则可能导致网络中断!

23.3.4 保存和恢复

Ubuntu/Debian保存规则:

sudo iptables-save > /etc/iptables/rules.v4

恢复规则:

sudo iptables-restore < /etc/iptables/rules.v4

CentOS/RHEL保存规则:

sudo service iptables save

23.3.5 常用WireGuard规则

完整规则集:

# 允许已建立的连接
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许WireGuard
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT

# 允许WireGuard转发
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT

# NAT
sudo iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE

# 默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

XBR

© 2026 XBR

bilibili bluesky discord