缘起 以前有个贪便宜(一年 5 刀)而入手但目前在吃灰中的小鸡,当然是 OpenVZ ,网络条件很差,用起来很鸡肋,后来看到 Google 的 BBR 也有能用在 OpenVZ 的案例,于是也想尝试下,看是否能将其起死回生。
LKL 大法 LKL(Linux Kernel Library) 是个有意思的东西,常见的应用场景是把整个 Linux kernel 编成一个动态库,然后用 LD_PRELOAD 环境变量将其注入到程序运行之前的环境里,强制让程序里的调用时用新编译的这个 kernel 包中的一些函数。
这样其实就已经解决了 OpenVZ 的系统不能升级 kernel 而不能使用 BBR 的问题:我可以把新的支持 BBR 的 kernel 库完全重新编一个,然后用 LD_PRELOAD 注入嘛,完美!
具体命令 现在开始贴命令,大段的命令,重要的地方我大概会写点注释
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 wget https://github.com/lkl/linux/archive/master.zip unzip master.zip cd linux-mastermake -C tools/lkl sudo su - mkdir haproxy apt-get install haproxy systemctl stop haproxy systemctl disable haproxy cd haproxycp \ /home/zhangsan/linux-master/tools/lkl/lib/hijack/liblkl-hijack.so \ . strip liblkl-hijack.so ( cat <<'EOF' { "gateway" :"10.0.0.1" , "debug" :"1" , "singlecpu" :"1" , "sysctl" :"net.ipv4.tcp_wmem=4096 65536 67108864" , "sysctl" :"net.ipv4.tcp_congestion_control=bbr" , "interfaces" :[ { "type" :"tap" , "param" :"tap0" , "ip" :"10.0.0.2" , "masklen" :"24" , "ifgateway" :"10.0.0.1" , "offload" :"0x8883" , "qdisc" :"root|fq" } ] } EOF ) > lkl-hijack.json ( cat <<'EOF' global user haproxy group haproxy defaults mode tcp timeout connect 5s timeout client 60s timeout server 60s listen shadowsocks bind 10.0.0.2:443server server1 10.0.0.1:11402 EOF ) > haproxy.cfg ( cat <<'EOF' #!/bin/bash killall -9 haproxy sleep 5 ip tuntap del tap0 mode tap ip tuntap add tap0 mode tap ip addr add 10.0.0.1/24 dev tap0 ip link set tap0 up sysctl -w net.ipv4.ip_forward=1 iptables -P FORWARD ACCEPT iptables -t nat -D PREROUTING \ -i venet0 -p tcp --dport 443 \ -j DNAT --to-destination 10.0.0.2 iptables -t nat -A PREROUTING \ -i venet0 -p tcp --dport 443 \ -j DNAT --to-destination 10.0.0.2 iptables -t nat -D PREROUTING \ -i venet0 -p udp --dport 443 \ -j REDIRECT --to-port 11402 iptables -t nat -A PREROUTING \ -i venet0 -p udp --dport 443 \ -j REDIRECT --to-port 11402 export LD_PRELOAD=/root/haproxy/liblkl-hijack.sohaproxy -f /root/haproxy/haproxy.cfg EOF ) > start_haproxy_lkl.sh
其他 本文只提到怎样在 OpenVZ 的虚拟机中启用 BBR,但实际上看上面的配置,应该知道系统里还有个服务,跑在 11402 端口的。这个服务的情况不在本文的内容范畴,所以没有细写。在我的环境里,那是一个酸酸乳(SSR)……不细说了,懂的人自然都懂。