2025年5月30日
今天上午 客户突然打电话说还是要研究 Nginx 网络透传以解决IBM MQ和宝马IBM MQ的通信问题。本来这是一个备选方案,他们周一决定直接连接**IBM MQ的。
我是完全不懂的,上周二在无锡我问了一个以前很熟悉的***的老师,他告诉我可以实现。然后我就用deepseek开始了我的工作。
工作是出奇的顺利,deepseek给出了完全无误的方案。
我用华为云模拟了企业专线,很快就实现了公有云上的IBM MQ和私有数据中心的IBM MQ的数据通信。
理解了您的网络拓扑结构,我来重新配置 Nginx 的端口透传规则。Nginx 服务器有两个 IP:内网 IP 10.11.13.60
和公网 IP 36.*.*.218
,需要连接的外部机器 IP 是 192.168.2.15
。
修正后的 Nginx 配置(完整版)
nginx
复制
下载
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; # 加载 stream 模块 load_module /usr/lib64/nginx/modules/ngx_stream_module.so; events { worker_connections 1024; } # TCP/UDP 透传配置 stream { # 配置1:内网访问 → 转发到外部机器 server { listen 10.11.13.60:1414; # 监听Nginx内网IP proxy_pass 192.168.2.15:1414; # 转发到外部机器 proxy_timeout 600s; proxy_connect_timeout 5s; proxy_buffer_size 16k; } # 配置2:外部访问 → 转发到内网服务器 server { listen 36.*.*.218:1414; # 监听Nginx公网IP proxy_pass 10.11.13.26:1414; # 转发到内网服务器 proxy_timeout 600s; proxy_connect_timeout 5s; proxy_buffer_size 16k; } } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers PROFILE=SYSTEM; # ssl_prefer_server_ciphers on; # # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }
配置说明
内网访问 → 外部机器:
nginx
复制
下载
server { listen 10.11.13.60:1414; # 监听Nginx的内网IP proxy_pass 192.168.2.15:1414; # 转发到外部机器 }
当内网客户端访问
10.11.13.60:1414
时Nginx 将流量透明转发到
192.168.2.15:1414
外部访问 → 内网服务器:
nginx
复制
下载
server { listen 36.*.*.218:1414; # 监听Nginx的公网IP proxy_pass 10.11.13.26:1414; # 转发到内网服务器 }
当外部客户端访问
36.*.*.218:1414
时Nginx 将流量透明转发到
10.11.13.26:1414
部署步骤
安装 stream 模块(如果尚未安装):
bash
复制
下载
sudo dnf install nginx-mod-stream
验证配置:
bash
复制
下载
sudo nginx -t
重启 Nginx:
bash
复制
下载
sudo systemctl restart nginx
检查端口监听:
bash
复制
下载
sudo ss -tulnp | grep nginx
应该看到:
复制
下载
tcp LISTEN 0 4096 10.11.13.60:1414 *:* users:(("nginx",pid=xxx,fd=yy)) tcp LISTEN 0 4096 36.*.*.218:1414 *:* users:(("nginx",pid=xxx,fd=zz))
配置防火墙:
bash
复制
下载
# 开放内网端口 sudo firewall-cmd --permanent --zone=internal --add-port=1414/tcp # 开放公网端口 sudo firewall-cmd --permanent --zone=public --add-port=1414/tcp sudo firewall-cmd --reload
网络拓扑说明
复制
下载
内网客户端 → [Nginx内网IP:10.11.13.60:1414] → 专线 → [外部机器:192.168.2.15:1414] 外部客户端 → [Nginx公网IP:36.*.*.218:1414] → Nginx → [内网服务器:10.11.13.26:1414]
测试方法
测试内网到外网透传(在内网任意机器执行):
bash
复制
下载
telnet 10.11.13.60 1414 # 检查外部机器192.168.2.15是否收到连接
测试外网到内网透传(在外部网络执行):
bash
复制
下载
telnet 36.*.*.218 1414 # 检查内网服务器10.11.13.26是否收到连接
安全加固建议
限制内网访问范围:
nginx
复制
下载
server { listen 10.11.13.60:1414; allow 10.11.13.0/24; # 只允许内网网段 deny all; # 拒绝其他所有 proxy_pass 192.168.2.15:1414; # ... }
限制外部访问源IP(如果可能):
nginx
复制
下载
server { listen 36.*.*.218:1414; allow 192.168.2.15; # 只允许外部机器IP deny all; # 拒绝其他所有 proxy_pass 10.11.13.26:1414; # ... }
启用连接限制:
nginx
复制
下载
server { listen 36.*.*.218:1414; proxy_pass 10.11.13.26:1414; proxy_connect_timeout 10s; proxy_upload_rate 1m; # 限制上传速度 proxy_download_rate 1m; # 限制下载速度 }
这个配置准确地反映了您的网络拓扑,使用 Nginx 的两个不同 IP 地址分别处理内网和外网的 1414 端口透传需求。