实现的效果:
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.168
和 172.16
开头的,这里使用 10
开头的是为了与 局域网内设备
和 docker容器
的ip网段进行区分。
安装 wireguard(linux debian)
1
| apt install -y wireguard
|
开启IP转发(服务器和节点都要开启)
1 2 3 4 5 6 7 8
|
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
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
wg genkey > node2.key
wg pubkey < node2.key > node2.key.pub
wJZXk2hmphvESMx4dDg1PcF9fMAd/p3akl885Nb1rlQ= IkODSFIS3bIAEAIlGm7qE6n0TlxwtGu7ECzPPeZyIX0=
EH2b95qb+hpc7ehBhjUlJ1KmW74L7iNhjSaICQ2Zakg= WELiQr6kEOIyqS7Jl7YP4WepO7qKygP+wIUw0zqdgy4=
WJrNXsKBe02Z7GsA0/lRRcY+n83eF4WQgeFC5vzIl3A= Use6tRS1lnBHpNf3/Mnpk1fpPHSY7JOgxIPi/ypsG3o=
yLEvKATTwZ6PcuyyZjSnpd5m20t9HmKi6Rl+BhUjO0U= 0mKXjfnvv1PAAB0ZMvQuluDMMo0IsoLDVja1H4k411s=
|
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
| iptables -I INPUT -p udp --dport 51820 -j ACCEPT ip6tables -I INPUT -p udp --dport 51820 -j ACCEPT
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
| wg-quick up wg0
wg-quick down 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= Address = 10.8.8.2
[Peer] PublicKey = IkODSFIS3bIAEAIlGm7qE6n0TlxwtGu7ECzPPeZyIX0= AllowedIPs = 10.8.8.0/24 Endpoint = 188.188.186.108:51820 PersistentKeepalive = 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
|