软路由诞生记


摘要

网络拓扑

硬件

  • 网线
  • 软路由准系统
  • 内存
  • SSD
  • 安装系统过程中使用的显示器、键盘鼠标、U盘

如果需要在软路由上挂在2.5寸硬盘的话推荐使用12v 5a的电源。最少12v 3a电源。

更新BIOS

EXSI安装

原定方案是采用PVE作为底层的操作系统,但是已知双内存在PVE系统中尚不支持N5105的板子。因此选择EXSI作为底层系统。

步骤:

  1. 将EXSI系统的镜像烧录进一个空白的U盘。

刷写系统

换源

外部标记名 系统设备名 设备位置 软路由内设备名
ETH0(虚拟网桥) enp2s0 0000:02:00.0 eth0(桥接)
ETH1 enp3s0 0000:03:00.0 eth1
ETH2 enp4s0 0000:04:00.0 eth2
ETH3 enp5s0 0000:05:00.0 eth3

自动启动网口

/var/lib/vz/template/iso

Openwrt扩容

Openwrt的镜像大小往往为了更小的安装需求,一般空间会给的很小。因此在空间足够的情况下,推荐堆Openwrt的空间进行扩容。如果只是简单的增加Docker的空间,可以直接增加一个硬盘空间,再挂载Docker空间即可。

基于squashfs的扩容

https://www.youtube.com/watch?v=YwbwzuXKNlg&t=4s

基于镜像改造的扩容

https://www.bilibili.com/video/BV1Ja411m7XA?spm_id_from=333.880.my_history.page.click&vd_source=c07358badb8d5ebd07b117510e0b6f6e

在https://drive.google.com/drive/folders/1dqNUrMf9n7i3y1aSh68U5Yf44WQ3KCuh下载了最新的系统后,找一个linux机器进行操作。因为Mac没有parted命令。

  1. 将镜像解压成img格式
  2. dd if=/dev/zero bs=1M count=10240 >> <镜像名>.img
  3. parted <镜像名>.img
  4. 在parted中print看下当前镜像的分区状态
  5. resizepart <分区编号> 100%
  6. 操作完成后print查看修改效果
  7. quit退出parted
  8. 转换成虚拟机系统格式
  9. 创建相应的op虚拟机

Docker推荐

百度网盘

docker create \
   --name=baidunetdisk \
   -p 5800:5800 \
   -p 5900:5900 \
   -e VNC_PASSWORD=<vnc密码> \
   -v <百度网盘配置文件地址>:/config \
   -v <下载地址>:/config/baidunetdiskdownload \
   -e DISPLAY_WIDTH=1920 \
   -e DISPLAY_HEIGHT=1080 \
   --restart unless-stopped \
   johngong/baidunetdisk:latest

青龙面板

docker run -dit \
-v $pwd/ql/config:/ql/config \
-v $pwd/ql/log:/ql/log \
-v $pwd/ql/db:/ql/db \
-v $pwd/ql/scripts:/ql/scripts \
-v $pwd/ql/jbot:/ql/jbot \
-p 5700:5700 \
-e ENABLE_HANGUP=true \
-e ENABLE_WEB_PANEL=true \
--name qinglong \
--restart unless-stopped \
whyour/qinglong:latest

home assistant

aliyunwebdav

alist

挂载各种云盘,支持映射到webdav。

Openwrt开启ipv6[1]

光猫拨号且有下发pd,ipv6地址由光猫分配

目标:开启二级路由的ipv6中继,ipv4使用nat方案不变,两者相互独立。

解法:

  1. 首先确认下openwrt的接口,我这边有两个接口,一个是lan口,还有一个wan口,为什么是两个呢,因为wan和wan6其实是同一个接口,只不过为了方便配置,分成了两个逻辑接口,也正因为这样分了,才更有利于ipv4和ipv6分开配置。

    op_接口.jpg

  2. 选择WAN6接口,协议设置为dhcpv6客户端,这里配置这个客户端就是为了使(wan wan6) 口能够自动获取到一级路由分配的ipv6地址,从而是ipv6的流量可以流向(wan wan6)口。

    op_wan6.jpg

  3. 点开wan口,协议配置成静态地址,填写你wan口需要配置的ipv4信息,为什么要配置静态的?因为如果不配置静态,下面图中的dhcp的ipv6设置不出现,当然如果ssh连接后命令下配置,这边就不需要配成静态的,但是我觉得做路由器配置能在图形化上配置就应该在图形化上配置,这样可以规避一些配错修正问题。

    op_wan_base.jpg

  4. 下面ipv6设置全部选择中继模式,wan口的中继模式配置的意思是可以让这个wan口继承一级路由的ipv6地址分配功能,从来进一步往lan口分发这种能力。

    op_wan_ipv6.jpg

  5. 切换到lan口,协议配置成静态,ipv4同样按需配置,由于进入了lan口,它和wan就不能在同一个网段,所以这里是ipv4的常规配置,按需配置即可,配置静态也是因为下面能够出现ipv6设置选项。

  6. op_lan_base.jpg

  7. 在ipv6设置同样全部选择中继模式,配置完成后,lan口也就继承了wan口分发过来的ipv6分配能力,这样lan下面的设备就能像一级路由下的设备一样获取ipv6地址了。

    op_wan_ipv6.jpg

  8. ssh登陆openwrt,在/etc/config/dhcp文件中查找到wan口配置,在下面加一行 option master ‘1’,只有配置了这一行,前面的ipv6中继能力才能生效。

    op_dhcp.jpg

Tailscale

qnap安装tailscale

下载地址

同一内网无法正常访问的解决方法[2]

问题:tailscale客户端广播路由导致同一内网无法访问

原因:tailscale开启--accept-routes

解法:

  • Windos:在广播了路由的客户端上,将原本广播的子网范围扩大即可。比如原本广播的是192.168.1.0/24,则修改为192.168.0.0/23,这样就会优先走物理网卡访问内网了。

  • Linux:Tailscale会使用52号路由表,优先级高于主路由表,这就导致上面的方法不适用于Linux客户端,因为不管怎么改,都是先从Tailscale的路由表里走。不过Linux可以通过对路由表做修改来解决。以广播192.168.1.0/24为例,有以下两种修改方法:

    1. 从Tailscale的路由表中删除该子网路由:

    ip route delete table 52 192.168.1.0/24

    使用这种方法,如果Tailscale断开重连,这条路由会被重新添加到路由表中,因此需要每次重连后执行一遍。

    1. 为子网添加一条更高优先级的路由规则:

    ip rule add to 192.168.1.0/24 priority 5000 table main

    这种方法更好用一些,Tailscale重连也依然生效,目前没发现什么副作用。

    但是安装在openwrt上的可能还是有问题,而openwrt的路由表比较复杂,因此只使用tailscale up --advertise-exit-node

ACL

定义tag

Access controls中先定义需要使用的tag标签。

// Define the tags which can be applied to devices and by which users.
	"tagOwners": {
		"tag:self": ["autogroup:admin"],
		"tag:work": ["autogroup:admin"],
	}

然后在Machines中点击对应机器的Edit ACL tags,选择需要使用的tag。

访问限制

可以使用别名简化host:

// 为主机设置别名
"hosts": {
	"op":    "1.1.1.1",
	"inner": "192.168.10.1",
}

限制访问权限:

// Define access control lists for users, groups, autogroups, tags,
// Tailscale IP addresses, and subnet ranges.
"acls": [
	// Allow all connections.
	// Comment this section out if you want to define specific restrictions.
	// {"action": "accept", "src": ["*"], "dst": ["*:*"]},
	{"action": "accept", "src": ["tag:self"], "dst": ["*:*"]},
	{
		"action": "accept",
		"src":    ["tag:work"],
		"dst":    ["inner:80"],
	},
       // Users in group:dev and devices in subnets 192.168.0.0/24 and
   // 192.168.1.0/24 can access devices in subnets 192.168.0.0/24 and
   // 192.168.1.0/24
   { "action": "accept",
     "src": ["group:dev","192.168.0.0/24", "192.168.1.0/24"],
     "dst": ["192.168.0.0/24:*", "192.168.1.0/24:*"]
   }]

subnet

开启subnet,tailscale可以通过这个客户端访问指定内网段中的所有内网机器。

  1. sudo tailscale up --advertise-routes=192.168.0.0/24,192.168.1.0/24需要ipv6理论上也可以。
  2. 客户端启动,需要在admin端中启用这个subnet。
  3. admin console
  4. 在需要访问内网的设备上sudo tailscale up --accept-routes允许这个额外的路由。不能默认只有tailscale100.x的路由解析。

exit-node

  1. 开启IP转发

    1. linux系统中有etc/sysyctl.d目录的:

      echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
      echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
      sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
    2. 没有的:

      echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
      echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
      sudo sysctl -p /etc/sysctl.conf
    3. 如果有防火墙的firewall-cmd --permanent --add-masquerade

  2. sudo tailscale up --advertise-exit-node

  3. 在admin console中允许

小米BE6500 ssh开通

老规矩,先登录系统,Chrome 浏览器上面的地址栏可以看到 Stok 变量:

然后打开 cmd,依次输入以下代码,小米 Be6500 解锁 SSH 命令:(<STOK> 整体替换为你浏览器地址栏看到的数值)

curl -X POST http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/arn_switch -d "open=1&model=1&level=%0Anvram%20set%20ssh_en%3D1%0A"
curl -X POST http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/arn_switch -d "open=1&model=1&level=%0Anvram%20commit%0A"
curl -X POST http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/arn_switch -d "open=1&model=1&level=%0Ased%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%22debug%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%0A"
curl -X POST http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/arn_switch -d "open=1&model=1&level=%0A%2Fetc%2Finit.d%2Fdropbear%20start%0A"

ssh 即可打开用户名root。由于路由使用的是rsa加密算法。高版本ssh可能无法直接访问,显示错误Unable to negotiate with 192.168.31.1 port 22: no matching host key type found. Their offer: ssh-rsa

此时需要制定加密类型ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa root@192.168.31.1

ssh 密码在 https://miwifi.dev/ssh 输入路由器的SN可以得到SSH密码,SN可以看路由器屁股,也可以进小米路由器后台看。

参考文献


  1. 二级路由(openwrt)开启ipv6中继(ipv4和ipv6共存) ↩︎

  2. Tailscale客户端广播路由导致同一内网其他客户端无法正常使用内网的解决方法 ↩︎


文章作者: 不二
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不二 !
  目录