proxy_bind指令用于指定Nginx反向代理请求的出站源IP地址,需绑定已配置的有效IP(而非网卡名),并启用net.ipv4.ip_nonlocal_bind=1;支持IPv4/IPv6、端口指定及off关闭,须通过tcpdump或ss验证生效。

在 Nginx 中,proxy_bind 指令可以指定上游请求(即反向代理发往后端服务器的连接)**从哪个本地 IP 地址或接口出站**,从而实现绑定到特定虚拟网卡(如 eth0:1、br0、docker0 或别名接口如 eth0:100)的效果。但需注意:Nginx 本身不识别“网卡名”(如 eth0:1),只认 IP 地址;所谓“绑定虚拟网卡”,实质是绑定该网卡上配置的某个本地 IP。
确认虚拟网卡已正确配置 IP
这是前提。Nginx 无法绑定一个未配置有效 IPv4/IPv6 地址的接口。例如:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 若你通过
ip addr add 192.168.100.5/24 dev eth0给eth0添加了辅助 IP,则可用192.168.100.5; - 若使用传统别名(如
eth0:1),它只是历史兼容写法,底层仍是给eth0添加 secondary IP,实际仍需用该 IP 地址; - 运行
ip -4 addr show查看哪些 IPv4 地址处于UP状态,并记下你想用的那个。
在 location 或 upstream 中使用 proxy_bind
proxy_bind 支持地址、地址+端口、或关键字(如 off)。要绑定出站源 IP,直接写 IP 即可:
- 在
location块中(对匹配该路径的所有 upstream 请求生效):
location /api/ {
proxy_pass https://backend;
proxy_bind 192.168.100.5; # ← 绑定到该 IP 对应的虚拟网卡
}- 在
upstream块中(更推荐,精细控制每个后端):
upstream backend {
server 10.10.20.100:443;
proxy_bind 192.168.100.5; # ← 此 upstream 所有连接都从此 IP 出站
}- 支持 IPv6:写成
proxy_bind [2001:db8::100];; - 如需指定源端口(少见):
proxy_bind 192.168.100.5:12345;; - 若想让某 location 不继承 upstream 的 bind 设置,可显式设为
proxy_bind off;。
关键限制与注意事项
-
必须启用
net.ipv4.ip_nonlocal_bind=1(Linux):否则 Nginx 无法绑定非本机主 IP(如 secondary IP 或 loopback 外的任意地址)。执行:sysctl -w net.ipv4.ip_nonlocal_bind=1,并写入/etc/sysctl.conf持久化; -
该 IP 必须属于本机且路由可达:Nginx 不会自动添加路由,确保系统能通过该 IP 正常发包(例如
ping -I 192.168.100.5 8.8.8.8可通); -
不支持直接写网卡名:像
proxy_bind eth0:1是无效语法,Nginx 会报错invalid address; - worker 进程需有 CAP_NET_BIND_SERVICE 权限(如需绑定低端口),但绑定出站源 IP 一般无需特权;
- 若使用
proxy_bind $remote_addr等变量,需开启proxy_bind的变量支持(Nginx ≥ 1.19.10,且编译时含--with-http_realip_module等依赖)。
验证是否生效
最直接方式:在后端服务器上抓包,查看 TCP SYN 包的源 IP 是否为你指定的 IP:
- 在后端执行:
tcpdump -i any 'tcp and port 443' -nn -v | grep "IP.*\."; - 触发一次前端请求,观察输出中的
IP xxx.xxx.xxx.xxx.???? > yyy.yyy.yyy.yyy.443,前面那个 IP 就是 Nginx 出站源 IP; - 也可在 Nginx 本机用
ss -tnp | grep :443查看 established 连接的本地地址列。

















