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)
这个命令会:
- 读取配置文件
- 移除PostUp/PostDown等无关配置
- 应用到运行中的接口
- 不会断开现有连接
方法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
解释:
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
特点:
- 删除所有现有peer
- 替换为配置文件中的peer
- 会断开未在配置文件中的连接
syncconf - 同步配置:
sudo wg syncconf wg0 <(wg-quick strip wg0)
特点:
- 仅更新有变化的peer
- 保留未变化的连接
- 不会断开现有连接
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
参数说明:
-tTCP端口-uUDP端口-l仅显示监听的-n数字显示,不解析-p显示进程信息
输出示例:
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
输出:active 或 inactive
检查是否启用开机自启:
systemctl is-enabled wg-quick@wg0
输出:enabled 或 disabled
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
使用场景:
- 修改了.service文件
- 添加了新的服务文件
- 修改了服务依赖关系
列出所有失败的服务:
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
优先级级别:
- 0: emerg
- 1: alert
- 2: crit
- 3: err
- 4: warning
- 5: notice
- 6: info
- 7: debug
按时间过滤:
# 最近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
参数说明:
-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