Skip to content

openwrt

woniuzfb edited this page Feb 9, 2023 · 9 revisions

1. 最省钱 mesh 配置

1.1 路由器选择以及考虑到底是需要 802.11s(Meshing) 还是 802.11r(Roaming)

  • 同一 AC + 多个 AP , 如果多个 AP 在不同房间, 只是需要客户端(比如手机)在移动到不同房间时能快速在不同 AP 间漫游, 这种情况下只需要配置 AC 和 AP 的 openwrt 802.11r , 使用官方默认配置. 在后台无线 - 无线安全 - 802.11r 快速切换 打开就可以. 需要注意的是不同 AP 的无线通道不能相同 国内5G通道可选 149,153,157,161,165 部分路由器刚刷完 openwrt 固件看不到这几个通道, 可以在 无线高级设置国家代码 选择 US 就可以看到这几个通道了.

  • 上面这种情况要求事先布好网线才能 AC + 多个 AP, 很多情况是要求加几个路由器扩展主路由器的无线覆盖范围, 这种情况就要用 802.11s mesh (batman-adv). 路由器最好选择能开启 防火墙 - 硬件加速(Hardware flow offloading) 选项的, 所以至少是 mt7621, 一查洋垃圾里 网件 netgear r6220 比较合适, 几十一个, 市场存量也大. 主路由和扩展路由都必须是 r6220. 为什么不能不同型号混用? 实测无线不稳定, 原因有很多. 担心 r6220 无线弱? 因为用多个路由扩展无线范围, 单个路由的无线强弱并不重要, 实测也不弱, 不用担心. 另外要注意用了 802.11s mesh (batman-adv) 就不要开启 802.11r 了.

1.2 B.A.T.M.A.N. / batman-adv (802.11s) 配置

参考 文档

这里用命令行设置 主路由和各结点路由, 几分钟设置完

# 设置路由名称, 用于区分
uci set system.@system[0].hostname='mesh1'

# 设置路由时区
uci set system.@system[0].zonename='Asia/Shanghai'

# 主路由设置网关
uci set network.lan.ipaddr='10.0.1.1'

# 禁用 ipv6, 国内 ipv6 还是慢, 可以设置
uci set network.@device[0].ipv6='0'
uci del dhcp.lan.dhcpv6

# 下面是开启路由器硬件加速
uci set firewall.@defaults[0].flow_offloading='1'
uci set firewall.@defaults[0].flow_offloading_hw='1'

# 下面是允许外部访问访问路由器, 建议设置, 方便以后连接路由器修改配置
uci set firewall.@defaults[0].forward='ACCEPT'
uci del firewall.@defaults[0].syn_flood
uci set firewall.@defaults[0].synflood_protect='1'
uci set firewall.@zone[1].input='ACCEPT'
uci set firewall.@zone[1].forward='ACCEPT'

# 保存配置
uci commit
reload_config

# 如果更改了网关你可能需要重新连接路由器
# 注意: batman 要求主路由和所有 mesh 结点路由的无线通道等各项参数相同. 
假设 5G无线是 radio1 (路由器刷完 openwrt, 5G 无线可能是 radio0 或 radio1, 
你可以到后台看 5G 无线是第一个还是第二个, 
r6220 是默认 5G 无线 radio1), 名称设置为 `mesh-5G`, 密码是 12345678, 通道选择 149, 按需修改

# 下面这些行都要在主路由和 mesh 节点路由设置
opkg update
opkg remove wpad-basic-wolfssl
opkg install zoneinfo-asia kmod-batman-adv wpad-mesh-openssl batctl-default

uci set network.bat0=interface
uci set network.bat0.proto='batadv'
uci set network.bat0.routing_algo='BATMAN_IV'
uci set network.bat0.aggregated_ogms='1'
uci set network.bat0.ap_isolation='0'
uci set network.bat0.bonding='0'
uci set network.bat0.fragmentation='1'
uci set network.bat0.gw_mode='off'
uci set network.bat0.log_level='0'
uci set network.bat0.orig_interval='1000'
uci set network.bat0.bridge_loop_avoidance='1'
uci set network.bat0.distributed_arp_table='1'
uci set network.bat0.multicast_mode='1'
uci set network.bat0.network_coding='0'
uci set network.bat0.hop_penalty='30'
uci set network.bat0.isolation_mark='0x00000000/0x00000000'

uci set network.nwi_mesh0=interface
uci set network.nwi_mesh0.mtu='2304'
uci set network.nwi_mesh0.proto='batadv_hardif'
uci set network.nwi_mesh0.master='bat0'

uci set network.@device[0].igmp_snooping='1'
uci set network.@device[0].mtu='2304'
uci add_list network.@device[0].ports='bat0'

uci set wireless.mesh0=wifi-iface
uci set wireless.mesh0.device='radio1'
uci set wireless.mesh0.ifname='mesh0'
uci set wireless.mesh0.network='nwi_mesh0'
uci set wireless.mesh0.mode='mesh'
uci set wireless.mesh0.mesh_fwding='0'
uci set wireless.mesh0.mesh_id='mymesh'
uci set wireless.mesh0.encryption='psk2+ccmp'
uci set wireless.mesh0.key='12345678'
uci set wireless.mesh0.mesh_rssi_threshold='-80'

uci del wireless.radio1.disabled
uci set wireless.radio1.country='US'
uci set wireless.radio1.channel='149'
uci set wireless.radio1.cell_density='0'
uci set wireless.default_radio1.ssid='mesh-5G'
uci set wireless.default_radio1.encryption='psk2+ccmp'
uci set wireless.default_radio1.key='12345678'

uci commit
reload_config
reboot

# 上面这些行都要在主路由和 mesh 节点路由设置

# 下面面这些行只在 mesh 节点路由设置
uci set dhcp.lan.ignore='1'
uci del dhcp.lan.ra
uci del dhcp.lan.ra_flags
uci add_list dhcp.lan.ra_flags='none'

uci commit
reload_config
reboot
  • batctl obatctl n 就能看到生效了

  • 提示: 如何连接各个节点路由器来修改配置? 将节点路由器的 lan 口连接主路由的一个 lan 口, 然后在主路由网络中可以查到节点路由器的 IP 地址


2. PVE 虚拟机下 x86 openwrt 扩容和升级步骤

2.1 扩容

ext4-combined(-efi) 先在 PVE 后台虚拟机硬件配置将硬盘大小增大, 重启虚拟机

opkg update
opkg install fdisk tune2fs resize2fs

fdisk /dev/sda
依次输入命令:
p
d
2
n
p
2
33792
N
w

fdisk /dev/sda
依次输入命令:
i
2

记下输出的 /dev/sda2 UUID

如果有 /boot 目录检查 /boot/grub/grub.cfg 中 UUID 是否和 /dev/sda2 UUID 一致

如果没有 /boot 目录, 执行命令
mkdir /boot
mount /dev/sda1 /boot
并检查 /boot/boot/grub/grub.cfg 中 UUID 是否和 /dev/sda2 UUID 一致

如果不一致(2处) 都要换成 /dev/sda2 UUID, 否则重启后无法再连接

然后执行命令, 有提示就按回车键
mount -o remount,ro /
tune2fs -O^resize_inode /dev/sda2
fsck.ext4 /dev/sda2
e2fsck -f /dev/sda2
reboot

重新连接后执行
resize2fs /dev/sda2

2.2 升级

参考文档

先新建虚拟机快照, 以防出错

系统 - 备份/升级 保存下载配置, 你可以重新新建虚拟机安装新版本 openwrt, 或者按下面步骤升级, 简单一点点, 升级还是会删除所有配置文件, 记得先保存配置!

从 ext4-combined.img.gz 中提取 boot.img, 可以插一块 U 盘到 mac 上

diskutil list
# 看到 U 盘是 /dev/disk2
diskutil unmountDisk /dev/disk2
gzip -d openwrt-xx.xx.x-x86-64-generic-ext4-combined.img.gz
sudo dd if=openwrt-xx.xx.x-x86-64-generic-ext4-combined.img of=/dev/rdisk2 bs=1m

sudo dd if=/dev/disk2s1 of=boot.img

在 PVE 后台虚拟机硬件配置增加一块 1G 硬盘

# 你应该看到有 /dev/sdb
fdisk -l

mkdir /mnt/sdb
mkfs.ext4 /dev/sdb
mount /dev/sdb /mnt/sdb
cd /mnt/sdb

上传上面得到的 boot.img 到虚拟机 /mnt/sdb 下
上传 openwrt-xx.xx.x-x86-64-generic-ext4-rootfs.img.gz 到虚拟机 /mnt/sdb 下

fdisk /dev/sda
依此输入命令:
i
2

记下输出的 /dev/sda2 的 UUID

执行命令
dd if=boot.img of=/dev/sda1

如果有 /boot/ 目录, 查看 /boot/grub/grub.cfg 中 UUID 是否和 /dev/sda2 UUID 一致

如果没有 /boot/ 目录, 执行命令
mount /dev/sda1 /boot
并查看 /boot/boot/grub/grub.cfg 中 UUID 是否和 /dev/sda2 UUID 一致

如果不一致(2处)修改成 /dev/sda2 的 UUID, 否则无法再连接

然后执行
gzip -d openwrt-xx.xx.x-x86-64-generic-ext4-rootfs.img.gz
dd if=openwrt-xx.xx.x-x86-64-generic-ext4-rootfs.img of=/dev/sda2

reboot(pve 后台强制关虚拟机重启)

默认网关又变成 192.168.1.1
访问后台恢复之前保存的配置

如果以前扩容过硬盘, 还需按下面设置
opkg update
opkg install fdisk tune2fs resize2fs

fdisk /dev/sda
依次输入命令:
p
d
2
n
2
33792
回车
N
i
2
w

重新校对 grub.cfg 中 UUID 是否和 /dev/sda2 UUID 一致, 否则无法重连

然后执行命令, 有提示就按回车键
mount -o remount,ro /
tune2fs -O^resize_inode /dev/sda2
fsck.ext4 /dev/sda2
e2fsck -f /dev/sda2

reboot

重新连接后执行
resize2fs /dev/sda2

3. Armbian or PVE openwrt 旁路由配置

3.1 推荐设置

  • 旁路由(openwrt)尽量不改变当前网络拓扑, 完全没必要将 DHCP 服务器设置在旁路由上, 这很关键, IPv6 设置也简单很多
  • 在主路由 DHCP 设置中, 将默认网关和dns设置为旁路由地址, 在旁路由中将网关设置为主路由地址即可
  • IPv6 只需要在主路由中设置就可以
  • 旁路由无需设置 MASQUERADE

具体到不同的主路由

Merlin 主路由

高级设置 - 内部网络(LAN) - 默认网关DNS server 1 修改成旁路由地址. IPv6 设置选择类型 Native

Openwrt 主路由

LAN 设置 - DHCP 服务器 - DHCP 选项 - 添加 6,192.168.2.13,192.168.2.1 这两项(指定dns和网关的意思), 192.168.2.1 替换成你的旁路由地址. IPv6 设置 默认即可

旁路由(openwrt)

  • 只需要设置 LAN 口, 关闭 IPv6 即可.
  • 关键问题 LAN 口 DNS 设置什么? 指定 dns 可以设置为主路由 IP. 当然如果你用的是一键脚本, host(Armbian/PVE) 都安装了 dnscrypt proxy, 所以你可以指定为 host 的 IP
  • 如果你的 host(Armbian/PVE) 网关指定的是主路由 IP, 设置就到此为止. 如果 host 网关指定的是旁路由(你可能因为需要在 host 访问外网) IP, 这时候就需要注意 DNS 查询死循环的情况. 旁路由中的 v2ray 需要添加额外的直连列表 IP, 比如一键脚本使用的 dnscrypt proxy 服务器是 dns.alidns.com, 你就要添加 IP 223.5.5.5 223.6.6.6, 你可以使用命令 resolveip dns.alidns.com 获得这些 IP

3.2 艰难设置(不推荐)

  • DHCP 只是负责内网 ip 发放, 与网关、NAT 无关, 即使将旁路由设为 DHCP 服务器, NAT 转换也是主路由的工作, IPv6 也设置麻烦, 尤其是主路由下有多个二级路由, 旁路由接的是二级路由的情况, IPv6 在旁路由内的设置更是复杂

4. 硬路由 dnscrypt-proxy 配置

Armbian 或者 PVE 如果使用的是一键脚本, 不用往下看了, 因为 dnscrypt-proxy 都安装在了 host

opkg update
opkg install dnscrypt-proxy2

/etc/init.d/dnsmasq stop
uci set dhcp.@dnsmasq[0].noresolv="1"
uci -q delete dhcp.@dnsmasq[0].server
uci add_list dhcp.@dnsmasq[0].server="127.0.0.53"
uci commit dhcp
/etc/init.d/dnsmasq start

cd /etc/dnscrypt-proxy2/
echo "$(awk '!x{x=sub(/.*\[static\..*/,"  [static.\047alidns-doh-fix\047]")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml
echo "$(awk '!x{x=sub(/.*stamp = .*/,"  stamp = \047sdns://AgAAAAAAAAAAACCY49XlNq8pWM0vfxT3BO9KJ20l4zzWXy5l9eTycnwTMA5kbnMuYWxpZG5zLmNvbQovZG5zLXF1ZXJ5\047")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml
echo "$(awk '!x{x=sub(/.*server_names = \[.*/,"server_names = [\047dnspod-doh\047,\047alidns-doh-fix\047]")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml
echo "$(awk '!x{x=sub(/^listen_addresses = .*/,"listen_addresses = [\047127.0.0.53:53\047]")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml
echo "$(awk '!x{x=sub(/.*require_dnssec = .*/,"require_dnssec = true")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml
echo "$(awk '!x{x=sub(/.*bootstrap_resolvers = .*/,"bootstrap_resolvers = [\047114.114.114.114:53\047, \0478.8.8.8:53\047]")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml
echo "$(awk '!x{x=sub(/.*netprobe_address = .*/,"netprobe_address = \047114.114.114.114:53\047")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml

# 如果要屏蔽 ipv6 dns 查询
echo "$(awk '!x{x=sub(/.*block_ipv6 = .*/,"block_ipv6 = true")}1' dnscrypt-proxy.toml)" > dnscrypt-proxy.toml

reboot