基于虚拟化ESXI平台的ikuai与linux原生wireguard异地组网
大明2115
编辑于 2026年07月13日 11:57
Linux软件

本笔记旨在记录本人在 IT基础设施工程-全栈开发 工作中遇到的一些业务及实现方式

本教程是为了实现企业级网络重构与异地组网。内容包含物理设备,esxi虚拟化,ikuai部署配置,linux部署配置,wireguard配置,python自动化监控程序

不过本教程是大致记录,必然有细节缺失,有想法的网友可以在评论区进行讨论

1.物理设备

介绍:基于x99平台的设备,多核心能力强劲,可用于虚拟化和多开等,对于企业要求的软路由能力完全充足

要求:最好6网口及以上,用于多线路宽带负载均衡,也可下联多台交换机

本业务实际配置:

CPU:e5 2650 v4

网卡:6个40G光口网卡(3张物理网卡)及4个2.5G口板载网卡

2.ESXI安装

做好一个ventoy启动盘,放入esxi系统

在软路由机器中进入bios选择外部设备优先启动

启动进入ventoy界面,选择esxi按步骤进行安装

进入esxi,首先需要修改管理口并绑定一条上行链路,为其设置静态ip,将终端使用网线接入该管理口,修改终端的ip段与esxi处于同一局域网,然后访问esxi管理口ip即可访问web页面

进入esxi web页面后需要上传iso,在datastore中选择数据存储浏览器,新建目录,上传iso(ikuai与ubuntu),作为安装虚拟机的镜像

虚拟机创建,一定要勾选不启用uefi引导(否则无法安装系统),内存要勾选预留,cpu数量是逻辑数,而非物理数

选择创建虚拟机,选择对应的操作系统(ikuai选linux 5.x,ubuntu选ubuntu 64位,centos选对应的版本)

存储跳过

系统配置

cpu核心是逻辑占用,而非物理占用(分时复用),不要太高(调度问题),不要太低(性能低)

内存合适就好,要给esxi留足4g的空间,可以选择预分配,直接占用。

选择好之后即可创建并安装

3.硬件直通

这里选择将所有网口全部直通给ikuai,避免虚拟机的损耗,以获得接近物理硬件的性能提升

在管理-硬件中找到指定网络设备,勾选并切换为直通模式

在ikuai虚拟机中设备配置选择,选择添加PCI设备,网卡将被添加到虚拟机中

4.ikuai配置

首先是选定一个eth绑定lan,配置ip网段,用终端进行连接并访问web页面

然后在ikuai中进行wan,lan分配,dhcp配置,端口映射,DDNS配置,负载均衡配置

注意,虚拟机是会为ikuai给予一个虚拟网卡的,ubuntu也会被给予一张,相当于ikuai和ubuntu是链接在了同一台虚拟交换机中,当ikuai为该虚拟网口分配ip段,作为dhcp服务器时,ubuntu虚拟机将获得来自ikuai分配的ip

静态路由配置则是将去往对方局域网的下一跳ip设置为ubuntu的ip,让wg可以获取去往对端的请求并在加密后进行转发

ddns则是为ikuai的某条公网ip配置一个域名,让对端可以进行访问

5.ubuntu配置

在安装好ubuntu虚拟机后,进行如下基础配置

代码块
PlainText
自动换行
复制代码
sudo apt update && sudo apt upgrade -y

sudo apt install wireguard -y

sudo ufw allow ssh               #允许ssh远程连接

sudo ufw allow 51820/udp    # 放行 WireGuard 端口 (UDP)
复制成功

在ubuntu中安装好wireguard后即可进行下一步

6.wireguard配置

代码块
PlainText
自动换行
复制代码
sudo -i 							# 进入管理员模式

cd /etc/wireguard				

wg genkey | tee privatekey | wg pubkey > publickey	# 生成公钥和私钥

cat /etc/wireguard/privatekey				# 查看私钥

cat /etc/wireguard/publickey				# 查看公钥

vim /etc/wireguard/wg0.conf				# 创建配置文件
复制成功

文件配置内容

代码块
PlainText
自动换行
复制代码
[Interface]

PrivateKey = <A的私钥>

Address = 10.0.9.1/24

ListenPort = 51820

PostUp = sysctl -w net.ipv4.ip_forward=1	#临时开启内核数据包转发,否则流量进来出不去

[Peer]

PublicKey = <B的公钥>

AllowedIPs = 10.0.9.2/32, 192.168.248.0/24	



[Interface]

PrivateKey = <B的私钥>

Address = 10.0.9.2/24

PostUp = sysctl -w net.ipv4.ip_forward=1

[Peer]

PublicKey = <A的公钥>

AllowedIPs = 10.0.9.1/24

Endpoint = 192.168.150.38:51820	#服务端的ip与端口,服务端ikuai需要通过域名映射端口到下面linux ip

PersistentKeepalive = 10
复制成功

端点也可以如下配置,先使用本地ip快速启动wg,然后postUp会修改为真正的端点进行连接

代码块
PlainText
自动换行
复制代码
#在wg启动后修改peer

PostUp = wg set wg0 peer <对端的公钥> endpoint xxx.com:51820

#修改端点为本地,快速启动wg

Endpoint = 127.0.0.1:51820
复制成功

使用如下命令来管理wg隧道

代码块
PlainText
自动换行
复制代码
sudo wg-quick up wg0				# 开启隧道wg0

sudo wg-quick down wg0				# 关闭wg0

sudo wg show						# 展示wg状态

sudo systemctl enable wg-quick@wg0	# 将隧道wg0设置为开机自启	
复制成功

由于B端是主动连接方,如果A断电重启,A的公网ip变化,B端有可能还在使用原来的ip去连接,导致隧道不通

因此如下在B端创建定时任务,每分钟检测一次隧道是否连通,否则直接关闭重启隧道,这样就会使用新的ip去连接

1.创建定时任务文件

代码块
PlainText
自动换行
复制代码
sudo vim /etc/wireguard/check_wg_reconnect.sh
复制成功

2.写入定时任务代码

代码块
PlainText
自动换行
复制代码
TARGET_IP="10.0.9.1"

 if ! ping -c 3 -W 2 $TARGET_IP > /dev/null 2>&1; then

    echo "$(date): Ping $TARGET_IP 失败,正在重新解析域名并重启 $WG_INTERFACE..." >> /etc/wireguard/reconnect.log

	sudo wg-quick down wg0		# 关闭wg

	sudo wg-quick up wg0			# 开启wg

fi
复制成功

3.添加定时任务

代码块
PlainText
自动换行
复制代码
sudo crontab -e												#进入root的crontab

* * * * * /bin/bash /etc/wireguard/check_wg_reconnect.sh	#添加到crontab文件,每分钟执行一次
复制成功

在配置好之后,即可互ping测试联通性,在联通没有问题之后进行下一步自动化

7.python自动化

由于手动命令控制wg比较繁琐不便,且无法实时监控流量大小,所以可以编写一个web程序来进行控制与监控,这里的代码不给予展示,只给出简单的部署方式之一

将文件通过ftp传到ubuntu家目录,然后 cp -r 将文件递归复制到 /opt下

代码块
PlainText
自动换行
复制代码
cd /home/qkadmin
cp -r wg-monitor /opt/
复制成功

虚拟环境配置及程序测试启动

代码块
PlainText
自动换行
复制代码
apt update
apt install python3-venv python3-pip -y     # 确保有虚拟环境工具
​
#激活虚拟环境(上一步中将程序文件放入其中)
cd /opt/wg-monitor
python3 -m venv venv                        # 如果已有旧的 venv,可用 rm -rf venv 先删除
source venv/bin/activate                    # 激活退出虚拟环境
pip install psutil flask                    # 安装库
deactivate                                  # 退出虚拟环境
​
#虚拟环境下运行python程序(必须测试,验证程序是否正常运行)
sudo /opt/wg-monitor/venv/bin/python3 main.py & 
sudo /opt/wg-monitor/venv/bin/python3 appweb.py  &
​
pkill python                                # 停止所有python进程
​
ps f | grep python                          # 查看python所有进程
ps ef | grep python                         # 查看进程及环境
复制成功

创建启动脚本 vim /opt/wg-monitor/start.sh

代码块
PlainText
自动换行
复制代码
#!/bin/bash
cd /opt/wg-monitor
/opt/wg-monitor/venv/bin/python3 main.py &
/opt/wg-monitor/venv/bin/python3 appweb.py > /dev/null 2>&1 &
wait      
复制成功
代码块
PlainText
自动换行
复制代码
sudo chmod +x /opt/wg-monitor/start.sh      #增加执行权限,避免systemd无法执行启动程序
复制成功

创建systemd服务 vim /etc/systemd/system/wg-monitor.service

代码块
PlainText
自动换行
复制代码
[Unit]
Description=WireGuard Tunnel Monitor
After=network-online.target
Wants=network-online.target
​
[Service]
Type=simple
ExecStart=/opt/wg-monitor/start.sh
User=root
WorkingDirectory=/opt/wg-monitor
Restart=always
RestartSec=5
KillMode=mixed
​
[Install]
WantedBy=multi-user.target
复制成功

设置开机自启,然后启动测试web

代码块
PlainText
自动换行
复制代码
#服务文件需要在 /etc/systemd/system/ 下创建,后缀.service
systemctl enable wg-monitor         # 开机自启
systemctl daemon-reload             # 重启systemd服务
systemctl start wg-monitor          # 启动 
systemctl status wg-monitor         # 状态
systemctl restart wg-monitor        # 重启
systemctl stop wg-monitor           # 停止
复制成功

通过 ip:5000 来访问web监控程序

7.总结

本教程是大致记录,必有细节缺失或描述不到位,请见谅。总体上,该方案能满足中小企业的需求不高的网络搭建与异地组网要求。对于需要多节点组网的企业,可以选择更加成熟的sd-wan平台,这里使用原生wireguard是因为该企业需求不高,可以使用原生wireguard来最大化提升效率。