远程访问局域网设备通常采用内网穿透或VPN隧道。WireGuard是一种采用UDP协议的新型VPN技术。WireGuard提供的是节点与节点的网络连接形式,除了可以实现传统VPN以服务器为网关的星型拓扑结构,还可以节点与任意其他节点进行连接,实现节点间的全互联,解决了单一网关导致的网络瓶颈。
AlmaLinux为CentOS停止维护后的继承者,是Red Hat的下游版本,拥有10年生命周期。本次实验采用AlmaLinux安装Docker来实现WireGuard的部署。
目录
三、安装WireGuard(Place1/wg-access-server项目)
WireGuard跨区域组网需要至少一台机器具有公网IP或在局域网内组网。如果仅有一台机器具备公网IP(可为云服务器),想要组建跨地域局域网,只能采用单一网关的星型拓扑结构,本实验将演示该情况下的跨地域组网。
一、AlmaLinux配置
1.配置阿里云镜像源
配置方法参考:almalinux镜像源配置 - 阿里巴巴开源镜像站
2.更新系统应用
终端内执行以下命令:
dnf upgrade -y
reboot
3.配置密钥远程登录
1)密钥文件产生
法一:云服务提供商后台管理面板直接生成.pem的密钥文件。将.pem文件Load到puttygen.exe软件中。复制“Public key for pasting into OpenSSH authorized_keys file”文本框里的公钥。点击Save private key,保存.ppk的私钥文件用于后续登录。
法二:打开puttygen.exe软件,密钥类型选择RSA,点击Generate按钮,产生过程中不停晃动鼠标直至产生完毕。复制“Public key for pasting into OpenSSH authorized_keys file”文本框里的公钥。点击Save private key,保存.ppk的私钥文件用于后续登录。
2)Putty密钥登录
① 配置登录信息
![](https://i-blog.csdnimg.cn/blog_migrate/4f6326c8729bf69f509c429087c1188a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4b694e96ba9a65064e3041ae253cb259.png)
![](https://i-blog.csdnimg.cn/blog_migrate/abf63fe578521f8ef4c907cc9b8f2918.png)
② 点击Open按钮即可登录。
二、安装Docker
1. 方法一:通过宝塔面板安装
1)防火墙配置:宝塔面板从CentOS 7开始只支持firewalld防火墙。关闭iptables并开启firewalld。
systemctl stop iptables
systemctl disable iptables
systemctl start firewalld
systemctl enable firewalld
2)面板安装:
安装方法:宝塔面板下载和安装
复制CentOS安装脚本进行安装即可。
【注意】需在服务器安全组放通宝塔面板管理页面端口
3)Docker安装:登录面板后,前往 软件商店,安装 Docker管理器。
后续Docker的使用可以直接在宝塔面板内可视化管理,也可在终端中使用docker命令管理。
2. 方法二:终端直接安装
官方指导文档:Install Docker Engine on CentOS | Docker Documentation
1)启动防火墙
systemctl stop iptables
systemctl disable iptables
systemctl start firewalld
systemctl enable firewalld
2)安装docker
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
3)启动docker
systemctl start docker
systemctl enable docker
4)docker管理常用命令
# 查看所有容器
docker ps -a
# 删除指定的容器(<dockerID>替换实际的容器ID)
docker rm <dockerID>
# 查看镜像
docker images
# 删除指定的镜像(<imageID>替换实际的镜像ID)
docker rmi <imageID>
# 查看前1000行日志(法1)
docker logs --tail=1000 <dockerID>
# 查看前1000行日志(法2)
cat /var/lib/docker/containers/<dockerID>/<dockerID>-json.log
# 清除日志
cat /dev/null > /var/lib/docker/containers/<dockerID>/<dockerID>-json.log
三、安装WireGuard(Place1/wg-access-server项目)
项目地址:https://github.com/Place1/wg-access-server
配置说明:Configuration - wg-access-server
1. 安装
终端中运行以下命令:
docker run -d \
--cap-add NET_ADMIN \
--device /dev/net/tun:/dev/net/tun \
-v wg-access-server-data:/data \
-e "WG_ADMIN_USERNAME=admin" \
-e "WG_ADMIN_PASSWORD=123456" \
-e "WG_WIREGUARD_PRIVATE_KEY=xxxxxxxx" \
-e "WG_PORT=51821" \
-e "WG_WIREGUARD_PORT=51820" \
-e "WG_VPN_CIDR=10.0.32.0/24" \
-e "WG_VPN_ALLOWED_IPS=0.0.0.0/0, ::/0" \
-e "WG_LOG_LEVEL=info" \
-e “WG_VPN_GATEWAY_INTERFACE=eth0” \
-p 51821:51821/tcp \
-p 51820:51820/udp \
--restart unless-stopped \
--privileged=true \
place1/wg-access-server
【配置说明】(红色部分对应的配置必须修改)
① 14~15行配置端口映射,:前为宿主机端口,:后为容器内端口。14行为管理面板的TCP端口,15行为WireGuard的UDP端口。宿主机端口需在服务器安全组放通。
② 16行用于开机自启动容器
③ 5~13行配置容器的环境变量,5~6行配置管理面板的用户名密码,7行为服务器私钥(可安装WireGuard的windows客户端,新建空隧道自动产生一个)。8~9行为容器内的管理面板TCP端口、WireGuard的UDP端口(建议此端口容器内和宿主机一致,否则在Web面板生成的客户端配置文件端口号是容器内的,需要手动改为宿主机的才能正确连接)。10行为客户端IP地址段。11行为允许访问的目标IP段。12行为全局日志级别。13行为WireGuard网关流量转发接口,需更改为宿主机的外网接口(可在终端内执行ifconfig命令,来查看外网接口名)。
2. 检查容器运行状态
docker ps -a
如果运行状态中为Up,则表明容器运行正常。如果运行状态中一直为Restarting,则需要进一步从日志中检查错误原因。(详见 五、容器运行异常排查)
3. 端口放通
在服务器安全组中,放通TCP和UDP端口。本例中WireGuard管理面板为TCP (51821),WireGuard为UDP (51820)。
4. 访问管理面板
管理面板地址:http://服务器公网IP:管理面板TCP端口号(本例端口为51820)
输入配置的用户名和密码登入管理面板(本例为admin/123456)
四、客户端配置
WireGuard应用下载:https://www.wireguard.com/install/
1. 配置信息生成
在WireGuard管理面板中,输入设备名称后点击 “Add” 添加设备。
2. 导入配置信息
电脑客户端直接下载配置文件,在WireGuard应用内新建隧道,将配置文件导入至隧道。手机客户端直接扫码即可添加节点。
![](https://i-blog.csdnimg.cn/blog_migrate/3d149ec3917496fcd9beff21687c36b9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/56c0f8ea7c2ed1d5592ecaba47aa2e1a.png)
3. 连接建立:
1)点击 连接 按钮即可使能当前节点。
2)在Windows系统中打开CMD命令提示符,通过Ping其他节点,如果Ping正常即表明连接正常(注意:如果Ping的是Windows节点,则需要正确配置Windows系统防火墙或暂时关闭)。
![](https://i-blog.csdnimg.cn/blog_migrate/73419334d619c352e7d7253c30c1bfbe.png)
五、容器运行异常排查
1. 查看Docker容器运行日志:
1)记录对应容器的ID
docker ps -a
![](https://i-blog.csdnimg.cn/blog_migrate/f17de851316f03aa24116ab5009728d0.png)
2)查看docker日志,根据日志错误情况进行解决。
docker logs <dockerID>
2. 错误处理
下面仅提供一种错误的解决办法,其他错误自行查找资料。
错误:exit status 3: iptables v1.8.3 (legacy): can't initialize iptables table `filter': Table does not exist (do you need to insmod?) Perhaps iptables or your kernel needs to be upgraded.
解决:加载内核模块iptable_filter;或升级Linux Kernel内核。
参考:加载内核,iptable防火墙相关;centos上docker无法启动 | 宋祎超
内核的阿里云镜像:linux-kernel安装包下载_开源镜像站-阿里云
步骤:
方法一:加载内核模块iptable_filter
[root@localhost ~]# modprobe iptable_filter
[root@localhost ~]# lsmod | grep ip
iptable_filter 16384 0
ip_tables 28672 1 iptable_filter
nf_defrag_ipv6 24576 1 nf_conntrack
nf_defrag_ipv4 16384 1 nf_conntrack
开机自动加载
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
[root@localhost ~]# echo modprobe iptable_filter>>/etc/rc.local
若无效,尝试法二。
法二:重新编译内核
1)获取内核文件
找到合适版本或最新版本:https://mirrors.aliyun.com/linux-kernel/v5.x/linux-5.19.4.tar.gz
终端执行:
wget https://mirrors.aliyun.com/linux-kernel/v5.x/linux-5.19.4.tar.gz
tar -xvf linux-5.19.4.tar.gz
2)配置内核选项
cd linux-5.19.4
make menuconfig
按《参考:centos上docker无法启动》链接内容的说明设置好配置选项并保存。
如果提示Unable to find the ncurses package. 则按照提示安装ncurses-devel 或 libncurses-dev其中一个即可。
3)编译模块(约需要2小时)
make clean
make modules -j 8 # 8核编译
4)安装模块
make modules_install
【提示】如果安装模块时,出现以下错误,则需要检查编译是否顺利完成。
sed: can't read modules.order: No such file or directory
make: *** [Makefile:1478: __modinst_pre] Error 2
可留意编译过程中的错误输出信息,或者重新执行make modules -j 8进行模块编译,将会直接打印错误信息。如果编译的错误信息为:
make[1]: *** No rule to make target 'certs/rhel.pem', needed by 'certs/x509_certificate_list'. Stop.
则编辑 linux-5.19.4 目录里的 .config 文件:
vim .config
在vim编辑器内,查找并注释掉以下内容:
#CONFIG_SYSTEM_TRUSTED_KEYS="certs/rhel.pem"
#CONFIG_DEBUG_INFO_BTF=y
保存后输入make modules -j 8重新编译即可。执行命令后如有选项则直接回车保持默认,直到屏幕显示开始编译。
5)编译并安装内核
make bzImage
make install
6)生效配置
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
7)查看内核版本是否已更新
uname -r
8)查看docker容器是否已经处于up状态
docker ps -a