百忍千锻事遂全
在OpenWrt上搭建SS+Pdnsd+ChinaDNS分流科学上网,Kcptun+BBR加速

其实早就搭好了的,最近由于种种原因从头到尾重来了一遍,中间各种问题麻烦不断,为了以后方便,记录一下整个过程。

VPS配置

我用的是Vultr.com的日本服务器,最低配每个月5美元,优化后在这南方某一线城市联通看YoutTube可以达到16000kbps的速度,看1440p60fps丝般顺滑,
购买连接在此:Vultr VPS

Debian 8 & Shadowsocks-libev

现在Debian已经有了9了,但是Debian 9的官方源已经没有Pdnsd了,所以还是用8。
Debian 8里根据SS-libev的github页面上的安装教程安装:

sudo sh -c 'printf "deb http://httpredir.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list'
sudo apt update
sudo apt -t jessie-backports install shadowsocks-libev

配置和启动shadowsocks-libev

shadowsocks-libev项目地址

# Edit the configuration file
sudo nano /etc/shadowsocks-libev/config.json

{
"server":"my_server_ip",
"server_port":8388, #any port
"local_address": "127.0.0.1",
"local_port":1080,
"password":"mypassword",
"timeout":300,
"method":"aes-256-cfb", #如果路由器配置不高可以换成chacha20,差别其实应该不大,据说都是玄学
"fast_open": true #手机上的SS客户端有fast open选项
}

# Edit the default configuration for debian
sudo nano /etc/default/shadowsocks-libev


# Enable during startup?
START=yes
# Configuration file
CONFFILE="/etc/shadowsocks-libev/config.json"
# Extra command line arguments
DAEMON_ARGS="-u"
# User and group to run the server as
USER=nobody
GROUP=nogroup
# Number of maximum file descriptors
MAXFD=32768


# Start the service
sudo /etc/init.d/shadowsocks-libev start    # for sysvinit, or
sudo systemctl start shadowsocks-libev      # for systemd

安装配置pdnsd

Pdnsd相当于一个在你的VPS上的DNS服务器,区别在于普通的DNS服务器是53端口查询的,这很容易被GFW识别并污染,所以要自己搞一个DNS服务器并设置成不同的端口。

sudo apt install pdns

安装好后会出来一个选择界面,请一定要选择manual

#备份pdnsd.conf
sudo cp /etc/pdnsd.conf /etc/pdnsd.conf.bak

#编辑pdnsd.conf
sudo nano /etc/pdnsd.conf

global {
    perm_cache=4096;
    cache_dir="/var/cache/pdnsd";
    run_as="pdnsd";
    server_ip = your_server_ip;  // Use eth0 here if you want to allow other
                            // machines on your network to query pdnsd.
    server_port = any_port_except_53;
    debug = off;
    status_ctl = on;
    paranoid=on;
    query_method=udp_only;  // pdnsd must be compiled with tcp
                            // query support for this to work.
                            // 因为这里是VPS查询国外上级DNS服务器的方式,所以不一定非得要TCP_only
                            // (国内UPD查询dns会被污染)
    min_ttl=15m;       // Retain cached entries at least 15 minutes.
    max_ttl=1w;        // One week.
    timeout=10;        // Global timeout option (10 seconds).

    // Don't enable if you don't recurse yourself, can lead to problems
    // delegation_only="com","net";
}

server {
    label = "mydns"; //随意label
    ip = 8.8.8.8; //查询Google DNS,也可以设成任何其他国外的DNS服务器
    timeout =3;
    interval = 30;
    uptest = none;
    port = 53;
}

#编辑/etc/default/pdnsd
sudo nano /etc/default/pdnsd

# do we start pdnsd ?
START_DAEMON=yes
# auto-mode, overrides /etc/pdsnd.conf if set [see /usr/share/pdnsd/]
AUTO_MODE=
# optional CLI options to pass to pdnsd(8)
START_OPTIONS=


# Start the service
sudo /etc/init.d/pdnsd start    # for sysvinit, or
sudo systemctl start pdnsd      # for systemd

验证pdnsd是否配置正确:

dig @服务器ip -p 配置global里填的端口号 www.google.com

如果结果里有

;; ANSWER SECTION:
www.google.com.         586     IN      A       216.58.197.164

说明dns查询正常

安装BBR

参考来源:开启TCP BBR拥塞控制算法

TCP-BBR是Google开发的拥塞控制算法,可以显著提升科学上网的速度。
注意TCP-BBR不支持OpenVZ虚拟化技术,使用前请确认你的VPS使用的是什么虚拟化技术。

下载最新内核

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.17/linux-image-4.10.17-041017-generic_4.10.17-041017.201705201051_amd64.deb

安装内核

dpkg -i linux-image-4.*.deb

更新 grub 系统引导文件并重启

update-grub
reboot

重启后uname -看看内核版本是不是4.9以上
执行lsmod | grep bbr,如果结果中没有tcp_bbr就先执行:

modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf

然后执行

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

保存生效

sysctl -p

执行

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果执行结果都有bbr,说明VPS内核已经开启BBR。
看到有tcp_bbr模块说明bbr已经启动。

安装服务器端Kcptun

Kcptun是把SS的流量转换成KCP协议通过KCP服务端再传到客户端,

我现在使用的OpenWrt有集成了KCPtun的客户端,但是运行起来比较占用cpu,所以我是在家里的NAS服务器上运行Kcptun客户端。
如果有需要在OpenWrt路由上运行客户端,请参考这个链接:Kcptun部署与使用

一键安装脚本:

wget https://github.com/kuoruan/shell-scripts/blob/master/kcptun/kcptun.sh
./kcptun.sh

通过一键安装脚本之后的配置:

服务器IP:  your_server_ip
端口:  anything_but_ss_port
加速地址:  your_server_ip:ss_port
key:  your_password
crypt:  aes-128
mode:  manual
mtu:  1400
sndwnd:  512
rcvwnd:  512
datashard:  70
parityshard:  30
dscp:  46
nocomp:  true
nodelay:  0
interval:  40
resend:  0
nc:  1

可使用的客户端配置文件为:

{
  "localaddr": ":ss_port",
  "remoteaddr": "your_server_ip:服务器配置里的第二项端口",
  "key": "your_password",
  "crypt": "aes-128",
  "mode": "manual",
  "mtu": 1400,
  "sndwnd": 512,
  "rcvwnd": 512,
  "datashard": 70,
  "parityshard": 30,
  "dscp": 46,
  "nocomp": true,
  "nodelay": 0,
  "interval": 40,
  "resend": 0,
  "nc": 1
}

手机端参数可以使用:
  key=your_password;crypt=aes-128;mode=manual;mtu=1400;sndwnd=512;rcvwnd=512;datashard=70;parityshard=30;dscp=46;nocomp;nodelay=0;interval=40;resend=0;nc=1

以上服务器端设置完毕

OpenWrt配置

我用的是二手网件WNDR4300,卖家刷好了明月OpenWrt固件,固件版本:Chaos Calmer 15.05.1,购至淘宝网,关键词wndr4300 open/tt,发货地深圳,记得注明刷好OpenWrt。
另外这个固件已经支持ShadowsockR,在SS基础上开发出来的新玩意,目前SS用着还不错,libev版本还有人维护,换SSR的动力不大。
OpenWrt路由比普通的路由稍微麻烦点,刚开始可能连拨号在哪都找不到:

宽带拨号设置在网络接口页面里接口总览列表里的WAN这一栏,右边修改按钮,协议选择PPPoE,
PAP/CHAP用户名/密码填入宽带拨号上网用户名与密码

WIFI密码设置在网络无线,此路由有2.4G和5G两个频段,分别在右边修改无线安全里设置WIFI密码。

配置Shadowsocks

服务器名称配置随便写,
服务器地址以下根据上面shadowsocks-libev/config.json内容写,代理方式:忽略列表
下面的都不用管

配置pdnsd

自动修改不要选,
配置文件:

    global {
    perm_cache = 1024;
    cache_dir = "/var/pdnsd";
    run_as = "nobody";
    debug = off;
    server_port = any_port_but_53; # 使用 xxx端口 作为 dns 端口, 默认是 53但请不要用,设一个别的端口
    server_ip = 127.0.0.1;
    status_ctl = on;
    query_method=tcp_only;  # 最重要的配置, 只使用 tcp 查询上级 dns
    neg_domain_pol = off;
    paranoid = on;
    par_queries = 1;
    min_ttl=15m;
    max_ttl=1w;
    timeout=10;
}

server {
    # Better setup dns server(DON'T USE PORT 53) on your own vps for faster proxying
    label = "special";  # 这个随便写
    ip = VPS_ip; # 这里为上级 dns 的 ip 地址
    port = #这里要填服务器端pdnsd配置里global里的port端口数;
    proxy_only = on;
    timeout = 5;
        uptest = none;
}

source {
    owner = localhost;
    file = "/etc/hosts";
}

rr {
    name = localhost;
    reverse = on;
    a = 127.0.0.1;
    owner = localhost;
    soa = localhost,root.localhost,42,86400,900,86400,86400;
}

再启用Pdnsd,保存&应用

配置Chinands

点启动
自动修改不选
启用双向过滤不选
本地端口:随意
上游服务器:

114.114.114.114,127.0.0.1:上面OpenWrt Pdnsd配置文件里global里的port端口

ie.

114.114.114.114.127.0.0.1:1234

更新路由表,保存&应用

防止BT下载走SS线路

因为VPS在国外,BT下载如果走SS路线下电影的话必然会连上蜜罐服务器,就等着VPS封你的账号吧(别问我是怎么知道的)
所以修改一下配置是很有必要的

SSH到路由器:

#只允许常用的几个端口可以这样:
uci set shadowsocks.@shadowsocks[-1].ipt_ext='-m multiport --dports 22,80,443'
#或者指定一个范围:
uci set shadowsocks.@shadowsocks[-1].ipt_ext='--dport 21:5000'
#以上命令二选一
#最后提交修改:
uci commit shadowsocks

来源:希望实现针对端口的透明代理(如仅对1024一下的保留端口执行透明代理)

Done