痛点:我记不住这么多端口

  最近在家里折腾了几台服务器,跑了一些自用服务:

  问题来了:每次想用某个服务,我都得想半天—这个服务跑在哪台机器?端口是多少?手机收藏夹里塞满了 http://192.168.1.10:8080、http://192.168.1.11:3000 这样的地址,换个设备就得重新输一遍。

  更烦的是,有一次重装了内网的一台机器,IP变了,所有收藏的链接全部失效,一个个改到崩溃。

  我需要一个统一的入口:所有服务都通过同一个IP访问,用不同的端口区分就行。这样我只需要记住一个地址,后端服务器怎么变都无所谓。

方案:HAProxy做统一接入层

  HAProxy是一款轻量级的TCP/HTTP路由工具,正好解决我的问题。它可以在主服务器上监听多个端口,每个端口对应一个后端服务。架构很简单:

客户端 → 主服务器(HAProxy) → 根据端口转发 → 对应的后端服务器

  主服务器用一台闲置的低配机器就行,HAProxy资源占用极小(内存<10MB),完全跑得动。

  一、安装HAProxy
  以Debian/Ubuntu为例:

apt update
apt install haproxy -y
haproxy -v  # 验证安装

二、基础配置:单端口转发
  先试一个最简单的:把主机的10001端口转发到内网某台机器的8080端口。编辑 /etc/haproxy/haproxy.cfg:

global
    log /dev/log local0
    maxconn 4096
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode tcp
    option tcplog
    retries 3
    timeout connect 5s
    timeout client 30s
    timeout server 30s

frontend myapp-in
    bind [::]:10001
    mode tcp
    default_backend myapp-out

backend myapp-out
    mode tcp
    server app-server 192.168.1.10:8080 check

  启动:

haproxy -f /etc/haproxy/haproxy.cfg -c  # 检查语法
systemctl restart haproxy
netstat -tlnp | grep 10001               # 确认监听

  防火墙放行:

ip6tables -A INPUT -p tcp --dport 10001 -j ACCEPT

  现在访问 http://主服务器IP:10001 就能看到实际跑在 192.168.1.10:8080 的服务了。

三、核心配置:多端口对应不同后端

  一个端口显然不够,我要的是把所有服务都统一进来。

  假设我有三个后端服务:

  配置文件这样写:

global
    log /dev/log local0
    maxconn 4096
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode tcp
    option tcplog
    retries 3
    timeout connect 5s
    timeout client 30s
    timeout server 30s

# 导航页:10001 -> 192.168.1.10:8080
frontend nav-in
    bind [::]:10001
    mode tcp
    default_backend nav-out

backend nav-out
    mode tcp
    server nav-server 192.168.1.10:8080 check

# RSS订阅:10002 -> 192.168.1.11:3000
frontend rss-in
    bind [::]:10002
    mode tcp
    default_backend rss-out

backend rss-out
    mode tcp
    server rss-server 192.168.1.11:3000 check

# NAS管理:10003 -> 192.168.1.12:9000
frontend nas-in
    bind [::]:10003
    mode tcp
    default_backend nas-out

backend nas-out
    mode tcp
    server nas-server 192.168.1.12:9000 check

  重载配置:

haproxy -f /etc/haproxy/haproxy.cfg -c
systemctl reload haproxy
netstat -tlnp | grep -E "10001|10002|10003"

  防火墙批量放行:

for port in 10001 10002 10003; do
    ip6tables -A INPUT -p tcp --dport $port -j ACCEPT
done

四、使用体验

  现在我的手机收藏夹里只存一个IP:http://主服务器IP,后面跟不同端口就行:

  再也不用记一堆IP和端口。前几天我把NAS的IP从 192.168.1.12 改成了 192.168.1.13,只需要在HAProxy配置里改一行,重启服务,收藏的链接照常用,完全不受影响。

五、一些实用的小功能

5.1 健康检查自动摘除

  配置里的 check 参数会让HAProxy定时检测后端服务。如果某台机器宕机,自动停止转发;恢复后自动加回来,不用手动干预。

5.2 抓包看请求是否到达

  怀疑配置有问题时,抓包确认:

apt install tcpdump -y
tcpdump -i any port 10001 -n

  有请求进来会看到类似:

13:45:22.123456 IP 客户端IP.54321 > 主服务器IP.10001: Flags [S]

  看到这个说明请求到了,问题可能出在后端。

5.3 监控带宽占用

apt install vnstat -y
vnstat -d  # 每日带宽
vnstat -h  # 每小时带宽
vnstat -l  # 实时带宽

5.4 配置备份

  每次改配置前备份一下:

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak.$(date +%Y%m%d)

六、遇到的小坑

七、总结

  这套方案让我从“记一堆端口”的混乱中解放出来:

🤝 转载请注明出处,谢谢! 🤝