我当前需求是:
1,我外网正式环境的mysql 3306端口不能被外部访问
2,我本地写的一个python脚本需要连接正式环境的mysql来导数据
3,我可以通过ssh连接远程mysql所在的服务器
所以的方案是通过SSH 隧道 把远程正式服务器的3306端口转发到我本机的127.0.0.1 的3306端口,我的脚本
只需要连接127.0.0.1 的3306 端口,ssh会自动把请求转发到远端服务器上mysql的3306端口上
ssh堆到命令如下:
ssh -i C:\sshfiles\ffff.pem -N -L 127.0.0.1:3306:127.0.0.1:3306 root@xxx.78.xxx.xxx
-L是本地转发,-L后面的127.0.0.1是本地机器的地址,3306端口是通过ssh在本地打的隧道端口
后面的地址和端口都是远程的
上面红色命令执行结果为:、
在本机 3306 连 → 流量被 SSH 送到 远端 127.0.0.1:3306(远程 MySQL)。
ssh -i C:\sshfiles\ffff.pem -N -R 127.0.0.1:3306:127.0.0.1:3306 root@xxx.78.xxx.xxx
只把-L 换成了-R 这变成了远程转发,-R后面的127.0.0.1 是远程ip地址,如果省略会变成在远程服务器打的隧道,会监听所有地址的3306端口(远程是即使省略的ip地址,只有端口号,也不一定会监听所有的ip地址,还和sshd_config 中的 GatewayPorts 是否为yes有关,默认都是no)
后面部分是本地的127.0.0.1 端口的3306 要被转发到远程服务器的部分。【-R会在远程服务器通过ssh映射端口,-L 会在本机映射端口】
这条命令结果是:
在 远端 127.0.0.1:3306 连 → 流量被 SSH 送回 本机 127.0.0.1:3306(本地 MySQL)
下面解释下 -N -f参数的用途!!!!!
<#
-f 会让 ssh 在认证成功后立即把自身放到后台(daemonize),
因此 PowerShell 退出并不影响它;进程已经交给操作系统继续运行。
-N 只是告诉 ssh 不执行远程命令,专心做端口转发。
所以窗口关闭后,ssh 仍在后台维持监听,这是预期行为。
-f 就是“后台守护”开关,窗口关了 ssh 也不会退出,用 Get-Process ssh 能找到它,想关就 Stop-Process -Name ssh 。
ssh -i C:\sshfiles\ffff.pem -N -L 3306:127.0.0.1:3306 root@xxx.78.xxx.xxx
上面这条命令省略了 本地地址,省略 bind 地址 → 默认 0.0.0.0:3306 全网卡监听;想只本地用,就显式写 127.0.0.1:3306
#>
ssh -i C:\sshfiles\ffff.pem -N -L 127.0.0.1:3306:127.0.0.1:3306 root@root@xxx.78.xxx.xxx
Write-Host "MySQL 隧道已后台启动,本地 3306 -> 远程 3306"
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!