ssh命令:隧道代理+本地端口转发+远程端口转发

0、前言

nc是一个在网络连接两端的好工具,同时也是也个临时的端口转发的好工具。(永久的端口转发用什么?用iptables)

ssh也是这方面的好工具,好处是加密可靠可复用在一端操作即可,代价是要有登录帐号。

我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。

1、隧道带理

典型应用:翻越中国高墙

需要条件:一个国外vps,一个不需要登录(安全)的帐号,一个命令。

vps新建帐号:useradd -g nobody -s /sbin/nologin  gfw && echo gfw_Passw0rd | passwd --stdin gfw

本地ssh连接:ssh -NfD 6666 [email protected] -p 2222

可选转换:使用privoxy把socks5代理变成http代理供svn,pip,gem,curl等工具使用。

2、本地端口转发

我们可以将远程机器(LdapClientHost)上的应用直接配置到本机的 7001 端口上(而不是 LDAP 服务器的 389 端口上)。在 LdapClientHost 上执行如下命令即可建立一个 SSH 的本地端口转发,例如:

$ ssh -L 7001:localhost:389 LdapServerHost

之后的数据流将会是下面这个样子:

  • 我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,
  • 而本机的 SSH Client 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Server 上。
  • SSH Server 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,
  • 最后再将从 LDAP 返回的数据原路返回以完成整个流程。

3、远程端口转发

我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,而本机的 SSH Server 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Client 上。

在 LDAP 服务器(LdapServertHost)端执行如下命令:

$ ssh -R 7001:localhost:389 LdapClientHost

区别:

SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 LDAP Server 时,LDAP Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。

4、使用autossh防网络抖动+supervisior进程守护。

autossh解决的问题:远程端口转发一旦端口,很难再次建立。

autossh -M 1932 -NR  1922:localhost:1122 user@vps -p 1122

ps可以看到实质是这样的:

ssh -L 1932:127.0.0.1:1932 -R 1932:127.0.0.1:1933 -NR 1922:localhost:1122 -p 1122 user@vps

分析:使用回路,将本地1933端口,(远程转发)映射到远端1932,(本地转发)到本机的1932。形成回路。

supervisior解决的问题:autossh的进程守护

因此,使用supervisior守护autossh,autossh守护ssh。达到自动启动和守护端口转发的目的。

5、综合使用

案例一、如何2222端口被封,如果绕过封死2222端口的防火墙直接ssh到内网机器。(就是说限某几个端口是有局限的)

1、登录最重要的机器把2222端口映射到12222端口:

ssh -gfNL 12222:0.0.0.0:2222 host -p2222

2、使用该机器做隧道代理访问其他内网机器:

ssh -NfD 10000 user@host -p2222

3、ssh绕道访问其他内网机器:

ssh -o "ProxyCommand=nc -x localhost:10000 %h %p" user@host -p2222

巧妙结合的ssh和nc,都是linux自带工具,没有依赖。

案例二、借助远程vps让两台不能直接相通的机器相互能访问。

有主机vps和主机A、B。A、B无法直连,通过“中介”搭桥相连。(两台机器都能主动ssh到vps就能完成。)

A要ssh到B(B要ssh到A是同理):

1、主机B用ssh远程转发自己的2222端口到vps的127.0.0.1:12222

ssh -NfR 12222:127.0.0.1:2222 user@vps -p2222

2、主机A用ssh本地转发vps的127.0.0.1:12222到本地的127.0.0.1:12222

ssh -NfL 12222:127.0.0.1:12222 user@vps -p2222

3、主机A登录主机B

ssh user@localhost -p12222

参考:

实战 SSH 端口转发

https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/

使用supervisor托管shadowsocks

https://blog.phpgao.com/supervisor_shadowsocks.html

SSH反向连接及Autossh

http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html

时间: 2024-10-07 19:06:38

ssh命令:隧道代理+本地端口转发+远程端口转发的相关文章

ssh命令 远程登录

11.查看SSH客户端版本.查看SSH客户端版本 查询SSH客户端及其相应的版本号.使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH: 表明该系统正在使用OpenSSH: $ ssh -V OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003 表明该系统正在使用SSH: $ ssh -V ssh: SSH Secure Shell 3.2.9.1 (non-commercial version) on i686-pc-linux

ssh命令,主机互联

1.ssh的基本用法 SSH主要用于远程登录.假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了. # ssh [email protected] 如果本地用户名与远程用户名一致,登录时可以省略用户名. # ssh host SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口.使用p参数,可以修改这个端口. # ssh -p 2222 [email protected] 2. ssh密钥认证过程 SSH之所以能够保证安全,原因在于它采用了公钥加密. 整个

SSH 远程端口转发

既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发. 还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发.但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3.这时,"本地端口转发"就不能用了,怎么办? 解决办法是,既然host3可以连host1,那么就从ho

ssh隧道代理连接

0x00 什么是SSH隧道 场景: 假设有两台主机: A主机为外网,B主机为内网通常来说外网主机A是无法直接连接到内网主机B的,这时如果要实现A主机通过ssh控制B主机,通常来说有两种方法: 1.端口映射: 将B主机的ssh端口映射到B的外网ip,当然这要通过设置防火墙来实现 2.ssh的反向连接: B主机通过ssh连接到A主机,并在A主机上打开一个端口进行监听.这时如果A主机连接本机的这个端口就可以实现控制B主机 0x01 建立本地SSH隧道   在我们计划建立一个本地SSH隧道之前,我们必须

内网接口调用,ssh反向隧道与nginx反向代理

外网访问测试机. Windows机器使用SSH反向隧道.服务端使用反向代理 win下安装openssh-win并设置环境变量 打开cmd C:\Users\Administrator>ssh -p 22 -R 1999:localhost:8080 -b 0.0.0.0 [email protected] -R 1999远程机器的端口 -b 外网段监听,不加是 127.0.0.1监听 8080 本机端口 这样外网访问 8.8.8.8的1999端口就映射到了localhost的8080 服务器ng

SSH远程管理、参数讲解、xshell使用、scp,sftp,ssh命令(ssh两种方式的密钥验证方

1.SSH远程管理 SSH(Secure Sheel)是一种安全通道协议,主要用于实现字符界面的远程登录.远程复制等功能.SSH协议对通信双方的数据传输进行了加密处理,其中包括用户的口令.与早期的TELNET(远程登录,tcp23端口).RSH(Remote Sheel,远程执行命令).RCP(Remote File Copy,远程文件复制)等应用想必,SSH协议提供了更好的安全性. 配置OpenSSH服务端(由openssh.openssh-server软件包提供.主配置文件/etc/ssh/

Docker运行MongoDB及Redis及ssh端口映射远程连接

Docker运行MongoDB及Redis及ssh端口映射远程连接 本节内容简介 在本实验里我们将通过完成 MongoDB 和 Redis 两个容器来学习Dockerfile及Docker的运行机制. 本节中,我们需要依次完成下面几项任务: MongoDB 的安装及配置 Redis 的安装及配置 Dockerfile 的编写 从 Dockerfile 构建镜像 本次实验的需求是完成 Dockerfile,通过 Dockerfile 创建 MongoDB 或 Redis 应用.Dockerhub上

linux中ssh命令及scp远程文件传输

ssh命令: ssh  用户名@ip  远程管理指定Linux服务器 远程文件传输scp命令: scp -r 用户名@ip:源文件路径 本地路径      #下载文件 scp -r 本地文件 用户名@ip:上传路径        #上传文件

Linux修改ssh远程端口

首先我们简单说下为什么要修改ssh远程端口号呢? 我们装好系统后linux 的ssh远程端口默认是用的是22端口,但是由于安全考虑,经常我们安装好系统后一般都会考虑把原来的22端口更改为另外的端口. 本文将以端口改为60022为例,讲解一下具体操作过程.(这个端口号,你可以根据自己需求更改,本文以60022为例.) [[email protected] ~]$ vi /etc/ssh/sshd_config 执行上条命令后可以看到下图的配置页面,找到Port22,然后将端口22改为你想要的端口号