[分享] OpenVZ 开启 BBR 之最简方法 – Linux Kernel Library

转载自: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
# https://drive.google.com/file/d/0ByqeeKN198fcdDVLMmVKakl5VE0/view?usp=sharing

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

 

建议剩余 64M 内存以上

 

补充1-CENTOS7

系统是 centos7 ,跑 systemd 的,所以我改了 haproxy 的 service 文件来启动:

[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target


[Service]

Environment='LD_PRELOAD=/usr/local/lib64/liblkl-hijack.so'
Environment='LKL_HIJACK_NET_QDISC="root|fq"'
Environment='LKL_HIJACK_SYSCTL=\'net.ipv4.tcp_congestion_control="bbr";net.ipv4.tcp_wmem="4096 65536 67108864"\''
Environment='LKL_HIJACK_NET_IFTYPE=tap'
Environment='LKL_HIJACK_NET_IFPARAMS=tap0'
Environment='LKL_HIJACK_NET_IP=10.0.0.2'
Environment='LKL_HIJACK_NET_NETMASK_LEN=24'
Environment='LKL_HIJACK_NET_GATEWAY=10.0.0.1'
Environment='LKL_HIJACK_OFFLOAD="0x8883"'

ExecStart=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS
#ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

 

补充2

提醒一下,因为 iptables 转发流量跟 haproxy 是端口对端口的本地通信,因此 MASQUERADE 的一句是不需要的,因此应该去掉

iptables -t nat -A POSTROUTING -o venet0 -j MASQUERADE

同时, haproxy 作为服务进程,最好不用 root 身份运行,因此配置文件顶上加

global 
user haproxy 
group haproxy

1 条评论

Leave a Reply

Your email address will not be published. Required fields are marked *

返回主页看更多
狠狠的抽打博主 支付宝 扫一扫