使用HAProxy端口转发TCP流量(支持BBR)

HAProxy端口转发优缺点
优点:工作在应用层,能用BBR,适合跨境和延迟高的网络。
缺点:仅支持TCP,无法转发UDP流量,高流量或复杂规则可能消耗较多CPU和内存,容易被DDoS攻击

安装默认版本

sudo apt-get update
sudo apt-get install haproxy -y

/etc/haproxy/haproxy.cfg

编辑配置文件:

sudo nano /etc/haproxy/haproxy.cfg

配置文件内容(简单设置,测试可用性):


global
    log /dev/log local0
    log /dev/log local1 notice
    maxconn 10000                #最大并发连接数为10000
    tune.bufsize 131072          #设置128KB缓存
    tune.maxrewrite 2048         #每个缓冲区最大重写空间为2048字节
    daemon

defaults
    log     global
    option  tcplog
    timeout connect 3000ms      #连接后端服务器的超时时间为 3 秒
    timeout client  30000ms     #客户端超时时间为 30 秒
    timeout server  30000ms     #服务器超时时间为 30 秒

frontend https_in
    bind :543 transparent tfo   # 支持透明代理获取真实IP,支持tfo快速连接
    mode tcp
    default_backend ocv_backend

backend ocv_backend
    mode tcp
    server ocv_local 127.0.0.1:443 check    #目标服务器地址和端口
    option splice-auto          # 内核级零拷贝(Linux 4.5+)

加载配置文件,测试配置是否正确。

haproxy -c -f /etc/haproxy/haproxy.cfg 

输出:Configuration file is valid

加载配置,启动服务:


sudo systemctl reload haproxy
systemctl status haproxy.service 

重启以后会自动生效,同时内核只要开启了BBR,也会起作用。

高级设置 /etc/haproxy/haproxy.cfg:


global
    log /dev/log local0
    log /dev/log local1 notice   # 日志输出到本地 syslog,local0/local1 为日志设施,notice 为日志级别
    tune.bufsize 5376000          # 5.125M 全局缓冲区,计算公式BDP=带宽(Mbps)×RTT(s)/8
    tune.rcvbuf.client 5376000    # 客户端接收缓冲区 5.125M(需内核支持)
    tune.sndbuf.client 5376000    # 客户端发送缓冲区 5.125M(需内核支持)
    tune.idle-pool.shared on     # 启用共享空闲连接池(仅 HAProxy 2.4+ 有效,低版本需删除此行)
    maxconn 10000                # 全局最大并发连接数(需配合 ulimit -n 调整)
    tune.maxrewrite 2048         # 保留 2KB 缓冲区用于协议重写(默认值,无需修改)
    ulimit-n 200000              # 设置 HAProxy 进程的文件描述符限制(需系统 systemd 配置支持)
    stats socket /run/haproxy/admin.sock mode 660 level admin  # 管理统计接口

defaults
    mode tcp                     # 纯 TCP 服务
    timeout connect 10s          # 连接后端超时设为 10 秒(适应跨国高延迟)
    timeout client 1h            # 客户端空闲超时 1 小时(适合长连接 VPN)
    timeout server 1h            # 服务端空闲超时 1 小时(与客户端对称)
    option tcplog                # 记录 TCP 层日志(基础必需)
    option tcpka                 # 启用 TCP Keep-Alive 保活(防中间设备断开)
    option srvtcpka              # 后端服务器也启用 Keep-Alive(必需与 tcpka 配合)


frontend oc_front543
    bind :543 transparent tfo    # 透明代理+TFO(需配合 nftables TPROXY 和策略路由)
    tcp-request content accept   # 跳过内容检查,直接接受连接(适用于纯转发场景)
    log /dev/log local2          # 独立日志标识符(方便过滤)
    default_backend oc_back543      # 指向后端配置

backend oc_back543
    balance leastconn            # 最少连接算法(适合 ocserv 长连接场景)
    server oc1 5.4.8.5:443 check inter 3s fastinter 1s fall 2 rise 2  # 健康检查更敏感(快速剔除故障节点)
    option splice-auto           # 内核零拷贝(需 Linux 4.5+ 和 CONFIG_HAPROXY_SPLICE 编译支持)

frontend oc_front443
    bind :443 transparent tfo    # 透明代理+TFO(需配合 nftables TPROXY 和策略路由)
    tcp-request content accept   # 跳过内容检查,直接接受连接(适用于纯转发场景)
    log /dev/log local2          # 独立日志标识符(方便过滤)
    default_backend oc_back443      # 指向后端配置

backend oc_back443
    balance leastconn            # 最少连接算法(适合 ocserv 长连接场景)
    server oc1 45.80.13.27:5101 check inter 3s fastinter 1s fall 2 rise 2  # 健康检查更敏感(快速剔除故障节点)
    option splice-auto           # 内核零拷贝(需 Linux 4.5+ 和 CONFIG_HAPROXY_SPLICE 编译支持)