当前位置: > 其它学习 > 日常运维 >

SSH隧道与端口转发及内网穿透绑定本地端口

时间:2019-12-24 15:34来源:linux.it.net.cn 作者:IT
ssh是一种安全的传输协议,我一般使用就是在登陆服务器或远端执行命令,最近我意识到这是个强大的命令。

开讲~
本地ssh隧道

工作中由于防火墙导致访问某些网站或某些ftp连接超时,有什么解决办法呢。ssh隧道就是一种解决方式。

首先你需要了解一些信息:

1. 你自己的电脑不能访问一个国外的ftp(10.10.10.10)。
2. 你有一台服务器(20.20.20.20),服务器可以访问国外的ftp。
3. 你和你的服务器是可以互通的。

你当然可以先连接到个人服务器进行文件下载后通过其他方式再放到本地,但low,这里可以使用ssh的隧道功能来实现。先看命令

ssh -CfNg -L 21:10.10.10.10:21 20.20.20.20
ftp localhost:21 # 现在访问本地21端口,就能连接10.10.10.10的21端口了
# 至此就可以连接下载了。

先对参数做说明:

    -C:压缩数据传输
    -f:ssh客户端在后台执行
    -N:不执行脚本或命令,仅进行端口转发
    -g:在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
    -L:做本地映射端口,被冒号分割的三个部分含义分别是  需要使用的本地端口号 需要访问的目标机器IP地址 需要访问的目标机器端口  
    用来建立隧道的中间机器的IP地址

远程ssh隧道

由于公司内网机器使用公共的路由器出口进行上网,由于公司内部的设备没有自己的公网ip地址,所有也是个问题,但是ssh也能解决。

首先你需要有一些支持:

    拥有一台有外网IP的服务器(20.20.20.20)。(这就够了)

先上命令:

ssh -p 1207 -CfNg -R 2222:127.0.0.1:22 root@20.20.20.20
# 该命令在内网机执行

    -R:该参数的三个部分的含义分别是  映射到远程机器使用的端口(2222) 需要映射的内部机器的IP地址(127.0.0.1) 需要映射的内部机器的端口(22)  
    最后的参数是外网连接的服务器。

很简单。基本都了解了。
ssh 隧道建立socket服务

如果我们需要借助一台中间服务器访问很多资源,一个个映射显然不是高明的办法。幸好,SSH客户端为我们提供了通过SSH隧道建立SOCKS服务器的功能。

通过下面的命令我们可以建立一个通过20.20.20.20的SOCKS服务器。

ssh -N -f -D 1080 20.20.20.20 # 将端口绑定在127.0.0.1上
ssh -N -f -D 0.0.0.0:1080 20.20.20.20 # 将端口绑定在0.0.0.0上

ssh隧道使用问题及解决办法

自动重连

隧道可能因为某些原因断开,例如重启,长时间没有数据通信而被路由器切断等等。因此我们可以使用简单的循环或supervisor来控制隧道的重新连接。重连时要避免要求输入密码而卡死程序,对于密码登陆可以采用sshpass或免密登陆方式。如果通过其他程序控制隧道连接,应当避免将SSH客户端放到后台执行,也就是去掉-f参数。

保持长连接

有些路由器会把长时间没有通信的连接断开。SSH客户端的TCPKeepAlive选项可以避免这个问题的发生,默认情况下它是被开启的。如果它被关闭了,可以在ssh的命令上加上-o TCPKeepAlive=yes来开启。

另一种方法是,去掉-N参数,加入一个定期能产生输出的命令。例如: top或者vmstat。

ssh -R 2222:localhost:22 root@20.20.20.20 "vmstat 30"

检查隧道状态

有些时候隧道会因为一些原因通信不畅而卡死,例如:由于传输数据量太大,被路由器带入stalled状态。这种时候,往往SSH客户端并不退出,而是卡死在那里。一种应对方法是,使用SSH客户端的ServerAliveInterval和ServerAliveCountMax选项。 ServerAliveInterval会在隧道无通信后的一段设置好的时间后发送一个请求给服务器要求服务器响应。如果服务器在 ServerAliveCountMax次请求后都没能响应,那么SSH客户端就自动断开连接并退出,将控制权交给你的监控程序。这两个选项的设置方法分别是在ssh时加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定义。

如果将ip绑定到外网地址上

使用上面的方法,映射的端口只能绑定在127.0.0.1这个接口上。也就是说,只能被本机自己访问到。如何才能让其他机器访问这个端口呢?我们可以把这个映射的端口绑定在0.0.0.0的接口上,方法是加上参数-b 0.0.0.0。同时还需要打开SSH服务器端的一个选项-GatewayPorts。默认情况下它应当是被打开的。如果被关闭的话,可以在/etc /sshd_config中修改GatewayPorts no为GatewayPorts yes来打开它。 (责任编辑:IT)
------分隔线----------------------------