Yang Yubo's Life @ Refactoring

SSH 反向隧道

written on Monday, July 30, 2012

目的

没有公网 IP, 处在防火墙/路由器保护范围内的服务器向外提供服务. 属于一种穿透方案, 即让公网用户访问处于内网的服务器。

原理

  1. 服务器 S 处在受保护的内网, 外部网络无法对其直接发起 TCP 连接, 无法访问其提供的网络服务
  2. 在外网建立一台 DMZ 服务器
  3. 在 S 和 DMZ 之间通过 SSH 建立 反向隧道
  4. 所有发给 DMZ 的 SOCKET 数据包都将被转发至服务器 S

建立步骤

修改 DMZ 的 /etc/ssh/sshd_config 配置文件

...

TCPKeepAlive yes
ClientAliveInterval 30
ClientAliveCountMax 99999 
...
...
GatewayPorts yes
...
service ssh restart

创建连接

# sshpass 可以通过命令行参数指定远程服务器的 ssh 密码, 方便无人职守执行

apt-get installl sshpass

# 注意: Ubuntu 11.04 和 11.10, sshpass 无法正常工作
# 注意: 首次连接会要求接受证书, 因此, 需要先执行
ssh -nNT -R 8082:localhost:80 host@remote.com -o ControlPath=/tmp/ssh_host_remote_reverse_tunnel

# 输入 yes 后, Ctrl-C 再次执行:
sshpass -p [remote ssh password here] ssh -nNT -R 8082:localhost:80 host@remote.com -o ControlPath=/tmp/ssh_host_remote_reverse_tunnel

自动连接

使用 Supervisor 管理 ssh 后台进程.

安全性问题

DMZ 服务器上的 SSH 帐号应只用于数据包的转发, 由于密码明文指定, 为防止恶意操作, 可在创建帐号时限制其透过 SSH/FTP 方式登录:

useradd -s /bin/false [username] # username,将用户的shell设置成/bin/false。这样用户就无法与系统进行交互。
passwd [username] # 设置密码

参考资料

This entry was tagged reverse-tunnel and ssh

blog comments powered by Disqus