本篇用haproxy来做反代。
openwrt安装haproxy很容易,opkg update 然后opkg install haproxy就可以了。
配置文件在/etc/haproxy.cfg
前面openwrt的文章第六篇使用了的是lucky来做反代和ddns,第十篇文章中由于我换用openwrt的ddns-scripts,所以反代也要替换掉lucky。一方面是因为lucky的配置全部都是加密的,调整必须要打开lucky的网页,这对于我远程访问需要调整的时候比较不方便。而haproxy的配置修改有命令行就可以了。
虽然haproxy是一个负载均衡软件,但实际上在家庭环境上当作反代也是没有任何问题的,只要你的设置得当,安全问题也是非常有保障的。
前面文章中有一个坑,不记得说没说。就是防火墙的设定。不论是使用haproxy还是lucky,都要开启防火墙的某一个端口。按图设定,端口尽量使用高端口,比如或是18883什么的,只要不是80或者443运营商应该暂时都不会封禁。

保存并应用后,我们在开始编辑haproxy的配置。前面的全局配置如下。
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 32000
daemon
ulimit-n 65535
uid 0
gid 0
nosplice
# 稍微提升安全性:不显示 HAProxy 的版本号
stats socket /var/run/haproxy.sock mode 600 level admin
defaults
log global
mode http
option dontlognull
# --- 增加:防止慢速攻击 (Slowloris) ---
timeout http-request 30s
timeout http-keep-alive 30s
timeout connect 5000
timeout client 50000
timeout server 50000
# 默认重试 5 次,增加稳定性
retries 5
listen stats
bind *:808 # 监听所有 IP 地址的 808 端口,你可以修改为其他端口
mode http
stats enable # 启用统计信息页面
stats uri /haproxy_stats # 设置管理页面的 URLhttp://LANIP:808/haproxy_stats
stats realm Haproxy Statistics # 设置认证的 realm
stats auth admin:password # 设置用户名和密码,请务必修改为安全的密码
stats refresh 10s # 每 10 秒自动刷新页面
stats admin if TRUE # 允许管理员权限,可以执行操作,例如禁用/启用服务器
这里启用了一个状态监控页面,可以通过http://192.168.X.X:808/haproxy_stats 来访问。
你会看到如下页面。

重点来了,前端和后端的设定。
# Example HTTP proxy listener
frontend https_in
bind :::18883 v4v6 ssl crt /etc/ssl/combined.pem
mode http
option httplog
option forwardfor
acl white_list src 192.168.111.0/24
acl white_list src 127.0.0.1
acl white_list src -f /etc/cloudflare_ips.acl
# --- 加固:防止暴力破解/频繁扫描 ---
# 定义一个 100k 条目的表,记录客户端 IP,10秒内连接超过 30 次则视为可疑
stick-table type ip size 100k expire 60s store conn_rate(10s)
http-request track-sc0 src
http-request deny status 429 if { sc0_conn_rate ge 150 } !white_list
# --- 加固:限制 HTTP 危险方法 ---
# 仅允许常见的请求方式,屏蔽罕见的可能被利用的攻击方式
http-request deny if ! { method GET POST HEAD OPTIONS PUT DELETE PATCH PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK }
# --- 加固:隐藏后端信息 ---
# 移除后端服务器可能发出的敏感 Header,伪装服务器标识
http-response del-header Server
http-response set-header Server Privacy-Host
http-request set-header X-Forwarded-Proto https
http-response set-header Strict-Transport-Security "max-age=31536000"
acl is_n8n hdr(host) -i n8n.域名:18883
acl is_dav hdr(host) -i webdav.域名:18883
acl is_nas hdr(host) -i nas.域名:18883
acl is_k3s hdr(host) -i k3s.域名:18883
acl is_ha hdr(host) -i ha.域名:18883
use_backend n8n_server if is_n8n
use_backend dav_server if is_dav
use_backend nas_server if is_nas
use_backend k3s_server if is_k3s
use_backend ha_server if is_ha
backend n8n_server
server n8n_node 192.168.111.245:10678 check
backend dav_server
server webdav_node 192.168.111.254:18080 check
backend nas_server
server nas_node 192.168.111.253:8083 check
backend k3s_server
server nas_node 192.168.111.245:10777 check
backend ha_server
server ha_node 192.168.111.254:18123 check
有了AI我相信如果各位不明白,扔给AI分析就可以了。
这个配置强制了HSTS并且有ssl证书,combined.pem的证书是cf生成的15年的证书,注意证书格式,之前文章提到过cloudns.ch域名托管到cf后如何生成15年的cf证书跟你设备通信的。现在唯一的缺点是三个月要手动更新一下dns的txt。
acl white_list src 192.168.111.0/24
acl white_list src 127.0.0.1
acl white_list src -f /etc/cloudflare_ips.acl
这一段是添加了一个白名单,其中/etc/cloudflare_ips.acl是为了和cf通信特意写的。由于开启了cf的小黄云。你的服务多了一层保障。还有ipv4和ipv6的双栈优势。内容如下。
root@route:#cat cloudflare_ips.acl
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/13
104.24.0.0/14
172.64.0.0/13
131.0.72.0/22
2400:cb00::/32
2606:4700::/32
2803:f800::/32
2405:b500::/32
2405:8100::/32
2a06:98c0::/29
2c0f:f248::/32
白名单在配置http-request deny status 429 if { sc0_conn_rate ge 150 } !white_list生效
这里后端都是卸载ssl的。如果你觉得不安心。可以不写在。check后面加上ssl之类的参数。具体可以问AI.
你可能注意到了,我这个配置全部都是http访问的。如果是tcp的访问比如说群晖的同步端口,前端配置加上一个
# ---------------------------------------------------------------------
# TCP 专用转发 (Synology Drive Sync 加固)
# ---------------------------------------------------------------------
frontend drive_sync_incoming
mode tcp
bind *:6690
option tcplog
# --- 加固:针对 TCP 端口的连接频率限制 ---
stick-table type ip size 50k expire 1m store conn_rate(10s)
tcp-request connection track-sc1 src
tcp-request connection reject if { sc1_conn_rate ge 30 }
default_backend synology_drive_backend
后端加上
backend synology_drive_backend
mode tcp
server nas_sync 192.168.111.8:6690 check
在防火墙开启6690这个端口。/etc/config/firewall文件中添加
config rule
option src 'wan'
option name 'Allow-Synology-Drive'
option dest_port '6690'
option target 'ACCEPT'
好了,基本上没有要设定的了。重启防火墙。检查一下haproxy的配置
haproxy -f /etc/haproxy.cfg -c
如果没有报错的话。就可以/etc/init.d/haproxy start 了。
如果对于haproxy的配置,实际上我基本都是通过AI帮我配置的。如果你有更加安全加固的配置。也可以提出来。
另外有一些优化局域网的访问速度的方法。在主路由的/etc/dnsmasq.conf中写入解析的局域网地址。
address=/n8n.域名/192.168.111.245
address=/k3s.域名/192.168.111.245
address=/webdav.域名/192.168.111.254
这样,当你在家访问的时候,路由器会自动解析到对应的局域网地址上。