来自 https://www.v2ex.com/t/353778
首先感谢 91yun 的 linhua :
https://www.91yunbbs.com/discussion/comment/1382/#Comment_1382
2 个相关链接:
https://www.netdevconf.org/2.1/session.html?tazaki
https://github.com/lkl/linux
教程从这里开始
先去 VPS 的 Panel 里打开 TUN/TAP 功能
创建一个 tap0
ip tuntap add tap0 mode tap
ip addr add 10.0.0.1/24 dev tap0
ip link set tap0 up
打通 tap0 和 host 之间的网络
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o venet0 -j MASQUERADE
假设我们准备在 443 端口开启 BBR
iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.2
安装 haproxy ,并禁止开机自启
apt-get install haproxy
update-rc.d haproxy disable
新建一个 /root/haproxy/haproxy.cfg
假设你原来的 server 监听的是 12580 端口, BBR 的端口开在 443 。
defaults
mode tcp
timeout connect 5s
timeout client 60s
timeout server 60s
listen shadowsocks
bind 10.0.0.2:443
server server1 10.0.0.1:12580
下载 Linux Kernel Library ,解压到 /root/haproxy
tar -xzvf liblkl-hijack.so.tgz
是时候开启 haproxy 为 BBR 过桥了,以下命令必须一行打完
LD_PRELOAD=/root/haproxy/liblkl-hijack.so LKL_HIJACK_NET_QDISC="root|fq" LKL_HIJACK_SYSCTL='net.ipv4.tcp_congestion_control="bbr";net.ipv4.tcp_wmem="4096 65536 67108864"' LKL_HIJACK_NET_IFTYPE=tap LKL_HIJACK_NET_IFPARAMS=tap0 LKL_HIJACK_NET_IP=10.0.0.2 LKL_HIJACK_NET_NETMASK_LEN=24 LKL_HIJACK_NET_GATEWAY=10.0.0.1 LKL_HIJACK_OFFLOAD="0x8883" haproxy -f /root/haproxy/haproxy.cfg
大功告成!
现在可以用客户端连上试试看了
12580 是原来 server 的端口
443 是开启 BBR 以后的端口
后记
如果需要把原来 12580 端口的 UDP 协议也转发到 443 端口,可以添加以下命令
iptables -t nat -A PREROUTING -i venet0 -p udp --dport 443 -j REDIRECT --to-port 12580
补充一个安全性的更新,感谢 @BOYPT ,原来的 haproxy 是以 root 用户启动,建议在 haproxy.cfg 文件顶部增加如下内容。
global
user haproxy
group haproxy
顺便再推荐一个个人认为不错的应用场合。
将 nginx 的 80 和 443 端口改为 10080 和 10443 ,让开了 BBR 的 haproxy 监听 80 和 443 端口,配置文件里将这 2 个端口指向 10080 和 10443 。就能让你的网站享受 BBR 带来的加成了。
第 2 条附言 · 71 天前
教程中最后一大行参数中有一个参数格式写错了,正确的格式如下,感谢 @weyou 指出。
LKL_HIJACK_SYSCTL="net.ipv4.tcp_congestion_control=bbr;net.ipv4.tcp_wmem=4096 65536 67108864"
第 3 条附言 · 70 天前
既然你们都喜欢快餐,那我提供一个脚本吧。
手动调试成功后,就可用下面脚本设置开机自启。
安装 supervisor ,添加配置文件,用于开机自启
/etc/supervisor/conf.dhaproxy-lkl.conf
[program:haproxy-lkl]
command=/root/haproxy/haproxy-lkl-start
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/root/haproxy/haproxy-lkl_stdout.log
stdout_logfile_maxbytes=1MB
stderr_logfile=/root/haproxy/haproxy-lkl_stderr.log
stderr_logfile_maxbytes=1MB
haproxy 配 Linux Kernel Library 的启动脚本。
原来的服务监听 12580 端口。开启 BRR 后,新的监听端口在 443 。
/root/haproxy/haproxy-lkl-start
!/bin/sh
ip tuntap add tap0 mode tap
ip addr add 10.0.0.1/24 dev tap0
ip link set tap0 up
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 12580
iptables -t nat -A PREROUTING -i venet0 -p udp --dport 443 -j REDIRECT --to-port 12580
export LD_PRELOAD=/root/haproxy/liblkl-hijack.so
export LKL_HIJACK_NET_QDISC="root|fq"
export LKL_HIJACK_SYSCTL="net.ipv4.tcp_congestion_control=bbr;net.ipv4.tcp_wmem=4096 65536 67108864"
export LKL_HIJACK_NET_IFTYPE=tap
export LKL_HIJACK_NET_IFPARAMS=tap0
export LKL_HIJACK_NET_IP=10.0.0.2
export LKL_HIJACK_NET_NETMASK_LEN=24
export LKL_HIJACK_NET_GATEWAY=10.0.0.1
export LKL_HIJACK_OFFLOAD="0x8883"
export LKL_HIJACK_DEBUG=1
haproxy -f /root/haproxy/haproxy.cfg
Enjoy~~~