ssh远程转发
SSH端口转发-远程转发
问题描述
- 假设有四台主机分别为
remote-gate : 127.0.1.1  # 远程的ssh服务器, 有个用户rg
remote-box  : 127.0.1.2  # 远程的某个应用, 
local-gate  : 127.0.0.1  # 远程的ssh服务器, 有个用户lg
local-app   : 127.0.0.2  # 远程的某台pc机器- local-app上有个服务在9494端口上提供服务
#!/usr/bin/perl
use Zeta::POE::HTTPD;
use POE;
Zeta::POE::HTTPD->spawn( 
    ip       => '127.0.02',
    port     => 9494, 
    callback => sub { 'hello world'; },
);
$poe_kernel->run();
exit 0;- 现在remote-box这台机器要访问local-app上的9494这个服务
解决方案
- 在local-gate上执行
ssh -CfNg -R 5555:local-app:9494 rg@remote-gate
# 解释
# 1. 将使得remote-gate上启一个后台进程在5555端口listen
# 2. 当remote-box访问remote-gate:5555时, local-gate将访问local-app:9494
# 3. 看起来好像是remote-box直接访问local-app一样- 
    图示  
- 
    例子 
# 在local-app上启动9494服务
./svc.pl '127.0.0.2' 9494
# 在local-gate(127.0.0.1)上建立本地转发隧道
ssh -CfNg -R 5555:127.0.0.2:9494 zhouchao@127.0.1.1
# 在remote-box发起到127.0.1.1:5555访问
GET 'http://127.0.1.1:5555/'- 
    注意, 需在ssh主机上/etc/ssh/sshd_config中增加GatewayPorts yes, 使得服务能暴露在公共IP上 
- 
    ssh隧道往往不稳定, 需要增加参数: -o TCPKeepAlive=yes