vpn
Scannednpx machina-cli add skill chaterm/terminal-skills/vpn --openclawFiles (1)
SKILL.md
6.8 KB
VPN 配置与管理
概述
OpenVPN、WireGuard、IPSec VPN 配置与管理技能。
WireGuard
安装
# Debian/Ubuntu
apt install wireguard
# CentOS/RHEL
yum install epel-release elrepo-release
yum install kmod-wireguard wireguard-tools
# 验证安装
wg --version
生成密钥
# 生成私钥
wg genkey > privatekey
# 从私钥生成公钥
wg pubkey < privatekey > publickey
# 一步生成
wg genkey | tee privatekey | wg pubkey > publickey
# 生成预共享密钥(可选,增强安全)
wg genpsk > presharedkey
服务端配置
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <server_private_key>
# 启用 IP 转发
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.0.0.2/32
客户端配置
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.2/24
PrivateKey = <client_private_key>
DNS = 8.8.8.8
[Peer]
PublicKey = <server_public_key>
Endpoint = server.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
管理命令
# 启动
wg-quick up wg0
systemctl start wg-quick@wg0
# 停止
wg-quick down wg0
systemctl stop wg-quick@wg0
# 开机启动
systemctl enable wg-quick@wg0
# 查看状态
wg show
wg show wg0
# 添加 peer
wg set wg0 peer <public_key> allowed-ips 10.0.0.3/32
OpenVPN
安装
# Debian/Ubuntu
apt install openvpn easy-rsa
# CentOS/RHEL
yum install epel-release
yum install openvpn easy-rsa
初始化 PKI
# 创建 CA 目录
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
# 初始化 PKI
./easyrsa init-pki
# 创建 CA
./easyrsa build-ca nopass
# 生成服务器证书
./easyrsa gen-req server nopass
./easyrsa sign-req server server
# 生成 DH 参数
./easyrsa gen-dh
# 生成 TLS 密钥
openvpn --genkey secret ta.key
# 生成客户端证书
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
服务端配置
# /etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
cipher AES-256-GCM
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
客户端配置
# client.ovpn
client
dev tun
proto udp
remote server.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
cipher AES-256-GCM
auth SHA256
verb 3
管理命令
# 启动服务
systemctl start openvpn@server
systemctl enable openvpn@server
# 查看状态
systemctl status openvpn@server
# 查看连接
cat /var/log/openvpn-status.log
# 吊销证书
cd ~/openvpn-ca
./easyrsa revoke client1
./easyrsa gen-crl
IPSec (strongSwan)
安装
# Debian/Ubuntu
apt install strongswan strongswan-pki
# CentOS/RHEL
yum install strongswan
生成证书
# 生成 CA
ipsec pki --gen --type rsa --size 4096 --outform pem > ca-key.pem
ipsec pki --self --ca --lifetime 3650 \
--in ca-key.pem --type rsa \
--dn "CN=VPN CA" \
--outform pem > ca-cert.pem
# 生成服务器证书
ipsec pki --gen --type rsa --size 4096 --outform pem > server-key.pem
ipsec pki --pub --in server-key.pem --type rsa | \
ipsec pki --issue --lifetime 1825 \
--cacert ca-cert.pem --cakey ca-key.pem \
--dn "CN=vpn.example.com" \
--san vpn.example.com \
--flag serverAuth --flag ikeIntermediate \
--outform pem > server-cert.pem
服务端配置
# /etc/ipsec.conf
config setup
charondebug="ike 2, knl 2, cfg 2"
uniqueids=no
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=@vpn.example.com
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
用户配置
# /etc/ipsec.secrets
: RSA "server-key.pem"
user1 : EAP "password1"
user2 : EAP "password2"
管理命令
# 启动
systemctl start strongswan
systemctl enable strongswan
# 重载配置
ipsec reload
ipsec rereadall
# 查看状态
ipsec statusall
ipsec status
# 查看 SA
ipsec listall
常见场景
场景 1:WireGuard 站点到站点
# 站点 A 配置
[Interface]
Address = 10.0.0.1/24
PrivateKey = <site_a_private>
ListenPort = 51820
[Peer]
PublicKey = <site_b_public>
Endpoint = site-b.example.com:51820
AllowedIPs = 10.0.0.2/32, 192.168.2.0/24
# 站点 B 配置
[Interface]
Address = 10.0.0.2/24
PrivateKey = <site_b_private>
ListenPort = 51820
[Peer]
PublicKey = <site_a_public>
Endpoint = site-a.example.com:51820
AllowedIPs = 10.0.0.1/32, 192.168.1.0/24
场景 2:分流配置
# WireGuard 仅代理特定网段
[Peer]
PublicKey = <server_public_key>
Endpoint = server.example.com:51820
AllowedIPs = 10.0.0.0/24, 192.168.100.0/24
场景 3:多用户管理脚本
#!/bin/bash
# add-wg-client.sh
CLIENT_NAME=$1
SERVER_PUBLIC_KEY="<server_public_key>"
SERVER_ENDPOINT="vpn.example.com:51820"
# 生成密钥
wg genkey | tee ${CLIENT_NAME}_private | wg pubkey > ${CLIENT_NAME}_public
# 生成客户端配置
cat > ${CLIENT_NAME}.conf << EOF
[Interface]
PrivateKey = $(cat ${CLIENT_NAME}_private)
Address = 10.0.0.${2}/24
DNS = 8.8.8.8
[Peer]
PublicKey = ${SERVER_PUBLIC_KEY}
Endpoint = ${SERVER_ENDPOINT}
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
echo "添加到服务器:"
echo "[Peer]"
echo "PublicKey = $(cat ${CLIENT_NAME}_public)"
echo "AllowedIPs = 10.0.0.${2}/32"
故障排查
| 问题 | 排查方法 |
|---|---|
| 连接失败 | 检查防火墙、端口、密钥配置 |
| 握手失败 | 检查公钥配置、时间同步 |
| 无法访问内网 | 检查 AllowedIPs、路由、IP 转发 |
| 性能差 | 检查 MTU、加密算法 |
# WireGuard 调试
wg show
dmesg | grep wireguard
tcpdump -i any port 51820
# OpenVPN 调试
tail -f /var/log/openvpn.log
tcpdump -i any port 1194
# IPSec 调试
ipsec statusall
journalctl -u strongswan -f
# 检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward=1
Source
git clone https://github.com/chaterm/terminal-skills/blob/main/network/vpn/SKILL.mdView on GitHub Overview
你可以用该技能在 Linux 服务器上快速搭建并维护 VPN,支持 WireGuard、OpenVPN、IPSec(strongSwan)等方案。它提供从安装、密钥生成、证书管理、到服务端/客户端配置、启动与监控的一整套流程,以及常用故障排查思路。
How This Skill Works
该技能通过系统包管理器安装对应的 VPN 工具,随后你使用 WireGuard 的 wg genkey/wg pubkey 生成密钥,或通过 OpenVPN 的 Easy-RSA 进行 PKI 证书管理,接着编写服务器与客户端的配置文件。你通过 wg-quick、systemctl、ipsec 等命令启动与管理 VPN 服务,并可借助日志、状态命令(如 wg show、ipsec statusall、systemctl status)进行调试与排错。对于 WireGuard,PostUp/PostDown 配置实现启动时的 iptables/masquerade,与网络转发配合;对于 OpenVPN,使用 tls-auth ta.key 增强 TLS 验证;对于 IPSec,使用 strongSwan 的 ikev2 配置与证书轮换。
When to Use It
- 站点到站点的加密网络连接(跨城/跨区域分支间互连)
- 远程员工需要安全访问企业内网资源
- 需要低开销、高性能的点对点 VPN(优先考虑 WireGuard)
- 需要多用户/证书化身份认证的场景(如 OpenVPN、IPSec)
- 需要集中管理密钥、证书与撤销列表(CRL)并进行运维监控
Quick Start
- 1. 选择要使用的协议并在目标主机安装相应软件包(WireGuard、OpenVPN、或 strongSwan)
- 2. 生成密钥/证书并创建服务器与客户端的配置文件(WireGuard 使用 wg genkey/wg pubkey,OpenVPN 使用 Easy-RSA PKI,IPSec 使用 ipsec pki 生成证书)
- 3. 配置服务器端与客户端,例如 WireGuard 的 /etc/wireguard/wg0.conf、OpenVPN 的 server.conf/client.ovpn、IPSec 的 /etc/ipsec.conf 与 /etc/ipsec.secrets
- 4. 启动服务并设置开机自启,验证连接与路由,使用 wg show、ipsec statusall、系统日志等进行排错
Best Practices
- 优先考虑 WireGuard 以获得简化的密钥管理与高性能,必要时再结合 OpenVPN/IPSec 以满足特定场景;
- 在服务器端启用 IP 转发并配置防火墙/NAT(如在 WireGuard 的 PostUp/PostDown 中实现),确保仅放行所需端口与信任的对端密钥/证书;
- 对 OpenVPN 使用 tls-auth ta.key 增强 TLS 验证,确保 CA、证书和私钥的安全存储与轮换;
- 对 IPSec 使用 IKEv2、证书轮换和撤销机制(CRL/OCSP),并定期评估密钥寿命与撤销名单;
- 定期检查日志与状态输出(wg show、ipsec statusall、OpenVPN 日志),并将密钥/证书轮换计划纳入运维流程。
Example Use Cases
- 场景 1:WireGuard 站点到站点 # 站点 A 配置 [Interface] Address = 10.0.0.1/24 PrivateKey = <site_a_private> ListenPort = 51820 [Peer] PublicKey = <site_b_public> Endpoint = site-b.example.com:51820 AllowedIPs = 10.0.0.2/32, 192.168.2.0/24 # 站点 B 配置 [Interface] Address = 10.0.0.2/24 PrivateKey = <site_b_private> ListenPort = 51820 [Peer] PublicKey = <site_a_public> Endpoint = site-a.example.com:51820 AllowedIPs = 10.0.0.1/32, 192.168.1.0/24
- 场景 2:分流配置 ```bash # WireGuard 仅代理特定网段 [Peer] PublicKey = <server_public_key> Endpoint = server.example.com:51820 AllowedIPs = 10.0.0.0/24, 192.168.100.0/24 ```
- 场景 3:多用户管理脚本 ```bash #!/bin/bash # add-wg-client.sh CLIENT_NAME=$1 SERVER_PUBLIC_KEY="<server_public_key>" SERVER_ENDPOINT="vpn.example.com:51820" # 生成密钥 wg genkey | tee ${CLIENT_NAME}_private | wg pubkey > ${CLIENT_NAME}_public # 生成客户端配置 cat > ${CLIENT_NAME}.conf << EOF [Interface] PrivateKey = $(cat ${CLIENT_NAME}_private) Address = 10.0.0.${2}/24 DNS = 8.8.8.8 [Peer] PublicKey = ${SERVER_PUBLIC_KEY} Endpoint = ${SERVER_ENDPOINT} AllowedIPs = 0.0.0.0/0 PersistentKeepalive = 25 EOF echo "添加到服务器:" echo "[Peer]" eecho "PublicKey = $(cat ${CLIENT_NAME}_public)" echo "AllowedIPs = 10.0.0.${2}/32" ```
Frequently Asked Questions
Add this skill to your agents