OpenWrt TTYD 终端自动登录

OpenWrt 安装 TTYD 终端可以通过如下的命令安装:

opkg update
opkg install ttyd
opkg install luci-app-ttyd

然后再 Services - Terminal 中即可访问终端,但是每次输入据需要输入用户名密码,可以在 Config - Command 的值由 /bin/login 改成 /bin/login -f root,保存并应用之后即可不用输入用户名密码进入终端。


其他的一些有用的设置

  1. 安装 lrzsz,opkg install lrzsz。然后在 config - Client option 中添加 enableZmodem=true。这样就可以通过 rz 命令接收文件,使用 sz 命令下载文件。

docker 中安装 openwrt 并作为旁路由

在 docker 运行 openwrt 的方式如下:
网络接口最好使用网线接口,我测试的下来使用 wifi 的接口,macvlan 连不上网,ipvlan 一段时间后宿主机会获取不到 ip 地址,导致宿主机掉线。

如果时使用网线接口,macvlan 可能时更好的方法,这种方法,容器具有独立的 mac 地址和 ip 地址。

docker stop openwrt
docker rm openwrt
docker network rm opvlan-net

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=enp3s0 \
  opvlan-net

docker run \
  --name openwrt \
  --network opvlan-net \
  --privileged \
  --sysctl net.ipv6.conf.all.disable_ipv6=0 \
  -d xinebf/openwrt:24.10.0-x86-64 /sbin/init

docker exec openwrt ip addr show eth0 | grep 'inet '
# You can access the router's backend using the following command.
docker exec -it openwrt sh

如果使用 macvlan 宿主机和容器要想通信需要创建 macvlan 子接口。此时宿主机和容器就能通过 容器 ip 和 hostvlan 中的 ip 进行互相通信了。

sudo ip link add hostvlan-net link enp3s0 type macvlan mode bridge
sudo ip addr add 192.168.1.15/24 dev hostvlan-net
sudo ip link set hostvlan-net up

# Clear hostvlan settings
sudo ip link set hostvlan-net down
sudo ip link delete hostvlan-net

如果想要使用 ipvlan 命令如下,ipvlan 的方式宿主机和容器可以直接通信。

docker network create -d ipvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=wlp1s0 \
  -o ipvlan_mode=l2 \
  opvlan-net

在 docker 中使用 openwrt 作为旁路由根据网络情况可以分为如下四种情况。

  1. 旁路由网关不启用 IPv6,并且禁用 DHCP,使用主路由提供 DHCP 服务。
  2. 旁路由网关不启用 IPv6,并且作为 DHCP 服务器,此时主路由要禁用 DHCP。
  3. 旁路由网关启动 IPv6,并且作为 DHCP 服务器,此时主路由需要禁用 DHCPv4,DHCPv6 只需要开启 RA 服务。

下面按照上面四种情况分别进行解释说明,下面所有的命令都假设是在通过上面命令启动的全新的 openwrt 容器内执行。

# Step One: Configure the LAN Port's Network
uci set network.lan.device='eth0'
uci set network.lan.ipaddr='192.168.1.6'
uci set network.lan.gateway='192.168.1.1'
uci add_list network.lan.dns='192.168.1.1'

uci commit network
service network restart
# Step Two: Disable DHCP Service
uci set dhcp.lan.ignore='1'
uci set dhcp.lan.dhcpv6=disabled
uci set dhcp.lan.ra=disabled

uci commit dhcp
service network restart
# Step Three: Create a New lan6 Interface
# Modify Firewall Configuration
uci del firewall.cfg02dc81.network
uci add_list firewall.cfg02dc81.network='lan'
uci add_list firewall.cfg02dc81.network='lan6'

# Modify Network Configuration
uci set network.lan6=interface
uci set network.lan6.proto='dhcpv6'
uci set network.lan6.device='@lan'
uci set network.globals.packet_steering='1'
uci set network.lan6.reqaddress='try'
uci set network.lan6.reqprefix='auto'
uci set network.lan6.norelease='1'

# Submit and Apply
uci commit firewall
uci commit network
service network restart
service firewall reload
# Configure devices with the tag 'direct' to use the main router as their gateway and DNS server.
uci add_list dhcp.lan.dhcp_option='tag:direct,3,192.168.1.1'
uci add_list dhcp.lan.dhcp_option='tag:direct,6,192.168.1.1'
# Configure devices whose tag is not 'proxy' to use the main router as their gateway and DNS server.
# uci add_list dhcp.lan.dhcp_option='tag:!proxy,3,192.168.1.1'
# uci add_list dhcp.lan.dhcp_option='tag:!proxy,6,192.168.1.1'
uci commit network
service network restart
  1. 旁路由网关不启用 IPv6,并且禁用 DHCP,使用主路由提供 DHCP 服务。

需要执行上面 step one 和 step two 中命令。

  1. 旁路由网关不启用 IPv6,并且作为 DHCP 服务器,此时主路由要禁用 DHCP。

只需要执行上面 step one 中的命令。

  1. 旁路由网关启动 IPv6,并且作为 DHCP 服务器,此时主路由需要禁用 DHCPv4,DHCPv6 只需要开启 RA 服务。

需要执行上面 step one 和 step three 中的命令。


上面命令的快捷方式

https://openwrt-in-docker.pages.dev/?ip=192.168.10.123

小容量路由器安装 OpenWrt 并使用 U 盘对空尽进行扩容

入手了一个支持 OpenWrt 的路由器,并且支持了 OpenWrt 官方的固件,官方的固件可玩性不大,于是便刷到了原生的 OpenWrt 固件,但是由于机器的存储只有 128MB 在刷完固件之后留给插件的空间就剩下了 45MB,几乎丧失了可玩性。
由于这个机器有一个 USB 3.1 的接口,便想着是不是可以使用 U 盘对可用空间进行扩容,经过到网上进行搜索和自己的尝试,将网上的内容进行了整合形成了这篇内容。
如果要对 overlay 进行扩容需要进行一下几步:

  1. 安装需要用到的插件。
  2. 格式化 sda1 分区(主分区)。
  3. 挂载 sda1 到 /mnt 目录。
  4. 拷贝 /overlay 目录下的所有内容到 sda1 中。
  5. 更新 fstab,使用 sda1 的 overlay 进行系统的启动。
opkg update
opkg install block-mount kmod-usb-storage kmod-usb-storage-uas kmod-fs-ext4 e2fsprogs cfdisk

mkfs.ext4 /dev/sda1

mount -t ext4 /dev/sda1 /mnt
cp /overlay/* /mnt -a
umount /mnt

block detect > /etc/config/fstab
uci set fstab.@mount[0].target='/overlay'
uci set fstab.@mount[0].enabled='1'
uci commit fstab

reboot

由于 sda1 是原始 overlay 的一个拷贝,那么在使用 sda1 中的 overlay 运行的过程中出现了什么问题,可以拔掉 u 盘重启,就会启动到原来的 overlay,此时在插入 u 盘,重新执行上面的操作就能将系统到系统中原来的 overlay。

如果不想拔掉 u 盘恢复到原来的 overlay,此时需要知道原来的 overlay 在什么盘的分区,在确定之后可以执行下面的命令,其中 ubi0_2 为原始 overlay 的分区。

rm -rf /overlay/*
mount -t ubifs -o ro /dev/ubi0_2 /mnt/original_overlay
cp -a /mnt/original_overlay/* /overlay/

reboot

或者在 u 盘中新建 sda2 分区并格式化成 ext4,作为备份文件存目录,使用如下的命令进行备份还原

mkdir -p /mnt/sda2
mount -t ext4 /dev/sda2 /mnt/sda2
FILE="overlay_backup_$(date +%Y%m%d).tar.gz"
tar -cvzf "/mnt/sda2/${FILE}" -C /overlay .
cp -f "/mnt/sda2/${FILE}" "/mnt/sda2/overlay_backup_latest.tar.gz"
umount /mnt/sda2

mkdir -p /mnt/sda2
mount -t ext4 /dev/sda2 /mnt/sda2
rm -rf /overlay/*
tar -xzvf /mnt/sda2/overlay_backup_latest.tar.gz -C /overlay --same-owner --preserve-permissions
umount /mnt/sda2

对 swap 进行扩容(如果 ram 的大小是 512MB 及以上并不推荐设置 swap)

对 swap 进行扩容并不建议在 u 盘上面创建一个 sda2 然后格式化为 swap 分区的方法,推荐使用 zram 的方法。
安装完成之后在 System -> System -> ZRam Settings 中设置 zram 的大小和压缩算法。

opkg update
opkg install kmod-zram zram-swap

swapon -s
cat /sys/block/zram0/comp_algorithm
cat /sys/block/zram0/disksize

经过折腾小磁盘的 openwrt 路由器,感觉 squashfs 格式比 ext4 更适合 openwrt。
根据 OpenWrt 的介绍 squashfs 是一个只读压缩的文件系统,在安装软件时即使文件超过了可用的空间也不放大胆的试一下。

cloudflare 设置回源规则

要自定义回源端口首先需要设置域名的 A 或者 CNAME 记录,并且打开小黄云。
然后在 Rules - Origin Rules 中 Create rule:
其中:5000 为需要回源的端口


如果是回源到 http 地址需要进行额为的设置

  1. 将 SSL/TLS - Overview - SSL/TLS encryption mode 设置为 Full;
  2. 将 SSL/TLS - Edge Certificates - Always Use HTTPS: False;
  3. 将 SSL/TLS - Edge Certificates - Automatic HTTPS Rewrites: False;

并在回源规则处再添加一个 And 设置

SSL/HTTPS: False


如果想要通过 https 访问源服务是 http 的地址,使用 cloudflare tunnels 是个更好的方法。


SSL/TLS - Origin Server 中可以为域名生成有效期 15 年的证书。
Cloudflare Origin ECC PEM CA ROOT Certificate

sing-box 配置记录

sing-box 入站 tun 的配置如下,其中,sniff 表示开启域名嗅探,sniff_override_destination 表示开启域名复写。
有些 vps 或者节点提供商可以通过 dns 解锁 chatgpt 服务,不开启复写的情况下,一般的网络访问为本地通过 dns 解析到域名对应的 ip,然后将 ip 和端口发送到节点服务器进行访问,节点接到要访问的 ip 和端口之后,如果节点没有开启嗅探复写就会直接访问 ip 和端口,如果节点开启了嗅探复写就会从接收到的内容中嗅探到要访问的域名,并在节点服务器进行 dns 解析,然后用节点服务器解析到的 ip 进行访问。
如果本地开启了嗅探复写那么客户端会讲嗅探到的域名交给节点服务器去访问,节点服务器在接收到客户端发过来的域名之后,会先进性 dns 查询,然后用查询到的 ip 和端口进行访问。
嗅探主要用来进行域名分流规则匹配,复写主要用嗅探到的域名替换掉访问目标 ip,如果节点开启了嗅探复写也可以正常解锁 chatgpt 服务。
开启嗅探复写导致无法连接智能家居和无法连接 tor 网络(对于 tor 网络本地和节点都不能开启嗅探复写,如果无法关闭嗅探复写则可以开启 tor 的 obfs4 混淆,这样就会嗅探不到域名)。

{
  "type": "tun",
  "tag": "tun-in",
  "inet4_address": "172.19.0.1/30",
  "mtu": 9000,
  "gso": true,
  "auto_route": true,
  "stack": "system",
  "sniff": true,
  "sniff_override_destination": false
}

通过 HTTP3 或者 QUIC 协议访问网站会导致即使开启嗅探也无法嗅探到域名,QUIC 会导致代理连接缓慢的问题,所以一般都会关闭 QUIC 协议的网络连接,在 sing-box 中关闭 QUIC 连接的方法是在 route 中屏蔽 QUIC 协议,或者在 dns 规则 rules 中平屏蔽 HTTPS 查询类型,这两种方法都会屏蔽掉 QUIC。

# 在 route 中屏蔽 quic 协议
{
  "protocol": "quic",
  "outbound": "block-out"
}

# 在 dns rules 中屏蔽 HTTPS 查询类型
{
  "query_type": "HTTPS",
  "server": "block-dns"
}

如果是在 docker 中搭建的服务要想实现 fullcone,容器的网络模式需要是 host

使用 nginx stream 实现共用 443 端口

最近由于我这里移动的宽带无法通过 vmess 访问网页,而国内的网站却不受影响,想到有可能是域名的问题,国内的域名或者常见的域名就不受影响,所以想着是不是可以使用 vless-reality-vision 避开这个限制。而且根据理解 vless-reality-vision 使用 443 端口可能是更好的选择,但是机子上面的 443 端口已经被 nginx 占用了,通过搜索在网上找到了别人分享的可以通过 nginx 的 steam 模块进行分流,由于我机子上的服务都是使用 docker 启动的,分析下来发现使用 docker 的情况下可以实现非常完美的效果。

首先机子上面要先安装 docker,然后需要创建一张 docker 内部用来通信的网卡(命名为 internal):

docker network create internal

准备 vless-reality-vision 的配置文件,在配置文件中有一些参数需要自定义,分别是:

  1. id,uuid 生成可以使用 xray 的命令来生成,windows 下的命令是 xray.exe uuid
  2. privateKey,也需要去替换,这个参数和客户端的 publicKey 是对应的,通过命令 xray.exe x25519 生成,执行这个命令之后会同时输出这两个 key。
  3. shortIds(可选),用来区分不同的客户端,在服务端可以填写多个,客户端中填写服务端中填写的任一个就行,可以通过 openssl rand -hex 3 生成,命令中的 3 可以替换成 1 到 8 中的任意一个数字。
  4. destserverNames(可选),dest 中的值需要填写可以正常访问的境外支持 tls1.3(通过 F12 - Security - Overiew 查看) 和 h2(通过 F12 - Network - Protocol 查看) 的网站serverNames 填写与 dest 域名共用同一个证书的网站(通过 F12 - Security - Main origin 下的网站中的 SAN 查看),但是暂不支持填写 * 通配符,serverNames 中填写的域名任一个都可以填写到客户端中的 serverName 中,serverNames 也可以简化到只填写和 dest 相同的一个域名。

我这里提供了一个 API 可以生成一个直接用的 vless-reality-vision 的配置文件

https://workflow.xinebf.com/webhook/domain-san?d=support.microsoft.com

其中:d= 后面填写配置文件中的 dest

在修改好 vless-reality-vision 的配置文件(保存在 ~/app/back/xray-vless-reality-vision.json)之后,就可以启动 docker 命令了。

在这个 docker 的启动命令中并没有将端口映射到容器外,此时的 vless-reality-vision 并不能被连接,需要创建一个 nginx 的容器通过其中的 stream 模块分流,创建 nginx 的配置文件(保存在 ~/data/nginx/nginx_stream.conf)通过命令启动 nginx stream 的容器,在这个 nginx stream 的配置文件中包含了所有服务端设置的 serverNames,即客户端可以填写任意服务端 serverNames 中包含的域名。可以在 nginx 的容器中对外映射 80 端口,nginx stream 的容器对外映射 443 端口。

至此,就可以通过 443 端口使用 vless-reality-vision 了。