在Docker下部署Wireguard

最近需要经常上GitHub clone一些项目,但是学校的校园网不仅卡,有些时候GitHub根本上不去甚至卡死,我已经经常为这件事抓狂了,所以去Vultr上买了两个月的VPS搭个WireGuard服务器给自己用。

WireGuard服务器搭建本来是比较困难的,如果需要组网需要自己搭建一下网桥。而docker正好解决了这个问题,这次把这个内容放进GitHub里避免自己忘记。需要说明的是WireGuard不仅可以搭机场科学上网,也可以加上内网穿透给自己搭一个回家的VPN,这样可以直接在内网里访问家里的NAS或者是服务器,不需要公网IP也没有向公网暴露端口,总体上说还是不错的。

WireGuard优点挺多,比如加密协议简单且安全,可以直接运行Linux内核里,速度嘎嘎棒;当然缺点很多,比如用的是UDP协议,在国内这种QoS下丢包率感人,而且WireGuard很容易被识别封IP。如果要用的话最好只给自己用吧。

其实命令很简单,首先是在Linux下安装docker,比如Ubuntu和Debian(这些发行版软件源有docker软件包):

1
sudo apt install docker.io -y

或者是Fedora以及CentOS,要启动额外的软件源才能安装。

1
2
3
4
5
6
7
8
9
#先下载Repo
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo #使用官方的源
sudo dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/fedora/docker-ce.repo #使用国内镜像源
#换源
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
#安装
sudo dnf install docker-ce docker-ce-cli containerd.io
#启动docker daemon
sudo systemctl start docker --now

接下来只需要一条指令就可以启动了,最好放在一个bash脚本里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker run -d \
--name=wireguard \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-e SERVERURL=11.4.5.14 \
-e SERVERPORT=51820 \
-e PEERS=10 \
-e PEERDNS=auto \
-e INTERNAL_SUBNET=191.9.8.10 \
-e ALLOWEDIPS=0.0.0.0/0 \
-p 51820:51820/udp \
-v /opt/wireguard/config:/config \
-v /opt/wireguard/module:/lib/modules \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--restart unless-stopped \
linuxserver/wireguard

解释以下这里的几个选项:

  • name指定这个docker容器名称
  • SERVERURL指定服务器IP地址,可以用ip addr查询以下
  • SERVERPORT指定服务器的端口
  • PEERS指定节点数量,最好多留几个
  • INTERNAL_SUBNET指定内网地址,具体看自己习惯修改
  • -p指定端口和协议,与端口SERVERPORT一致
  • /opt/wireguard/config/opt/wireguard/module改成自己指定的本地文件夹,我是在/opt下创建的,可以自己做一些修改

执行完之后如果VPS有防火墙,记得放行一下刚刚指定的端口,接下来就是安装本地的WireGuard软件,Windows下可能比较难找到(因为WireGuard官网已经被墙了),Android可以在F-Droid商店里下载,Linux的话基本上每个发行版都有软件包,具体可以去查Wiki,这里讲一下在安卓下连接的方法。

在创建完服务器并开启之后,以之前的目录为例,用scp命令把服务器上/opt/wireguard/config/peer1/peer1.png下载到电脑上,然后用手机扫图片里的二维码就行了,如果服务器在内网还得重新修改一下远端IP地址(即Endpoint这一项),打开连接后出现“上次握手时间 现在”就说明连接成功了,如果是电脑的话下载/opt/wireguard/config/peer1/peer1.conf加进WireGuard配置里就行了。