0%

ImmortalWrt软路由安装及配置

记录一下ImmortalWrt的安装方法,以及一些配置。

镜像下载

下载地址:https://firmware-selector.immortalwrt.org/。根据目标设备选择对应的镜像即可,

安装

VMware虚拟机

在镜像下载页面搜索Generic x86/64,选择ext4 vmdk镜像下载。当前最新版本24.10.2,查看package,确认kernel版本是6.6。

将下载好的vmdk文件复制到存放虚拟机的文件夹。VMware新建虚拟机,操作系统类型选择其他Linux 6.x 内核 64 位,命名为p73wrt,处理器和内存按需配置。网络选择NAT。磁盘界面选择复制进去的vmdk文件。虚拟机创建好之后直接启动即可。

系统启动之后,如果终端一直在吐log,可以用echo 0 > /proc/sys/kernel/printk关闭log。

树莓派3B

镜像下载页面搜索Raspberry Pi 3,我选择的64位ext4版本。解压后用Win32DiskImage或其他类似工具写入TF卡,插入树莓派启动即可。

基础设置

IP地址

进入虚拟机终端,编辑文件/etc/config/network,给网卡lan设置IP地址,网段和路由器保持一致。添加网关和dns的配置。网关可以填路由器的地址。最后/etc/init.d/network restart重启网卡。可以ping路由器、8.8.8.8baidu.com测试网络是否正常。

1
2
3
4
5
lan
...
option gateway 'ipaddr'
list dns 'dns server'
option ipaddr 'ip'

网络配置好之后,在浏览器输入IP地址,即可进入网页端,默认没有密码。以上关于网络接口的配置,也可以访问管理网页,进入网络->接口,进入设置。

root密码

shell执行 passwd root,或网页web进入系统->管理权进行设置。

软件包更新和安装

immortalwrt 使用opkg管理软件包,所以可以使用opkg安装软件包。也可以访问网页端,进入系统->软件包,对软件包进行管理。

rootfs扩容

安装系统的时候,默认分配了1GB大小的磁盘,但是rootfs最大只有290MB。

1
2
3
4
5
6
7
root@ImmortalWrt:~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 290.4M 42.1M 242.3M 15% /
tmpfs 991.9M 1.1M 990.8M 0% /tmp
/dev/vda1 31.9M 8.3M 23.6M 26% /boot
/dev/vda1 31.9M 8.3M 23.6M 26% /boot
tmpfs 512.0K 0 512.0K 0% /dev

安装相关工具的指令

1
opkg install resize2fs parted losetup fdisk

关闭虚拟机,进入虚拟机设置,把磁盘设置为10GB大小(如果是树莓派,忽略)。启动虚拟机,进入终端,执行fdisk /dev/vda命令,进入交互式界面,敲p查看分区表,确认rootfs分区编号,应该是2。然后输入e->2,不输入大小,直接回车,用默认的最大值。最后敲w保持退出。

1
2
3
4
5
6
7
8
9
10
Command (m for help): e
Partition number (1,2,128, default 128): 2

New <size>{K,M,G,T,P} in bytes or <size>S in sectors (default 10G):

Partition 2 has been resized.

Command (m for help): w
The partition table has been altered.
Syncing disks.

重启系统,待系统重启成功后,执行 resize2fs /dev/vda2,扩大文件系统。最终效果如下。

1
2
3
root@ImmortalWrt:~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 9.8G 43.1M 9.8G 0% /

也可以参考 https://blog.csdn.net/2301_81011704/article/details/142636930 扩容rootfs。

如果 rootfs 扩容遇到如下错误。

1
2
3
4
5
6
root@ImmortalWrt:~# resize2fs /dev/sda2
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/sda2 to 2613120 (4k) blocks.
resize2fs: Invalid argument While trying to add group #3

kernel log 如下。

1
2
3
4
5
6
root@ImmortalWrt:~# dmesg | grep sda2
[ 31.879942] EXT4-fs (sda2): resizing filesystem from 98304 to 2613120 blocks
[ 31.880641] EXT4-fs warning (device sda2): reserve_backup_gdb:1052: reserved block 24 not at offset 23
[ 31.880945] EXT4-fs warning (device sda2): ext4_resize_fs:2194: error (-22) occurred during file system resize
[ 31.881274] EXT4-fs (sda2): resized filesystem to 98304
[ 31.883174] EXT4-fs warning (device sda2): reserve_backup_gdb:1052: reserved block 24 not at offset 23

参考https://github.com/openwrt/openwrt/issues/7729,拿到如下修复命令。成功修复。如果是虚拟机,分区名字要换成 /dev/sda2

1
2
3
4
5
6
mount -o remount,ro / #Remount root as ReadOnly
tune2fs -O^resize_inode /dev/mmcblk0p2 #Remove reserved GDT blocks
fsck.ext4 /dev/mmcblk0p2 #Fix part, answer yes to remove GDT blocks remnants。所有全部选y
reboot

resize2fs /dev/mmcblk0p2

webserver 切换到nginx

首先停止uhttpd,防止端口冲突。然后安装nginx。

1
2
service uhttpd stop && service uhttpd disable
opkg update && opkg install nginx-full nginx-mod-luci

nginx的主配置文件是/etc/nginx/uci.conf。这个文件是根据/etc/config/nginx里面的配置生成来的。修改此文件,参考如下。主要修改了第一个server的名字,server_name,证书的文件名,以及包含文件p73wrt.inc.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
config main global
option uci_enable 'true'

config server '_main'
list listen '443 ssl default_server'
list listen '[::]:443 ssl default_server'
option server_name 'p73wrt.inc'
list include 'restrict_locally'
list include 'conf.d/*.locations'
list include 'p73wrt.inc.conf'
# option uci_manage_ssl 'self-signed'
option ssl_certificate '/etc/nginx/conf.d/p73wrt.inc.crt'
option ssl_certificate_key '/etc/nginx/conf.d/p73wrt.inc.key'
option ssl_session_cache 'shared:SSL:32k'
option ssl_session_timeout '64m'
option access_log 'off; # logd openwrt'

config server '_redirect2ssl'
list listen '80'
list listen '[::]:80'
option server_name '_redirect2ssl'
option return '302 https://$host$request_uri'

修改完成之后,使用如下命令重启nginx。

1
2
3
touch /etc/nginx/p73wrt.inc.conf
uci commit nginx
service nginx restart

p73wrt.inc.conf添加如下内容,禁止IP直接访问。

1
2
3
if ($host != 'p73wrt.inc') {
return 403;
}

参考:

  1. 安装nginx https://segmentfault.com/a/1190000044574943
  2. 禁止IP访问:https://zhuanlan.zhihu.com/p/372689544

DHCP

把主路由的静态IP设置,同步到ImmortalWrt。关闭主路由的DHCP服务,使用软路由分配IP地址。在网络->DHCP/DNS->静态地址分配,可以为某台设备设置静态IP地址和标签。注意,如果只设置标签而没有设置固定IP地址,则标签设置不会生效。

dhcp 选项3用于指定网关。关闭主路由的dhcp后,软路由dhcp默认指定的网关是软路由地址,这样局域网内所有的设备都能科学上网了。但是不想所有设备都走代理。关键配置在于设备的网关地址。

经过搜索资料,有两种方式可以做到。黑名单,即默认网关指向软路由(默认走代理),如果某个设备不想走代理,通过设置把网关指向主路由。白名单,即默认网关指向主路由(默认不走代理),如果想让某个设备走代理,通过设置把这台设备的网关指向软路由。这里选择白名单模式。

网络->接口->点击lan编辑->DHCP服务器->高级设置,增加三个DHCP选项,3,192.168.100.16,192.168.100.25tag:outsea,3,192.168.100.55,保存并应用。

DHCP的地址范围在网络->接口->点击lan编辑->DHCP服务器->常规设置下面,默认是从100开始分配地址。

参考:

DNS

切换lan到inc,网络->DHCP/DNS->常规,将本地解析这些项目改成/inc/本地域名改成inc。这样会自动增加一个<hostname>.inc的域名。

选项卡下面的所有服务器,即打开all-servers选项,同时查询所有的上游DNS服务器。询问AI,会导致CPU使用率增加、带宽使用增加、减低缓存命中率。打开之后会提高查询速度,避免DNS劫持。综合考虑,性能优先,打开这个选项。

DNS记录选项卡下面可以添加DNS记录,例如A记录、CNAME记录等。图形化界面。但是历史DNS记录比较多,图形化界面不利于重新部署,还是考虑自动化部署。首先将/etc/dnsmasq.d包含到dnsmasq的配置文件中,参考如下命令。最后修改相关自动化脚本,将DNS记录配置文件部署到/etc/dnsmasq.d 下面。。

1
2
3
4
mkdir -p /etc/dnsmasq.d
uci set dhcp.@dnsmasq[0].confdir="/etc/dnsmasq.d"
uci commit dhcp
service dnsmasq restart

转发选项卡下面的DNS转发可以设置上游DNS服务器地址。可以设置为阿里的公共DNS服务器,223.5.5.5223.6.6.6。注意,如果安装了openclash插件,clash默认会打开DNS劫持,DNS转发的设置总是会被自动修改成127.0.0.1#7874。建议在服务->OpenClash->插件设置->DNS设置关闭DNS劫持。避免部分网页无法打开。为了访问速度更快,建议使用运营商的dns。主路由拨号时会自动获取运营商的dns,所以这里填主路由IP即可。

Resolv和Hosts文件选项卡下面的解析文件,默认也配置了两个上游DNS服务器。默认是文件/tmp/resolv.conf.d/resolv.conf.auto。参考https://www.openwrt.pro/post-141.html,看起来是netifd自动生成的。

openclash也有设置上游DNS服务器的地方,在服务->OpenClash->复写设置->DNS设置,找到设置自定义上游 DNS 服务器(在上方设置中启用本功能后生效),有NameServerDefault-NameServer两个选项卡可以配置。这里默认不生效。

Resolv和Hosts文件选项卡下面的忽略解析文件,表示打开选项noresolv,忽略/etc/resolv.conf文件。

打开dnsmasq的log

修改dhcp和dns的时候,可能遇到问题,这时就需要打开dnsmasq的log进行debug。首先编辑/etc/dnsmasq.conf文件,注释log-facility=/dev/null。然后service dnsmasq restart重启服务。

进入web,进入网络->DHCP/DNS->日志,勾选记录查询日志,记录设施选自定义,填/tmp/dnsmasq.log,保存并应用。这时就能在/tmp/dnsmasq.log文件看到相关日志。

调整完成之后,记得关闭log,提高性能。

如果在web界面打开log后,dnsmasq启动失败。使用命令logread | grep dnsmasq查询启动日志,确认启动失败的原因。