Windows 中的 OpenSSH:
https://docs.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_overview
openssh windows10 download 下载与安装:http://www.mls-software.com/opensshd.html
实验室平台:
语音引擎主机:
Linux wiseatc-HP-Pavilion-Gaming-Desktop-790-08xx 4.15.0-72-generic #81~16.04.1-Ubuntu SMP Tue Nov 26 16:34:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
sudo ps aux |grep ssh
[sudo] wiseatc 的密码:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1119 0.0 0.0 65512 5464 ? Ss 2019 0:01 /usr/sbin/sshd -D
wiseatc 2702 0.0 0.0 44792 3772 ? S 20:41 0:00 ssh -C -f -N -g -R 9009:localhost:22 wiseatc@182.150.56.5 -p 9090
wiseatc 3306 0.0 0.0 44792 3912 ? S 20:42 0:00 ssh -C -f -N -g -R 9009:localhost:22 wiseatc@182.150.56.5 -p 9090
——
182.150.56.5来自
四川省成都市武侯区 电信
/usr/local/bin$
cat ra.sh
#!/bin/env bash
#FIEL DESCRIPTION: remote assistant demon script
#FILE AUTHOR: YangKai
#FILE VERSION: 1.0.0
#FILE UPDATE LOG: 2019.10.15, initial version
#Copyright Wisesoft co. ltd 2019
#
USAGE: ra.sh serverport loginstring serversshport
#eg. ra.sh 9008 wiseatc@183.150.56.5 9090
ps -A | grep -v grep | grep "ssh -C -f -N -g -R $1:localhost:22 $2 -p $3" > /dev/null
ret=$?
if [ $ret -ne 0 ]; then
echo "Resume remote assistant...."
ssh -C -f -N -g -R $1:localhost:22 $2 -p $3
$crontab -e
#m h dom mon dow command
*/1 * * * * /bin/bash /usr/local/bin/ ra.sh 9009 wiseatc@182.150.56.5 9090
ssh -C -f -N -g -R 9009:localhost:22 wiseatc@182.150.56.5 -p 9090
9009/tcp,udp | Pichat Server - Peer to peer chat software | 官方 |
webshpere管理工具,默认的端口号为9090
$sudo crontab -e
18 * * * * sudo ps aux|grep SDI|awk {' print$2'}|xargs sudo kill -9
(root
23112 3.5 0.0 146428 26252 ? Sl 20:18 1:40 python /home/wiseatc/AIsafe/PII/SDI/
SDI.py)
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),( ssh的转发有四类: 远程转发、本地转发、动态转发和X转发 。把TCP流重定向到ssh连接叫做“转发”,这个ssh连接叫做“隧道”), SSH 端口转发能够提供两大功能:
- 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
- 突破防火墙的限制完成一些之前无法建立的 TCP 连接。
如上图所示,使用了端口转发之后,TCP 端口 A 与 B 之间现在并不直接通讯,而是转发到了 SSH 客户端及服务端来通讯,从而自动实现了数据加密并同时绕过了防火墙的限制。
SSH基本用法
ssh -p 22 user@host参数:
SSH 不仅仅能够自动加密和解密 SSH 客户端与服务端之间的网络数据,同时,SSH 还能够提供了一个非常有用的功能,那就是端口转发,即将TCP 端口的网络数据,转发到指定的主机某个端口上,在转发的同时会对数据进行相应的加密及解密。如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过使用SSH转发后的端口进行通信。转发,主要分为本地转发与远程转发两种类型。
SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 LDAP Server 时,LDAP Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。
——另一个方便记忆的方法是,Server 端的端口都是预定义的固定端口(SSH Server 的端口 22,LDAP 的端口 389),而 Client 端的端口都是动态可供我们选择的端口(如上述例子中选用的 7001 端口)。如果 Server 端的两个端口都在同一台机器,Client 端的两个端口都在另一台机器上,那么这就是本地连接;如果这四个端口 交叉分布在两个机器上,每台机器各有一个 Server 端端口,一个 Client 端端口,那就是远程连接。
—————————— http://www.zsythink.net/archives/2450/ ——————————————
https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/
https://blog.csdn.net/randyleonard/article/details/9049335
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host
(
ssh -L <
local
port>:<
remote
host>:<
remote
port> <
SSH
hostname>
)
*本地转发命令中的
ssh -C -f -N -g -R listen_port: DST_Host:DST_port user@ Tunnel_Host
(
ssh -R <
local
port>:<
remote
host>:<
remote
port> <
SSH
hostname>
)
ssh -C -f -N -g -D listen_port user@Tunnel_Host
(
ssh -D <
local
port> <
SSH
Server>
)
只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
参数: -C:压缩数据-f :后台认证用户/密码,通常和-N连用,不用登录到远程主机。-N :不执行脚本或命令,通常与-f连用。-g :在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。-L : 本地端口:目标IP:目标端口-D : 动态端口转发-R : 远程端口转发-T :不分配 TTY 只做代理用-q :安静模式,不输出 错误/警告 信息
创建隧道时的常用选项有:
"-L选项":表示使用本地端口转发创建ssh隧道
"-R选项":表示使用远程端口转发创建ssh隧道
"-N选项": 表示创建隧道以后不连接到sshServer端,通常与"-f"选项连用
"-f选项":表示在后台运行ssh隧道,通常与"-N"选项连用
"-g选项":表示ssh隧道对应的转发端口将监听在主机的所有IP中,不使用"-g选项"时,转发端口默认只监听在主机的本地回环地址中, "-g"表示开启网关模式,远程端口转发中,无法开启网关功能。 本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”。好在 SSH 同时提供了 GatewayPorts 关键字,我们可以通过指定它与其他机器共享这个本地端口转发。
如果想要能够正常的使用ssh端口转发,我们还需要做出正确的配置才行,之前一直没有说明,是因为openssh默认的配置就是支持端口转发的。
如果想要ssh端口转发能够正常工作,需要在ssh服务端的配置文件中将AllowTcpForwarding的值设置为yes。
此处所指的ssh服务端即ssh隧道中的一头,扮演ssh服务端角色的那台主机。
当隧道建立以后,经过一段时间后,ssh隧道链接可能会被断开,这有可能是因为ssh客户端和ssh服务端长时间没有通讯,于是ssh服务端主动断开了链接,如果想要解决这个问题,可以在ssh服务端进行配置,调整ssh服务端的ClientAliveInterval配置和ClientAliveCountMax配置即可。
1、本地端口转发:
指定到本地(客户端)主机上给定TCP端口或Unix套接字的连接将转发到远程端的给定主机和端口或Unix套接字。这是通过 分配一个套接字来侦听本地端的TCP端口(可选地绑定到指定的bind地址)或Unix套接字来实现的。无论何时连接到本地端口或套接字,都会通过安全通道转发连接,并从远程计算机连接到主机端口hostport或Unix套接字remote socket。
端口转发也可以在配置文件中指定。只有超级用户才能转发特权端口。IPv6地址可以通过将地址括在方括号中来指定。默认情况下,根据GatewayPorts设置绑定本地端口。但是,可以使用显式绑定地址将连接绑定到特定地址。“localhost”的bind地址表示侦听端口只能绑定为本地使用,而空地址或“*”表示端口应该可以从所有接口使用。
应用 :在实验室主用ATC系统APP-FDO2席位的firefox浏览器打开168.192.11.24:15672,显示语音识别电脑168.192.11.99的RabbitMQ界面(user:mqadmin;pw:wiseatc123)
只需在 APP-FDO2执行:ssh -f -N -L 168.192.11.24:15672:168.192.11.99:15672 wiseatc@168.192.11.99
ssh -L [本地地址:]本地端口:远程地址:远程端口 远程用户@远程地址
将本地WIN10-WAN(192.168.5.100/127.0.0.1)的某个端口,映射到RHEL5.8 DB(192.168.5.60 安装了二所mysql)机器上面的,在 192.168.5.100执行: 当访问本地 192.168.5.100端口3306时,通讯数据会被转发(通过 建立的ssh隧道)到目标主机 192.168.5.60的端口3306,这就是本地转发。
ssh -L 127.0.0.1:3306:192.168.5.60:3306 root@192.168.5.60
因为本地网卡地址是可以省略的,上面的转发,可以简写为:
ssh -L 3306:192.168.5.60:3306 root@192.168.5.60
当然,ssh连接的时候,若两台机器的用户名相同,也是可以省略的,即命令可以简写为:
ssh -L 3306:192.168.5.60:3306 192.168.13.142
例如: ssh -f -N -L 192.168.5.100:9906:192.168.5.60:3306 TWR1@192.168.5.60
"-N选项",当配合此选项创建ssh隧道时,并不会打开远程shell连接到目标主机; 9906端口已经被监听
"-f"选项表示后台运行ssh隧道,即使我们关闭了创建隧道时所使用的ssh会话,对应的ssh隧道也不会消失
"-g"选项( Win10中必须在-L参数之前)可以开启"网关功能",开启后, 192.168.5.100中的 所有IP(多网卡情况)都会监听对应端口 -ok
在 本地WIN10-WAN(192.168.5.100/127.0.0.1)执行mysql -h127.0.0.1 -P9906 -uroot可连接192.168.5.60主机的二所数据库; 办公网其它主机访问 WIN10-WAN(多网卡: 192.168.5.100/办公网IP192.168.6.200的9906端口,即访问mysql; 另考虑端口177, 二楼办公网的主机使用 Xbrowser通过实验室WIN10主机访问川大RHEL6.5主机图形桌面)
2、SSH的远程操作
tar -cz test | ssh dequan@192.168.13.149 'tar -xz'
ssh dequan@192.168.13.149 'netstat -tln |grep 1080'
3、SSH的远程转发
指定要将到远程(服务器)主机上给定TCP端口或Unix套接字的连接转发到本地端。 这是通过分配一个套接字来侦听远程端的TCP端口或Unix套接字来实现的。无论何时连接到此端口或Unix套接字,都会通过安全通道转发连接,并从本地计算机连接到由主机端口hostport或本地套接字指定的显式目标,如果未指定显式目标,ssh将充当SOCKS 4/5代理,并将连接转发到远程SOCKS客户端请求的目的地。端口转发也可以在配置文件中指定。只有以root用户身份登录远程计算机时,才能转发特权端口。IPv6地址可以通过将地址括在方括号中来指定。默认情况下,服务器上的TCP侦听套接字将仅绑定到环回接口。这可以通过指定绑定地址来覆盖。空的bind地址或地址'*',表示远程套接字应该侦听所有接口。只有启用了服务器的GatewayPorts选项(请参阅sshd config(5)),才能成功指定远程绑定地址。如果port参数为“0”,则侦听端口将在服务器上动态分配,并在运行时报告给客户端。当与-O forward一起使用时,分配的端口将打印到标准输出。
场景( 只要访问公司外网 ServerA的对应IP端口,即可访问到内网ServerB中的mysql服务):
公司有一台服务器ServerB,ServerB处于公司的内网中,公司内网中的所有主机都通过路由器访问互联网(典型的NAT网络),ServerB中有提供mysql服务; 公司在公网上有另外一台服务器ServerA,ServerA有自己的公网IP,你有权控制ServerA,这时,我们就可以利用ServerA达到目的。由于 我们无法从ServerA中使用ssh命令连接到ServerB,但是,我们可以从ServerB(办公内网 192.169.7.199)中使用ssh命令连接到ServerA(公网 139.196.99.48)。 我们现在需要一种方法,能够从ServerB中创建SSH隧道连接到ServerA,并且,隧道创建后,ServerA中会监听9906端口,以便别人能够通过外网访问,也就是说,我们需要一种方法,能够满足如下两个条件
条件1:从ServerB中主动连接到ServerA,即 在ServerB中执行创建隧道的命令,连接到ServerA。
条件2:隧道创建后,转发端口需要 监听在ServerA中,以便利用ServerA访问到内网的ServerB。
这种方法就是"远程转发"。
ssh -C -f -N -g -R 39009:localhost:28080 uav@139.196.99.48
ServerA的IP为 168.192.11.223(假设此IP为公网IP); ServerB(语音识别)的办公网IP为 168.192.11.99
ssh -C -f -N -g -R listen_port: DST_Host: DST_port user@ Tunnel_Host
*测试?:
在APP-FDO-2主机168.192.11.24执行: ssh -C -f -N -g -R 3333:168.192.11.99:15672 hp@168.192.11.223
——在Win10主机 168.192.11.223打开( 其它IP不行)127.0.0.1:3333 可以访问 168.192.11.99的端口15672(RabbitMQ服务)
1)APP-FDO-2主机168.192.11.24:
root 2011 0.0 0.0 66604 1236 ? Ss Feb05 0:00 /usr/sbin/sshd
root 5283 0.0 0.0 60504 1600 ? Ss 13:26 0:00 ssh -C -f -N -g -R *:3333:168.192.11.99:15672 hp@168.192.11.223
[root@APP-FDO-2 ~]# netstat -tanp |grep ssh
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 168.192.11.24:59455 168.192.11.223:22 ESTABLISHED 5283/ssh
tcp 0 0 168.192.11.24:35919 168.192.11.99:15672 ESTABLISHED 5283/ssh
tcp 0 0 168.192.11.24:22 168.192.11.99:32850 ESTABLISHED 12143/sshd
tcp 0 40 168.192.11.24:22 168.192.11.223:56969 ESTABLISHED 4641/sshd
2)RabbitMQ 主机 168.192.11.99:
wiseatc@wiseatc$ sudo ps -aux |grep ssh
root 25690 0.0 0.0 56600 3960 pts/25 S+ 2月07 0:00 sudo ssh 168.192.11.24
root 25692 0.0 0.0 49056 6412 pts/25 S+ 2月07 0:00 ssh 168.192.11.24
root 27948 0.0 0.0 94928 6980 ? Ss 10:04 0:00 sshd: wiseatc [priv]
wiseatc@wiseatc$ sudo netstat -antp |grep ssh
tcp 0 0 168.192.11.99:22 168.192.11.223:62672 ESTABLISHED 27948/sshd: wiseatc
tcp 0 0 168.192.11.99:32850 168.192.11.24:22 ESTABLISHED 25692/ssh
3)Win10主机168.192.11.223:
PS C:\WINDOWS\system32> netstat -ano -p tcp
协议 本地地址 外部地址 状态 PID
TCP 168.192.11.223:22 168.192.11.24:59455 ESTABLISHED 14268
TCP 168.192.11.223:56969 168.192.11.24:22 ESTABLISHED 14464
TCP 168.192.11.223:62672 168.192.11.99:22 ESTABLISHED 468
TCP 127.0.0.1:3333 0.0.0.0:0 LISTENING 6812
TCP 127.0.0.1:3333 127.0.0.1:51647 ESTABLISHED 6812
PS C:\WINDOWS\system32> tasklist | findstr 6812
sshd.exe 6812 Services 0 7,692 K
https://www.cnblogs.com/liujunjun/p/14212418.html
*当使用远程转发的命令时,并没有指定监听ServerA的外网IP,也没有使用"-g选项"开启网关功能,这是因为,即使你在命令中指定了IP地址,最终在ServerA中还是会 只监听127.0.0.1的 9906端口, 如果你一心想要通过别的主机访问ServerA的9906端口,也可以使用其他程序去反代ServerA的9906端口,还有,我在实际的使用过程中,如果使用远程转发穿透到内网,ssh隧道将会非常不稳定,隧道会莫名其妙的消失或者失效,特别是在没有固定IP的网络内,网上有些朋友提供了autossh的解决方案, 可以试一试。
在 139.196.99.48主机执行:mysql -h127.0.0.1 -P9906 可访问到内网的mysql。
示例:
vim /etc/ssh/sshd_config如果有GatewayPorts no改为GatewayPorts yes没有,添加即可(),然后重启sshd sudo service sshd restart
ssh -f -g -N -R 8081:127.0.0.1:80 dequan@192.168.13.149
测试:
curl -x 192.168.13.149:8081 127.0.0.1
4、SSH的动态转发
本地转发,远程转发,但是前提都是要求有一个固定的应用服务端的端口号。动态转发 选择了 7001 作为本地的端口号,其实在这里 SSH 是创建了一个 SOCKS 代理服务。可以直接使用 localhost:7001 来作为正常的 SOCKS 代理来使用,直接在浏览器或 MSN 上设置即可。在 SSH Client 端无法访问的网站现在也都可以正常浏览。
指定本地“动态”应用程序级端口转发。这是通过分配一个套接字来监听本地端的端口,可以选择绑定到指定的 bind_address。无论何时连接到此端口,都会通过安全通道转发连接,然后使用应用程序协议确定从远程计算机连接到何处。目前支持SOCKS4和SOCKS5协议,ssh将充当SOCKS服务器。只有root用户可以转发特权端口。动态端口转发也可以在配置文件中指定。IPv6地址可以通过将地址括在方括号中来指定。只有超级用户才能转发特权端口。默认情况下,根据GatewayPorts设置绑定本地端口。但是,可以使用显式绑定地址将连接绑定到特定地址。“localhost”的bind地址表示侦听端口只能绑定为本地使用,而空地址或“*”表示端口应该可以从所有接口使用。
对于SSH的本地转发和远程转发,都需要将本地端口和远程端口一一绑定,格式如下:
ssh -D [本地地址:]本地端口号 远程用户@远程地址
ssh -N -f -D 0.0.0.0:1080 123.123.123.123 # 将端口绑定在0.0.0.0上
端口绑定在0.0.0.0的接口上,方法是加上参数-b 0.0.0.0。同时还需要打开 SSH服务器端的一个选项-GatewayPorts。默认情况下它应当是被打开的。如果被关闭的话,可以在/etc /sshd_config中修改GatewayPorts no为GatewayPorts yes来打开它。
https://zhuanlan.zhihu.com/p/72988255( 127.0.0.1和0.0.0.0地址的区别 ) 比如实验室上网电脑,一个外放地址A,一个内网地址B,如果绑定的端口指定了0.0.0.0,那么通过内网地址或外网地址都可以访问应用 。
- *在服务器中, 0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。
- *在路由中,0.0.0.0表示的是默认路由,即当路由表中没有找到完全匹配的路由的时候所对应的路由。
5、X协议转发
我们日常工作当中,可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以 GUI 方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC 或者 X 窗口,让我们来看看后者。
使用 X 窗口通常需要分别安装:X Client 和 X Server 。在本例中我们的 X Client 就是所访问的远程 Linux/Unix/Solaris/HP,而我们的 X Server 则是发起访问的本地机器(例如你面前正在使用的笔记本或台式机)。把 X Client 端的 X 窗口显示在 X Server 端需要先行在 X Client 端指定 X Server 的位置,命令格式如下:
export DISPLAY=<
X
Server IP>:<
display
#>.<
virtual
#>
export DISPLAY=myDesktop:1.0 // 然后直接运行 X 应用即可,X 窗口就会自动在我们的本地端打开。
一切运行正常,但是,这时候 IT 部门突然在远程 Linux/Unix/Solaris/HP 前面加了一道防火墙。非常不幸的是,X 协议并不在允许通过的列表之内。怎么办?只能使用 VNC 了么?不,其实只要使用了 SSH 端口转发即可通过,同时也对 X 通讯数据做了加密,真是一举两得。
建立命令也很简单,直接从本地机器(X Server 端)发起一个如下的 SSH 连接即可:
$ ssh -X <
SSH
Server>
建立连接之后就可以直接运行远程的 X 应用。注意建立 X 转发之后会自动设置 DISPLAY 环境变量,通常会被设置成
localhost:10.0
,我们无需也不应该在连接之后再进行修改此环境变量。
一个比较常见的场景是,我们的本地机器是 Windows 操作系统,这时可以选择开源的 XMing 来作为我们的 XServer,而 SSH Client 则可以任意选择了,例如 PuTTY,Cygwin 均可以配置 访问 SSH 的同时建立 X 转发。
6、参考示例
1)有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 // 将本地机(客户机B)的6300端口转发到远端机器C的80端口
$ ssh -CfNg -R 80:127.0.0.1:6300 usera@A // 将远程主机(服务器A)的80端口转发到本地端机器B的6300端口
服务器A和服务器C之间, 利用 跳板服务器B建立了加密隧道. 在A上连接127.0.0.1:80, 就等同C上的80端口. 需要注意的是, 服务器B上的6300端口的数据没有加密, 可被监听, 例: # tcpdump -s 0-i lo port 6300
2) 情景:在家SSH连单位内网,但是内网使用NAT,所以没办法连回去。
3) 如何查看隧道是否建立完善, 查看进程:
ps aux | grep ssh
查看端口:
netstat -ntl sudo netstat -lnput | grep ssh
4)、
多主机转发应用,
本地转发命令中的
在 SSH Client(C) 执行下列命令来建立 SSH 连接以及端口转发:
1 |
$ ssh -g -L 7001::389 |
然后在我们的应用客户端(A)上配置连接机器(C )的 7001 端口即可。注意我们在命令中指定了“ -g ”参数以保证机器(A)能够使用机器(C)建立的本地端口转发。而另一个值得注意的地方是,在上述连接中,(A)<-> (C) 以及 (B)<->(D) 之间的连接并不是安全连接,它们之间没有经过 SSH 的加密及解密。
5)