如何在带静态IP的云端Ubuntu虚拟机上搭建免费VPN,使多设备连接后使用家庭实验室域控制器作为首选DNS服务器
嘿,这个场景我刚好帮朋友配置过,用WireGuard完全能搞定——它免费、轻量,还支持Windows、Mac、iPhone几乎所有主流设备,配置起来也不算复杂,完美匹配你的需求。下面我一步步给你捋清楚整个流程:
整体思路先理清楚
因为你的家庭网络没有静态IP,直接从云端访问家里的域控制器(DC)是行不通的。所以我们需要先搭一条反向隧道:让家里的一台设备(比如你的DC本身,或者找个闲置的Linux小主机更稳定)主动连接到云端的WireGuard服务器,这样云端服务器就能打通到家庭内网的链路。之后外部设备(Windows/Mac/iPhone)连云端VPN时,就能通过这条隧道访问家里的DC,同时把DNS直接指向家里的DC内网IP。
具体配置步骤
1. 云端Ubuntu服务器配置WireGuard
首先登录你的云端Ubuntu虚拟机,先把WireGuard装上:
sudo apt update && sudo apt install wireguard -y
接下来生成服务器的密钥对(WireGuard靠密钥验证身份,非常安全):
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
执行完后,服务器的私钥存在/etc/wireguard/privatekey,公钥在/etc/wireguard/publickey,后面配置会用到。
然后创建WireGuard的核心配置文件/etc/wireguard/wg0.conf,复制下面的内容,记得替换掉占位符:
[Interface] PrivateKey = 替换成你的云端服务器私钥(从/etc/wireguard/privatekey里复制) Address = 10.0.0.1/24 # 这是VPN隧道用的网段,别和你的家庭内网、云端内网网段重复就行 ListenPort = 51820 # WireGuard默认的UDP端口,后面防火墙要开这个 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 # 这里先把DNS设为家里DC的IP,后面客户端也会用到 DNS = 192.168.x.x # 替换成你家庭DC的内网IP,比如192.168.1.10 # 下面是家庭内网设备的Peer配置,用来建立反向隧道 [Peer] PublicKey = 后面家庭设备生成的公钥 AllowedIPs = 192.168.x.0/24 # 替换成你的家庭内网网段,比如192.168.1.0/24 PersistentKeepalive = 25 # 每25秒发一次心跳,防止家庭网络换IP后隧道断开
配置文件权限要设成600,避免被其他人读取:
sudo chmod 600 /etc/wireguard/wg0.conf
启动WireGuard并设置开机自启:
sudo wg-quick up wg0 sudo systemctl enable wg-quick@wg0
最后别忘了开防火墙!不管是云端服务商的安全组(比如阿里云、AWS的安全组),还是Ubuntu自带的ufw,都要开放UDP 51820端口:
# 如果用ufw的话 sudo ufw allow 51820/udp sudo ufw reload
2. 家庭内网设备配置WireGuard客户端(反向隧道)
选一台家里的设备来连云端服务器,推荐用Linux设备(稳定),如果是Windows的DC也可以装WireGuard客户端。这里以Linux为例:
先安装WireGuard,然后生成密钥对:
wg genkey | tee privatekey | wg pubkey | tee publickey
把生成的公钥复制出来,填到刚才云端服务器的wg0.conf的Peer部分里,然后重新加载云端的WireGuard配置:
sudo wg-quick down wg0 && sudo wg-quick up wg0
然后创建家庭设备的WireGuard配置文件wg-home.conf:
[Interface] PrivateKey = 替换成家庭设备的私钥 Address = 10.0.0.2/32 # 隧道内的IP,和云端服务器在同一网段就行 [Peer] PublicKey = 替换成云端服务器的公钥(从/etc/wireguard/publickey复制) Endpoint = 你的云端服务器静态IP:51820 AllowedIPs = 10.0.0.0/24 # 只让VPN隧道的流量走这里,不用把家庭所有流量都发去云端 PersistentKeepalive = 25
启动客户端并设置开机自启:
sudo wg-quick up wg-home sudo systemctl enable wg-quick@wg-home
这时候在云端服务器执行wg show,如果看到家庭设备的Peer状态是connected,就说明反向隧道通了。
3. 配置外部客户端(Windows/Mac/iPhone)
给你的Windows、Mac、iPhone都装上WireGuard客户端(官网就能免费下载),然后每个客户端都生成自己的密钥对。
接着回到云端服务器,在wg0.conf里给每个客户端加一段Peer配置:
[Peer] PublicKey = 替换成这个客户端的公钥 AllowedIPs = 10.0.0.3/32 # 每个客户端分配一个唯一的隧道IP,比如10.0.0.3、10.0.0.4以此类推
加完后重新加载云端的WireGuard配置:
sudo wg-quick down wg0 && sudo wg-quick up wg0
然后给每个客户端写配置文件,比如iPhone的配置(Windows/Mac类似):
[Interface] PrivateKey = 替换成这个客户端的私钥 Address = 10.0.0.3/32 # 和刚才云端配置里的AllowedIPs对应 DNS = 192.168.x.x # 这里必须填你家庭DC的内网IP,确保客户端用它做DNS [Peer] PublicKey = 替换成云端服务器的公钥 Endpoint = 你的云端服务器静态IP:51820 AllowedIPs = 0.0.0.0/0, ::/0 # 让客户端所有流量都走VPN;如果只想让访问家庭内网和DNS走VPN,可以改成AllowedIPs = 192.168.x.0/24, 10.0.0.0/24 PersistentKeepalive = 25
把配置导入客户端的WireGuard应用,连接上之后就能测试了——比如在Windows上打开命令提示符,执行nslookup your-domain.local,应该能通过家里的DC成功解析域名。
几个要注意的点
- 家庭内网的WireGuard客户端一定要保持在线,最好设置开机自启,不然反向隧道断了,外部客户端就访问不到家里的DC了。
- 检查云端服务器的IP转发是否开启:执行
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward,然后编辑/etc/sysctl.conf,把net.ipv4.ip_forward=1前面的注释去掉,这样服务器才能转发客户端的流量到家庭内网。 - 如果家庭内网有防火墙,要允许WireGuard的出站流量到云端服务器的51820 UDP端口。
备注:内容来源于stack exchange,提问作者Ryan Vogel

