WireGuard是一个易于配置,快速且安全的开源VPN协议,它利用了最新的加密技术。目的是提供一种更快,更简单,更精简的通用VPN,它可以轻松地在低端设备和高端服务器上部署。IPsec和OpenVPN等大多数其他解决方案是几十年前开发的。安全研究人员和内核开发人员Jason Donenfeld意识到它们速度慢且难以正确配置和管理。这让他创建了一个新的开源VPN协议和解决方案,它更加快速,安全,易于部署和管理。
WireGuard最初是为Linux开发的,但现在可用于Windows,macOS,BSD,iOS和Android,如今仍在活跃的开发中。除了可以跨平台之外,WireGuard的最大优点之一就是易于部署。配置和部署WireGuard就像配置和使用SSH一样容易。WireGuard的另一个好处是代码十分精简,调试更加容易。由于WireGuard运行在内核空间,因此可以高速提供安全的网络。
VPN的通用特性:
安全性:保证两个私有网络间的数据可以在不安全的网络(如公网)上安全地传输
真实性:访问者是合法的用户,访问者访问的是正确的网络
高效性:开启 VPN 并不会让访问网络明显变慢,且建立隧道的速度要快
隐秘性:第三方并不能轻易嗅探到网关的存在
易用性:很容易配置,很容易开启和关闭
WireGuard的优点:
简单易用:WireGuard可以像SSH一样易于配置和部署。VPN连接只需通过交换非常简单的公钥即可实现,就像交换SSH密钥一样,其余所有内容都由WireGuard透明地处理,无需管理连接,关注状态,管理守护程序或后台的内容。WireGuard提供了一个非常基本但功能强大的界面。
加密健全:WireGuard 使用先进的密码学和安全可信结构。它做出了保守合理的选择,并经过密码学家的审查。
最小攻击面:WireGuard在设计时考虑了易于实现和简单性。WireGuard代码十分精简,并且易于审计安全漏洞,与IPsec或OpenVPN等庞然大物相比,即使对于大型安全专家团队来说,审计庞大的代码也是一项艰巨的任务,WireGuard意味着可以由个人进行全面审查。
高性能:极高速的加密原语和WireGuard存在于Linux内核中的事实相结合,意味着安全网络可以非常高速。它适用于智能手机等小型嵌入式设备和满载骨干路由器。
通过Wireguard可以将公网上的主机连接起来,形成一个局域网。只需要有一台具有固定公网IP的服务器,就可以将其作为我们搭建的局域网的中心节点,让其他的主机(不论是否有公网IP,不论是否在NAT内),都通过这个中心节点和彼此相连。由此就构建了一个中心辐射型的局域网,实现了内网穿透等功能。
bash#安装Wireguard
apt install wireguard resolvconf -y
#开启IP地址转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p
可以通过wg genkey和wg pubkey生成公钥和私钥
json[Interface]
Address = 10.0.1.1 #服务器局域网IP
PrivateKey = 私钥
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -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
ListenPort = 51820 # 自定义UDP端口
DNS = 223.5.5.5, 114.114.114.114
MTU = 1420
[Peer1]
PublicKey = 公钥
PresharedKey = 预共享密钥
AllowedIPs = 10.0.1.2/24 #客户端允许局域网IP
[Peer2]
PublicKey = 公钥
PresharedKey = 预共享密钥
AllowedIPs = 10.0.1.3/24
。。。
服务端防火墙需要打开51820端口允许UDP连接。
bash#启动Wireguard,wg0为配置文件名
wg-quick up wg0
#关闭Wireguard
wg-quick down wg0
#设置开机启动Wireguard
systemctl enable wg-quick@wg0
可以在WireGuard处下载需要平台的客户端,每个客户端与WireGuard服务端连接需要单独配置预共享密钥与配置文件。
json[Interface]
PrivateKey = 私钥
Address = 10.0.1.2/24
DNS = 223.5.5.5, 114.114.114.114
[Peer]
PublicKey = 公钥
PresharedKey = 预共享密钥
AllowedIPs = 10.0.1.0/24 #客户端允许局域网IP
Endpoint = 服务器IP:端口
PersistentKeepalive = 25
可以参考Docker简介安装。
bashdocker run -d \
--name=wg-easy \
-e WG_HOST=服务器IP \
-e PASSWORD=密码 \
-e WG_DEFAULT_ADDRESS=服务器局域网IP \
-e WG_DEFAULT_DNS=114.114.114.114 \
-e WG_ALLOWED_IPS=客户端允许局域网IP \
-e WG_PERSISTENT_KEEPALIVE=25 \
-v ~/.wg-easy:/etc/wireguard \
-p 51820:51820/udp \
-p 51821:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
weejewel/wg-easy
服务端防火墙需要打开51820端口允许UDP连接,打开51821端口允许TCP连接。
打开http://服务端IP:51821,通过密码登录可以访问可视化WireGuard配置界面,客户端的配置进行和配置文件下载可以在网页上进行。可以在WireGuard处下载需要平台的客户端,配置可以参考上面直接安装的配置方式。
(p.s.使用docker配置较为简单,且有可视化界面,但是由于镜像制作的问题,wg-easy不太方便修改配置文件,可玩性会降低不少(如无法自定义客户端允许的IP段与NAT转发等),推荐除小白外的童鞋都使用直接安装的方式,否则会出现一些不符合预期的问题。。。)
基于WireGuard实现内网穿透