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内网IPproxy_pass 192.168.2.15:1414; # 转发到外部机器proxy_timeout 600s;proxy_connect_timeout 5s;proxy_buffer_size 16k;}# 配置2:外部访问 → 转发到内网服务器server {listen 36.*.*.218:1414; # 监听Nginx公网IPproxy_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/tcpsudo 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 端口透传需求。