SSH端口转发实现内网穿透

SSH端口转发实现内网穿透

Scroll Down

ssh端口转发实现内网穿透

0、导

通过一台公网主机做跳板机,实现SSH穿透内网主机的目的

准备一台内网主机A、一台外网固定IP主机B

内网主机IP:192.168.1.31
转发端口:22

公网主机IP:公网主机IP
代理端口: 5678

1、操作

1.1 外网主机操作

外网主机需开启一个端口用作端口转发的代理端口(至少能通过防火墙),这里随便选择了 公网主机的5678端口

外网主机需开启端口转发,配置字段是 AllowTcpForwarding yes,默认该配置已生效。

vim /etc/ssh/sshd_config
GatewayPorts yes
AllowTcpForwarding yes
1.2 内网主机操作

内网主机A开启ssh隧道实现转发:

使用该命令建立一个A到B的连接,并在B上监听5678端口,将该端口收到的请求转发到A的22端口

# 使用 -i 选项指定公网主机的秘钥
ssh -fNR 5678:192.168.1.31:22 USER_NAME@公网主机B_IP -i 公网主机B_秘钥 -o ServerAliveInterval=30

# 没有使用秘钥的话,使用密码登录

-o 参数指定配置保活(这个非常关键)
-f 参数表示后台执行
-N 参数表示不执行远程命令

该命令只建立连接,不分配终端,进程后台执行,连接成功后终端控制权马上交给用户

1.3 SSH连接保活

建立的ssh连接断开,转发就失效了。为了让转发长时间有效,保证服务的可用性

什么是SSH链接保活?

为了避免长时间空闲导致ssh连接被断开,我们可以通过配置保活选项来定期发送心跳包保活。可以通过修改配置文件的方式,也可以在建立ssh链接时通过命令的-o选项指定。如:-o ServerAliveInterval=60,每60秒向ssh server发送心跳信号。

SSH连接保活的方法:

1.3.1 修改配置文件

① 修改SSH Server配置文件实现保活

# 修改ssh server主机的/etc/ssh/sshd_config配置文件
$ vim /etc/ssh/sshd_config
ClientAliveInterval 60	# SSH Server每隔60秒向SSH Client发送一次请求,然后SSH Client响应,从而保持连接
ClientAliveCountMax 40	# SSH Client超过40次无响应就断开链接

② 修改SSH Client主机的/etc/ssh/ssh_config配置文件

$ vim /etc/ssh/ssh_config
ServerAliveInterval 60 #client每隔60秒发送一次请求给server,然后server响应,从而保持连接。
ServerAliveCountMax 3  #client发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,server不会不响应。

还有一个TCPKeepAlive选项的作用是类似的,但是不如ServerAliveInterval好,因为TCPKeepAlive在TCP层工作,发送空的TCP ACK packet,有可能会被防火墙丢弃而ServerAliveInterval 在SSH层工作,发送真正的数据包,更可靠

以上两种方法,任选一种即可。修改配置文件后记得重启服务。

1.3.2 命令行参数指定
# -o参数指定配置保活

# 在建立链接的命令参数里通过-o ServerAliveInterval=60保活, 这样只会在当前建立的连接中保持持久连接, 其他链接不受影响。
# 毕竟不是所有连接都要保持持久的

# 例如
$ ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 root@IP地址

1、SSH GatewayPorts参数说明
2、SSH端口转发和连接保活