OpenWRT
OpenWRT
视频:9分钟搞定ESXI中安装配置OpenWRT/LEDE、PPPoE拨号、OpenVPN以及WireGuard VPN 地址:哔哩哔哩 西瓜视频 YouTube
一、在ESXI中安装
1.1 制作 OpenWrt ESXi 镜像
点击链接下载最新版本的 Stable Release OpenWrt 镜像。ESXi 一般运行在 X64 平台,因此我们选择 x86/64 目标平台的镜像文件,文件系统选择 ext4。例如:
制作镜像,官方文档OpenWrt on VMware HowTo
brew install gzip
gzip -d openwrt-21.02.3-x86-64-generic-ext4-combined.img.gz
brew install qemu
qemu-img convert -f raw -O vmdk ~/Downloads/openwrt-21.02.3-x86-64-generic-ext4-combined.img openwrt-21.02.3-x86-64-generic-ext4-combined.vmdk
1.2 ESXI 网络配置
创建 OpenWrt 虚拟机之前,首先规划好它的网络架构。
假设运行 ESXi 的物理主机有 N(N>1) 个硬件网络适配器,那么通常的做法是将 1 个物理网口用于 WAN,其余的 (N -1 个)物理网口用于构建 LAN。博主的主机有 4 个物理网络适配器,下文以此为例。
注意:ESXi 初始的虚拟交换机、端口组请保持默认配置,谨慎编辑,否则你将无法远程连接到 ESXi
另外为了帮助读者理解原理,先简要介绍 ESXi 的虚拟网络架构:
VMs(虚拟机)
↓↑
Port Groups(端口组)
↓↑
vSwitch(虚拟交换机)
↓↑
Physical NICs(硬件网络适配器)
上面是各虚拟网络组件的层级与数据流图,其中
- 端口组: ESXi 并非直接连接到
vSwitch
(虚拟交换机),而是连接到再划分的端口组,并在虚拟机内部实体化为相应的虚拟网络适配器。端口组是软件逻辑实现,因此一个虚拟交换机上可以划分多个端口组,进而可以实现 VLAN 功能:在 ESXi 的管理界面中为不同的端口组分配不同的VLAN ID
即可。如果把vSwitch
类比于物理世界中的交换机,那么端口组则类似于为交换机上的一组端口 - 虚拟交换机: 可以类比物理世界的交换机来理解
- 硬件网络适配器: 虚拟网络只有链接至硬件网络适配器才能与物理世界通讯。如果某个虚拟交换机没有链接至任何一个硬件网卡,那么其上的虚拟机只能与连接到该虚拟交换机的其他虚拟机通信,而不能与外界通信,相当于组建了一个虚拟的内网。
下面正式开始部署端口组。首先创建三个新的虚拟交换机,保持默认配置。如下图所示,含 ESXi 初始的 vSwitch0
在内,共有四个虚拟交换机,将来分别对应物理机上的四个网口。
点击编辑虚拟交换机按钮,为新创建的 vSwitch
分别链接上行链路(物理网络适配器),从而与主机上的物理网口链接起来
下一步,考虑到 ESXi 虚拟网络未来拓展性(方便、安全地部署其他 VMs),以默认配置创建 VM Network1
、VM Network2
、WAN Network
三个端口组,分别连接到之前新创建的 3 个虚拟交换机上。这项操作目的是为未来其他的 VMs 预留默认安全配置的端口组(区别于后面专为 OpenWrt VM 创建的开启混杂模式端口组),本身和搭建 OpenWrt VM 没有关系。
下一步,创建 OpenWrt LAN0
、OpenWrt LAN1
、OpenWrt LAN02
、OpenWrt WAN
四个端口组,其中 LAN 系列端口组开启混杂模式、MAC 地址修改、伪传输三个安全选项,而 WAN 端口组保留默认配置,即上述选项全部关闭。
最终网络拓扑如图所示
其中 OpenWrt 虚拟机通过 OpenWrt LAN0
~ OpenWrt LAN2
和 OpenWrt WAN
四个端口组连接到虚拟交换机 vSwitch0
~ vSwitch3
进而连通 VMNIC0
~ VMNIC3
四个物理网口。由于 OpenWrt LAN
系列端口组开启了混杂模式,具备监控虚拟网络流量的能力,当其中某个虚拟交换机收到 MAC 帧时,会将此帧转发复制到 OpenWrt br-lan(用于 LAN 口设备桥接的虚拟网络,使多个虚拟或物理网络接口的行为好像他们仅有一个网络接口一样),然后再由内部网桥系统决定如何处理(转发到某个 LAN 口还是路由至 WAN 上)。如果 OpenWrt LAN 端口组不开启混杂模式,由于虚拟交换机不具备 MAC 地址学习能力,将丢弃需要转发的 MAC 帧,OpenWrt 将无法接收和转发数据流量。
进一步解释 混杂模式
作用:因为虚拟交换机不像传统物理交换机,它不具备 MAC 学习功能力:vSwitch 所有接入端口的设备(VMs)是预先配置好的,虚拟交换机它知道这些接入端口组的接口的 MAC 地址,而不需要根据数据包的源 MAC 来更新 MAC 与 PORT 的映射。因此,在混杂模式未开启情况下,如果目标 MAC 不属于该虚拟交换机,那么虚拟交换机将丢弃该数据包。虚拟交换机或端口组开启混杂模式后,所属的 PORT 将收到虚拟交换机上 VLAN 策略所允许的所有流量。这种特性可用来监控虚拟网络流量。
至此,完成端口组的配置。这些端口组后续将被 OpenWrt 虚拟机内的虚拟网络适配器使用。
1.3 配置网络
编辑文件/etc/config/network
注意要作为wan口的设备名,以下是初始设置
配置OpenWRT虚拟机的时候把WAN口的网卡放在第二行,这样OpenWRT里面初始WAN口配置刚好是第二个网卡
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fdaf:b952:d594::/48'
config interface 'lan'
option type 'bridge'
option ifname 'eth0 eth1 eth3'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'
config interface 'wan'
option ifname 'eth2'
option proto 'dhcp'
config interface 'wan6'
option ifname 'eth2'
option proto 'dhcpv6'
修改好以后重载配置:
/etc/init.d/network reload
1.4 扩展磁盘
- 把OpenWrt原来的磁盘放到
ide 0:1
- 创建新磁盘放到
ide 0:0
- 下载systemrescue,加载到OpenWrt的光驱并启动
- 使用dd命令把
ide 0:1
拷贝到ide 0:0
:dd if=/dev/sdb of=/dev/sda
- enter
fdisk /dev/sda
and write the partition table (without making changes, this helps sysrescuecd to see the partitions properly) - 磁盘检查
fsck -f /dev/sda2
- 扩容以下
resize2fs /dev/sda2
- 再次磁盘检查
fsck -f /dev/sda2
- 重启看结果,没有问题之后关掉,把老硬盘删了。
1.5 opkg 常用命令
官方文档:Opkg package manager
作用 | 命令 |
---|---|
更新软件索引 (重启路由器会丢失索引,需要重新创建) | opkg update |
安装软件 | opkg install packagename |
卸载软件 | opkg remove packagename |
更新软件 | opkg upgrade packagename |
查看软件详情 | opkg info packagename |
查询可更新软件 | opkg list-upgradable |
查询已安装软件 | opkg list-installed |
以关键词查询软件 | opkg list | grep -e packagename |
以关键词搜索软件 | opkg search packagename |
1.6 更改软件源镜像
sed -i 's/downloads.openwrt.org/mirrors.ustc.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf
1.7 处理PPPOE丢包导致频繁掉线问题
-- 对应页面配置的LCP echo failure threshold和LCP echo interval
uci set network.wan.keepalive='10 50'
1.8 设置时区
编辑/etc/config/system
添加以下配置
option timezone 'Asia/Shanghai'
option timezone 'CST-8'
1.9 ESXI 处理 Failed - Object type requires hosted I/O 错误
ssh到esxi然后执行以下命令
vmkfstools -x check openwrt-x86-64-generic-squashfs-combined-efi.vmdk
vmkfstools -x repair openwrt-x86-64-generic-squashfs-combined-efi.vmdk
二、安装OpenVPN
官方文档:OpenVPN server
三、编译 LEDE
export http_proxy=http://192.168.50.216:1087;export https_proxy=http://192.168.50.216:1087;export ALL_PROXY=socks5://192.168.50.216:1080
3.1 准备
export LC_ALL="en_US.UTF-8"
sudo dpkg-reconfigure locales
sudo apt update -y
sudo apt full-upgrade -y
sudo apt-get purge tex-common
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
3.2 编译步骤
首次编译
git clone https://github.com/coolsnowwolf/lede
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
# 预下载编译所需的软件包
make download -j8
make V=s -j$(nproc)
二次编译
cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make defconfig
make download -j8
make V=s -j$(nproc)
重新配置
rm -rf ./tmp && rm -rf .config
make menuconfig
make V=s -j$(nproc)
编译完成后输出路径:bin/targets
3.2 编译调整项
Target Images ---> (160) Kernel partition size (in MB)
Target Images ---> (1600) Root filesystem partition size (in MB)
Extra packages ---> < > automount # 取消USB 文件共享
Extra packages ---> < > autosamba # 取消Samba 多媒体共享
Base system ---> < > block-mount
LuCI ---> 3. Applications ---> < > luci-app-accesscontrol................. LuCI Access Control Configuration
LuCI ---> 3. Applications ---> < > luci-app-adbyby-plus #广告屏蔽大师Plus +
LuCI ---> 3. Applications ---> < > luci-app-ddns
LuCI ---> 3. Applications ---> [ ] Include lsblk
LuCI ---> 3. Applications ---> < > luci-app-filetransfer
LuCI ---> 3. Applications ---> < > luci-app-ipsec-vpnd
LuCI ---> 3. Applications ---> [ ] Include rclone-webui
LuCI ---> 3. Applications ---> [ ] Include rclone-ng (another webui)
LuCI ---> 3. Applications ---> < > luci-app-ssr-plus
LuCI ---> 3. Applications ---> < > [ ] Include Shadowsocks Libev Server
LuCI ---> 3. Applications ---> < > [ ] Include ShadowsocksR Libev Client
LuCI ---> 3. Applications ---> < > [ ] Include ShadowsocksR Libev Server
LuCI ---> 3. Applications ---> < > [ ] Include Shadowsocks Simple Obfs Plugin
LuCI ---> 3. Applications ---> < > luci-app-ttyd
LuCI ---> 3. Applications ---> < > luci-app-turboacc............ LuCI support for Flow Offload / Shortcut-FE
LuCI ---> 3. Applications ---> < > [ ] Include Shortcut-FE ECM
LuCI ---> 3. Applications ---> < > [ ] Include BBR CCA
LuCI ---> 3. Applications ---> < > [ ] Include Pdnsd
LuCI ---> 3. Applications ---> < > luci-app-unblockmusic #解锁网易云灰色歌曲3合1新版本
LuCI ---> 3. Applications ---> [ ] UnblockNeteaseMusic Golang Version
LuCI ---> 3. Applications ---> < > luci-app-upnp................. Universal Plug & Play configuration module
LuCI ---> 3. Applications ---> < > luci-app-vsftpd #FTP服务器
LuCI ---> 3. Applications ---> <*> luci-app-vssr
LuCI ---> 3. Applications ---> < > luci-app-wol # 网络唤醒
LuCI ---> 3. Applications ---> < > luci-app-xlnetacc #迅雷快鸟
LuCI ---> 3. Applications ---> < > luci-app-zerotier #ZeroTier内网穿透
LuCI ---> 3. Applications ---> < > luci-app-dnscrypt-proxy
-- LuCI ---> 3. Applications ---> <*> luci-app-pushbot
-- LuCI ---> 3. Applications ---> <*> luci-app-serverchan
Utilities ---> open-vm-tools #打开适用于VMware的VM Tools
3.3 自定义修改配置
编辑./package/lean/default-settings/files/zzz-default-settings
uci set network.lan.ipaddr='192.168.1.254' # 默认 IP 地址
uci set network.lan.proto='static' # 静态 IP
uci set network.lan.type='bridge' # 接口类型:桥接
uci set network.lan.ifname='eth0' # 网络端口:默认 eth0,第一个接口
uci set network.lan.netmask='255.255.255.0' # 子网掩码
uci set network.lan.gateway='192.168.1.1' # 默认网关地址(主路由 IP)
uci set network.lan.dns='192.168.1.1' # 默认上游 DNS 地址
uci commit network
四、WireGuard
4.1 创建密钥
在OpenWRT中创建以下密钥
root@OpenWrt:~# mkdir wg
root@OpenWrt:~# cd wg
# 配置创建密钥的权限
root@OpenWrt:~/wg# umask 077
# 创建预共享密钥
root@OpenWrt:~/wg# wg genpsk > sharekey
root@OpenWrt:~/wg# cat sharekey
uQYSORFGivaZWJipt/6yWh6XTPgJuVmpVBJ2TioJIzE=
# 创建服务端公钥和私钥
root@OpenWrt:~/wg# wg genkey | tee server_privatekey | wg pubkey > server_publickey
root@OpenWrt:~/wg# cat server_privatekey
IOteNE3ZQHuiyxmiPiIfcfsCAydved/dzQGBkizO7UQ=
root@OpenWrt:~/wg# cat server_publickey
74vBm8dDCrn8nmfO0S01YUuEYhr8rsvuFo2aD2EcxDE=
# 客户端公钥私钥
# 重复此操作创建每个客户端的公钥和私钥
root@OpenWrt:~/wg# wg genkey | tee macos_privatekey | wg pubkey > macos_publickey
root@OpenWrt:~/wg# cat macos_privatekey
KDdqdexXGpm/r0KBzQyzuXrTKJcj+PppRcr0FipYAF4=
root@OpenWrt:~/wg# cat macos_publickey
iRk+VFxllViXNFynSt0BTXTUaUFr4q885CshSB6aGSE=
4.2 WireGuard 服务端相关配置
添加WireGuard接口
登陆 OpenWRT
-网络
-接口
添加新接口
新接口的名称
-> 随意 新接口的协议
-> WireGuard VPN
- 编辑刚创建的WG接口
基本配置
私钥
- IOteNE3ZQHuiyxmiPiIfcfsCAydved/dzQGBkizO7UQ=
填写上文的服务器私钥(server_privatekey) 监听端口
- 55555
(需要在路由映射该端口的 UDP 协议) IP 地址
- 192.168.100.1/24
IP 地址填写一个 VPN 专用的网段,本文以192.168.100.X
为 WireGuard 的专用网段为例,则本 WG 服务器 IP 为192.168.100.1/24
防火墙设置
创建/分配防火墙区域
有vpn选vpn,没有选择lan
Peers
按添加
设置客户端配置,选择预共享密钥
- 添加
公钥
- iRk+VFxllViXNFynSt0BTXTUaUFr4q885CshSB6aGSE=
上文macOS 客户端公钥(macos_publickey) 预共享密钥
- uQYSORFGivaZWJipt/6yWh6XTPgJuVmpVBJ2TioJIzE=
填写上文获取的预共享密钥(sharekey) 允许的 IP
- 192.168.100.2/32
客户端分配固定 IP , 注意各客户端 IP 不能冲突. 路由允许的 IP
- 勾选 持续 Keep-Alive
- 25
4.3 OpenWRT 防火墙配置
通信规则
打开路由器端口:
名字
- wg 传输协议
- UDP 外部端口
- 55555 (这里就是前面基本配置中的监听端口)
自定义防火墙
如果OpenWRT 是作为旁路由接入需要这条规则
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o br-lan -j MASQUERADE
# 注意此条防火墙网段 192.168.100.0/24 需和上文服务端 IP 网段保持一致.
4.4 客户端配置文件
创建客户端配置文件:macos_wireguard.conf
[Interface]
# 对应 macOS 客户段分配的 IP
Address = 192.168.100.2/32
# PrivateKey为 macOS 客户端的私钥(macos_privatekey)
PrivateKey = KDdqdexXGpm/r0KBzQyzuXrTKJcj+PppRcr0FipYAF4=
# 本地的 DNS 服务器或者公有 DNS 服务器,例如: 114.114.114.114
DNS = 223.5.5.5
[Peer]
# PublicKey为 OpenWRT 的公钥(server_publickey)
PublicKey = 74vBm8dDCrn8nmfO0S01YUuEYhr8rsvuFo2aD2EcxDE=
# AllowedIPs = 192.168.1.0/24, 192.168.100.0/24 表示以上两个网段才会走VPN,如果设置为0.0.0.0/0则所有访问都走
AllowedIPs = 192.168.1.0/24,192.168.100.0/24
# 预共享密钥(sharekey)
PresharedKey = uQYSORFGivaZWJipt/6yWh6XTPgJuVmpVBJ2TioJIzE=
Endpoint = 114.92.204.148:55555
PersistentKeepalive = 25
4.5 客户端
各个平台客户端访问官网安装:Installation
五、AdGuard Home
AdGuard Home 自建 DNS 防污染、去广告教程 #1 - 安装部署详解(Docker)AdGuard Home 自建 DNS 防污染、去广告教程 #2 - 优化增强设置详解群晖NAS高级服务 - docker 部署 AdGuard Home 拦截广告防 DNS 劫持
其他
Enabling a Wi-Fi access point on OpenWrtSecure and turn on Wi-FiFlashing OpenWrt with Wi-Fi enabled on first bootThe UCI systemHow to get rid of LuCI HTTPS certificate warningsLuCI on lighttpdOpenWrt完美扩容Overlay 硬核新方法,真扩容,零空间浪费,专治强迫症!用最简单的方法给虚拟机硬盘扩容|Gparted Linux下的磁盘分区魔术师烧录镜像OpenWRT作为AP使用OpenWRT作为AP并启用自动漫游openwrt pc-install