搭建OpenWrt软路由

起因

一直以来, 都想在路由器上搭建机场, 不用在每台设备上都安装小飞机. 看了一下路由器, 基本上都是华硕路由器刷梅林固件, 因为价格过高以及我大部分时间使用有线网络的原因, 购买一个新的路由器并没有必要.
无意中看到了软路由这个词, 搜索之后得知, 软路由其实就是基于CPU散片组装的小型PC, 在上面安装OpenWrt等系统, 就可以进行路由转发. 在上面有很多插件, 可以方便的搭建透明代理. 于是当天在淘宝上购买了基于J1900的软路由, 到家之后立刻开始折腾.

安装

在OpenWrt官网下载了img镜像, 准备好Arch Linux的PE盘, 选择Arch是因为镜像小, 下载和烧录迅速. 把软路由接好显示器, 插入U盘, 按下电源键, 默认就优先进入了U盘引导. Arch Linux启动后, 再插入包含OpenWrt镜像的U盘, 或者直接使用curl下载.

1
dd if=openwrt.img of=/dev/sda

使用dd命令将镜像直接写入软路由硬盘, 此时如果重启就可以直接进入OpenWrt系统了. 但这里有个坑需要注意, 不管你的软路由的硬盘有多大, 重启后你就会发现rootfs只有200M+的空间. 因为dd写入镜像, 分区表等信息都和镜像一样, 镜像的ext4分区默认只有200M+. 所以要使用PE系统重建分区, 因为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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 对sda进行分区扩展
root@OpenWrt:~# sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.32).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 输入 p 显示分区信息
Command (m for help): p
Disk /dev/sda: 7.2 GiB, 7751073792 bytes, 15138816 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcbad8a62

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 33279 32768 16M 83 Linux
/dev/sda2 33792 558079 524288 256M 83 Linux
# 输入 d 删除 第二个分区,这里记录下第二个分区的起点是33792
Command (m for help): d
Partition number (1,2, default 2):

Partition 2 has been deleted.
# 输入 n 创建新的分区
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
# 输入 p 确认是主分区
Select (default p): p
# 输入分区id 用默认的2
Partition number (2-4, default 2): 2
# 输入 分区起始位置(就是原来分区2起始的位置)
First sector (33280-15138815, default 34816): 33792
# 这里直接回车,默认选择终止位置就是硬盘的末尾
Last sector, +sectors or +size{K,M,G,T,P} (33792-15138815, default 15138815):

Created a new partition 2 of type 'Linux' and of size 7.2 GiB.
Partition #2 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n
# 输入 w ,写入硬盘, 这里可能会有一个warning,忽略即可
Command (m for help): w

The partition table has been altered.
Syncing disks.

此时分区大小扩展了, 但是上面的ext4还没有扩容:

1
2
resize2fs /dev/sda2
e2fsck -f /dev/sda2

执行上面的命令完成rootfs扩容, 重启即可进入OpenWrt.

配置

进入系统后执行:

1
cat /etc/config/network

查看网卡配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'

config globals 'globals'
option ula_prefix 'fddb:f68c:5cd8::/48'

config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'

config interface 'wan'
option ifname 'eth1'
option proto 'dhcp'

config interface 'wan6'
option ifname 'eth1'
option proto 'dhcpv6'

可以看到wan口配置在eth1, 也就是第二个网线插口, 从光猫牵线插入wan口即可获取动态IP, 此时OpenWrt已经成功联网. 另外eth0也就是第一个网线插口配置成了lan, 将电脑或路由器插上去即可获取IP. 此时用电脑浏览器访问192.168.1.1(可手动修改配置), 登录OpenWrt配置页面.

Clash

安装了clash之后, 可以顺利的科学上网, 可是当我执行:

1
2
3
PING baidu.com (198.18.1.115) 56(84) bytes of data.
--- baidu.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 4ms

域名baidu.com被解析到了一个保留地址, 可是此时我的系统可以正常联网, 于是我开始探索这种被称为Fake IP的机制. Clash自带DNS服务器, 监听127.0.0.1:5300, 通过设置dnsmasq的server字段, 将所有DNS请求转发到自身服务.
然后通过建立一个虚拟IP与实际域名的映射表, 随机返回一个IP(198.18.0.1/16). 客户端收到响应后, 与该IP建立TCP/UDP连接, 而Clash通过添加IPTables规则, 将目标IP属于198.18.0.1/16的请求转发到Clash的Redir Port(7892). 此时Clash可以查询IP对应的域名, 进行透明代理.