SSH本地端口转发
A在防火墙外,A上面的一个应用,需要访问B服务器上的某个端口,比如12345端口,但是有防火墙挡住了;
不过,幸运的是,A可以对B发起SSH连接,我们可以建立一个SSH本地端口转发隧道;
在A上执行这个命令 ssh -N -L 54321:localhost:12345 username@B
这个命令建立了一条SSH本地端口转发的隧道,界面会提示你输入username登录B的密码,如果没有异常,界面就阻塞在那里了,这是正常的;
命令参数解析:-L表示是Local Port Forwarding,-N表示不要打开B服务器的shell,54321:localhost:12345 username@B
表示的含义是,在A电脑上访问A自己的12345号端口,就相当于通过B访问(B的)localhost的12345号端口;
然后,A上应用访问A的54321的数据,就会自动通过SSH的加密隧道发到B,然后B自动解密后,发给B自己的12345号端口。这样,A就实现了穿透防火墙到达B。
也许你不太喜欢A的SSH操作界面阻塞在那里了,我们可以这样:ssh -N -f -L 54321:localhost:12345 username@B
增加-f参数,让这个隧道进程在后台运行;
以上命令还默认的SSH连接B使用22号端口,如果不是默认ssh端口,还需要在最后使用-p参数;像这样:ssh -N -f -L 54321:localhost:12345 username@B -p ssh_port_of_B
如果A不是要访问B的端口,而是访问C呢?如下图:
A只能SSH到B,而B和C在一个局域网里面,A需要访问C的23456端口;
在A上创建本地端口转发,命令是 ssh -N -L 54321:ip_of_host_C:23456 username@B
这样,在A本地访问54321端口,就相当于通过B来访问C的23456号端口。
A穿透了防火墙,通过B访问C。命令行两个端口号中间的目的主机,是从B的视角来写的:访问B自己的某个端口,B看到的就是localhost,或127.0.0.1,访问C的时候,B看到的就是C的ip或域名!!
现在,我们在A上访问B和C,还有个问题,只能在A上使用localhost:54321来访问,能否让另一台能够连上A的电脑也访问呢?把A当成一个网关?答案是:可以的。
X与A在一个局域网,X不能ssh到B和C,只有A能ssh到B,B和C在另一个局域网;
现在,X想要访问C的33333端口;
我们可以在A上建立一条ssh本地端口转发的隧道,打通C的33333号端口,然后将这条隧道共享给X使用;
ssh -g -N -L 12345:ip_of_host_C:33333 username@B
多了一个-g参数(gateway),表示A把自己的12345端口作为网关;
这样,X通过访问ip_of_host_A:12345,就相当于在访问C的33333端口。