Wireguard配合udp2raw的内网穿透方案

2023/04/08

背景

由于家里没有公网IP,想随时访问回家里的网络还是比较麻烦的,由于目前家里的服务器操作系统是 Ubuntu 20.04 LTS,里面搭建了一些常用的的开发环境,刚好手上也有云服务器,云服务器也是Ubuntu 20.04 LTS,刚好用来中转流量回到家庭局域网。找了下资料,决定用WireGuard来实现。

WireGuard 介绍

WireGuard ®是一种极其简单但快速的现代 VPN,它使用最先进的加密技术。它旨在比 IPsec更快、更简单、更精简和更有用,同时避免令人头疼的问题。它旨在比 OpenVPN 具有更高的性能。WireGuard 被设计为通用 VPN,用于在嵌入式接口和超级计算机上运行,适用于许多不同的环境。最初是为 Linux 内核发布的,现在是跨平台的(Windows、macOS、BSD、iOS、Android)并且可以广泛部署。它目前正在大力发展,但它可能已经被认为是业内最安全、最容易使用和最简单的 VPN 解决方案。

极高速加密原语和 WireGuard 存在于 Linux 内核中这一事实的结合意味着安全网络可以非常高速。它既适用于智能手机等小型嵌入式设备,也适用于满载的主干路由器。

关于更多的WireGuard的资料可以去WireGuard官网查看更多的信息以及原理

安装

由于我的服务器和客户端都是Ubuntu系统,所以两台机器都是同样执行一样的命令,其他的系统可以在其WireGuard官网安装指引以及WireGuard‘s Github上查看更多

# 安装 wireguard
$ sudo apt install wireguard resolvconf -y
# 查看一些是否开启了ipv4的转发 如果是1跳过下面
$ cat /proc/sys/net/ipv4/ip_forward

# 开启ipv4的内核转发
$ sudo sh -c 'echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf'
# 使配置生效
$ sudo sysctl -p
# 再次查看一些是否开启了ipv4的转发 如果是1跳过下面
$ cat /proc/sys/net/ipv4/ip_forward

配置

由于WireGuard都是通过非对称加密传输的,我们先用wg命令(安装完WireGuard就有了)来创建服务器的公私钥 以及客户端的公私钥,当然客户端的公私钥也可以在其他平台上介绍,到时候复制一下客户端的公钥过来就好了。

由于udp协议的原因,运营商总是会qos,所以我搭配了udp2raw使用,可以将udp模拟成tcp。所以可以在Github Release上下载并解压好文件,我放在**/opt/udp2raw**下

服务端的配置
$ cd /etc/wireguard/
#生成服务器私钥
$ wg genkey > server_priv.key
#通过服务器私钥生成服务器公钥
$ wg pubkey < server_priv.key > server_pub.key

#生成客户端的私钥
$ wg genkey > client_priv.key
#生成客户端的私钥
$ wg pubkey < client_priv.key > client_pub.key

$ cd /etc/wireguard

# 输出配置到文件
$ echo """

[Interface]
PrivateKey = $(cat server_priv.key) # 填写本机的privatekey 内容
Address = 172.16.100.1 #本机虚拟局域网IP

ListenPort = 10086 # 监听端口
DNS = 8.8.8.8
MTU = 1200
PreUp = /opt/udp2raw/udp2raw_amd64  -s -l0.0.0.0:10085 -r127.0.0.1:10086 -k "wireguard-udp2raw" --raw-mode faketcp -a > udp.log &
PostDown = killall udp2raw_amd64 || true
#注意eth0需要为本机网卡名称

[Peer] #Peer可以有很多个例如下面可以继续添加100.3 100.4
PublicKey = xxxxx
AllowedIPs = 172.16.100.2/32
""" > wg0.conf 

# 设置开机服务启动,后面的wg0就是配置的名字,可以根据自己去修改
$ sudo systemctl enable wg-quick@wg0
#启动wg0
$ sudo wg-quick up wg0
#关闭wg0
$ sudo wg-quick down wg0


# 打印一下信息,配置客户端使用
$ cat server_pub.key && cat client_priv.key
客户端的配置
# 输出配置到文件
$ echo """
[Interface]
PrivateKey = xxxxxxx # 填写服务器生成的client_priv.key的内容 通过服务器命令 cat client_priv.key 获取
Address = 172.16.100.2 #本机虚拟局域网IP
MTU = 1200
PreUp = /opt/udp2raw/udp2raw_amd64 -c -l0.0.0.0:10085 -r [服务器ip或者域名]:10086 -k "wireguard-udp2raw"  --raw-mode faketcp -a > udp.log &
PostDown = killall udp2raw_amd64 || true

[Peer]
PublicKey = xxxxxxx # 填写服务器生成的server_pub.key的内容  通过服务器命令 server_pub.key 获取
AllowedIPs = 176.16.100.0/24
Endpoint = 127.0.0.1:10085
PersistentKeepalive = 25 # 心跳保持 持久性keepalive
""" > wg0.conf 

查看结果

# 服务器或者客户端上执行如下命令
$ wg

interface: wg0
  public key: xxxxxxx
  private key: (hidden)
  listening port: 10011

peer: xxxxxx
  endpoint: 127.0.0.1:45114
  allowed ips: 172.16.100.2/32
  latest handshake: 52 seconds ago #这里有写着handshake握手代表成功
  transfer: 41.77 KiB received, 36.73 KiB sent