转载自: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
感谢分享