缘由

前段时间,买了个 PS 4,然后由于众所周知的原因,PSN 的各路 CDN 提供商在中国都没有节点,例如 cloudfront, Akamai 等,因此在国内访问 PSN 会被分到一个连接很不理想的节点,所以可想而知速度是极度慢的,更别说下载游戏什么的了,动辄 20+ GB 的游戏,猴年马月才下的完呢!于是就想到换 DNS,但是,假若 DNS 换到了台湾香港,访问其他网站就悲剧了,自己上网时候还得改回来,那么有没有分域名去请求不同的 DNS 服务器呢!那就得请 OpenWrt 出场了,它能干更多的事情。

事实上,开源的路由器系统有很多,比如 DD-Wrt, OpenWrt 等,鉴于 OpenWrt 比较流行,并且恰巧去年买的 TL-WR 703N 刚好又是刷 OpenWrt 的神器之一,于是动手这个小路由。

目标

  1. 将 TL-WR703N(以下简称 703N)刷成 OpenWrt 系统。
  2. 挂载 U 盘作为存储(703N 原厂只有 4MB,装完系统后就没空间了)。
  3. 配置 dnsmasq。
  4. [选做] 配置 pdnsd,避免被劫持。

配置路由

注意:如果你打算挂载 U 盘,请先一路浏览完“配置路由”,“挂载 U 盘“两部分再动手~

下载 OpenWrt 固件.

进入路由器管理页面,选择系统固件升级,选择刚下好的 OpenWrt 固件,根据说明进行升级。

路由器重启完成后,就是 OpenWrt 了,默认是没有开启无线的,所以网线直连路由。

打开终端,直接 telnet 192.168.1.1 进入系统。出现欢迎界面后,修改 root 密码。

passwd root

然后就可以使用更安全的 ssh 登录路由器了,退出 telnet,ssh 登入:

ssh root@192.168.1.1

先备份下配置文件,以防万一,

cp /etc/config ~/ -r

然后配置无线网络,

vi /etc/config/wireless 

注释掉 # option disabled 1,开启无线,顺便可以修改下 SSID 和密码。

option ssid 'OpenWrt'  
option encryption 'psk2'  
option key '8位以上密码' 

保存退出,编辑 /etc/config/network 文件,修改 lan 接口配置,注释掉此行:

# option ifname 'eth0'

增加 wan 接口,如果你上级网络是DHCP的,则文件的末尾添加:

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

如果是拨号的话,则添加如下配置:

config interface 'wan'
	option ifname 'eth0'
    option proto 'pppoe'
    option username '宽带帐号'
    option password '宽带密码'

保存退出。

输入 reboot 命令重启路由器,然后找到你刚配置的 SSID,通过无线连接你的路由(PS:别忘了拔下路由器连到你电脑的那头的网线,插到你家上级网络接口上。)

到此,如果已经可以上网了,那么这一步完成了。

挂载 U 盘

首先需要对 U 盘分区,这一步看似简单,实际上有个大坑,我第一次配置的时候,看似全部 ok,结果一重启路由器后,所有设备都可以正常上网,唯独路由器本身连 baidu.com 都 ping 不通,检查半天发现 DNS 配置都正确,百思不得其解,后来 google 了半天,最后终于找到一个同病相怜的老外,揪出原因是因为 u 盘是在 Ubuntu 下分区和格式化的,然后把 u 盘挂载后,路由器木有权限,囧。我一怒之下就直接用路由器来重格了。步骤如下:

首先,删掉一些不痛不痒的包,腾出空间,安装几个格分区需要的包,

可以先用其他软件先给 U 盘分区,这是我的分区方案:

1). 1000 MB,用于路由器的根分区,安装各种包用;
2). 512 MB,用于 swap;
3). 剩下所有,发挥自己想象去用 →_→。

opkg install block-mount kmod-fs-ext4 e2fsprogs  

没记错的话,最后那个包相当大,上百 KB,装完之后,插上 u 盘。

看下是否识别成功了,

ls /dev/

如果发现几个 /dev/sda*,就可以继续了。

那么,首先格式化第一个将用于路由器系统的分区,

mkfs.ext4 /dev/sda1  

然后,设置 swap 分区,

mkswap /dev/sda2  

第三个分区就看自己喜好了,ext, ntfs 随意。

然后,如果你还记得之前删掉了哪些包的话,再装上就是,如果不记得了的话,干脆重刷一遍~ Orz

然后就可以开始挂载 U 盘了。

首先挂载主分区:

mount /dev/sda1 /mnt
mkdir /tmp/root
mount -o bind / /tmp/root
cp /tmp/root/* /mnt -a
umount /tmp/root

开启 swap,

swapon /dev/sda2  

编辑 /etc/config/fstab 文件,修改如下,

config mount
        option target   /overlay
        option device   /dev/sda1
        option fstype   ext4
        option options  rw,sync
        option enabled  1
        option enabled_fsck 0

同样,修改 swap 部分

config swap
        option device   /dev/sda2
        option enabled  1

reboot 重启路由,然后输入 df -h 就可以看到 rootfs 已经很大了。可以安装各种包了。

配置 dnsmasq

OpenWrt 实际上已经自带了 dnsmasq 了,所以要做的只是加配置而已了。编辑 /etc/dnsmasq.conf,在文件最后加入:

conf-dir=/etc/dnsmasq.d

这样,dnsmasq 启动后会加载 /etc/dnsmasq.d 目录下所有的配置。

针对 PSN,我们新建一个配置文件 /etc/dnsmasq.d/psn.conf,然后输入相关配置即可,为节省篇幅,配置文件内容我放到了 GitHub 的 Gist 中。

保存完后,重启 dnsmasq 即可。

/etc/init.d/dnsmasq restart

pdnsd(可选)

这个 pdnsd 是干嘛用的呢!当我们访问一些国外的网站的时候,有时候,本地的 DNS 并不见得会快,或者说,所处的网络不小心被 hijack 了,那么还有可能会得到错误的解析结果,有了 pdnsd,我们就可以让一些特定的域名使用特定的 dns 去查询。

首先安装 pdnsd 包

opkg update
opkg install pdnsd

编辑配置文件 /etc/pdnsd.conf

# 这一段全局配置需要修改:

global {
    # debug = on;          
    perm_cache=1024;
    cache_dir="/var/pdnsd";
    run_as="nobody";
    
    # 使用 1053端口防止冲突
    server_port = 1053;    
    server_ip = 127.0.0.1;
    status_ctl = on;
    
    # 仅用 tcp 的查询方式,保证可靠性
    query_method=tcp_only; 
    min_ttl=15m;
    max_ttl=1w;
    timeout=10;
}

# 增加一个 DNS 服务器,因为针对国外网站,所以选个国外的
server {
    label= "googledns";
    ip = 8.8.8.8;
    root_server = on;
    uptest = none;
}

该配置文件中其他的内容如果你不知道是啥意思的话,就不用随便动了,保存退出即可。

启用 pdnsd,并设置为开机启动:

/etc/init.d/pdnsd enable
/etc/init.d/pdnsd start

好了,我们来测试下,

dig @8.8.8.8 +tcp www.google.com
dig @192.168.1.1 -p 1053 www.google.com

比对以上结果,如果一致的话,就说明配置生效了。

最后的步骤,使用 dnsmasq 转发特定的域名的 dns 查询请求到我们路由器 1053 端口的 pdnsd。

同样,新建一个 dnsmasq 配置文件,例如/etc/dnsmasq.d/accelerate.conf

配置很简单,按照如下格式书写即可:

# github
server=/.github.com/127.0.0.1#1053

关键在于 127.0.0.1#1053 既指定使用 pdnsd 的服务来进行 github 相关的域名的 dns 查询。

好了,到这里就收工了~,享受飞一般的 PSN 登录速度~

参考