ssh打洞 回首页
一、概述
为什么要使用"ssh打洞"——改善网络连接、突破防火墙的限制、防止窃听
例1:
client在墙内, 但可以访问server, 需要打个洞让server反向以ssh访问client.
# client下ssh到server的10022端口, 开端口11111
ssh -NfR 11111:localhost:22 -p 10022 [email protected]
# 然后在server, ssh回到client
ssh localhost -p 11111
# scp 回到client
scp -P 1111 -r 5.4 [email protected]:/Storage1/CentOS/
例2:
Bob在内网, 有防火墙挡着, 所以Alice没办法向Bob建立连接,
但是Bob在的内网中有一台Carol可以操作并向外网的Alice建立连接。
如果Alice这里有 sshd server, 就可以从Carol用 ssh -R 来反向建立通道:
ssh -R 11432:Bob:1432 Alice
Bob || Alice
+-------------------+ || +-------------------+
| 公司里的Winxp | || | 家里的 |
| Port 1432 | || | windows 2008 R2 |
+-------------------+ || | 安装了winsshd服务|
\ || | |
\ || | |
Carol \ || | |
+-------------------+ || | |
| Linux | || | ssh server |
| ssh client --->-+---->--++----->+--> |
+-------------------+ || +-------------------+
这样在Alice上连 localhost:11432 的时候, ssh 通道会自动把网络包发回Bob机器的1432端口。
这里如果能操作Bob, 那么从Bob直接 ssh Alice 也可以, 就不需要Carol了。
在没有网关权限的情况下, 这个方法是从外网连内网机器的最基本的方法。
例3:
假设Alice, Bob, Carol都是互联网上的机器, 但是Alice和Bob通讯不畅, 想通过Carol中转。可能的方法有:
从Carol往Alice: ssh -R, 从Carol往Bob: ssh -L, 从Alice往Carol: ssh -L, 从Bob往Carol: ssh -R。
有一个要注意的问题是 -L -R 参数开的端口往往只监听localhost, 绑定到外网 IP 可能被禁止,
这时候可以再建一个本地的洞从0.0.0.0:"某个端口"打通到那个本地的洞。
比较新的 ssh 开始带 -D 参数, 可以将 ssh 通道当作 socks4 代理使用。
这个尤其适合连Bob上的ftp。
从Alice通过另一台机器Carol连Bob的ftp碰到的问题是数据连接端口是动态的, 无论 PORT 还是 PASV 模式都需要特殊配置。
比较简单的方法是:
Alice往Carol: ssh -D 3003 端口,
然后配置Alice本地ftp软件使用socks4代理: localhost:3003,
这样ftp软件就可以正常工作了。
这个方法也可以用于浏览有IP限制的网段。
比如从国外无法浏览中国教育网里面的网页, 如果可以用 ssh -D 挂上一台能直连教育网的机器,
那么配置浏览器使用这个 ssh 通道的 socks4 代理就可以了。
另外比如你想下bt但是又想避开米国的耳目, 或者你对某段网路的安全不放心, 也可以用这个办法来方便的加密传输数据,
因为 ssh 通道内传送的数据是加密的。
二、几个特别的例子
例1:
本地端口转发(ssh和连接服务端口的方向一致), 格式: ssh -L "local port":"remote host":"remote port" "SSH hostname"
在Alice上执行:
ssh -L 10389:localhost:389 Bob
Alice || Bob
+-------------------+ || +-------------------+
| LDAP Client | || | LDAP Server |
| Port 10389 | || | Port 389 |
| \ | || | / |
| \ | || | / |
| \ | || | / |
| | | || | | |
| ssh client --->-+---->--++----->+--> ssh server |
| | || | |
+-------------------+ || +-------------------+
这时候Alice通过访问本地的10389实现连到Bob上的389端口.
例2:
远程端口转发(ssh和连接服务端口的方向相反), 格式: ssh -R "local port":"remote host":"remote port" "SSH hostname"
在Bob上执行:
ssh -R 10389:localhost:389 Alice
Alice || Bob
+-------------------+ || +-------------------+
| LDAP Client | || | LDAP Server |
| Port 10389 | || | Port 389 |
| \ | || | / |
| \ | || | / |
| \ | || | / |
| | | || | | |
| ssh server --->-+---->--++----->+--> ssh client |
| | || | |
+-------------------+ || +-------------------+
例3:
多主机转发应用
格式:
ssh -CfNg -L "local port":"remote host":"remote port" "SSH hostname"
ssh -CfNg -R "local port":"remote host":"remote port" "SSH hostname"
SSH提供了 GatewayPorts 关键字, "-g "参数以保证机器Alice能够使用机器Carol建立的本地端口转发.
方案1
在Carol上执行:
ssh -CfNg -L 10389:Bob:389 Donna
然后Alice连接Carol的10389端口即可.
Alice || Bob
+-------------------+ || +-------------------+
| LDAP Client | || | LDAP Server |
| | || | Port 389 |
+-------------------+ || +-------------------+
\ || /
\ || /
Carol \ || / Donna
+-------------------+ || +-------------------+
| ssh client | || | ssh server |
| Port 10389 --->-+---->--++----->+--> |
+-------------------+ || +-------------------+
方案2
在Donna上执行:
ssh -CfNg -R 10389:Bob:389 Carol
然后Alice连接Carol的10389端口即可.
Alice 家里 || 公司 Bob
+-------------------+ || +-------------------+
| LDAP Client | || | LDAP Server |
| | || | Port 389 |
+-------------------+ || +-------------------+
\ || /
\ || /
Carol \ || / Donna
+-------------------+ || +-------------------+
| ssh server | || | ssh client |
| Port 10389 --->-+---->--++----->+--> |
+-------------------+ || +-------------------+
例4:
动态端口转发. 格式: ssh -D "local port"
当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览及 MSN 信息无疑是十分必要的。
在Alice上执行:
ssh -D 10001 Donna
Alice || WEB, MSN
+-------------------+ || ______
| Browser | || ( )
| MSN | || ( ___)
| | || (____)
| | || /
| | || /
| | || / Donna
| ssh slient | || +-------------------+
| | || | ssh server |
| --->-+---->--++----->+--> |
+-------------------+ || +-------------------+
选择了10001作为本地的端口号,其实在这里 SSH 是创建了一个 SOCKS 代理服务.
-D port
This works by allocating a socket to listen to port on the local
side, and whenever a connection is made to this port, the con-
nection is forwarded over the secure channel, and the applica-
tion protocol is then used to determine where to connect to from
the remote machine. Currently the SOCKS4 and SOCKS5 protocols
are supported, and ssh will act as a SOCKS server. Only root
can forward privileged ports. Dynamic port forwardings can also
be specified in the configuration file.
例5:
X转发.
在Alice上执行:
ssh -X Bob
Alice || Bob
+-------------------+ || +-------------------+
| X Server | || | X Client |
| \ | || | / |
| \ | || | / |
| \ | || | / |
| | | || | | |
| ssh client --->-+---->--++----->+--> ssh server |
| | || | |
+-------------------+ || +-------------------+