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
Client
到sshd
的机器要配置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 去对外联机(注意这个选项会关掉 RhostsAuthentication 和 RhostsRSAAuthentication ) |
-q | 安静模式运行;忽略提示和错误 |
-T | 不占用shell终端,禁止分配pseudo-tty (伪终端) |
-t | 强制配置pseudo-tty (伪终端) |
-v | 打印更详细信息 |
-X | 开启X11转发功能 |
-x | 关闭X11转发功能 |
-y | 开启信任X11转发功能 |
-L | listen-port:host:port 指派 本地 的 port 转发到服务器 上的 port;建立本地SSH隧道(本地客户端建立监听端口); 将本地机(客户机)的某个端口转发到远端指定机器的指定端口. |
-R | listen-port:host:port 将 远程机器 上的 port 转发到指定IP 的port;建立远程SSH隧道(隧道服务端建立监听端口); 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. |
-D | port 指定一个本地机器 “动态的’’ 应用程序端口转发. |
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
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