使用Wireguard搭建全流量代理

使用Wireguard搭建全流量代理

S1eepy Amon OSCP Certified

前言

本文主要介绍一下之前在Ubuntu和Windows上搭建Wireguard组建内网代理的流程。(本文是已经完成配置后重新编写,流程基本靠回忆,没有再进行第二次测试,若有任何问题可以留言让我更改错误)

来段GPT介绍:Wireguard是一种简单、高效、现代化的虚拟专用网络(VPN)协议,旨在为用户提供高速、简洁且安全的网络通信方式。WireGuard 使用了现代、强大的加密算法来确保数据传输的安全性。这些算法被选择是因为它们在性能和安全性上达到了很好的平衡,相比于传统 VPN它具有更好的性能。

搭建环境:

  • 一台Ubuntu作为服务端(中继节点)
  • 一台Windows作为客户端(Peer节点)

Wireguard协议中,中继节点使用一台服务器来整合所有对等节点的流量并将其路由到互联网,从而实现虚拟专用网络(VPN)连接。对等节点是指使用 WireGuard 协议的客户端设备,它们之间可以直接通信,而无需通过中继节点。对等节点可以是任何支持 WireGuard 协议的设备,例如计算机、手机、路由器等等。在 WireGuard 中,中继节点和对等节点的配置方式也略有不同。简单来说可以将中继节点理解为服务端,Peer节点理解为客户端

环境配置

中继节点配置

确保关闭ufw

由于本人是在ubuntu上20.04上进行中继节点的配置,因此需要首先关闭ubuntu自带的防火墙ufw

1
sudo ufw disable

安装Wireguard

1
sudo apt update && sudo apt install wireguard

生成密钥对

1
2
3
4
sudo mkdir /etc/wireguard
cd /etc/wireguard
wg genkey | tee privatekey
wg pubkey < privatekey > publickey

中继节点生成的私钥会保存在/etc/wireguard/privatekey中,公钥为/etc/wireguard/publickey

编写Wireguard配置

配置文件可以放置在任何路径下,但是启动时需要指定绝对路径,本人在此放置的配置文件名为/etc/wireguard/wg0.conf,其中wg0是之后会新建的网卡设备名

文件内容如下

1
2
3
4
5
6
7
[Interface]
Address = 192.168.105.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 53
PrivateKey = {中继节点的私钥,即刚才生成的私钥}

注意事项1:上述文件大部分都可以自定义,但是ListenPort这里如果要进行全流量代理,则必须设置为53,而设置53时会出现和Ubuntu自带的dns解析冲突,需要简单解决一下

1
2
3
4
5
# 关闭ubuntu自带的dns解析
systemctl stop systemd-resolved
# 修改dns解析服务器
vim /etc/resolved.conf
# 将/etc/resolved.conf的解析地址只保留一行 namerserver 114.114.114.114,其余全部注释

注意事项2:文件中的eth0网卡需要改为自己的网卡,ifconfig或者ip -o -4 route show to default | awk '{print $5}'都可以查看

之后还会对该文件添加Peer节点,但是暂时先写到这里,需要添加时再回来

配置内核参数

为了让 WireGuard 中继节点转发数据包,需要设置内核参数 net.ipv4.ip_forward=1 和 net.ipv4.conf.all.proxy_arp=1。其中,net.ipv4.ip_forward=1 允许 Linux 内核将数据包从一个网络接口转发到另一个网络接口,net.ipv4.conf.all.proxy_arp=1 则允许 Linux 内核在本地网络中拦截 ARP 请求并向请求方提供本地主机的 MAC 地址,从而实现数据包的转发。流程如下

1
sudo vim /etc/sysctl.conf

文件内查找如下内容进行修改

1
2
net.ipv4.ip_forward=1
net.ipv4.conf.all.proxy_arp = 1

生效配置

1
sudo sysctl -p /etc/sysctl.conf

Wireguard,启动!

1
2
3
4
5
6
7
8
// 执行命令
sudo wg-quick up wg0
// 输出结果
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.100.5/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

可以通过如下命令检测wireguard的状态

1
2
3
4
5
6
7
8
// 执行命令
sudo wg show wg0
// 输出结果
interface: wg0
public key: {你的公钥}
private key: (hidden)
listening port: 51820
fwmark: 0xca6c

设置Wireguard开机自启

1
sudo systemctl enable wg-quick@wg0.service

Peer节点配置

之后本人是在Windows上配置的Peer节点,因此后面命令均在Windows上运行,若要在Ubuntu等Linux机器上运行,可参考下方参考文献的方案(本质区别不大)

在Windows上安装Wireguard

Windows安装十分简单,直接去官网 下载就好,安装完毕后命令行应该也会自动添加进来(我不记得是否有环境变量这一步了,似乎安装时会自动添加到环境变量,如果没有手动加一下就行)

在powershell输入wg -h可以查看安装信息,会提示Available subcommands

Peer节点生成密钥对并配置

1
2
3
4
mkdir C:\\User\\[Username]\\.wireguard
cd C:\\User\\[Username]\\.wireguard
wg genkey | tee privatekey
wg pubkey < privatekey > publickey

生成的私钥将保存在 C:\\User\\[Username]\\.wireguard\\privatekey 中,公钥将保存在 C:\\User\\[Username]\\.wireguard\\publickey 中。

编写Wireguard配置

同样随便找个路径写个wg0.conf,内容如下

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = {Peer节点的私钥}
Address = 192.168.105.2/24

[Peer]
PublicKey = {中继节点的公钥}
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1
Endpoint = {中继节点的公网IP}:53
PersistentKeepalive = 21

这里需要注意的是Peer下的AllowIPs,设置这两个IP的意思是进行全流量代理。另外注意Endpoint的端口是53

完成编写后直接打开Wireguard软件导入隧道即可,Windows下点点就行,就不做演示了(懒得截图是这样的)

将Peer节点添加到中继节点

现在又要回到中继节点Ubuntu,将我们刚刚生成的公钥添加到中继节点上,在Ubuntu上sudo vim /etc/wireguard/wg0.conf

1
2
3
4
5
6
7
8
9
10
11
[Interface]
Address = 192.168.105.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
ListenPort = 53
PrivateKey = {中继节点的私钥}

[Peer]
PublicKey = {Peer节点的公钥}
AllowedIPs = 192.168.105.2/32

注意编辑的时候记得先在ubuntu上关闭wireguard,运行sudo wg-quick down wg0,不然正运行时写入不会保存进去

编辑完毕后重新启动sudo wg-quick up wg0,然后使用sudo wg show查看状态,确保Peer节点已经添加进入

1
2
3
4
5
6
7
8
9
10
11
interface: wg0
public key: {中继节点公钥}
private key: (hidden)
listening port: 51820
fwmark: 0xca6c

peer: {Peer 节点公钥}
endpoint: {Peer 节点公网IP}:64886
allowed ips: 192.168.100.2/32
latest handshake: 1 minute, 44 seconds ago
transfer: 40.12 KiB received, 10.00 KiB sent

最终测试

在Windows上也点击连接后,若能二者能互相通过192.168.105.*进行ping即说明连接成功,然后就是根据一些查看IP地址的工具(比如在线网页或者学校的流量网关查看IP)进行测试是否进行了全流量代理

参考文献

  • Title: 使用Wireguard搭建全流量代理
  • Author: S1eepy Amon
  • Created at : 2024-09-08 15:50:05
  • Updated at : 2024-09-08 16:56:37
  • Link: https://s1eepy-amon.github.io/2024/09/08/Proxy/Wireguard/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments