如何配置Nginx实现server2的22端口流量转发到server1的SFTP服务
问题排查与解决方案
现有配置的核心错误
- 协议不匹配:SFTP是基于SSH的四层TCP协议,你使用的是Nginx七层HTTP代理模块,无法识别、转发非HTTP/HTTPS协议的SFTP流量,配置逻辑从底层就不成立。
- 配置规则冲突:你在server块首行配置了
return 301 https://google.com,所有匹配到的请求会直接跳转,永远不会执行下方的location代理规则。 - 端口逻辑错误:你配置的监听规则归属HTTP块,仅能处理HTTP协议请求,无法接收SFTP的TCP流量。
正确配置方案
你需要使用Nginx的stream模块做四层TCP流量转发,步骤如下:
1. 前置检查
- 执行
ss -tulpn | grep :22检查server2的22端口占用:如果是server2自身的SSH服务(sshd)占用了22端口,需修改/etc/ssh/sshd_config中的SSH端口为其他值(如2222),重启sshd服务释放22端口。 - 验证server2到server1私网连通性:执行
nc -zv server1-private-ip 22确认网络连通,无安全组、防火墙拦截。 - 确认你的Nginx Docker镜像已编译
stream模块(官方Nginx镜像默认已包含该模块)。
2. 调整Nginx配置
删除你之前写在http块内的错误server块,新增与http块平级的stream块配置,示例如下:
# 与http块平级,不能写在http块内部 stream { server { listen 22; proxy_pass server1-private-ip:22; # 可选优化配置:延长SFTP连接超时时间 proxy_timeout 1h; proxy_connect_timeout 10s; } }
3. 调整Docker启动参数
启动Nginx容器时增加22端口映射:
docker run -d -p 80:80 -p 22:22 你的其他启动参数 nginx:latest
如果你用docker-compose,在ports配置中新增- "22:22"即可。
4. 验证配置
重启Nginx容器后,用FileZilla连接server2的公网/私网IP的22端口,即可正常访问SFTP服务。
内容的提问来源于stack exchange,提问作者jayzee
相关产品推荐
相关产品推荐

