背景:
上一篇谈了如何在两个节点间创建WireGuard隧道。在只有2个节点的情况下,这个方式是合适的。在实际部署过程中,很可能是一个服务器节点对应多个客户端节点,这样需要在每个客户端节点生成公钥私钥并创建配置文件,这是一个重复无趣的过程。好在我们有Docker,一切都变得简单,而且使用Docker,还能自动部署设置DNS。这一篇就来谈谈如何通过Docker快速部署WireGuard。
实现步骤(以下在Ubuntu20.04.3LTS版下实际操作过,其他Linux版本未作测试):
- 先创建一个新用户kelemi,所有步骤都以该用户操作(非必须)。sudo useradd -m -s /bin/bash kelemisudo usermod -a -G sudo kelemisudo passwd kelemi
- 安装Docker 和 Docker compose。(本步骤参考官方文档,请您最好也参考官方文档操作,您阅读时官方文档可能已有修改)更新APT包索引并安装包以允许APT通过 HTTPS 使用存储库:sudo apt-get updatesudo apt-get install ca-certificates curl gnupg lsb-release添加 Docker 的官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg设置稳定存储库:echo \”deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装Docker引擎:sudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io安装Docker Compose:sudo curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose添加可执行权限及创建软链接:sudo chmod +x /usr/local/bin/docker-composesudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose - 将当前用户加入docker组,避免每次输docker命令需要sudo:sudo usermod -aG docker $USERnewgrp docker #更新组成员
- 测试Docker和Docker compose安装正常docker run hello-worlddocker-compose version
- 以上,完成了Docker和Docker-compose的安装,下面进入主题。
- 创建wireguard-server文件夹,并设定当前用户kelemi为所有者,避免出现权限问题。sudo mkdir /opt/wireguard-serversudo chown kelemi:kelemi /opt/wireguard-server/
- 生成docker-compose.yaml文件。cd /opt/wireguard-servervim docker-compose.yaml该yaml文件该如何配置呢?我们可以复制模板文件,再在模板上修改。本次拟用的docker是 linuxserver/wireguard,所以 在hub.docker.com中找到该镜像,查看文档,复制yaml文件模板如下:
—version: “2.1”services: wireguard: image: lscr.io/linuxserver/wireguard container_name: wireguard cap_add: – NET_ADMIN – SYS_MODULE environment: – PUID=1000 – PGID=1000 – TZ=Europe/London – SERVERURL=wireguard.domain.com #optional – SERVERPORT=51820 #optional – PEERS=1 #optional – PEERDNS=auto #optional – INTERNAL_SUBNET=10.13.13.0 #optional – ALLOWEDIPS=0.0.0.0/0 #optional volumes: – /path/to/appdata/config:/config – /lib/modules:/lib/modules ports: – 51820:51820/udp sysctls: – net.ipv4.conf.all.src_valid_mark=1 restart: unless-stopped根据实际情况,修改模板标红的几行,说明:PUID/PGID:当前用户的ID,用id kelemi查询,这里是1001
PEERS:表示生成几个客户端,这里暂保持1,后面将说明如何添加PEERDNS:代表客户端指向的DNS,如果保持auto,将在服务器端预设置一个DNS服务器,客户端的DNS将指向服务器Restart:改成always,为了能使它一直运行Volumes:容器映像路径要确保有权限修改后的docker-compose.yaml截图如下: - 启动docker-compose,加上参数d表示后台运行docker-compose up -ddocker会自动从hub.docker.com上拉取image,完成之后启动该image的容器。
- 查看容器运行情况
- 查看容器里的wireguard运行情况,发现已自动生了一个对端节点peer。
- 在当前目录下,可以看到新建了一个config文件夹,里面有:wg0.conf文件,这是服务器的配置coredns 文件夹,这是该wireguard容器中自动生成运行的DNS服务器peer1文件夹,对端节点相关文件server文件夹,服务器相关文件template文件夹等。
- 可以看到,wg0.conf文件只允许用户kelemi读写,其他任何人都无法查看。进入server文件夹,也能看到相应的权限设置。这样就有效保护了wireguard配置的安全性。cd server && ls -lSsha
- 关键点来了:客户端想要连到该服务器,只需复制相应的配置过去即可,非常方便!!我们可以查看peer1文件夹,能看到已帮我们生成了4个文件,包括配置文件,二维码图标,公钥私钥文件。配置文件也自动帮我们写好了公钥私钥、主机地址、DNS、端点信息等。
- 下面我们来看看如何配置客户端:
- WireGuard支持各种客户端,可以进入官方主页查看安装方法https://www.wireguard.com/install本次也以ubuntu20.04.3LTS为例测试,测试客户端IP是 10.160.128.17
- 安装wireguard软件包,同时也安装resolvconf包,该包在wireguard解释DNS里需要。sudo apt install wireguard resolvconf
- 将服务器端生成的peer1.conf复制到客户端。scp peer1.conf kelemi@10.160.128.17:~/peer1.conf
- 再到客户端将peer1.conf移到正确的位置。sudo mv peer1.conf /etc/wireguard/wg0.conf
- 启动wireguardwg-quick up wg0
- 检查是否连接。客户端查:sudo wg服务器查:docker exec -it wireguard wg
能看到握手已连接。 - 上面步骤用docker连了一个客户端,如果想增加用户怎么办?如果增加的用户是手机用户怎么做?也是非常方便的,follow me!
- 转到服务器端修改docker-compose.yaml。比如想增加客户端2个,只需将PEERS改成2即可。然后重建一下:docker-compose up -d –force-recreate
- 检查发现config文件夹下已新建了一个peer2文件夹,相关配置都已生成了。
- 手机用户可以去应用市场下载wireguard。本步骤略。
- 服务器端可以展示二维码。2表示是peer2。docker exec -it wireguard /app/show-peer 2屏幕上出现了二维码。
- 用手机wireguard扫描一下,即可完成配置,并连到wireguard服务器。一切都那么完美!!!
后记:技术人员经常需要查资料,当碰到百度搜索到的资料是那么的不靠谱时,我们都会怀念谷歌,谷歌的通用搜索、专业搜索不知甩了百度几条街。相信能读懂本文的人都有办法用上谷歌,这里不能详细说明。