shadowsocks 配置优化折腾小记

Reading time ~1 minute

这两天给******开了台vps,试用投票下来,最后决定是用Linode,然后vps的话,显然很大的一个用途就是应付gfw了,我用shadowsocks,于是乎折腾了一下优化,这里记录一下。

为了优化,我们拥塞控制算法最好是采用hybla,而内核不自带,所以我们需要自己来编译(Digital Ocean可以不用编译,只要加载一下就好)。

  1. 查看机器内核版本:

    uname -r

    我的机器显示为:

    4.0.4-x86_64-linode57
  2. https://www.kernel.org/pub/linux/kernel下载相同版本的源码:

    mkdir kernel
    cd kernel
    wget https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.11.6.tar.gz 
    tar xzvf linux-3.11.6.tar.gz
  3. 安装以下内核编译工具,不然会编译失败:

    CentOS and Fedora
    yum update && yum install -y ncurses-devel make gcc
    
    Ubuntu and Debian
    sudo apt-get install -y build-essential libncurses5-dev
  4. 配置内核编译文件,导出官方的配置文件再修改增加hybla htcp模块:

    cd linux-3.11.6
    zcat /proc/config.gz > .config

    编辑.config文件,查找CONFIG_TCP_CONG_CUBIC=y,要编译hybla模块在下面一行增加CONFIG_TCP_CONG_HYBLA=y,要编译htcp模块在下面一行增加CONFIG_TCP_CONG_HTCP=y,两个都要的话,都添加在下面,然后编译:

    make

    耐心等待编译内核完成,单核编译大约需15分钟

  5. 修改编译模块的Makefile

    cd net/ipv4/
    mv Makefile Makefile.old
    vim Makefile

    需要hybla的话修改Makefile改成:

    # Makefile for tcp_hybla.ko
    obj-m := tcp_hybla.o
    KDIR := ../..
    PWD := $(shell pwd)
    default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

    需要htcp的替换下关键词就好

  6. 开始编译模块

    cd ../..
    make modules
  7. 测试加载模块

    cd net/ipv4
    insmod ./tcp_hybla.ko
    sysctl net.ipv4.tcp_available_congestion_control

    如果加载成功,会显示:

    net.ipv4.tcp_available_congestion_control = cubic reno hybla
  8. 设置开机自动加载模块

    首先将我们需要开机自动加载的模块复制到/lib/modules/4.0.4-x86_64-linode57/kernel/net/ipv4

    sudo mkdir -p /lib/modules/4.0.4-x86_64-linode57/kernel/net/ipv4
    sudo cp -a ~/kernel/linux-4.0.4/net/ipv4/tcp_hybla.ko /lib/modules/4.0.4-x86_64-linode57/kernel/net/ipv4

    然后由于我是Ubuntu,所以直接修改/etc/modules,再最后加入tcp_hybla即可。

至此,我们就已经将hybla算法添加好了,接下来开始修改配置:

  1. 首先修改/etc/security/limits.conf,在最后加入:

    * soft nofile 51200
    * hard nofile 51200
  2. 然后执行:

    ulimit -n 51200
    # 其实我执行的:ulimit -n unlimited
  3. 然后修改/etc/sysctl.conf,在最后加入:

    # max open files
    fs.file-max = 51200
    # max read buffer
    net.core.rmem_max = 67108864
    # max write buffer
    net.core.wmem_max = 67108864
    # default read buffer
    net.core.rmem_default = 65536
    # default write buffer
    net.core.wmem_default = 65536
    # max processor input queue
    net.core.netdev_max_backlog = 4096
    # max backlog
    net.core.somaxconn = 4096
    
    # resist SYN flood attacks
    net.ipv4.tcp_syncookies = 1
    # reuse timewait sockets when safe
    net.ipv4.tcp_tw_reuse = 1
    # turn off fast timewait sockets recycling
    net.ipv4.tcp_tw_recycle = 0
    # short FIN timeout
    net.ipv4.tcp_fin_timeout = 30
    # short keepalive time
    net.ipv4.tcp_keepalive_time = 1200
    # outbound port range
    net.ipv4.ip_local_port_range = 10000 65000
    # max SYN backlog
    net.ipv4.tcp_max_syn_backlog = 4096
    # max timewait sockets held by system simultaneously
    net.ipv4.tcp_max_tw_buckets = 5000
    # turn on TCP Fast Open on both client and server side
    net.ipv4.tcp_fastopen = 3
    # TCP receive buffer
    net.ipv4.tcp_rmem = 4096 87380 67108864
    # TCP write buffer
    net.ipv4.tcp_wmem = 4096 65536 67108864
    # turn on path MTU discovery
    net.ipv4.tcp_mtu_probing = 1
    
    # for high-latency network
    net.ipv4.tcp_congestion_control = hybla
    
    # for low-latency network, use cubic instead
    # net.ipv4.tcp_congestion_control = cubic

    然后执行:

    sudo sysctl -p

    是配置生效

  4. 最后设置好shadowsocks的配置文件,启动即可:

    {
        "server": "::",
        "server_port": 8888,
        "password": "your password",
        "timeout": 300,
        "method": "rc4-md5",
        "fast_open": true
    }
    sudo ssserver -c /etc/shadowsocks.json -d start --user nobody

参考文章:http://www.777s.me/linode-hybla-htcp.html

挂载网络文件夹后网络故障时文件操作命令卡死

挂载 NFS 或者 Samba 的时候,经常会由于网络故障导致挂载好的链接断掉。此时如果尝试进行 ls、cd、df 等各种命令,只要与此目录沾上边,就会卡住。如果使用了类似 oh-my-zsh 这种配置的,只要在网络目录中,弹出命令提示符前就会直接卡住。这个时候第一反应就是...… Continue reading

路由折腾记 第四弹

Published on September 02, 2017