alpine镜像构建与OpenVZ下开启BBR拥塞控制,并开启暴力BBR算法

    本文部分转自https://www.fanyueciyuan.info/jsxj/OpenVZ_BBR_UML_Alpine_Linux.html


    安装uml

    apt-get install uml-utilities


    在OpenVZ(须TUN/TAP支持)环境中通过UML(User Mode Linux)开启BBR。

    1,制作Alpine Linux镜像

    KVM的Debian 8上制作需要使用的镜像。

    关于Alpine Linux,详情查看其官网

    首先写一个ext4格式的空镜像,打上ROOT的标签,方便写fstab。然后挂载到alpine目录下

    dd if=/dev/zero of=alpine_mini bs=1M count=150
    mkfs.ext4 -L ROOT alpine_mini
    mkdir alpine
    mount -o loop alpine_mini alpine


    这里Alpine Linux版本选择3.5,下载相应的apk tool,把基本的系统写入到空镜像中

    REL="v3.5"
    REL=${REL:-edge}
    MIRROR=${MIRROR:-http://nl.alpinelinux.org/alpine}
    REPO=$MIRROR/$REL/main
    ARCH=$(uname -m)
    ROOTFS=${ROOTFS:-alpine}
    APKV=`curl -s $REPO/$ARCH/APKINDEX.tar.gz | tar -Oxz | grep -a '^P:apk-tools-static$' -A1 | tail -n1 | cut -d: -f2`
    mkdir tmp
    curl -s $REPO/$ARCH/apk-tools-static-${APKV}.apk | tar -xz -C tmp sbin/apk.static
    tmp/sbin/apk.static --repository $REPO --update-cache --allow-untrusted --root $ROOTFS --initdb add alpine-base
    printf '%s\n' $REPO > $ROOTFS/etc/apk/repositories
    


    接下来最重要的是写分区表,将下面的东西写入到alpine/etc/fstab文件中

    # 
    # /etc/fstab: static file system information
    #
    # <file system>	<dir>	<type>	<options>	<dump>	<pass>
    LABEL=ROOT / auto defaults 1 1


    其他的配置,都可以进入镜像后再操作。

    由于宿主机里面本身就有go版本的ss了,直接从系统里面复制一下,配置里面修改个端口就行了。

    mkdir alpine/etc/shadowsocks-go
    cp /usr/local/bin/ss-goserver alpine/usr/local/bin
    cp /etc/shadowsocks-go/config.json alpine/etc/shadowsocks-go


    如果没有,可以直接去官网下载最新版

    #注,可后续安装python版本

    apk update
    apk add wget
    apk add py-pip
    wget https://github.com/shadowsocks/shadowsocks/archive/master.zip --no-check-certificate
    unzip master.zip
    /root/shadowsocks-master/shadowsocks/server.py  -p 9191 -m aes-256-gcm --workers 5 -k passwd &


    顺便修改下alpine/etc/sysctl.conf,配合ss优化一番。

    # 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
    #BBR
    net.core.default_qdisc = fq
    net.ipv4.tcp_congestion_control = bbr #tsunami


    镜像设定完毕后,卸载掉镜像。

    umount ./alpine


    2,制作UML的可执行文件vmlinux

    安装依赖

    apt-get install build-essential libncurses5-dev bc screen


    在https://www.kernel.org/上找到需要的内核。

    这里以4.10.1内核为例。

    wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.10.1.tar.xz
    tar xf linux-4.10.1.tar.xz
    rm linux-4.10.1.tar.xz
    cd linux-4.10.1
    make defconfig ARCH=um
    make menuconfig ARCH=um


    ——————————————————

    如需编译变态版BBR即tsunami,需要添加以下步骤再执行上述make命令。


    参考当时bbr的提交https://patchwork.ozlabs.org/patch/671069/


    vi net/ipv4/Kconfig

    (在bbr附近添加)

    config TCP_CONG_TSUNAMI
        tristate "BBR tsunami TCP"
        default y
        ---help---

        BBR (Bottleneck Bandwidth and RTT) TCP congestion control aims to
        maximize network utilization and minimize queues. It builds an explicit
        model of the the bottleneck delivery rate and path round-trip
        propagation delay. It tolerates packet loss and delay unrelated to
        congestion. It can operate over LAN, WAN, cellular, wifi, or cable
        modem links. It can coexist with flows that use loss-based congestion
        control, and can operate with shallow buffers, deep buffers,
        bufferbloat, policers, or AQM schemes that do not provide a delay
        signal. It requires the fq ("Fair Queue") pacing packet scheduler.


    vi net/ipv4/Makefile
    (在bbr附近添加)

     obj-$(CONFIG_NET_TCPPROBE) += tcp_probe.o

    +obj-$(CONFIG_TCP_CONG_BBR) += tcp_tsunami.o

     obj-$(CONFIG_TCP_CONG_BBR) += tcp_bbr.o
     obj-$(CONFIG_TCP_CONG_BIC) += tcp_bic.o
     obj-$(CONFIG_TCP_CONG_CDG) += tcp_cdg.o



    添加源码

    wget -O net/ipv4/tcp_tsunami.c https://gist.github.com/anonymous/ba338038e799eafbba173215153a7f3a/raw/55ff1e45c97b46f12261e07ca07633a9922ad55d/tcp_tsunami.c

    ——————————————————


    在配置菜单中,除了把TCP_BBR选上,还要保证内核支持net.ipv4.tcp_syncookies和net.core.default_qdisc选项。

    通过按空格来选择项目,只有*状态才是构建,下面是基本的内容。

    UML-specific options 
        ==> [*] Force a static link 
    Device Drivers
        ==> [*] Network device support
            ==> <*> Universal TUN/TAP device driver support
    [*] Networking support
        ==> Networking options
            ==> [*] IP: TCP syncookie support
            ==> [*] TCP: advanced congestion control
                ==> <*> BBR TCP
                ==> <*> Default TCP congestion control (BBR)
            ==> [*] QoS and/or fair queueing
                ==> <*> Quick Fair Queueing scheduler (QFQ)
                ==> <*> Controlled Delay AQM (CODEL)
                ==> <*> Fair Queue Controlled Delay AQM (FQ_CODEL)
                ==> <*> Fair Queue


    配置完成后开始构建以及可执行文件减肥

    make ARCH=um vmlinux
    strip -s vmlinux


    3,在UML中配置Apline Linux

    为了让Apline Linux有网可用,外部网络可穿透9000-19000端口到内部,要在宿主机上开启tap,设置iptables

    D_I=`ip route show 0/0 | sort -k 7 | head -n 1 | sed -n 's/^default.* dev \([^ ]*\).*/\1/p'`
    sudo ip tuntap add tap0 mode tap  
    sudo ip addr add 10.0.0.1/24 dev tap0  
    sudo ip link set tap0 up  
    sudo iptables -P FORWARD ACCEPT
    sudo iptables -t nat -A POSTROUTING -o ${D_I} -j MASQUERADE
    sudo iptables -t nat -A PREROUTING -i ${D_I} -p tcp --dport 9000:19000 -j DNAT --to-destination 10.0.0.2


    然后,开启镜像

    sudo ./vmlinux ubda=alpine_mini rw eth0=tuntap,tap0 mem=64m


    通过screen命令来操作小虚拟机,下面的X,根据具体情况修改。

    screen /dev/pts/X


    系统默认下,root用户没有密码。系统中,可以执行setup-alpine命令来一步一步配置系统。

    需要注意的是网络设定,Ip address for eth0=10.0.0.2,gateway=10.0.0.1,netmask=255.255.255.0,DNS nameserver=8.8.8.8。

    其他的根据自己需要来设定。

    开机自启的网络有bug,需要重新启动网络才可用。

    这里选择设定开机自启动脚本来简单修复下。

    rc-update add local default
    


    索性加入swapfile和ss的开机自启动,先创建swapfile

    dd if=/dev/zero of=/swapfile bs=1M count=64
    chmod 600 /swapfile


    然后用vi编辑/etc/local.d/my.start文件

    #!/bin/sh
    # swap on
    /sbin/mkswap /swapfile
    /sbin/swapon /swapfile
    # fix net
    sleep 3
    /etc/init.d/networking restart
    # ss
    /usr/bin/nohup /usr/local/bin/ss-goserver -c /etc/shadowsocks-go/config.json > /dev/null 2>&1 &


    不要忘了加上可写的权限

    chmod +x /etc/local.d/my.start


    最后,reboot一下看看配置是否都生效了。

    如果需要安装其他的软件的话,例如curl,可以使用它提供的包管理软件apk

    apk add curl



    查看策略状态

    sysctl net.ipv4.tcp_available_congestion_control
    sysctl net.ipv4.tcp_congestion_control
    sysctl -w net.ipv4.tcp_congestion_control=bbr #tsunami



    4,总结

    实际上镜像和vmlinux只需要做一遍,在其他的64位linux系统上,配置好tap和转发,再次复用它们即可。

    https://github.com/fanyueciyuan/eazy-for-ss/tree/master/openvz-bbr



    添加tsunami编译的x86版本vmlinux

    链接: https://pan.baidu.com/s/1jHNPrlO 密码: uycu

    alpine镜像及vmlinux内核

    链接: https://pan.baidu.com/s/1jHNPr8a 密码: fav5




标签: alpine bbr openvz