代码改变世界

ssh tunnel通道

2016-02-26 16:46  youxin  阅读(5577)  评论(0编辑  收藏  举报

Secure SHell (SSH) 是一个通过网络登录其他计算机的程序,在远程服务器运行命令,和从一台机器移动文件到另一台。在不安全的网络中,它提供两台主机之间强大认证和安全加密的的通讯,被称为 SSH Port Forwarding (Tunneling)。通常情况下,它是使用为一个 Telnet 的加密版本。

在一个 Telnet 阶段作业,全部的通讯,包括用户名和密码,会用纯文本传输,让任何人都能监听你的阶段作业及窃取密码或其他信息。这种阶段作业也容易受到阶段作业劫持,一旦你验证,恶意用户就能接管这种阶段作业。SSH 的目的是防止这种漏洞,并允许你在不影响安全性的情况下访问远程服务器的 shell。

 

SSH 通道的好处

SSH 有一个极好功能叫做 SSH Port Forwarding,有时也被称为 SSH 通道,它允许你创建一个安全的阶段作业,然后通过它打开随心所欲的 TCP 连接。通道可以随时创建,几乎不需要任何努力及编程,这令到它们非常有吸引力。在无数不同的方式,SSH Port Forwarding 可以用于安全通信。

 

本地端口转发

ssh -fgN -L 2222:localhost:22 localhost

(2) 远程端口转发

ssh -fgN -R 2222:host1:22 localhost 
 

(3) 动态转发

ssh -fgN -D 12345 root@host1 

许多提供服务器讬管的讬管公司会封锁讬管公司网络以外访问服务器,以及只授予访问給本机(localhost)用户连接。

 

使用 SSH 的多个好处:

@当服务器端口被封锁时,连接到使用了防火墙的服务器。

@自动验证用户,没有发送纯文本的密码,以防止窃取密码。

@多个强大的认证方法,防止安全威胁如欺骗的身份。

@安全和快速的加密和压缩数据。

@安全文件传输。

为确保进来的连接请求是由你发出,SSH 能够使用密码,或公开及私钥对(也称为公钥)验证机制。

 

@密码验证。

@公钥验证。

注意:请确保在Linux 服务器的参数 -「AllowTcpForwarding」设置值为「yes」,否则,会禁用 SSH port forwarding。要查找路径:/etc/ssh/sshd_config。在默认情况下,SSH port forwarding 应该已启用。请仔细检查该值的设置。

 

** 即使服务器支持 SSH 通道,然而,如果 port forwarding 被禁用,Navicat 就无法通过 SSH 端口 22 连接。

 

1.

复制代码
SSH: Port Forwarding
1.正向隧道-隧道监听本地port,为普通活动提供安全连接
ssh -qTfnN -L port:host:hostport -l user remote_ip
2.反向隧道----隧道监听远程port,突破防火墙提供服务
ssh -qTfnN -R port:host:hostport -l user remote_ip
3.socks代理
SSH -qTfnN -D port remotehost(用证书验证就直接主机名,没用的还要加上用户名密码)
-q Quiet mode. 安静模式,忽略一切对话和错误提示。
-T Disable pseudo-tty allocation. 不占用 shell 了。
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数。
-n Redirects stdin from /dev/null (actually, prevents reading from stdin). -f 推荐的,不加这条参数应该也行。
-N Do not execute a remote command. 不执行远程命令,专为端口转发度身打造。
复制代码

2.

复制代码
ssh实现转发, 只要用到以下两条命令: 

# ssh -CfNg -L 6300:127.0.0.1:1521 oracle@172.16.1.164
# ssh -CfNg -R 1521:127.0.0.1:6300 oracle@172.16.1.164

不论是做跳板, 还是加密隧道, 还是加密其他的网络连接也都是这两条命令. 视具体情况而定, 有时只要用到其中一条, 有时两条都要用到. 

命令解释: 

1) -CfNg

C表示压缩数据传输
f表示后台用户验证,这个选项很有用,没有shell的不可登陆账号也能使用.
N表示不执行脚本或命令
g表示允许远程主机连接转发端口

2) -L 本地转发

# ssh -CfNg -L 6300:127.0.0.1:1521 oracle@172.16.1.164

本机(运行这条命令的主机)打开6300端口, 通过加密隧道映射到远程主机172.16.1.164的1521端口(使用远程主机oracle用户). 在本机上用netstat -an|grep 6300可看到. 简单说,本机的6300端口就是远程主机172.16.1.164的1521端口. 

3) -R 远程转发

# ssh -CfNg -R 1521:127.0.0.1:6300 oracle@172.16.1.164

作用同上, 只是在远程主机172.16.1.164上打开1521端口, 来映射本机的6300端口. 

4) 实用例子

有A,B,C 3台服务器, A,C有公网IP, B是某IDC的服务器无公网IP. A通过B连接C的80端口(A<=>B<=>C), 那么在B上执行如下命令即可: 

$ ssh -CfNg -L 6300:127.0.0.1:80 userc@C
$ ssh -CfNg -R 80:127.0.0.1:6300 usera@A

服务器A和服务器C之间, 利用跳板服务器B建立了加密隧道. 在A上连接127.0.0.1:80, 就等同C上的80端口. 需要注意的是, 服务器B上的6300端口的数据没有加密, 可被监听, 例: 

# tcpdump -s 0-i lo port 6300

 

新建一个ssh代理:

 ssh -CfNg -L 6000:127.0.0.1:22 root@120.18.28.28

本机6000代理到远程22.

运行命令后可用看到有进程:

tcp        0      0 0.0.0.0:62667               0.0.0.0:*                   LISTEN      27449/ssh

测试是否可用

ssh -p 6000  root@localhost -v  

如果不可用会报错,常见的错误有:

ssh_exchange_identification: Connection closed by remote host

这个说明远程主机名单设置有问题。

 

securecrt连接:

新建一个连接:

这里的ip是你跳板机的ip,端口是你设置的ssh转发端口6000,

 

在连接中选择“Connection” -> "Port Forwarding",选择“add...”添加一条新的转发规则

 

然后选择“OK”,要想配置生效,需要关闭当前连接重新连一次,此时,只要该连接处于连接状态,所有本地(127.0.0.1)2222的请求都会通过跳板机(150.236.223.72)转发至内网服务器(10.170.67.234)的22端口。

 

 

http://blog.sina.com.cn/s/blog_48f9c0840100tp5h.html

 

http://my.oschina.net/zencodex/blog/387581

http://www.cnblogs.com/wangkangluo1/archive/2011/06/29/2093727.html

http://blog.csdn.net/a19881029/article/details/40081983

Python实现运维堡垒机(跳板机)系统   http://www.linuxidc.com/Linux/2014-08/105793.htm

 

使用rinetd做端口转发

 

(1) 源码下载
wget https://li.nux.ro/download/nux/misc/el7/x86_64/rinetd-0.62-9.el7.nux.x86_64.rpm
(2) 安装rinetd
rpm -ivh rinetd-0.62-9.el7.nux.x86_64.rpm
(3) 编辑配置文件
vi rinetd.conf
0.0.0.0 1234 127.0.0.1 22
(4) 启动转发
rinetd -c /etc/rinetd.conf
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/JineD/article/details/118254041

 

ncat也可以端口转发https://blog.csdn.net/JineD/article/details/118254041