1 引言
1.1 什么是WireGuard
官方介绍如下:
WireGuard ® 是一款极其简单但快速且当代的 VPN,采用最先进的加密技术。它的目标是比 IPsec 更快、更简单、更精简、更有用,同时避免令人头疼的问题。它的性能远高于 OpenVPN。
WireGuard 被设计为通用 VPN,可在嵌入式接口和超级计算机上运行,适合许多差别的环境。它最初针对 Linux 内核发布,现在已跨平台(Windows、macOS、BSD、iOS、Android)且可广泛摆设。它目前正在大力开发中,但它大概已被视为业内最安全、最易于利用且最简单的 VPN 解决方案。
我们可以用一句话概括它:
WGuard是一款可以组建虚拟私人局域网(VPN)的软件,允许用户通过公共网络(如互联网)安全地传输数据,同时保持数据的秘密性和完备性。
WireGuard有如下上风:
- 更轻便:以Linux内核模块的形式运行,资源占用小。
- 更高效:相比目前主流的IPSec、OpenVPN等协议,WireGuard的效率要更高。
- 更快速:比目前主流的VPN协议,连接速率要更快。
- 更安全:利用了更先进的加密技术。
- 更易搭建:摆设难度相对更低。
- 更埋伏:以UDP协议进行数据传输,比TCP协议更低调。
- 不易被封锁:TCP阻断对WireGuard无效,IP被墙的环境下仍然可用。
- 更省电:不利用时不进行数据传输,移动端更省电。
1.2 WireGuard可以用来做什么
- 建立VPN(不限设备类型)
WireGuard支持多种平台,包括电脑、智能手机和路由器。这一特性使其成为构建虚拟私有网络(VPN)的理想选择,能在这些设备上实现安全连接。无论是用于远程工作、掩护数据隐私,还是绕过地理限定,WireGuard都能提供稳固且安全的网络连接。
- 实现内网穿透
内网穿透,即NAT(Network Address Translator)穿透,是指计算机在内网(局域网)内利用私有IP地点,在连接外网(互联网)时利用全局IP地点的技术。该技术被普遍利用在有多台主机但只通过一个公有IP地点访问的私有网络中。
举个例子:比如我在实行室配置了一个服务器 Server A,当我在实行室的时间,就可以通过本身的笔记本利用SSH连接【由于我和服务器处于一个局域网】,当我回宿舍以后,就没有办法直接利用SSH连接了【由于我和服务器不在一个局域网】,这个时间就需要进行NAT穿透,让我在宿舍也可以利用SSH连接Server A。
通过Wireguard可以将广域网上的主机连接起来,形成一个局域网。只需要有一台具有固定公网IP的服务器,就可以将其作为我们搭建的局域网的中心节点,让其他的主机(不论是否有公网IP,不论是否在NAT内),都通过这个中心节点和彼此相连。由此就构建了一个中心辐射型的局域网,实现了内网穿透等功能。
- Docker容器通信
WireGuard还可用于Docker容器之间的通信。在Docker环境中,容器之间的网络通信是一个重要的问题。WireGuard通过提供一种安全的通信方式,能够在差别容器之间建立一个加密的网络连接,从而保障数据的安全传输。这对于需要在差别容器间安全共享数据的应用尤为重要。
1.3 WireGuard原理
WireGuard源码地点
WireGuard 是一种在第 3 层(网络层)运行的安全网络隧道,与传统的 VPN 解决方案(如 IPsec 和 OpenVPN)相比,它的设计更安全、性能更高且更易于利用。它是作为 Linux 内核虚拟网络接口实现的,基于安全隧道的基本原理:将peer的公钥与隧道源 IP 地点关联。
相关术语:
- Peer/Node/Device
连接到VPN 并为本身注册一个VPN子网地点(如 192.0.2.3)的主机。还可以通过利用逗号分隔的 CIDR 指定子网范围,为其自身地点以外的 IP 地点选择路由。
- 中继服务器(Bounce Server)
一个公网可达的peer,可以将流量中继到 NAT 背面的其他peer。Bounce Server 并不是特殊的节点,它和其他peer一样,唯一的区别是它有公网 IP,并且开启了内核级别的 IP 转发,可以将 威屁恩 的流量转发到其他客户端。
- 子网(Subnet)
一组私有 IP,比方 192.0.2.1-255 或 192.168.1.1/24,一般在 NAT 背面,比方办公室局域网或家庭网络。
- CIDR 表示法
CIDR,即无类域间路由(Classless Inter-Domain Routing),是一种用于对IP地点进行机动表示和分配的标准。
- NAT
子网的私有 IP 地点由路由器提供,通过公网无法直接访问私有子网设备,需要通过 NAT 做网络地点转换。路由器会跟踪发出的连接,并将相应转发到正确的内部 IP。
- 公开端点(Public Endpoint)
节点的公网 IP 地点:端口,比方 123.124.125.126:1234,大概直接利用域名 some.domain.tld。如果peer节点不在同一子网中,那么节点的公开端点必须利用公网 IP 地点。
- 私钥(Private key)
单个节点的 WireGuard 私钥,天生方法是:wg genkey > example.key。
- 公钥(Public key)
单个节点的 WireGuard 公钥,天生方式为:wg pubkey < example.key > example.key.pub。
- DNS
域名服务器,用于将域名解析为 VPN 客户端的 IP,不让 DNS请求泄漏到 VPN 之外。
主要功能和原理如下
WireGuard 通过添加一个(或多个)网络接口来工作,比方 eth0 或 wlan0 ,称为 wg0 (或 wg1 、 wg2 、 wg3 等)。然后可以利用 ifconfig(8) 或 ip-address(8) 正常配置该网络接口,并利用 route(8) 或 ip-route(8) 添加和删除其路由,以及全部普通网络实用步伐都是如此。接口的特定 WireGuard 方面利用 wg(8) 工具进行配置。该接口充当隧道接口。
WireGuard 将隧道 IP 地点与公钥和远程端点相关联。当接口向peer发送数据包时,它会实行以下操作:
- 该数据包适用于 192.168.30.8。那是哪位peer啊?让我看看…好吧,这是给peer ABCDEFGH 的。 (大概,如果它不适合任何已配置的peer,则丢弃该数据包。)
- 利用peer ABCDEFGH 的公钥加密整个 IP 数据包。
- Peer ABCDEFGH 的远程端点是什么?让我看看…好的,端点是主机 216.58.211.110 上的 UDP 端口 53133。
- 利用 UDP 通过 Internet 将步调 2 中的加密字节发送到 216.58.211.110:53133。
当接口收到数据包时,会发生以下环境:
- 我刚刚从主机 98.139.183.24 上的 UDP 端口 7361 收到一个数据包。让我们来解密吧!
- 它为peer LMNOPQRS 正确解密和验证。好的,让我们记着,peer LMNOPQRS 的最新 Internet 端点是利用 UDP 的 98.139.183.24:7361。
- 解密后,明文数据包来自 192.168.43.89。是否允许peer LMNOPQRS 以 192.168.43.89 向我们发送数据包?
- 如果是,则在接口上接受数据包。如果没有,就放弃它。
WireGuard 的核心是一个称为加密密钥路由的概念,它的工作原理是将公钥与隧道内允许的隧道 IP 地点列表相关联。每个网络接口都有一个私钥和一个peer点列表。每个peer都有一个公钥。公钥短小且简单,由peer用来相互验证。它们可以通过任何带外方法通报以在配置文件中利用,类似于将 SSH 公钥发送给朋友以访问 shell 服务器的方式。
1.4 WireGuard安装
wireGuard官方安装教程
2 WireGuard组网实现内网穿透
2.1 条件条件
- 公网服务器: 必须拥有一台具有公网IP地点的服务器,这是内网穿透的关键。该服务器充当中转站,负责将外部请求通报到内部网络。
- 网络设备配置权限: 需要对内部网络的路由器或防火墙有一定的配置权限,以便进行端口映射或其他必要的网络设置。这确保了从公网服务器到内网的连接是有效的。
- 安装WireGuard: 在公网服务器和内网设备上都需要安装和配置WireGuard软件。确保两端的WireGuard配置同等,包括公私钥的天生和网络接口的配置。
- 开启相应端口: 在公网服务器的防火墙配置中,需要打开WireGuard所利用的端口(默认是51820/UDP),以确保能够接收来自内网设备的连接请求。
- 合适的网络拓扑: 确保了解内部网络的拓扑布局,以便正确设置WireGuard配置,包括允许流量通过的子网、路由等。
2.2 网络拓扑布局
2.3 具体步调
2.3.1 中继服务器配置
- 创建密钥对
wg genkey | tee server_privatekey | wg pubkey > server_publickey
实行以上两条命令后,会在实行命令的当前文件夹自动天生2个文件:
- 开启IP地点转发
sudo sysctl net.ipv4.ip_forward
如果显示1则说明已开启,否则则未开启。
- echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
- echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
- sysctl -p /etc/sysctl.conf
复制代码 - 设置IP地点伪装
- # 允许防火墙伪装IP
- firewall-cmd --add-masquerade
- # 检查是否允许伪装IP
- firewall-cmd --query-masquerade
- # 禁止防火墙伪装IP
- firewall-cmd --remove-masquerade
复制代码 - 配置wireguard虚拟网卡(不推荐,只是让读者直观了解过程)
- sudo ip link add wg0 type wireguard # 添加一块叫 wg0 的虚拟 wireguard 网卡
- sudo ip addr add 192.168.71.1/24 dev wg0 # 给 wg0 网卡添加 ip 地址 192.168.71.1,子网掩码 255.255.255.0
- sudo wg set wg0 private-key ./server-privatekey # wireguard 设置密钥
- sudo ip link set wg0 up # 启用刚刚添加的网卡
复制代码 我们可以通过ip addr命令查看到wg0网卡的状态
可以看到网卡wg0 接口是已启用的,具有 IPv4 地点 192.168.71.1
输入wg命令则可以看到配置信息,配置文件通常在/etc/wireguard/目录中
有想继续尝试这种方式的可以看一下官方教程
- 编写配置文件配置网卡(推荐,应该wg set命令需要提供许多参数,很容易出错)
我们在/etc/wireguard目录中创建wg0.conf并编写配置,配置项请看2.4 配置项说明
- [Interface]
- # 本机密钥
- PrivateKey = KIDTljv66CgVYBNlrSD13Au6qfUdIcFJkTBkuErhTEk=
- # 本机地址
- Address = 192.168.71.1/24
- # 监听端口
- ListenPort = 51820
- [Peer]
- # 对端的publickey
- PublicKey = iWy57DmR6wVXcVzMDOa2WyywO0WT5JRAGYIlh0v/nW8=
- # 对端地址
- AllowedIPs = 192.168.71.2/24
复制代码 - 重新启动网卡
- sudo wg-quick down wg0
- sudo wg-quick up wg0
复制代码 2.3.2 其他peer
我这里只列举MacOS的操作方式(其他都同理,就是要配置私钥和公钥)
操作完之后,它会给出密钥对,我们只需要添加好其他信息即可。
配置文件如下:
- [Interface]
- # 本机密钥
- PrivateKey = kDUqWzkbaB1EU5C2ADoId1TXtZF89xxn0VV45EcjFHs=
- # 本机地址
- Address = 192.168.71.2/24
- [Peer]
- # 对端公钥,即公网服务器公钥
- PublicKey = bEm1p736FQySfKlTTUCeHmiwTmna5umZWOWLGWqioSk=
- # 允许此对等方的传入流量并指定传出流量的目标。
- AllowedIPs = 192.168.71.0/24
- # 公网IP+监听端口号
- Endpoint = 1.1.1.1:51820
- PersistentKeepalive = 25
复制代码 2.3.3 测试
MacOS端:
服务器Ping 主机:
2.4 WireGuard配置文件说明
- interface部分:
- PrivateKey: 由 wg genkey 天生的 Base64 编码的私钥。必须配置。
- ListenPort: 用于监听的 16 位端口。可选,如果未指定,则随机选择端口。
- DNS: 指定 DNS 服务器的 IP 地点。
- FwMark: 用于传出数据包的 32 位 fwmark。如果设置为 0 或 “off”,则禁用此选项。可选。可以以十六进制形式指定,比方,以 “0x” 开头。可选。
- Peer 部分:
- PublicKey: 由 wg pubkey 根据私钥计算的 Base64 编码的公钥。必须配置。
- PresharedKey: 由 wg genpsk 天生的 Base64 编码的预共享密钥。可选,可以省略。此选项为现有的公钥加密提供了额外的对称密钥加密层,以增强对抗后量子计算的本领。
- AllowedIPs: 逗号分隔的 IP 地点(IPv4 或 IPv6)列表,带有 CIDR 掩码,用于允许此对等方的传入流量并指定传出流量的目标。可以多次指定。可用 0.0.0.0/0 匹配全部 IPv4 地点,利用 ::/0 匹配全部 IPv6 地点。
- Endpoint: 一个 IP 地点或主机名,后跟冒号,然后是一个端标语。此端点将自动更新为来自对等方的正确经过身份验证的数据包的最新源 IP 地点和端口。可选。
- PersistentKeepalive: 保持活跃的时间间隔,介于 1 和 65535 之间,表示多久发送一次对等方的身份验证空数据包,以保持有状态的防火墙或 NAT 映射的有效性。如果设置为 0 或 “off”,则禁用此选项。可选,默认环境下此选项被禁用。
下面是一个简单的配置文件示例:
- [Interface]
- PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
- ListenPort = 51820
- [Peer]
- PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
- Endpoint = 192.95.5.67:1234
- AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
- [Peer]
- PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
- Endpoint = [2607:5300:60:6b0::c05f:543]:2468
- AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
- [Peer]
- PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
- Endpoint = test.wireguard.com:18981
- AllowedIPs = 10.10.10.230/32
复制代码 3 WireGuard工具
3.1 wg-easy
github地点
这是一个用于管理 WireGuard 设置的 Web 用户界面。利用它之前我们得先安装docker和docker-compose。这里我给出docker-compose.yml配置文件示例。还有许多配置项可在仓库中找到,机动配置VPN
- version: '3'
- services:
- wg-easy:
- image: weejewel/wg-easy
- container_name: wg-easy
- environment:
- - WG_HOST=YOUR_SERVER_IP # 公网IP
- - PASSWORD=YOUR_ADMIN_PASSWORD # Web UI登录密码
- - WG_PORT=51820 # 监听端口
- - WG_PERSISTENT_KEEPALIVE=25 # 保持“连接”打开的值(以秒为单位)
- - WG_DEFAULT_ADDRESS=192.168.71.0 # 客户端 IP 地址范围
- - WG_ALLOWED_IPS=192.168.71.0/24 # 客户端将使用的允许 IP
- volumes:
- - ~/.wg-easy:/etc/wireguard
- ports:
- - 51820:51820/udp
- - 51821:51821/tcp
- cap_add:
- - NET_ADMIN
- - SYS_MODULE
- sysctls:
- - net.ipv4.conf.all.src_valid_mark=1
- - net.ipv4.ip_forward=1
- restart: unless-stopped
复制代码 通过docker compose up -d摆设好后,我们进入Web界面即可添加Client。
这里,我们只需要将这三个配置文件分给对应的Client的即可完成网络搭建,特别方便!
3.2 wg-gen-web
wg-gen-web
跟wg-easy类似,不过功能更强盛。
3.3 dsnet
github地点
一款用于管理会合式wireguard VPN 的FAST 命令。
官网配置教程
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |