4. EVE-NG平台部署
4.1 EVE-NG访问
4.1.1 EVE-NG简介
EVE-NG (Emulated Virtual Environment - Next Generation) 是一个基于Linux的网络仿真平台,支持多种虚拟化技术(QEMU、Dynamips、IOL等),可以在单台物理机上构建复杂的网络拓扑。
本项目中EVE-NG的作用:
- 提供虚拟化基础设施
- 承载Ubuntu虚拟机
- 隔离实验环境
- 便于网络拓扑调整
4.1.2 访问EVE-NG管理界面
访问地址:
URL: http://192.168.1.66
默认用户名: admin
默认密码: eve
浏览器要求:
- 推荐:Chrome、Firefox、Edge(最新版本)
- 需要启用JavaScript和Cookie
- 需要安装HTML5 Console插件(可选)
登录步骤:
1. 打开浏览器,输入 http://192.168.1.66
2. 输入用户名和密码
3. 点击 Login
4. 进入EVE-NG主界面
4.1.3 SSH访问EVE-NG
SSH连接:
# 从本地计算机连接
ssh [email protected]
# 默认密码:eve
# 首次登录建议修改密码
passwd
密钥登录配置(推荐):
# 本地生成SSH密钥对
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# 复制公钥到EVE-NG
ssh-copy-id [email protected]
# 测试密钥登录
ssh [email protected]
4.1.4 EVE-NG基础配置
系统信息查看:
# 查看EVE-NG版本
cat /etc/eve-release
# 查看系统资源
free -h
df -h
cat /proc/cpuinfo | grep "processor" | wc -l
网络配置检查:
# 查看网络接口
ip addr show
# 查看网桥配置
brctl show
# 测试网络连通性
ping -c 4 8.8.8.8
4.2 Ubuntu镜像转换
4.2.1 镜像格式说明
EVE-NG使用QEMU虚拟化技术,需要将ISO格式的Ubuntu镜像转换为qcow2格式。
支持的镜像格式:
- ISO → 原始光盘镜像(不能直接使用)
- qcow2 → QEMU Copy-On-Write格式(推荐,支持快照)
- vmdk → VMware虚拟磁盘格式
- raw → 原始磁盘镜像格式
qcow2格式优势:
- 动态扩展,节省磁盘空间
- 支持快照功能
- 支持压缩和加密
- EVE-NG原生支持
4.2.2 下载Ubuntu镜像
官方下载地址:
Ubuntu Server 22.04.5 LTS:
https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso
清华大学镜像站(推荐,国内速度快):
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04.5-live-server-amd64.iso
使用wget下载:
# 进入临时目录
cd /tmp
# 下载镜像(清华源)
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ubuntu-22.04.5-live-server-amd64.iso
# 或使用阿里云镜像
wget https://mirrors.aliyun.com/ubuntu-releases/22.04/ubuntu-22.04.5-live-server-amd64.iso
# 验证下载完整性(可选)
md5sum ubuntu-22.04.5-live-server-amd64.iso
预期文件大小:
ubuntu-22.04.5-live-server-amd64.iso
大小:约 2.6 GB
MD5:根据官方发布信息验证
4.2.3 ISO转qcow2转换
方法一:直接转换(不推荐,需要额外步骤)
ISO镜像不能直接转换为可启动的qcow2,需要先安装系统。
方法二:先安装后转换(推荐)
# 1. 创建虚拟磁盘
qemu-img create -f qcow2 /tmp/ubuntu.qcow2 20G
# 2. 使用QEMU安装系统(通过VNC访问)
qemu-system-x86_64 -enable-kvm -m 2048 \
-hda /tmp/ubuntu.qcow2 \
-cdrom /tmp/ubuntu-22.04.5-live-server-amd64.iso \
-boot d -vnc :0
# 3. 通过VNC客户端连接 192.168.1.66:5900 完成安装
# 4. 安装完成后关闭虚拟机
方法三:使用预制镜像(最快)
EVE-NG社区提供了预制的Ubuntu qcow2镜像,可以直接下载使用。
# 下载预制镜像(示例)
cd /opt/unetlab/addons/qemu
mkdir linux-ubuntu-22.04
cd linux-ubuntu-22.04
# 下载并解压(假设已有预制镜像)
wget http://example.com/ubuntu-22.04.qcow2
mv ubuntu-22.04.qcow2 virtioa.qcow2
4.3 镜像导入命令
4.3.1 创建镜像目录
EVE-NG的镜像存储路径规范:
/opt/unetlab/addons/qemu/<os-name>-<version>/
创建Ubuntu镜像目录:
# 创建目录
sudo mkdir -p /opt/unetlab/addons/qemu/linux-ubuntu-22.04
# 进入目录
cd /opt/unetlab/addons/qemu/linux-ubuntu-22.04
4.3.2 复制镜像文件
假设已经制作好了qcow2镜像(例如通过本地VMware/VirtualBox导出):
从本地上传到EVE-NG:
# 在本地计算机执行(使用scp)
scp ubuntu-22.04.qcow2 [email protected]:/opt/unetlab/addons/qemu/linux-ubuntu-22.04/
# 或使用SFTP
sftp [email protected]
put ubuntu-22.04.qcow2 /opt/unetlab/addons/qemu/linux-ubuntu-22.04/
在EVE-NG上重命名:
# 进入镜像目录
cd /opt/unetlab/addons/qemu/linux-ubuntu-22.04
# 重命名为virtioa.qcow2(EVE-NG默认识别名称)
mv ubuntu-22.04.qcow2 virtioa.qcow2
4.3.3 ISO转qcow2完整流程
如果从ISO开始,完整命令如下:
# 1. 确保qemu-img工具已安装
which qemu-img
# 2. 创建镜像目录
sudo mkdir -p /opt/unetlab/addons/qemu/linux-ubuntu-22.04
cd /opt/unetlab/addons/qemu/linux-ubuntu-22.04
# 3. 创建空白虚拟磁盘(20GB)
/opt/qemu/bin/qemu-img create -f qcow2 virtioa.qcow2 20G
# 4. 从ISO安装系统(需要VNC或控制台访问)
# 此步骤通常在EVE-NG Web界面中通过创建虚拟机完成
# 5. 或者使用现有的Ubuntu虚拟机导出
# 如果已在VMware中安装,可以导出vmdk后转换:
/opt/qemu/bin/qemu-img convert -f vmdk -O qcow2 \
ubuntu.vmdk virtioa.qcow2
转换进度监控:
# 查看转换进度(另开终端)
watch -n 1 ls -lh virtioa.qcow2
4.3.4 验证镜像文件
检查镜像信息:
# 查看镜像信息
/opt/qemu/bin/qemu-img info virtioa.qcow2
# 预期输出:
# image: virtioa.qcow2
# file format: qcow2
# virtual size: 20 GiB
# disk size: 2.5 GiB
# cluster_size: 65536
检查文件权限:
# 查看权限
ls -lh virtioa.qcow2
# 应该类似:
# -rw-r--r-- 1 root root 2.5G Mar 23 10:00 virtioa.qcow2
4.4 权限修复命令
4.4.1 为什么需要权限修复
EVE-NG使用特定的用户运行QEMU进程(通常是unl0用户),镜像文件必须具有正确的所有者和权限,否则虚拟机无法启动。
常见权限问题:
- 镜像文件所有者错误
- 目录权限不正确
- SELinux/AppArmor策略限制
4.4.2 执行权限修复
使用EVE-NG内置修复工具:
# 执行权限修复(推荐方法)
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
# 输出类似:
# Fixing permissions for /opt/unetlab/addons/qemu/
# Done!
手动修复权限:
# 修改镜像目录所有者
sudo chown -R unl0:unl0 /opt/unetlab/addons/qemu/linux-ubuntu-22.04
# 修改镜像文件权限
sudo chmod 644 /opt/unetlab/addons/qemu/linux-ubuntu-22.04/virtioa.qcow2
# 修改目录权限
sudo chmod 755 /opt/unetlab/addons/qemu/linux-ubuntu-22.04
4.4.3 验证权限修复
检查文件所有者和权限:
# 查看详细权限
ls -lh /opt/unetlab/addons/qemu/linux-ubuntu-22.04/
# 预期输出:
# total 2.5G
# -rw-r--r-- 1 unl0 unl0 2.5G Mar 23 10:00 virtioa.qcow2
测试虚拟机启动:
# 在EVE-NG Web界面创建测试节点
# 1. 创建新实验室(Lab)
# 2. 添加节点,选择 Linux-ubuntu-22.04
# 3. 启动节点,观察是否正常启动
4.5 虚拟机创建
4.5.1 通过Web界面创建
步骤:
1. 登录EVE-NG Web界面
2. 点击 "Add new lab"
3. 实验室名称:WireGuard-VPN-Lab
4. 版本:1.0
5. 描述:WireGuard VPN System
6. 点击 "Save"
7. 进入实验室界面
8. 右键空白区域 → "Add Node"
9. 节点类型:选择 "Linux"
10. 模板:选择 "Linux-ubuntu-22.04"
11. 节点数量:1
12. 名称:VPN-Server
13. 点击 "Save"
14. 配置节点硬件(右键节点 → Edit)
- CPU: 2 cores
- RAM: 2048 MB
- Ethernet: 1 interface
15. 点击 "Save"
4.5.2 网络连接配置
连接节点到网络:
1. 在实验室界面,找到左侧 "Networks"
2. 点击 "Add Network"
3. 类型:选择 "Cloud0"(连接到宿主机网络)
4. 点击 "Save"
5. 连接节点网卡到网络
- 将鼠标悬停在节点上
- 点击网卡图标(Ethernet)
- 拖拽连接到 Cloud0
6. 连接成功后显示绿线
网络类型说明:
- Cloud0-9:桥接到宿主机网络(推荐用于WireGuard服务器)
- NAT:NAT模式(用于隔离环境)
- Internal:内部网络(节点间互联)
4.5.3 启动虚拟机
启动节点:
1. 右键节点 → "Start"
2. 等待节点状态变为绿色(运行中)
3. 右键节点 → "Console" → "Console" (HTML5)
4. 打开控制台窗口
控制台访问选项:
- HTML5 Console:浏览器内直接访问(推荐)
- native Console:使用本地Terminal/PuTTY
- VNC:VNC客户端访问
4.5.4 虚拟机首次配置
在控制台中登录:
Ubuntu 22.04 LTS hostname tty1
hostname login: ubuntu
Password: ubuntu
# 首次登录可能需要修改密码
设置root密码:
# 设置root密码
sudo passwd root
# 切换到root用户
su - root
配置网络:
# 查看网卡名称
ip link show
# 假设网卡名称为 ens3
# 编辑网络配置
sudo nano /etc/netplan/00-installer-config.yaml
配置内容(使用DHCP):
network:
version: 2
ethernets:
ens3:
dhcp4: true
或配置静态IP:
network:
version: 2
ethernets:
ens3:
dhcp4: no
addresses:
- 192.168.1.66/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 223.5.5.5
- 114.114.114.114
应用配置:
sudo netplan apply
# 验证网络
ip addr show ens3
ping -c 4 8.8.8.8
更新系统:
sudo apt update
sudo apt upgrade -y
5. Ubuntu系统初始化
5.1 系统更新命令
5.1.1 更新软件源
更新包索引:
# 更新本地软件包索引
sudo apt update
# 预期输出:
# Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
# Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
# ...
# Reading package lists... Done
更换为国内镜像源(可选,提升下载速度):
# 备份原始源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
# 使用清华镜像源
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 或使用阿里云镜像源
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 更新索引
sudo apt update
5.1.2 升级系统软件包
升级已安装的软件包:
# 升级所有可更新的软件包
sudo apt upgrade -y
# 升级过程可能需要5-15分钟
升级系统(包括内核):
# 完整升级(可能升级内核和删除旧包)
sudo apt full-upgrade -y
# 清理旧的内核和依赖
sudo apt autoremove -y
sudo apt autoclean
检查是否需要重启:
# 检查是否需要重启
[ -f /var/run/reboot-required ] && echo "需要重启" || echo "不需要重启"
# 如果需要重启
sudo reboot
5.1.3 验证系统版本
查看系统信息:
# 查看发行版信息
lsb_release -a
# 预期输出:
# Distributor ID: Ubuntu
# Description: Ubuntu 22.04.5 LTS
# Release: 22.04
# Codename: jammy
# 查看内核版本
uname -r
# 预期:5.15.0-xx-generic 或更高版本
5.2 网络配置
5.2.1 查看网络接口
列出所有网络接口:
# 方法1:使用ip命令(推荐)
ip link show
# 方法2:使用ifconfig(需要安装net-tools)
ifconfig -a
# 方法3:查看网络配置文件
ls /sys/class/net/
查看IP地址:
# 查看所有接口的IP地址
ip addr show
# 查看特定接口
ip addr show pnet0
# 或使用简写
ip a
5.2.2 静态IP配置
Netplan配置方法(Ubuntu 18.04+):
# 查找网络配置文件
ls /etc/netplan/
# 通常是:00-installer-config.yaml 或 01-netcfg.yaml
编辑配置文件:
sudo nano /etc/netplan/00-installer-config.yaml
静态IP配置示例:
network:
version: 2
renderer: networkd
ethernets:
pnet0: # 替换为实际网卡名称
dhcp4: no
addresses:
- 192.168.1.66/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 223.5.5.5
- 114.114.114.114
search:
- local
应用配置:
# 测试配置语法
sudo netplan try
# 如果配置正确,会提示"Press ENTER before timeout"
# 按回车确认
# 或直接应用(跳过测试)
sudo netplan apply
# 验证配置
ip addr show pnet0
ip route show
⚠️ 注意:YAML格式对缩进敏感,必须使用空格(不能用Tab),每级缩进2个空格。
5.2.3 DHCP配置
DHCP自动获取IP:
network:
version: 2
ethernets:
pnet0:
dhcp4: true
dhcp6: false
应用:
sudo netplan apply
# 查看获取的IP
ip addr show pnet0
5.2.4 DNS配置
方法1:通过Netplan配置(推荐):
已在上述静态IP配置中包含:
nameservers:
addresses:
- 223.5.5.5
- 114.114.114.114
方法2:手动配置systemd-resolved:
# 编辑resolved配置
sudo nano /etc/systemd/resolved.conf
配置内容:
[Resolve]
DNS=223.5.5.5 114.114.114.114
FallbackDNS=8.8.8.8 1.1.1.1
Domains=~.
DNSSEC=no
重启服务:
sudo systemctl restart systemd-resolved
# 验证DNS
resolvectl status
测试DNS解析:
# 测试域名解析
nslookup www.baidu.com
# 或使用dig
dig www.google.com
# 或使用host
host www.github.com
5.3 必要工具安装
5.3.1 系统基础工具
安装常用工具:
# 一键安装基础工具包
sudo apt install -y \
wget curl vim nano \
net-tools iproute2 iputils-ping \
traceroute mtr-tiny \
htop iotop \
git unzip \
build-essential
工具说明:
wget/curl:下载工具vim/nano:文本编辑器net-tools:网络工具(ifconfig、netstat等)iproute2:高级网络工具(ip命令)iputils-ping:ping命令traceroute/mtr:路由跟踪htop/iotop:系统监控git:版本控制build-essential:编译工具链
5.3.2 网络诊断工具
安装网络分析工具:
sudo apt install -y \
tcpdump \
nmap \
netcat \
telnet \
dnsutils \
whois
工具用途:
tcpdump:抓包分析nmap:端口扫描netcat:网络调试telnet:远程连接测试dnsutils:DNS工具(dig、nslookup)whois:域名查询
使用示例:
# 抓取UDP 51820端口的包
sudo tcpdump -i any udp port 51820
# 扫描开放端口
nmap -p 1-65535 192.168.1.66
# 测试端口连通性
nc -zv 192.168.1.66 51820
# DNS查询
dig @223.5.5.5 www.baidu.com
5.3.3 Python环境
安装Python 3和pip:
# 安装Python 3(Ubuntu 22.04默认已安装Python 3.10)
sudo apt install -y python3 python3-pip python3-venv
# 验证安装
python3 --version
pip3 --version
升级pip:
# 升级pip到最新版本
sudo pip3 install --upgrade pip
# 或使用国内镜像加速
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
创建Python虚拟环境(可选):
# 创建虚拟环境
python3 -m venv /opt/vpn-env
# 激活虚拟环境
source /opt/vpn-env/bin/activate
# 在虚拟环境中安装依赖
pip install Flask==2.3.3
# 退出虚拟环境
deactivate
5.4 防火墙初始配置
5.4.1 UFW防火墙
Ubuntu默认使用UFW (Uncomplicated Firewall) 作为前端防火墙工具。
检查UFW状态:
# 查看UFW状态
sudo ufw status
# 如果显示 "inactive",表示未启用
启用UFW:
# 启用防火墙(注意:会断开当前SSH连接!)
sudo ufw enable
# 安全的启用方法:先允许SSH
sudo ufw allow 22/tcp
sudo ufw enable
5.4.2 开放必要端口
开放WireGuard和管理端口:
# 允许SSH(如果还没允许)
sudo ufw allow 22/tcp
# 允许WireGuard VPN端口
sudo ufw allow 51820/udp
# 允许Web管理界面(仅内网,可选)
sudo ufw allow from 192.168.1.0/24 to any port 8000
# 允许Flask API(仅本地,可选)
# sudo ufw allow from 127.0.0.1 to any port 5000
# 查看规则
sudo ufw status numbered
预期输出:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
51820/udp ALLOW Anywhere
8000 ALLOW 192.168.1.0/24
5.4.3 UFW常用命令
管理防火墙规则:
# 查看详细状态
sudo ufw status verbose
# 删除规则(按编号)
sudo ufw status numbered
sudo ufw delete 3
# 删除规则(按规则内容)
sudo ufw delete allow 8000/tcp
# 禁用防火墙
sudo ufw disable
# 重置防火墙(删除所有规则)
sudo ufw reset
高级规则示例:
# 仅允许特定IP访问SSH
sudo ufw allow from 192.168.1.100 to any port 22
# 限制连接速率(防暴力破解)
sudo ufw limit 22/tcp
# 拒绝特定IP
sudo ufw deny from 1.2.3.4
# 允许出站流量(默认策略)
sudo ufw default allow outgoing
# 拒绝入站流量(默认策略)
sudo ufw default deny incoming
5.5 系统参数调整
5.5.1 内核参数优化
编辑sysctl配置:
sudo nano /etc/sysctl.conf
添加以下优化参数:
# IP转发(VPN必需)
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# TCP性能优化
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.netdev_max_backlog = 5000
# 连接跟踪优化
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
# 安全加固
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
应用配置:
# 立即生效
sudo sysctl -p
# 验证配置
sysctl net.ipv4.ip_forward
预期输出:
net.ipv4.ip_forward = 1
5.5.2 文件描述符限制
查看当前限制:
# 查看当前限制
ulimit -n
# 查看所有限制
ulimit -a
提高限制(永久生效):
# 编辑limits配置
sudo nano /etc/security/limits.conf
添加以下内容:
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
对于systemd服务:
# 编辑systemd全局配置
sudo nano /etc/systemd/system.conf
取消注释并修改:
DefaultLimitNOFILE=65536
重启系统使配置生效:
sudo reboot
5.5.3 系统时间同步
安装NTP服务:
# Ubuntu 22.04默认使用systemd-timesyncd
sudo apt install -y systemd-timesyncd
# 启用时间同步
sudo systemctl enable systemd-timesyncd
sudo systemctl start systemd-timesyncd
配置NTP服务器:
# 编辑配置文件
sudo nano /etc/systemd/timesyncd.conf
配置内容:
[Time]
NTP=ntp.aliyun.com ntp.tencent.com
FallbackNTP=time.cloudflare.com
验证时间同步:
# 查看时间同步状态
timedatectl status
# 预期输出包含:
# System clock synchronized: yes
# NTP service: active
手动设置时区:
# 列出可用时区
timedatectl list-timezones | grep Shanghai
# 设置时区为上海
sudo timedatectl set-timezone Asia/Shanghai
# 验证
date
6. WireGuard安装与配置
6.1 安装步骤
6.1.1 检查内核版本
WireGuard在Linux Kernel 5.6+版本已经集成到主线内核,无需额外安装内核模块。
检查内核版本:
# 查看内核版本
uname -r
# 预期输出(Ubuntu 22.04):
# 5.15.0-xx-generic 或更高
如果内核版本低于5.6:
# 需要安装DKMS模块(动态内核模块支持)
sudo apt install -y linux-headers-$(uname -r) wireguard-dkms
6.1.2 安装WireGuard
Ubuntu 20.04+(推荐方法):
# 更新软件包索引
sudo apt update
# 安装WireGuard及工具
sudo apt install -y wireguard wireguard-tools
# 安装过程输出:
# Reading package lists... Done
# Building dependency tree... Done
# ...
# Setting up wireguard (1.0.20210914-1ubuntu2) ...
验证安装:
# 检查WireGuard版本
wg --version
# 预期输出:
# wireguard-tools v1.0.20210914
# 检查内核模块
lsmod | grep wireguard
# 预期输出(如果内核5.6+可能为空,因为已集成):
# wireguard xyz 0
6.1.3 安装依赖工具
安装必要的网络工具:
# iptables(通常已安装)
sudo apt install -y iptables
# resolvconf(DNS管理,可选)
sudo apt install -y openresolv
# qrencode(生成二维码,可选)
sudo apt install -y qrencode
验证iptables:
# 查看iptables版本
iptables --version
# 预期输出:
# iptables v1.8.7 (nf_tables)
6.2 密钥生成命令
6.2.1 密钥对概念
WireGuard使用Curve25519椭圆曲线算法进行密钥交换,每个节点(服务器或客户端)都需要生成一对密钥:
- 私钥(Private Key):保存在本地,绝对不能泄露
- 公钥(Public Key):从私钥派生,用于与对方节点配置
密钥特性:
- 密钥长度:32字节(256位)
- 编码方式:Base64编码
- 私钥示例:
8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ= - 公钥示例:
rUEB9pR7DO7qgkbo6Ylerrh/Fvl1XA8RJuALBdlkFkk=
6.2.2 生成服务器密钥对
创建密钥存储目录:
# 创建WireGuard配置目录(通常已存在)
sudo mkdir -p /etc/wireguard
# 设置目录权限(仅root可访问)
sudo chmod 700 /etc/wireguard
生成服务器私钥:
# 生成私钥并保存到文件
wg genkey | sudo tee /etc/wireguard/server_private.key
# 输出示例(这是你的服务器私钥):
# 8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=
从私钥生成公钥:
# 从私钥派生公钥
sudo cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
# 输出示例(这是你的服务器公钥):
# rUEB9pR7DO7qgkbo6Ylerrh/Fvl1XA8RJuALBdlkFkk=
设置文件权限(关键步骤):
# 私钥必须设置为600(仅所有者可读写)
sudo chmod 600 /etc/wireguard/server_private.key
# 公钥可以设置为644(所有者可读写,其他人只读)
sudo chmod 644 /etc/wireguard/server_public.key
# 验证权限
ls -l /etc/wireguard/
# 预期输出:
# -rw------- 1 root root 45 Mar 23 10:00 server_private.key
# -rw-r--r-- 1 root root 45 Mar 23 10:00 server_public.key
⚠️ 安全警告:私钥权限必须是600,否则WireGuard会拒绝启动!
6.2.3 生成客户端密钥对
生成客户端私钥:
# 生成客户端私钥
wg genkey | sudo tee /etc/wireguard/client_private.key
# 输出示例:
# eKX7A+ZxHanItaMVdEIwB3ENUZpQhX0VdPCL1CCWCmE=
生成客户端公钥:
# 从私钥派生公钥
sudo cat /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key
# 输出示例:
# QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
设置权限:
sudo chmod 600 /etc/wireguard/client_private.key
sudo chmod 644 /etc/wireguard/client_public.key
6.2.4 密钥管理最佳实践
一键生成脚本(推荐):
# 创建密钥生成脚本
sudo nano /usr/local/bin/wg-keygen.sh
脚本内容:
#!/bin/bash
# WireGuard密钥生成脚本
if [ $# -eq 0 ]; then
echo "用法: $0 <密钥对名称>"
echo "示例: $0 server 或 $0 client1"
exit 1
fi
NAME=$1
KEY_DIR="/etc/wireguard/keys"
# 创建密钥目录
mkdir -p $KEY_DIR
chmod 700 $KEY_DIR
# 生成私钥
wg genkey | tee $KEY_DIR/${NAME}_private.key | wg pubkey > $KEY_DIR/${NAME}_public.key
# 设置权限
chmod 600 $KEY_DIR/${NAME}_private.key
chmod 644 $KEY_DIR/${NAME}_public.key
echo "✓ 密钥对生成成功:"
echo " 私钥: $KEY_DIR/${NAME}_private.key"
echo " 公钥: $KEY_DIR/${NAME}_public.key"
echo ""
echo "私钥内容:"
cat $KEY_DIR/${NAME}_private.key
echo ""
echo "公钥内容:"
cat $KEY_DIR/${NAME}_public.key
使用方法:
# 添加执行权限
sudo chmod +x /usr/local/bin/wg-keygen.sh
# 生成服务器密钥对
sudo wg-keygen.sh server
# 生成客户端密钥对
sudo wg-keygen.sh client1
sudo wg-keygen.sh client2
密钥备份:
# 备份所有密钥到安全位置
sudo tar -czf /root/wireguard-keys-backup-$(date +%Y%m%d).tar.gz /etc/wireguard/*.key
# 验证备份
tar -tzf /root/wireguard-keys-backup-*.tar.gz
6.3 配置文件编写(/etc/wireguard/wg0.conf)
6.3.1 配置文件结构
WireGuard配置文件采用INI格式,包含两个主要部分:
[Interface]:本地接口配置(服务器自身)[Peer]:对端节点配置(客户端信息)
配置文件位置:
/etc/wireguard/wg0.conf
其中wg0是接口名称,可以自定义(如wg1、wg-vpn等)。
6.3.2 创建服务器配置文件
编辑配置文件:
sudo nano /etc/wireguard/wg0.conf
基本配置内容:
[Interface]
# 服务器私钥
PrivateKey = 8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=
# VPN隧道内的服务器IP地址
Address = 10.8.0.1/24
# UDP监听端口
ListenPort = 51820
# 隧道启动后执行的命令(配置iptables规则)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
# 隧道关闭前执行的命令(清理iptables规则)
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
[Peer]
# 客户端公钥
PublicKey = QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
# 允许该客户端使用的IP地址(严格限制为单个IP)
AllowedIPs = 10.8.0.2/32
设置配置文件权限:
# 配置文件必须设置为600
sudo chmod 600 /etc/wireguard/wg0.conf
# 验证权限
ls -l /etc/wireguard/wg0.conf
# 预期:-rw------- 1 root root xxx Mar 23 10:00 wg0.conf
6.4 接口参数详解
6.4.1 [Interface] 部分参数
PrivateKey(必需)
PrivateKey = 服务器私钥内容
- 说明:服务器的私钥,用于加密和身份验证
- 格式:32字节Base64编码字符串
- 获取:通过
wg genkey生成 - 安全:绝对不能泄露,不能共享
Address(必需)
Address = 10.8.0.1/24
- 说明:VPN隧道内的虚拟IP地址
- 格式:IP地址/CIDR前缀
- 示例:
10.8.0.1/24- 服务器地址,可管理10.8.0.0/24整个网段10.8.0.1/32- 单个IP(不推荐服务器使用)
- 注意:必须与客户端的Address在同一子网
ListenPort(必需)
ListenPort = 51820
- 说明:UDP监听端口
- 默认:51820
- 范围:1-65535
- 建议:
- 生产环境可改为非默认端口(如41194)
- 必须在防火墙开放此UDP端口
- 避免与其他服务冲突
PostUp(可选但推荐)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
- 说明:隧道启动后自动执行的命令
- 用途:配置防火墙规则、路由规则
- 格式:多个命令用分号
;分隔 - 示例:
# 单行格式
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
# 多行格式(更清晰)
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
- 占位符:
%i- 接口名称(wg0)
PostDown(可选但推荐)
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
- 说明:隧道关闭前自动执行的命令
- 用途:清理防火墙规则
- 注意:通常与PostUp对应,将
-A(添加)改为-D(删除)
MTU(可选)
MTU = 1420
- 说明:最大传输单元
- 默认:自动检测(通常1420或1412)
- 推荐值:
- PPPoE网络:1412
- 标准以太网:1420
- 光纤网络:1500(较少使用)
- 作用:避免数据包分片,提升性能
DNS(可选,仅客户端需要)
# 服务器端不需要配置此项
Table(可选,高级用途)
Table = off
- 说明:是否自动配置路由表
- 默认:auto(自动配置)
- 可选值:
auto- 自动配置路由off- 不配置路由(需手动配置)数字- 指定路由表编号
6.4.2 完整[Interface]配置示例
生产环境推荐配置:
[Interface]
PrivateKey = 8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=
Address = 10.8.0.1/24
ListenPort = 51820
MTU = 1420
# 启动时配置防火墙
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
PostUp = iptables -A INPUT -p udp --dport 51820 -j ACCEPT
# 关闭时清理防火墙
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
PostDown = iptables -D INPUT -p udp --dport 51820 -j ACCEPT
# 保存iptables规则(可选)
PostUp = iptables-save > /etc/iptables/rules.v4
6.5 Peer配置详解
6.5.1 [Peer] 部分参数
PublicKey(必需)
PublicKey = QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
- 说明:客户端的公钥
- 格式:32字节Base64编码字符串
- 获取:从客户端的私钥派生
- 作用:识别和验证客户端身份
AllowedIPs(必需)
AllowedIPs = 10.8.0.2/32
- 说明:允许该客户端使用的IP地址范围
- 格式:IP地址/CIDR前缀
- 用途:
- 访问控制:只有在此范围内的IP才被接受
- 路由控制:决定哪些流量走该Peer
- 示例:
# 单个IP(推荐)
AllowedIPs = 10.8.0.2/32
# 多个IP或网段(逗号分隔)
AllowedIPs = 10.8.0.2/32, 192.168.2.0/24
# 全部流量(不推荐服务器端使用)
AllowedIPs = 0.0.0.0/0
Endpoint(可选,服务器端通常不需要)
# 服务器端通常不配置Endpoint
# 客户端会主动连接服务器
- 说明:对端的公网地址和端口
- 格式:
IP:端口或域名:端口 - 使用场景:
- 客户端配置(指向服务器)
- 站点到站点VPN(双向)
PersistentKeepalive(可选)
# 服务器端通常不需要
- 说明:保活间隔(秒)
- 默认:0(禁用)
- 推荐值:25
- 作用:穿透NAT,保持连接活跃
- 使用场景:客户端在NAT后时配置
PresharedKey(可选,高级安全)
PresharedKey = <预共享密钥>
- 说明:额外的对称密钥(抗量子计算)
- 生成:
wg genpsk - 用途:增加安全性,防御量子计算攻击
- 注意:服务器和客户端必须配置相同的PSK
6.5.2 单客户端配置
服务器端配置:
[Peer]
# 客户端1的公钥
PublicKey = QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
# 分配给客户端1的IP(严格限制)
AllowedIPs = 10.8.0.2/32
6.5.3 多客户端配置
添加多个客户端(在同一配置文件):
[Interface]
PrivateKey = 8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=
Address = 10.8.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
# 客户端1
[Peer]
PublicKey = QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
AllowedIPs = 10.8.0.2/32
# 客户端2
[Peer]
PublicKey = Bx8yN3kL9mP2qR5sT7uV4wX6yZ8aB1cD3eF5gH7iJ9k=
AllowedIPs = 10.8.0.3/32
# 客户端3
[Peer]
PublicKey = C9d0E1f2G3h4I5j6K7l8M9n0O1p2Q3r4S5t6U7v8W9x=
AllowedIPs = 10.8.0.4/32
注意事项:
- 每个客户端必须有唯一的公钥
- 每个客户端必须分配唯一的IP地址
- AllowedIPs不能重叠
6.6 完整配置文件示例
6.6.1 服务器配置(单客户端)
文件:/etc/wireguard/wg0.conf
# ====================================
# WireGuard服务器配置文件
# 接口名称:wg0
# 服务器IP:10.8.0.1/24
# 监听端口:UDP 51820
# ====================================
[Interface]
# 服务器私钥(保密!)
PrivateKey = 8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=
# VPN隧道内的服务器地址
Address = 10.8.0.1/24
# UDP监听端口
ListenPort = 51820
# MTU设置(避免分片)
MTU = 1420
# 启动后执行:开启IP转发和NAT
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
# 关闭前执行:清理防火墙规则
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
# ====================================
# 客户端配置
# ====================================
[Peer]
# Windows客户端公钥
PublicKey = QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
# 分配给该客户端的IP(单个地址)
AllowedIPs = 10.8.0.2/32
6.6.2 服务器配置(多客户端)
文件:/etc/wireguard/wg0.conf
[Interface]
PrivateKey = 8Phv4OQlc88y4o8v0dSPr9loJudYDxqvnzIkK6SnWkQ=
Address = 10.8.0.1/24
ListenPort = 51820
MTU = 1420
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
# 客户端1:Windows工作站
[Peer]
PublicKey = QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
AllowedIPs = 10.8.0.2/32
# 客户端2:MacBook
[Peer]
PublicKey = A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V=
AllowedIPs = 10.8.0.3/32
# 客户端3:iPhone
[Peer]
PublicKey = Z9Y8X7W6V5U4T3S2R1Q0P9O8N7M6L5K4J3I2H1G0F9E=
AllowedIPs = 10.8.0.4/32
# 客户端4:远程服务器(站点互联)
[Peer]
PublicKey = F8E7D6C5B4A3Z2Y1X0W9V8U7T6S5R4Q3P2O1N0M9L8K=
AllowedIPs = 10.8.0.10/32, 192.168.100.0/24
6.6.3 配置文件验证
语法检查:
# 检查配置文件语法(尝试加载)
sudo wg-quick strip wg0
# 如果没有输出错误,表示语法正确
查看配置内容:
# 查看完整配置
sudo cat /etc/wireguard/wg0.conf
# 或使用wg命令(隧道启动后)
sudo wg show wg0
7. 系统参数配置
7.1 IP转发开启
7.1.1 为什么需要IP转发
IP转发(IP Forwarding)允许Linux系统作为路由器,转发不同网络接口之间的数据包。对于VPN服务器来说,必须开启IP转发才能:
- 将VPN客户端的流量转发到内网
- 将内网的响应转发回VPN客户端
- 实现NAT(网络地址转换)功能
数据流向示例:
VPN客户端(10.8.0.2) → wg0接口 → [IP转发] → pnet0接口 → 内网服务(192.168.1.x)
7.1.2 临时开启IP转发
立即生效(重启后失效):
# 开启IPv4转发
sudo sysctl -w net.ipv4.ip_forward=1
# 开启IPv6转发(可选)
sudo sysctl -w net.ipv6.conf.all.forwarding=1
# 验证设置
sysctl net.ipv4.ip_forward
# 预期输出:
# net.ipv4.ip_forward = 1
或使用echo方式:
# 写入proc文件系统
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# 验证
cat /proc/sys/net/ipv4/ip_forward
# 输出:1
7.1.3 永久开启IP转发
方法1:修改sysctl.conf(推荐)
# 编辑系统配置文件
sudo nano /etc/sysctl.conf
找到并取消注释以下行(或直接添加):
# IP转发
net.ipv4.ip_forward=1
# IPv6转发(可选)
net.ipv6.conf.all.forwarding=1
应用配置:
# 立即生效
sudo sysctl -p
# 或重新加载所有sysctl配置
sudo sysctl --system
方法2:创建独立配置文件(更清晰)
# 创建WireGuard专用配置
sudo nano /etc/sysctl.d/99-wireguard.conf
内容:
# WireGuard VPN IP转发配置
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
应用:
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf
验证持久化:
# 重启系统后验证
sudo reboot
# 重启后检查
sysctl net.ipv4.ip_forward
# 应该输出:1
7.1.4 通过PostUp自动开启(备用方法)
也可以在WireGuard配置文件中通过PostUp开启:
[Interface]
...
PostUp = sysctl -w net.ipv4.ip_forward=1
但推荐使用sysctl.conf永久配置,PostUp方式仅作为补充。
7.2 iptables规则配置
7.2.1 iptables基础概念
iptables链(Chain):
INPUT:处理进入本机的数据包FORWARD:处理转发的数据包(VPN需要)OUTPUT:处理本机发出的数据包
iptables表(Table):
filter:默认表,用于过滤(允许/拒绝)nat:NAT地址转换表mangle:修改数据包(高级用途)
VPN所需规则:
- FORWARD链:允许wg0接口的转发
- nat表:MASQUERADE源地址转换
7.2.2 查看当前iptables规则
查看filter表规则:
# 查看所有链的规则
sudo iptables -L -v -n
# 查看FORWARD链
sudo iptables -L FORWARD -v -n
# 输出示例:
# Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
# pkts bytes target prot opt in out source destination
查看nat表规则:
# 查看nat表
sudo iptables -t nat -L -v -n
# 查看POSTROUTING链
sudo iptables -t nat -L POSTROUTING -v -n
以行号显示:
sudo iptables -L --line-numbers
7.2.3 手动添加iptables规则
允许wg0接口转发:
# 允许从wg0接口进入的数据包转发
sudo iptables -A FORWARD -i wg0 -j ACCEPT
# 允许转发到wg0接口的数据包
sudo iptables -A FORWARD -o wg0 -j ACCEPT
配置NAT(MASQUERADE):
# 对从pnet0出去的数据包进行源地址转换
sudo iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
允许已建立的连接:
# 允许已建立和相关的连接
sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
完整手动配置示例:
# 1. 允许wg0转发
sudo iptables -A FORWARD -i wg0 -j ACCEPT
# 2. 配置NAT
sudo iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
# 3. 允许已建立的连接
sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 4. 验证规则
sudo iptables -L FORWARD -v -n
sudo iptables -t nat -L POSTROUTING -v -n
7.2.4 删除iptables规则
按规则内容删除:
# 删除FORWARD规则
sudo iptables -D FORWARD -i wg0 -j ACCEPT
# 删除NAT规则
sudo iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
按行号删除:
# 查看行号
sudo iptables -L FORWARD --line-numbers
# 删除第3行规则
sudo iptables -D FORWARD 3
清空所有规则(危险!):
# 清空filter表
sudo iptables -F
# 清空nat表
sudo iptables -t nat -F
# 重置所有链的策略
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
⚠️ 警告:清空规则可能导致网络中断,谨慎操作!
7.3 PostUp脚本详解
7.3.1 PostUp工作原理
PostUp是WireGuard配置文件中的钩子(Hook),在接口启动后自动执行指定的命令。
执行时机:
wg-quick up wg0
↓
创建wg0接口
↓
配置IP地址
↓
执行PostUp命令 ← 在这里执行
↓
接口启动完成
常见用途:
- 配置iptables防火墙规则
- 添加路由规则
- 开启IP转发
- 启动相关服务
7.3.2 基础PostUp配置
单个命令:
[Interface]
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
多个命令(分号分隔):
[Interface]
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
多行PostUp(更清晰):
[Interface]
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
PostUp = sysctl -w net.ipv4.ip_forward=1
7.3.3 PostUp常用命令
防火墙配置:
# 允许转发
PostUp = iptables -A FORWARD -i %i -j ACCEPT
# NAT配置
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
# 限制特定网段
PostUp = iptables -A FORWARD -i %i -s 10.8.0.0/24 -j ACCEPT
# 端口转发(高级)
PostUp = iptables -t nat -A PREROUTING -i pnet0 -p tcp --dport 80 -j DNAT --to-destination 10.8.0.2:80
系统参数配置:
# 开启IP转发
PostUp = sysctl -w net.ipv4.ip_forward=1
# 禁用ICMP重定向
PostUp = sysctl -w net.ipv4.conf.all.send_redirects=0
路由配置:
# 添加静态路由
PostUp = ip route add 192.168.100.0/24 via 10.8.0.2
# 修改默认路由
PostUp = ip route add default via 10.8.0.1 dev %i table 200
脚本执行:
# 执行自定义脚本
PostUp = /usr/local/bin/wg-up.sh
# 带参数的脚本
PostUp = /usr/local/bin/notify.sh "VPN started"
7.3.4 PostUp占位符
%i - 接口名称:
# %i 会被替换为实际接口名(wg0)
PostUp = iptables -A FORWARD -i %i -j ACCEPT
# 等效于:
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
好处:如果接口名改变,不需要修改规则。
7.3.5 PostUp错误处理
检查PostUp执行结果:
# 启动接口并查看详细输出
sudo wg-quick up wg0
# 如果PostUp命令失败,会显示错误信息
调试PostUp:
# 手动执行PostUp命令测试
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
# 查看是否成功
echo $? # 返回0表示成功
容错处理:
# 使用 || true 忽略错误(不推荐)
PostUp = iptables -A FORWARD -i %i -j ACCEPT || true
# 或检查规则是否已存在
PostUp = iptables -C FORWARD -i %i -j ACCEPT 2>/dev/null || iptables -A FORWARD -i %i -j ACCEPT
7.4 PostDown脚本详解
7.4.1 PostDown工作原理
PostDown是在接口关闭前执行的钩子,通常用于清理PostUp创建的规则。
执行时机:
wg-quick down wg0
↓
执行PostDown命令 ← 在这里执行
↓
删除IP地址
↓
删除wg0接口
↓
接口关闭完成
7.4.2 PostDown与PostUp对应
基本原则:PostDown应该撤销PostUp的操作。
对应关系:
[Interface]
# PostUp添加规则(-A = Add)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
# PostDown删除规则(-D = Delete)
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
完整对应示例:
[Interface]
# 启动:添加转发规则
PostUp = iptables -A FORWARD -i %i -j ACCEPT
# 关闭:删除转发规则
PostDown = iptables -D FORWARD -i %i -j ACCEPT
# 启动:添加NAT规则
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
# 关闭:删除NAT规则
PostDown = iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
7.4.3 PostDown常见错误
问题1:规则不存在导致删除失败
# 如果规则不存在,-D会报错
iptables: Bad rule (does a matching rule exist in that chain?)
解决方案:
# 方法1:忽略错误(不推荐)
PostDown = iptables -D FORWARD -i %i -j ACCEPT 2>/dev/null || true
# 方法2:检查后删除
PostDown = iptables -C FORWARD -i %i -j ACCEPT 2>/dev/null && iptables -D FORWARD -i %i -j ACCEPT || true
问题2:PostUp失败但PostDown仍执行
如果PostUp失败,某些规则可能没有添加,但PostDown仍会尝试删除,导致错误。
**解决方案:**使用容错的PostDown命令(如上所示)。
7.4.4 PostDown高级用法
清理路由:
PostUp = ip route add 192.168.100.0/24 via 10.8.0.2
PostDown = ip route del 192.168.100.0/24 via 10.8.0.2 2>/dev/null || true
恢复系统参数:
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0
执行清理脚本:
PostDown = /usr/local/bin/wg-down.sh
7.5 NAT配置命令
7.5.1 NAT概念
NAT(Network Address Translation,网络地址转换)允许多个内网设备共享一个公网IP地址。
MASQUERADE类型:
- 动态SNAT(Source NAT)
- 自动使用出口网卡的IP作为源地址
- 适用于动态IP环境
工作原理:
VPN客户端 10.8.0.2 → 访问 192.168.1.100
↓
经过服务器NAT处理
↓
源地址 10.8.0.2 被替换为 192.168.1.66
↓
192.168.1.100 看到的请求来自 192.168.1.66
↓
响应返回到 192.168.1.66
↓
NAT反向转换,转发给 10.8.0.2
7.5.2 MASQUERADE配置
基本命令:
# 对从pnet0出去的流量进行MASQUERADE
sudo iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
参数说明:
-t nat:指定nat表-A POSTROUTING:添加到POSTROUTING链-o pnet0:匹配从pnet0出去的数据包-j MASQUERADE:动作为MASQUERADE
指定源网段:
# 仅对VPN网段进行NAT
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o pnet0 -j MASQUERADE
指定目标网段:
# 仅访问内网时进行NAT
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.1.0/24 -o pnet0 -j MASQUERADE
7.5.3 SNAT配置(固定IP)
如果服务器有固定公网IP,可以使用SNAT代替MASQUERADE(性能更好):
# 使用固定IP进行SNAT
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o pnet0 -j SNAT --to-source 192.168.1.66
MASQUERADE vs SNAT:
| 特性 | MASQUERADE | SNAT |
|---|---|---|
| IP类型 | 动态IP | 固定IP |
| 性能 | 略低(需查询IP) | 略高 |
| 适用场景 | DHCP环境 | 静态IP环境 |
7.5.4 端口转发(DNAT)
将外部请求转发到VPN客户端:
# 将访问服务器80端口的请求转发到VPN客户端
sudo iptables -t nat -A PREROUTING -i pnet0 -p tcp --dport 80 -j DNAT --to-destination 10.8.0.2:80
# 同时需要允许转发
sudo iptables -A FORWARD -p tcp -d 10.8.0.2 --dport 80 -j ACCEPT
应用示例:通过VPN访问内网Web服务
# 外部访问 192.168.1.66:8080 → 转发到 10.8.0.2:80
sudo iptables -t nat -A PREROUTING -i pnet0 -p tcp --dport 8080 -j DNAT --to-destination 10.8.0.2:80
sudo iptables -t nat -A POSTROUTING -d 10.8.0.2 -p tcp --dport 80 -j MASQUERADE
sudo iptables -A FORWARD -p tcp -d 10.8.0.2 --dport 80 -j ACCEPT
7.5.5 NAT规则持久化
问题:手动添加的iptables规则在重启后丢失。
解决方案1:使用PostUp/PostDown
[Interface]
PostUp = iptables -t nat -A POSTROUTING -o pnet0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
解决方案2:使用iptables-persistent
# 安装iptables-persistent
sudo apt install -y iptables-persistent
# 保存当前规则
sudo netfilter-persistent save
# 或手动保存
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
# 恢复规则
sudo iptables-restore < /etc/iptables/rules.v4
解决方案3:使用UFW(简化管理)
# UFW会自动持久化规则
sudo ufw route allow in on wg0 out on pnet0
# 但UFW不支持MASQUERADE,仍需手动配置
8. 服务启动与管理
8.1 手动启动命令
8.1.1 使用wg-quick启动
启动WireGuard接口:
# 启动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
启动其他接口:
# 如果有多个配置文件(wg1.conf, wg2.conf)
sudo wg-quick up wg1
sudo wg-quick up wg2
8.1.2 检查启动状态
查看接口状态:
# 方法1:使用wg命令
sudo wg show
# 预期输出:
# interface: wg0
# public key: rUEB9pR7DO7qgkbo6Ylerrh/Fvl1XA8RJuALBdlkFkk=
# private key: (hidden)
# listening port: 51820
#
# peer: QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4=
# allowed ips: 10.8.0.2/32
方法2:查看接口详细信息
sudo wg show wg0
# 详细输出包括:
# - 接口配置
# - 对端信息
# - 最后握手时间
# - 传输数据统计
方法3:使用ip命令
# 查看网络接口
ip link show wg0
# 输出:
# 4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 ...
# 查看IP地址
ip addr show wg0
# 输出:
# 4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> ...
# inet 10.8.0.1/24 scope global wg0
8.1.3 查看连接统计
查看传输数据量:
sudo wg show wg0 transfer
# 输出示例:
# QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= 5.16 MiB received, 8.92 MiB sent
查看最后握手时间:
sudo wg show wg0 latest-handshakes
# 输出示例(Unix时间戳):
# QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= 1711173845
查看所有Peer的端点:
sudo wg show wg0 endpoints
# 输出示例:
# QcDIGh0MyyLJoovsb7hMccZGwMha7aqfa/3cyFtfhE4= 192.168.1.100:54321
8.2 停止服务命令
8.2.1 使用wg-quick停止
停止WireGuard接口:
# 停止wg0接口
sudo wg-quick down wg0
# 预期输出:
# [#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
# [#] ip link delete dev wg0
停止所有接口:
# 如果有多个接口
sudo wg-quick down wg0
sudo wg-quick down wg1
sudo wg-quick down wg2
8.2.2 强制删除接口
如果wg-quick down失败:
# 直接删除网络接口
sudo ip link delete dev wg0
# 手动清理iptables规则
sudo iptables -D FORWARD -i wg0 -j ACCEPT
sudo iptables -t nat -D POSTROUTING -o pnet0 -j MASQUERADE
8.3 重启服务方法
8.3.1 重启WireGuard接口
方法1:先停止再启动
sudo wg-quick down wg0
sudo wg-quick up wg0
方法2:使用一行命令
sudo wg-quick down wg0 && sudo wg-quick up wg0
方法3:创建重启函数(便捷)
# 添加到 ~/.bashrc 或 /etc/profile
alias wg-restart='sudo wg-quick down wg0 && sudo wg-quick up wg0'
# 使用
wg-restart
8.3.2 重载配置(不断开连接)
使用wg syncconf(推荐):
# 重载配置而不中断连接
sudo wg syncconf wg0 <(wg-quick strip wg0)
# 说明:
# - wg-quick strip wg0:处理配置文件,去除PostUp/PostDown
# - wg syncconf:应用新配置,保持现有连接
应用场景:
- 添加新的Peer
- 修改Peer的AllowedIPs
- 不想断开现有连接
限制:
- 不能修改接口IP、监听端口等核心配置
- 不会执行PostUp/PostDown
- 修改核心配置仍需重启接口
8.4 开机自启配置
8.4.1 使用systemd启用自启动
启用WireGuard服务:
# 启用wg0接口开机自启
sudo systemctl enable wg-quick@wg0
# 预期输出:
# Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected].
启用多个接口:
sudo systemctl enable wg-quick@wg0
sudo systemctl enable wg-quick@wg1
sudo systemctl enable wg-quick@wg2
验证自启动状态:
# 查看服务状态
sudo systemctl is-enabled wg-quick@wg0
# 输出:enabled
8.4.2 禁用自启动
禁用WireGuard自启动:
sudo systemctl disable wg-quick@wg0
# 输出:
# Removed /etc/systemd/system/multi-user.target.wants/[email protected].
8.4.3 使用systemd管理服务
启动服务(等同于wg-quick up):
sudo systemctl start wg-quick@wg0
停止服务(等同于wg-quick down):
sudo systemctl stop wg-quick@wg0
重启服务:
sudo systemctl restart wg-quick@wg0
查看服务状态:
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 Sat 2025-03-23 10:00:00 CST; 1h 23min ago
# Docs: man:wg-quick(8)
# man:wg(8)
# Process: 1234 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
# Main PID: 1234 (code=exited, status=0/SUCCESS)
查看服务日志:
# 查看最近日志
sudo journalctl -u wg-quick@wg0
# 实时跟踪日志
sudo journalctl -u wg-quick@wg0 -f
# 查看今天的日志
sudo journalctl -u wg-quick@wg0 --since today
# 查看最近100行
sudo journalctl -u wg-quick@wg0 -n 100
8.4.4 验证开机自启动
测试方法:
# 1. 启用自启动
sudo systemctl enable wg-quick@wg0
# 2. 重启系统
sudo reboot
# 3. 重启后登录,检查服务状态
sudo systemctl status wg-quick@wg0
# 4. 检查接口是否启动
ip link show wg0
sudo wg show