Wireguard实现纯ipv4网络环境连接只有ipv6的服务器

实现的效果:
1、没有公网ip的机器实现相互通信(每个机器都是一个node节点,能相互通信),可以实现内网穿透的效果。
2、在没有ipv6的网络环境下 ssh连接到 ipv6云服务器。

server 公网云服务器(linux debian)具有ipv4 188.188.186.108 和 ipv6 2001:19f0:6000:90ea:5400:5ff:fe02:9277 节点1虚拟ip设置为 10.8.8.1

node2 公司的局域网笔记本电脑(windows10)节点2虚拟ip设置为 10.8.8.2

node3 家里的局域网设备香橙派(linux debian)节点3虚拟ip设置为 10.8.8.3

node4 仅有ipv6的公网云服务器(linux debian)节点4虚拟ip设置为 10.8.8.4

以上局域网内网ip网段,也可以使用 192.168172.16 开头的,这里使用 10 开头的是为了与 局域网内设备docker容器 的ip网段进行区分。

安装 wireguard(linux debian)

1
apt install -y wireguard

开启IP转发(服务器和节点都要开启)

1
2
3
4
5
6
7
8
#ipv4
#/proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

#ipv6
#/proc/sys/net/ipv6/conf/all/forwarding
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -p

进入配置存储路径,调整目录权限(此步为可选项)

1
2
3
4
5
cd /etc/wireguard/
chmod 0777 /etc/wireguard

#调整目录默认权限
umask 077

生成密钥文件

密钥文件可以在任意机器上生成,在配置完配置文件后,就可以删除了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#生成服务器私钥
wg genkey > server.key
#通过服务器私钥生成公钥
wg pubkey < server.key > server.key.pub

#生成节点(node2)私钥
wg genkey > node2.key
#通过节点(node2)私钥生成公钥
wg pubkey < node2.key > node2.key.pub

# 密钥列举,可以直接拿去测试用
wJZXk2hmphvESMx4dDg1PcF9fMAd/p3akl885Nb1rlQ= #此处为server的私钥
IkODSFIS3bIAEAIlGm7qE6n0TlxwtGu7ECzPPeZyIX0= #server的公钥

EH2b95qb+hpc7ehBhjUlJ1KmW74L7iNhjSaICQ2Zakg= #此处为node2的私钥
WELiQr6kEOIyqS7Jl7YP4WepO7qKygP+wIUw0zqdgy4= #node2的公钥

WJrNXsKBe02Z7GsA0/lRRcY+n83eF4WQgeFC5vzIl3A= #此处为node3的私钥
Use6tRS1lnBHpNf3/Mnpk1fpPHSY7JOgxIPi/ypsG3o= #node3的公钥

yLEvKATTwZ6PcuyyZjSnpd5m20t9HmKi6Rl+BhUjO0U= #此处为node4的私钥
0mKXjfnvv1PAAB0ZMvQuluDMMo0IsoLDVja1H4k411s= #node4的公钥

1、服务器配置(node1)

实际使用中发现,端口用过一段时间就会无法使用,需要重新换一个端口并修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = wJZXk2hmphvESMx4dDg1PcF9fMAd/p3akl885Nb1rlQ= #服务器的私钥
Address = 10.8.8.1 #本机虚拟IP(wireguard为服务器设置的虚拟ip)

#注意eth0需要为本机网卡名称(我的公网服务器网卡为 enp1s0 但是用 eth0 也没问题)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -A FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -D FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

ListenPort = 51820 #服务器监听端口

#节点配置
[Peer]
PublicKey = WELiQr6kEOIyqS7Jl7YP4WepO7qKygP+wIUw0zqdgy4= #node2的公钥
AllowedIPs = 10.8.8.2 #wireguard为节点2生成的虚拟IP

[Peer]
PublicKey = Use6tRS1lnBHpNf3/Mnpk1fpPHSY7JOgxIPi/ypsG3o= #node3的公钥
AllowedIPs = 10.8.8.3 #wireguard为节点3生成的虚拟IP

[Peer]
PublicKey = 0mKXjfnvv1PAAB0ZMvQuluDMMo0IsoLDVja1H4k411s= #node4的公钥
AllowedIPs = 10.8.8.4 #wireguard为节点4生成的虚拟IP
EOF

放行端口(仅在服务器上配置)

实际使用中发现,端口用过一段时间就会无法使用,需要重新换一个端口并修改配置文件

1
2
3
4
5
6
7
8
# wireguard 使用的是udp协议,所以仅打开udp端口即可
iptables -I INPUT -p udp --dport 51820 -j ACCEPT
ip6tables -I INPUT -p udp --dport 51820 -j ACCEPT

#保存规则,如果不保存,重启后会失效
#debian 保存命令
iptables-save > /etc/iptables.up.rules
ip6tables-save > /etc/ip6tables.up.rules

设置 wireguard 开机自启动

1
systemctl enable wg-quick@wg0

命令行启动 wireguard

1
2
3
4
5
6
#启动wg0
wg-quick up wg0
#关闭wg0
wg-quick down wg0
#重启wg0
wg-quick down wg0 && wg-quick up wg0

2、windows 节点配置(node2)

实际使用中发现,端口用过一段时间就会无法使用,需要重新换一个端口并修改配置文件
下载 windows 版本的 wireguard
https://www.wireguard.com/install/
打开软件 Ctrl + N 新建空白隧道,写入以下配置

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = EH2b95qb+hpc7ehBhjUlJ1KmW74L7iNhjSaICQ2Zakg= #此处为node2的私钥
Address = 10.8.8.2 #为节点2设置虚拟IP

[Peer]
PublicKey = IkODSFIS3bIAEAIlGm7qE6n0TlxwtGu7ECzPPeZyIX0= #此处为server的公钥
AllowedIPs = 10.8.8.0/24 #允许访问的IP段 10.8.8.1 - 10.8.8.254 的ip区间
Endpoint = 188.188.186.108:51820 #服务器IP+端口
PersistentKeepalive = 25 #保活间隔 25秒

3、linux 节点 香橙派 配置(node3)

1
2
3
4
5
6
7
8
9
10
11
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = WJrNXsKBe02Z7GsA0/lRRcY+n83eF4WQgeFC5vzIl3A= #此处为node3的私钥
Address = 10.8.8.3 #为节点3设置虚拟IP

[Peer]
PublicKey = IkODSFIS3bIAEAIlGm7qE6n0TlxwtGu7ECzPPeZyIX0= #此处为server的公钥
AllowedIPs = 10.8.8.0/24 #允许访问的IP段 10.8.8.1 - 10.8.8.254 的ip区间
Endpoint = 188.188.186.108:51820 #服务器IP+端口
PersistentKeepalive = 25 #保活间隔 25秒
EOF

4、linux 节点配置(node4,此节点仅有ipv6)

1
2
3
4
5
6
7
8
9
10
11
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = yLEvKATTwZ6PcuyyZjSnpd5m20t9HmKi6Rl+BhUjO0U= #此处为node4的私钥
Address = 10.8.8.4 #为节点4设置虚拟IP

[Peer]
PublicKey = IkODSFIS3bIAEAIlGm7qE6n0TlxwtGu7ECzPPeZyIX0= #此处为server的公钥
AllowedIPs = 10.8.8.0/24 #允许访问的IP段 10.8.8.1 - 10.8.8.254 的ip区间
Endpoint = [2001:19f0:6000:90ea:5400:5ff:fe02:9277]:51820 #服务器IPv6+端口
PersistentKeepalive = 25 #保活间隔 25秒
EOF

实现效果

一、实现ipv4 ssh连接 ipv6 云服务器

使用公司没有ipv6网络环境的电脑 ssh连接 仅有ipv6的服务器 10.8.8.4:22

二、所有设备间通过虚拟ip相互通信

1
2
3
4
ping 10.8.8.1
ping 10.8.8.2
ping 10.8.8.3
ping 10.8.8.4