ESXi软路由OpenWRT使用MWAN3配合网管交换机使用VLAN实现3路宽带负载均衡

ESXi 部署 OpenWRT

在ESXi上部署OpenWRT需要注意的地方在于
选用X86/X86-64版本OpenWRT(据测试x86版本比64版本性能更好,原因暂未知
ESXi中虚拟网卡选用 E1000 / E1000e / AMD PCNet32 / Intel VNet 时,记得在OpenWRT内安装对应版本的内核模块以提高网络性能
内核模块名称以kmod-*开头,通常直接搜索网卡型号关键字即可

ESXi 部署 端口组 Vlan 设置

在ESXi上的端口组可以配置Vlan ID,其中1~4094为普通VLan编号,4095设置此端口为Trunk模式,0禁用此端口的Vlan
此处设置默认为0,如需使用Vlan时需要修改此VLan ID为对应的正确配置,否则ESXi会直接抛弃不匹配的数据包(像一个标准的交换机那样

https://kb.vmware.com/s/article/1004074

水星 网管交换机 上的VLan配置

由于使用一个水星网管交换机作为核心交换机,在此次网络架构设计中,其需要在承载普通交换机流量的同时,
使用VLan隔离出一个独立的子交换部分,此部分网络架构形如三叉戟般,使用三个不同端口对应三个不同VLan分别连接三个宽带的光猫,同时汇聚到一个端口去连接ESXi中的OpenWRT

网络结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-----------------------------------------------------------------------------------------------------------------------
PPPoE MWAN Part
*******************

Vlan 10 [Untaged 10, PVID 10]
A ISP Moden ---------------+
| [software vlan 10]
Vlan 11 v [Taged 10+11+12, PVID 1 (no one care it)] +-----> eth0.10 <== PPPoE A ISP ------+
B ISP Moden ------------>Switch-------Trun------+ | |
[Untaged 11] ^ Vlan 10+11+12 | (Trunk Mode) | [software vlan 11] v
[PVID 11] | +--> ESXi -------------> OpenWRT ---->eth0---> eth0.11 <== PPPoE B ISP --> MWAN3 LoadBalance
| Vlan4095 | ^ |
C ISP Moden ---------------+ | [software vlan 12] | v
Vlan 12 [Untaged 12, PVID 12] +-----> eth0.12 <== PPPoE C ISP ------+ | [LAN Area]
|
----------------------------------------------------------------------------------------------------------------------- ESXi
Normal Part |
******************* [Link Aggregation] v
All Port as [VLan 1, PVID 1, Untaged 1] Phisical Switch <=========================================================== vSwitch ---> Other ESXi VM
| | | | (Multi RJ45 Cable)
v | | |
(WiFi AP*) v | v
/ | \ DeviceD | DeviceF
/ | \ v
v | v DeviceE
DeviceA | DeviceC
v
DeviceB

* WiFi AP is a old router run on lan only mode, its DHCP function are disabled.
-----------------------------------------------------------------------------------------------------------------------

802.1Q VLan 资料

https://zh.wikipedia.org/wiki/IEEE_802.1Q
https://blog.csdn.net/xiaohaijiejie/article/details/70208549

OpenWRT 上的 MWAN3 设置

在OpenWRT上实现负载均衡需使用 MWan3 这个模块
【TODO】

可用的参考资料
https://www.sgtfz.cn/2018/02/229.html
https://www.sgtfz.cn/2019/08/1855.html

OpenWRT 上的 IPv6 设置

默认情况下,如果ISP提供IPv6,使用OpenWRT的默认拨号配置即可获得IPv6网段并正确分发子IP到内网设备上。(只要拨号的接口勾选了使用内置的IPv6管理选项,正常情况即可正确工作
可以在接口页面上查看是否具有一个设备名与拨号接口一致且接口名自带*_6后缀的接口来确定ISP是否随PPPoE自动分发了IPv6

如有需要针对特定ISP进行配置,可在LANDHCP服务器页面中的IPv6子页面下配置详细的IPv6分发/中继模式
如需要在两次重启之间继承IPv6,或需要获得最好的兼容性,可直接选择三个都为混合模式,且选择无状态+有状态

注意:在开启了MWAN后,很多人都以为IPv6也需要进行负载均衡。
但是真实情况是,最新的IPv6都不再是NAT模式工作,而是每个设备分配到一个全球IP。
这也就意味着在这种情况下的IPv6无法在路由上使用MWAN进行负载均衡,
其原因在于,不同的ISP分配的IPv6自然属于不同的IPv6块,而不同IPv6分块下的IPv6 IP对应的网络出口也就自然需要一一对应,
这也就决定了想要在配置了MWAN后让IPv6仍然有效,需要在MWAN的策略页面中将所有策略的备用成员(也就是fail back)设置为默认(使用主路由表)
这样IPv6数据包在MWAN进行判断时遇到选路失败后才会正确被导向到对应的IPv6块,去往正确的ISP。
同样这样也就意味着如果想要使用原生IPv6(也就是内网的每台机器都获得全球唯一的公网IPv6 IP),就无法让IPv6流量在多个ISP之间自动负载均衡(除非在流量发出之时就已经针对不同运营商选择了不同的IPv6源地址
如果想要让IPv6流量在多个ISP之间自动负载均衡,唯一的方法就是使用IPv6 NAT,那这样的话使用IPv6不久没有什么意义了不是吗?IPv6存在的意义不就是在IPv4地址不足不得不使用NAT时仍然可以获得一个公网IP么。

https://koolshare.cn/thread-146539-1-1.html
https://www.51zot.com/blog/201903vmwareesxizlljhlacpck/
https://kb.vmware.com/s/article/1001938?lang=zh_CN

博客迁移到Hexo

百姓苦Wordpress久矣
Godaddy怨声载道
PHP罪行罄竹难书


总之,在经历了Wrodpress后台进不去、垃圾评论攻击、Godaddy SSL爆炸等等等等问题之后
终于下定决心更换Blog到全静态架构

在考察了多个可部署在Github Pages上的全静态/伪动态Blog架构之后
决定走两个方案,先迁移到Hexo,所有文章逐步转换为Markdown表示
之后找机会使用”Angular+静态Json ++ 自定义语法分析器+Markdown”方案自行实现伪动态Blog

openwrt 报错 'nf_conntrack: table full' 路由表连接数爆满问题

最近更新openwrt后,若全速启动PT会出现以下错误

1
nf_conntrack: table full, dropping packet

且出现此错误时管理界面的活动连接爆满

可通过增大系统最大连接数缓解此问题

查看连接数及其配置

1
2
3
4
cat /proc/sys/net/netfilter/nf_conntrack_max
cat /proc/sys/net/nf_conntrack_max
sysctl net.netfilter.nf_conntrack_max
sysctl net.nf_conntrack_max

修改最大连接数

1
2
sysctl -w net.netfilter.nf_conntrack_max=65535
sysctl net.netfilter.nf_conntrack_max

或者可以将以下命令加入到luci中启动项页面中的本地启动脚本
其中参数的大小可以根据内存大小调整,有必要时可以在后面加一个0 (如果有那个必要且内存够大的话

1
sysctl -w net.netfilter.nf_conntrack_max=65535

Ref :

1
2
https://blog.huzhifeng.com/2015/03/14/nf_conntrack-table-full/
https://www.pc-freak.net/blog/resolving-nf_conntrack-table-full-dropping-packet-flood-message-in-dmesg-linux-kernel-log/

使用mount挂载特定目录到公共文件夹以便解决文件访问权限与修改更新之间的冲突

神秘代码:

1
mount -o bind,ro,username=nginx /home/jeremie/WingImaging/WebFront/dist/ /usr/share/nginx/webfront/

fstab:

1
2
3
4
5
6
7
8
9
10
11
12
13

#
# /etc/fstab
# Created by anaconda on Tue Jan 16 10:02:13 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b0a16d98-3b8c-400f-948d-0092477704fe / ext4 defaults 1 1
UUID=1c944257-c4f0-4023-88c6-ded8ef40ebda /data1 ext4 defaults 0 2
/home/jeremie/WingImaging/WebFront/dist/ /usr/share/nginx/webfront/ none defaults,noauto,x-systemd.automount,nofail,bind,ro,username=nginx 0 0


原理:
使用mount的bind模式,将特定文件夹挂载到另一位置,并施以特定用户身份和特定访问权限以便其他程序读取
在fstab中以此种方式设置可实现同样的功能

注意其中的noauto,x-systemd.automount两个参数,表示其只在首次访问时才自动挂载,以便等待真实文件系统准备就绪
其中的nofail参数表示允许失败
bind,ro,username=nginx参数表示此挂载为bind模式,且read only,挂载后用户身份为nginx

curl强制指定域名解析结果

https://stackoverflow.com/questions/12941703/use-curl-with-sni-server-name-indication

1
curl -vik --resolve example.com:443:198.18.110.10 https://example.com/

此方法可用于跳过DNS强制使用指定的hostname从指定ip获取数据

适用于以下情况等

  1. 需要强制跳过dns解析,例如dns过期、dns无效、dns被污染、无dns等原因
  2. 需要测试指定ip是否能对指定hostname做出响应
  3. 需要伪造SNI连接指定ip获取数据

部署RSSHUB

按照官网手动部署文档
https://docs.rsshub.app/install/#shou-dong-bu-shu

启用redis缓存,并使用yarn启动和管理,使用systemd设置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
git clone https://github.com/DIYgod/RSSHub.git
cd RSSHub

yay -S yarn npm nodejs redis

yarn


systemctl start redis
systemctl enable redis






nano /etc/systemd/system/RSSHub.service




[Unit]
Description=RSSHub Server Service
Requires=network.target
After=network.target

[Service]
Type=simple
User=jeremie
Restart=always
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=CACHE_TYPE=redis
Environment=CACHE_EXPIRE=600
Environment=HTTP_BASIC_AUTH_NAME=username
Environment=HTTP_BASIC_AUTH_PASS=passwd
Environment=PORT=11200
Environment=LISTEN_INADDR_ANY=0
WorkingDirectory=/home/jeremie/RSSHub
Restart=always
ExecStart=/bin/yarn run start -o --watch

[Install]
WantedBy=multi-user.target




systemctl start RSSHub
systemctl status RSSHub
systemctl enable RSSHub


nginx 反向代理配置
ref: https://blog.csdn.net/physicsdandan/article/details/45667357

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

server {
listen 127.0.0.1:11080;
server_name rsshub.jeremie.moe;


location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:11200;
}

}