ssh端口转发

前置条件:调整sshd服务端配置

SSH 仅支持TCP端口映射!
调整/etc/ssh/sshd_config配置,让ssh转发效率更好。

# 查看sshd_config的以下配置是否启用
# 查看TCPKeepAlive|AllowTCPForwarding|PermitOpen|GatewayPorts的配置
grep -Ei 'TCPKeepAlive|AllowTCPForwarding|PermitOpen|PermitTunnel|GatewayPorts' /etc/ssh/sshd_config

# Linux默认是不会启用这些配置的

在这里插入图片描述


开启AllowTcpForwarding和GatewayPorts

ssh-host机器的sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败

如要绑定0.0.0.0需要打开sshd_config里的GatewayPorts选项,否则只能绑定到 127.0.0.1 .

# 确保前4个参数配置正确
# 允许TCP转发
AllowTCPForwarding yes

# 允许sshd将远程端口转发绑定到非loopback地址
GatewayPorts yes

# PermitOpen 参数来限制允许转发到哪些目标地址和端口
# PermitOpen host:port,host1:port1
# 重点配置,允许转发所有
PermitOpen any

# 允许通过SSH连接隧道
## yes:允许任何类型的隧道。
## point-to-point:只允许建立点对点(Point-to-Point,简称 P2P)隧道。
## ethernet:只允许建立以太网(Ethernet)隧道。
## no:不允许建立任何类型的隧道。
PermitTunnel yes

# TCP保活
TCPKeepAlive yes

在这里插入图片描述


内核参数优化

https://blog.csdn.net/omaidb/article/details/122719243


调整ssh客户端配置~/.ssh/config必须

参考:https://www.nixcraft.com/t/channel-1-open-failed-administratively-prohibited-open-failed-with-ssh-tunneling/3773/2
参考: https://blog.tizen.moe/entry/2019/10/12/000000

解决的问题:
sshd服务端机器上会一直提示open failed: connect failed: Connection timed out;
channel 11: open failed: administratively prohibited: open failed

# 配置ssh客户端配置
vim ~/.ssh/config

# 将日志级别设置为: QUIET
LogLevel QUIET

在这里插入图片描述


Autossh建立稳定隧道

项目地址:https://www.harding.motd.ca/autossh/
https://www.51cto.com/article/661059.html

使用autossh命令的优点是后台运行,ssh连接中断后会自动恢复ssh隧道。


安装AutoSSH

Clientsshd的机器要配置ssh免密

# Centos7安装 AutoSSH
yum install -y autossh

# macos安装AutoSSH
brew install autossh

# 查看autossh版本
autossh -V

在这里插入图片描述
在这里插入图片描述


AutoSSH常用参数解释

官方文档:https://www.harding.motd.ca/autossh/README.txt

https://www.escapelife.site/posts/e6647650.html

https://www.yuque.com/listenstar/ygqknt/go0939

AutoSSH只有三个自己的参数:

参数解释
-M-M port[:echo_port] ;指定要使用的监控端口和echo的端口,用于自动重连
-f使autossh在运行ssh之前进入后台。和ssh的-f冲突,使用此参数需要先配置好公钥登录
-V查看版本号
其余参数其余参数使用的是ssh参数

SSH常用参数

https://segmentfault.com/a/1190000021888536
https://www.linuxcool.com/ssh
https://wangchujiang.com/linux-command/c/ssh.html

参数含义说明
-1强制使用ssh协议版本1
-2强制使用ssh协议版本2
-4强制使用IPv4地址
-6强制使用IPv6地址
-A开启认证代理连接转发功能
-a关闭认证代理连接转发功能
-b使用本机指定地址作为对应连接的源ip地址
-C请求压缩所有数据
-c选择所加密的密码型式 (blowfish
-e设定跳脱字符
-F指定ssh指令的配置文件
-f后台运行ssh
-g允许远程主机连接主机的转发端口
-i指定密钥对身份文件(预设是在使用者的家目录 中的 .ssh/identity)
-l指定连接远程服务器登录用户名
-N不执行远程指令
-n重定向stdin 到 /dev/null;(要配合 -f 参数使用)
-o指定配置选项
-p指定远程服务器上的端口(默认22)
-P使用非特定的 port 去对外联机(注意这个选项会关掉 RhostsAuthenticationRhostsRSAAuthentication
-q安静模式运行;忽略提示和错误
-T不占用shell终端,禁止分配pseudo-tty(伪终端)
-t强制配置pseudo-tty(伪终端)
-v打印更详细信息
-X开启X11转发功能
-x关闭X11转发功能
-y开启信任X11转发功能
-Llisten-port:host:port
指派本地的 port 转发到服务器上的 port;
建立本地SSH隧道(本地客户端建立监听端口);
将本地机(客户机)的某个端口转发到远端指定机器的指定端口.
-Rlisten-port:host:port
远程机器上的 port 转发到指定IP的port;
建立远程SSH隧道(隧道服务端建立监听端口);
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口.
-Dport 指定一个本地机器 “动态的’’ 应用程序端口转发.


3种转发方式的区别

https://jeremyxu2010.github.io/2018/12/ssh的三种端口转发/

# 综合示例:转发多个端口
Host vm
	User root
	# User bai
	Hostname 181.220.x.x
	# 将vm中的127.0.0.1:1081转发到localhost的30081
	LocalForward localhost:30081 127.0.0.1:1081
	# 本地开放一个30082端口
	DynamicForward 127.0.0.1:30082

动态端口转发

https://www.ronpad.com/docs/ssh/port-forwarding-2.html


命令行动态端口转发

# 转发socks5到本地端口13459
ssh -D 10421 -N -f -C -q username@hostip
# ssh -D 127.0.0.1:10421 -N -f -C -q username@hostip
## -D socket5代理,动态端口转发
## -N 不执行远程脚本或命令,,用于端口转发,通常与-f连用。
## -f 输入密码后进入后台模式,后台认证用户/密码,通常和-N连用,不用登录到远程主机。
## -C 使用数据压缩,网速快时会影响速度
## -q :安静模式,不输出 错误/警告 信息

# 其他参数
## -L tcp转发,本地端口:目标IP:目标端口
## -g :在-L/-R/-D参数中,允许远程主机连到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
## -R : 远程端口转发
## -T :不分配 TTY 只做代理用

# 关闭提示 -o
ssh -o 'GatewayPorts yes' -D 0.0.0.0:13659  -N -C -f -q root@localhost

关闭错误提示,参考地址 https://qastack.cn/server/480208/strange-output-on-ssh-tunneling-output-failed-connect-failed-connection-timed


ssh_config动态端口转发

参考文档: 动态转发开发文档

Host ssh-host
	user admin
	Hostname 114.114.114.114
	Port 2222
	# 私钥文件
	identityfile ~/.ssh/id_rsa_dns
	# 为本地暴露一个socks端口10421 
	# DynamicForward localhost-ip:local-port 
	DynamicForward 127.0.0.1:10421

在本地暴露一个ssh的动态端口–D

https://www.ronpad.com/docs/ssh/port-forwarding-2.html

-D [本地主机:]本地主机端口

# 开启一个本地socks端口
## -M 监控端口:[echo端口],请在服务器上将 监控端口 和 监控端口+1 开放
## -f 使autossh在运行ssh之前进入后台。

# ssh参数
## -C 使用数据压缩
## -N 只连接远程主机,不打开远程shell(不需执行指令,只作端口转发)
## -T: 不分配伪终端 tty

# 转发命令
## -D 本地暴露一个socks5
## -g: 允许代理服务器连接到本地转发端口(谨慎使用)
# autossh -M 5678:5679 -f -CNT -D localhost:1080 hk
autossh -M 5678:5679 -f -CNT -D localhost:1080 ssh-host

本地转发

https://www.ronpad.com/docs/ssh/port-forwarding-3.html

Host ssh-host
	user admin
	Hostname 114.114.114.114
	Port 2222
	# 私钥文件
	identityfile ~/.ssh/id_rsa_dns
	# LocalForward [bind_address:]port remotehost:hostport
	# LocalForward client-IP:client-port server-IP:server-port
	# 将baidu.com:80端口转发到本地80端口
	## 访问localhost:80会通过sshd转发数据到baidu.com:80
	LocalForward localhost:80 baidu.com:80

将远程端口映射为本地端口上–L

https://www.ronpad.com/docs/ssh/port-forwarding-3.html
-L 参数:将本地主机端口通过ssh-host主机端口转发到目标主机端口上去。
效果:通过本地主机端口可以访问到目标主机端口
在这里插入图片描述
-L [本地主机:]本地主机端口:目标主机:目标主机端口

# 将本地端口映射到远程主机上
## -M 监控端口:[echo端口],请在服务器上将 监控端口 和 监控端口+1 开放
## -f 使autossh在运行ssh之前进入后台。

# ssh参数
## -C 使用数据压缩
## -N 只连接远程主机,不打开远程shell(不需执行指令,只作端口转发)
## -T: 不分配伪终端 tty

# 转发命令
## -L 将`本地主机端口`通过`ssh-host主机端口`转发到`目标主机端口`上
## -g: 允许代理服务器连接到本地转发端口(谨慎使用)
autossh -M 5678:5679 -f -CNT -L localhost:3306:mysql:3306 ssh-host

远程转发

https://www.ronpad.com/docs/ssh/port-forwarding-4.html

!!!注意,本配置不是在本机执行的,而是在ssh-host机执行的。

远程转发作用:将ssh-host主机端口通过本地主机端口转发到目标主机上。本机的作用象一个转发器,本地暴露端口。

效果:通过ssh-host1主机端口可以访问到目标主机的端口

远程转发用的很少,不如直接在ssh-host1上安装个转发工具好用。

Host ssh-host1
	user root
	Hostname 1.2.3.4
	Port 2222
	# 私钥文件
	identityfile ~/.ssh/id_rsa_mysql
	RemoteForward 0.0.0.0:3306 mysql-ip:3306

将远程端口映射到目标主机上–R

https://www.ronpad.com/docs/ssh/port-forwarding-4.html
-R 参数:将ssh-host主机端口通过本地主机端口转发到目标主机上。
-R模式:本地机器的作用象一个转发器,本地暴露端口。
效果:通过ssh-host主机端口可以访问到目标主机端口
在这里插入图片描述
-R ssh-host主机端口:目标主机:目标主机端口

ssh-host机器的sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败
如要绑定0.0.0.0需要打开sshd_config里的GatewayPorts选项。

# 开启一个本地socks端口
## -M 监控端口:[echo端口],请在服务器上将 监控端口 和 监控端口+1 开放
## -f 后台运行autossh

# ssh参数
## -C 使用数据压缩
## -N 只连接远程主机,不打开远程shell(不需执行指令,只作端口转发)
## -T: 不分配伪终端 tty

# 转发命令
## -R 将`ssh-host主机端口`通过`本地主机端口`转发到`目标主机`上
## -g: 允许代理服务器连接到本地转发端口(谨慎使用)
autossh -M 5678:5679 -f -CNT -R 0.0.0.0:1080:host2:1081 ssh-host
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值