由于我们想要访问的是整个家庭局域网,而不仅仅是家庭笔记本电脑,所以我们需要在家庭笔记本电脑上配置路由,使得家庭局域网的其他主机可以通过家庭笔记本电脑访问VPN,或者将家庭笔记本电脑作为网关,将流量转发到OpenVPN服务器。
这里有两种方式:
家庭笔记本电脑作为VPN客户端,同时作为家庭局域网的网关,将家庭局域网的流量路由到VPN。
家庭笔记本电脑仅作为VPN客户端,然后通过配置家庭路由器,将VPN流量路由到家庭笔记本电脑。
由于家庭路由器的配置可能不同,且可能不支持自定义路由,本文采用第一种方式,即家庭笔记本电脑作为网关,但这样需要在家庭笔记本电脑上启用IP转发,并且配置iptables进行NAT,这样家庭局域网的其他主机就可以通过家庭笔记本电脑访问VPN网络。
bash
# 登录云服务器
ssh ley@120.48.170.222
# 更新系统
sudo apt update
sudo apt upgrade -y
# 安装OpenVPN和Easy-RSA
sudo apt install openvpn=2.6.12-0ubuntu0.24.04.3~bpo22.04.1 easy-rsa iptables-persistent -ybash
# 创建Easy-RSA目录
mkdir ~/easy-rsa
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
chmod 700 ~/easy-rsa
# 初始化PKI
cd ~/easy-rsa
./easyrsa init-pki
# 创建CA证书(无密码)
./easyrsa build-ca nopass
# 创建服务器证书
./easyrsa gen-req server nopass
./easyrsa sign-req server server
# 生成Diffie-Hellman参数
./easyrsa gen-dh
# 生成TLS认证密钥
openvpn --genkey --secret ta.keybash
# 创建OpenVPN配置目录
sudo mkdir -p /etc/openvpn/server
# 复制证书文件
sudo cp ~/easy-rsa/pki/ca.crt /etc/openvpn/server/
sudo cp ~/easy-rsa/pki/issued/server.crt /etc/openvpn/server/
sudo cp ~/easy-rsa/pki/private/server.key /etc/openvpn/server/
sudo cp ~/easy-rsa/pki/dh.pem /etc/openvpn/server/
sudo cp ~/easy-rsa/ta.key /etc/openvpn/server/
# 创建服务器配置文件
sudo nano /etc/openvpn/server/server.conf/etc/openvpn/server/server.conf 内容:
ini
# 网络配置
port 1194
proto udp
dev tun
# 证书配置
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
# 虚拟网络配置
server 10.8.0.0 255.255.255.0
topology subnet
# 客户端到客户端通信
client-to-client
# 推送路由到客户端
push "route 192.168.66.0 255.255.255.0"
push "route 192.168.3.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
# 安全配置
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-GCM
auth SHA256
key-direction 0
# 连接保持
keepalive 10 120
# 用户权限
user nobody
group nogroup
persist-key
persist-tun
# 日志配置
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3
# 客户端配置目录
client-config-dir /etc/openvpn/ccdbash
# 创建客户端配置目录
sudo mkdir -p /etc/openvpn/ccd
# 为公司PC创建固定IP配置
sudo nano /etc/openvpn/ccd/company_pc内容:
text
ifconfig-push 10.8.0.2 255.255.255.0
iroute 192.168.3.0 255.255.255.0bash
# 为家庭笔记本电脑创建固定IP配置
sudo nano /etc/openvpn/ccd/home_laptop内容:
text
ifconfig-push 10.8.0.3 255.255.255.0
iroute 192.168.66.0 255.255.255.0bash
# 启用IP转发
sudo nano /etc/sysctl.conf
# 取消注释或添加以下行:
net.ipv4.ip_forward = 1
# 应用配置
sudo sysctl -p
# 配置iptables规则
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
# 保存iptables规则
sudo netfilter-persistent savebash
# 启动服务
sudo systemctl start openvpn-server@server
sudo systemctl enable openvpn-server@server
# 检查服务状态
sudo systemctl status openvpn-server@serverbash
# 在云服务器上生成客户端证书
cd ~/easy-rsa
# 为公司PC生成证书
./easyrsa gen-req company_pc nopass
./easyrsa sign-req client company_pc
# 为家庭笔记本电脑生成证书
./easyrsa gen-req home_laptop nopass
./easyrsa sign-req client home_laptop将以下文件从服务器下载到各客户端:
~/easy-rsa/pki/ca.crt
~/easy-rsa/pki/issued/company_pc.crt(公司PC)
~/easy-rsa/pki/private/company_pc.key(公司PC)
~/easy-rsa/pki/issued/home_laptop.crt(家庭笔记本)
~/easy-rsa/pki/private/home_laptop.key(家庭笔记本)
~/easy-rsa/ta.key
bash
# 安装OpenVPN客户端(使用Homebrew)
brew install openvpn
# 创建客户端配置文件
sudo nano /usr/local/etc/openvpn/client.ovpnclient.ovpn 内容(公司PC):
ini
client
dev tun
proto udp
remote 120.48.170.222 1194
resolv-retry infinite
nobind
persist-key
persist-tun
# 证书配置
ca ca.crt
cert company_pc.crt
key company_pc.key
# 安全配置
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
auth SHA256
# 路由配置
route 192.168.66.0 255.255.255.0
# 连接参数
verb 3下载并安装OpenVPN GUI客户端
创建配置文件 home_laptop.ovpn:
ini
client
dev tun
proto udp
remote 120.48.170.222 1194
resolv-retry infinite
nobind
persist-key
persist-tun
# 证书配置
ca ca.crt
cert home_laptop.crt
key home_laptop.key
# 安全配置
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
auth SHA256
# 路由配置
route 192.168.3.0 255.255.255.0
# 连接参数
verb 3将配置文件放入 C:\Program Files\OpenVPN\config\
bash
# 在云服务器上添加路由
sudo ip route add 192.168.66.0/24 via 10.8.0.3 dev tun0
sudo ip route add 192.168.3.0/24 via 10.8.0.2 dev tun0
# 永久保存路由(添加到rc.local)
sudo nano /etc/rc.local添加以下内容到 /etc/rc.local 的 exit 0 之前:
bash
sleep 30
ip route add 192.168.66.0/24 via 10.8.0.3 dev tun0 2>/dev/null || true
ip route add 192.168.3.0/24 via 10.8.0.2 dev tun0 2>/dev/null || true在家庭笔记本电脑上(Windows)以管理员身份运行:
powershell
# 启用IP转发
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v IPEnableRouter /t REG_DWORD /d 1 /f
# 配置家庭路由器
# 登录家庭路由器管理界面(通常是192.168.66.1)
# 添加静态路由:
# 目标网络:10.8.0.0/24
# 网关:家庭笔记本电脑的IP(如192.168.66.100)
# 目标网络:192.168.3.0/24
# 网关:家庭笔记本电脑的IP如果公司网络允许,在路由器上添加路由:
text
目标网络:10.8.0.0/24 → 网关:192.168.3.23
目标网络:192.168.66.0/24 → 网关:192.168.3.23或者在公司PC上配置端口转发(如果公司网络有防火墙限制):
bash
# macOS 上设置端口转发
sudo sysctl -w net.inet.ip.forwarding=1
sudo pfctl -f /etc/pf.conf 2>/dev/null测试服务器端状态:
bash
# 在云服务器上检查
sudo systemctl status openvpn-server@server
sudo cat /var/log/openvpn/openvpn.log | tail -20测试客户端连接:
bash
# 公司PC连接
sudo openvpn --config /usr/local/etc/openvpn/client.ovpn
# 家庭笔记本电脑通过OpenVPN GUI连接bash
# 从公司PC测试:
ping 10.8.0.1 # 测试到VPN服务器
ping 10.8.0.3 # 测试到家庭笔记本电脑VPN IP
ping 192.168.66.1 # 测试到家庭路由器
ping 192.168.66.100 # 测试到家庭其他设备
# 从家庭笔记本电脑测试:
ping 10.8.0.1 # 测试到VPN服务器
ping 10.8.0.2 # 测试到公司PC VPN IP
ping 192.168.3.23 # 测试到公司PC本地IP
# 从家庭其他设备测试:
ping 10.8.0.2 # 通过VPN隧道到公司PC
ping 192.168.3.23 # 到公司PC本地IPbash
# 在云服务器上查看路由
ip route show
# 在公司PC上查看路由
netstat -nr
# 在家庭笔记本电脑上查看路由
route printbash
# 测试SSH连接
ssh user@192.168.66.100 # 从公司PC SSH到家庭设备
ssh user@192.168.3.23 # 从家庭设备SSH到公司PC
# 测试文件共享
# 配置Samba或NFS共享,测试跨网络访问bash
# 检查云服务器防火墙
sudo ufw status
# 确保1194端口开放
sudo ufw allow 1194/udp
# 检查客户端防火墙
# Windows: 确保OpenVPN客户端在防火墙中被允许
# macOS: 系统偏好设置 → 安全性与隐私 → 防火墙如果连接失败,检查:
服务器日志:sudo journalctl -u openvpn-server@server -f
客户端日志:查看OpenVPN客户端的连接日志
网络跟踪:
bash
# 跟踪路由
traceroute 192.168.66.1
# 检查端口
nc -zv 120.48.170.222 1194定期更新证书:每6-12个月更新一次证书
使用强密码:为证书设置强密码(虽然示例中用了nopass)
防火墙限制:限制VPN端口访问IP
监控日志:定期检查OpenVPN日志
备份配置:定期备份服务器配置和证书
这个配置方案实现了云服务器作为VPN枢纽,打通公司PC和家庭网络的互访。根据实际网络环境,可能需要调整路由和防火墙设置。
提示:如遇链接失效,请在评论区留言反馈