SSH反向代理配置教程

注:本篇文章不讲原理,只说实现,具体原理自己Google吧!

功能说明

(1)假设我有一台内网(或者说处于内部局域网)的服务器 A,其内网 IP 为 192.168.1.2,但由于没有公网 IP,因此我们无法直接从外网连接这个服务器。

(2)不过服务器 A 能访问外网,假设我们有台外网服务器 B,其公网 IP 为 222.197.219.26。那么我们就可以在服务器 A 上做到服务器 B 的反向代理,然后我们便能通过服务器 B 来连接服务器 A。

注意:即使服务器 A 不能访问外网,但只要服务器 A 能访问服务器 B,且外网也能访问服务器 B,那么同样可以实现从外网借由 B 访问服务器 A。

登录服务器 A 执行如下命令,实现连接到服务器 B 开启反向端口代理。

ssh -fCNR :20010:localhost:22 root@222.197.219.26

其中 22 为 A 的本地端口,20010 为 B 的监听端口(执行后会要求输入服务器 B 的密码),root为B服务器的用户。

回到服务器 B 执行如下命令可以看到这个监听:

netstat -anp | grep 20010

连接测试:

ssh -p 20010 root@222.197.219.26

docker容器内也适用这个方法

参数说明

ssh参数

# 反向代理  
ssh -fCNR

正向代理  
ssh -fCNL

-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口

踩坑说明

从外部还是连不能从B连上A,但是可以直接从B连上A

在上面执行到最后的时候发现连不上,可能是地址调用回环了:

ssh: connect to host 222.197.219.26 port 20010: No route to host

但是当我们进入B服务内,直接对本地的20010端口使用ssh连接,发现居然连上了。

ssh root@127.0.0.1 -p 20010

解决方式:

再使用nginx代理一遍,nginx 配置文件添加如下, 和http同级

	stream { 
		upstream 20010_ssh {
			hash $remote_addr consistent;"
			server 127.0.0.1:20010; # 这里被反代的地址和端口 
		} 
		server { 
			listen 20001;
			proxy_pass 20010_ssh; 
			proxy_connect_timeout 1h; 
			proxy_timeout 1h; 
		} 
	}

这样就可以通过20001端口去连接服务器A了

ssh -p 20001 root@222.197.219.26

其实如果有一个服务器C,他同时能被外网访问也能访问到服务器A,就直接可以用nginx代理了。但是那样简单的多。下面做个补充:

	stream { 
		upstream 2_ssh {
			hash $remote_addr consistent;
			server 192.168.1.2:22; # 这里A服务器的地址,对应A的端口 
		} 
		server { 
			listen 20011; #外层通信需要的tcp端口 
			proxy_pass 2_ssh; 
			proxy_connect_timeout 1h; 
			proxy_timeout 1h; 
		} 
	}

这样就可以通过222.197.219.26的20011端口去连接192.168.1.2的ssh服务了。

解决方式2

上面的解决办法是在正向代理一遍,当然也可以直接使用ssh的正向代理:

ssh -fCNL *:20001:localhost:20010 jay@localhost

ssh -fCNL [A机器IP或省略]:[A机器端口]:[B机器的IP]:[B机器端口] [登陆B机器的用户名@B机器的IP]

解决方式3

在使用SSH反向代理的时候,可以从公网ssh localhost连接到内网(即需要先ssh连接到B服务器,然后在B服务器中ssh连接到A服务器)。这样做需要先登录到公网服务器,因此对于只想要给其他人提供一个跳板的人来说,不希望别人能登录自己的服务器。所以就需要在反向代理的时候,将绑定的端口开放到公网,而非127.0.0.1。所以需要在B服务器中的sshd_config中设置GatewayPorts为yes。

修改/etc/ssh/sshd_config

GatewayPorts yes

修改后记得手动重启ssh服务service sshd restart

GatewayPorts
是否允许远程主机连接本地的转发端口。默认值是"no"。
sshd(8) 默认将远程端口转发绑定到loopback地址。这样将阻止其它远程主机连接到转发端口。
GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。
"no"表示仅允许本地连接,"yes"表示强制将远程端口转发绑定到统配地址(wildcard address),

SSH在一定时间没有任何的操作后就会自动的断开

解决方式1

修改/etc/ssh/sshd_config

ClientAliveInterval 60
ClientAliveCountMax 3

找到 ClientAliveInterval 0和ClientAliveCountMax 3并将注释符号(”#”)去掉, 将ClientAliveInterval对应的0改成60,ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0,不发送. ClientAliveInterval 60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了. ClientAliveCountMax, 使用默认值3即可.ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开. 这样的配置就能让一个SSH的配置保持长连接了,代理就能稳定的在线。

ClientAliveCountMax
sshd(8) 在未收到任何客户端回应前最多允许发送多少个"alive"消息。默认值是 3 。
到达这个上限后,sshd(8) 将强制断开连接、关闭会话。
需要注意的是,"alive"消息与 TCPKeepAlive 有很大差异。
"alive"消息是通过加密连接发送的,因此不会被欺骗;而 TCPKeepAlive 却是可以被欺骗的。
如果 ClientAliveInterval 被设为 15 并且将 ClientAliveCountMax 保持为默认值,
那么无应答的客户端大约会在45秒后被强制断开。这个指令仅可以用于SSH-2协议。

ClientAliveInterval
设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,
sshd(8) 将通过安全通道向客户端发送一个"alive"消息,并等候应答。
默认值 0 表示不发送"alive"消息。这个选项仅对SSH-2有效。

解决方式2

使用autossh自动监听,请确保你已经安装autossh(自行Google),然后重新执行反向代理,需要先ps -aux 查看之前反代的进程然后kill pid 掉 :

autossh -M 7000 -fCNR :20014:localhost:22 root@222.197.219.26

补充免密登录

ssh每次重连都需要键入密码,故在此首先设置免密码登陆到内网

在A服务器上执行 ssh-copy-id 外网用户名@外网IP

ssh-copy-id root@222.197.219.26

在Oracle数据库管理中,使用本地SSH反向代理来监听Oracle数据库是一种常见的技术手段,特别适用于需要远程访问数据库但又受到网络限制的情况。以下是具体的步骤和原理: ### 步骤: 1. **配置Oracle监听器**: - 确保Oracle数据库的监听器配置正确,并且能够在本机(本地)上正常访问。 - 编辑`listener.ora`文件,确保监听器配置如下: ```plaintext LISTENER = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ``` 2. **建立SSH反向隧道**: - 在本地机器上使用SSH命令建立反向隧道,将本地的Oracle监听端口(通常是1521)映射到远程服务器的某个端口(例如,远程服务器的1522端口)。 - 命令如下: ```bash ssh -N -f -L 1522:localhost:1521 user@remote_server ``` 其中,`user@remote_server`是远程服务器的用户名和地址。 3. **配置远程服务器**: - 在远程服务器上,确保防火墙允许通过1522端口进行访问。 - 编辑远程服务器上的`tnsnames.ora`文件,添加一个新的网络服务名,指向本地的1522端口: ```plaintext ORCL_REMOTE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ``` 4. **测试连接**: - 使用Oracle客户端工具(如SQL*Plus)连接到远程服务器的1522端口,验证是否能够成功访问Oracle数据库。 - 命令如下: ```bash sqlplus username/password@ORCL_REMOTE ``` ### 原理: 通过SSH反向隧道,本地的Oracle监听端口被映射到远程服务器的某个端口。这样,远程服务器上的Oracle客户端可以通过本地端口访问到实际的Oracle数据库。整个过程通过SSH加密传输,确保了数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值