环境
假设有以下设备:
- 家里10台虚拟机(内网ip:192.168.2.101 - 192.168.2.110)
- linux云服务器(公网ip:123.123.123.123)
- 使用流量联网的安卓手机
目的:
- 云服务器访问家里虚拟机
- 手机访问家里虚拟机运行的网页
方案:
如果家里只有一两台设备,使用内网穿透工具(frp、ngrok等)也能完成,我需要搭建k8s集群,因此这里使用wireguard组网。
大概思路:
- 选择一台虚拟机(192.168.2.101)使用wireguard与云服务器点对点连接
- 配置iptables将从云服务器访问192.168.2.0/24段的流量转发至192.168.2.101
步骤:
1.安装wireguard(云服务器/192.168.2.101)
这里使用ubuntu系统,其他平台安装方法见wireguard官网
apt install wireguard openresol
2.确认开启Linux内核的IP转发(云服务器/192.168.2.101)
# 查看输出是否为1
sysctl net.ipv4.ip_forward
# 设为1开启
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
# 使其生效
sysctl -p
3.启动wireguard(云服务器)
编辑/etc/wireguard/wg0.conf
[Interface]
Address = 10.10.0.1/32
ListenPort = 54321
PrivateKey = 云服务器私钥
PostUp = iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE;
PostUp = iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT;
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
[Peer]
PublicKey = 虚拟机101公钥
AllowedIPs = 10.10.0.2/32, 192.168.2.0/24
PersistentKeepalive = 15
[Peer]
PublicKey = 安卓手机的公钥
AllowedIPs = 10.10.0.3/32
PersistentKeepalive = 15
启动wireguard
wg-quick up wg0
4.启动wireguard(192.168.2.101)
编辑/etc/wireguard/wg0.conf
[Interface]
PrivateKey = 虚拟机101私钥
Address = 10.10.0.2/32
PostUp = iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -j SNAT --to-source 192.168.2.101
PostDown = iptables -t nat -D POSTROUTING -s 10.10.0.0/24 -j SNAT --to-source 192.168.2.101
[Peer]
PublicKey = 云服务器公钥
AllowedIPs = 10.10.0.0/24
Endpoint = 123.123.123.123:54321
PersistentKeepalive = 15
启动wireguard
wg-quick up wg0
5.启动wireguard(安卓手机)
安卓客户端配置
[Interface]
PrivateKey = 安卓客户端的私钥
Address = 10.10.0.3/32
[Peer]
PublicKey = 云服务器公钥
AllowedIPs = 10.10.0.0/24, 192.168.2.0/24 # 这里加入192.168.2.0网段
Endpoint = 123.123.123.123:54321
PersistentKeepalive = 15
6.验证
在虚拟机192.168.2.101上执行
ping 10.10.0.1
在云服务上执行
ping 10.10.0.2
ping 192.168.2.101
ping 192.168.2.102
确保以上都能ping通