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.youkuaiyun.com/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转发数据到:80
LocalForward localhost:10421 ${EdgeNodeSSHserverIP}:8000
下图示范用WindTerm做本地转发

测试服务可达性
# 这条命令相当于使用 ${ssh_host} 去访问https://${EdgeNodeSSHserverIP}:8000
## -x socks5h://localhost:10421: 使用 SOCKS5 代理。socks5h 表示通过 SOCKS5 代理进行主机名解析,localhost:30001 是代理服务器的地址。
## -v: 启用详细模式,显示请求和响应的详细信息。
## -k: 跳过 SSL 证书验证。这在访问 HTTPS 服务器时很有用,即使证书无效也会继续请求。
## -X GET: 指定 HTTP 请求方法为 GET。
curl -x socks5h://localhost:10421 -v -k -X GET https://${EdgeNodeSSHserverIP}:8000
将远程端口映射为本地端口上–L
https://www.ronpad.com/docs/ssh/port-forwarding-3.html
-L 参数:将本地主机端口通过ssh-host主机端口转发到目标主机端口上去。
效果:通过本地主机端口可以访问到目标ssh主机上的指定端口。
-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_client机执行转发的,而是在ssh-server机执行转发的。
远程转发的作用:将ssh-host主机端口通过本地主机转发到目标主机上。本机的作用象一个转发器,本地无暴露端口。
效果:通过ssh-host1主机端口可以访问到目标主机的端口。
远程转发用的很少,不如直接在ssh-host1上安装个转发工具好用。
Host ssh_server_1
user root
Hostname ${ssh_server_1_ip}
Port 2222
# 私钥文件
identityfile ~/.ssh/id_rsa_mysql
RemoteForward ${ssh_server_1_ip}:3306 ${mysql-server_ip}:3306
然后,通过${ssh_server_1_ip}:3306,就可以访问到${mysql-server_ip}:3306
将远程端口映射到目标主机上–R
https://www.ronpad.com/docs/ssh/port-forwarding-4.html
-R 参数:将ssh_server主机上的机指定端口通过本地主机转发到目标主机上。
-R模式:本地机器的作用象一个转发器,本地无暴露端口。
效果:通过访问ssh_server主机上的机指定端口可以访问到目标主机端口。

-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主机端口`通过`host1主机端口`转发到`目标主机`上
## -g: 允许代理服务器连接到本地转发端口(谨慎使用)
autossh -M 5678:5679 -f -CNT -R ${ssh_server_ip}:1080:host2:1081 ssh-host

2580

被折叠的 条评论
为什么被折叠?



