SSH端口转发的妙用

作者: 刘小白DOER | 来源:发表于2021-04-08 22:15 被阅读0次

        因为公司的外网安装有行为管理器,但是行为管理器的证书又无法在linux上验证,导致笔者的linux以及linux虚拟机无法连接外网。于是乎,笔者就来使用SSH端口转发来解决。SSH能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务,也被叫做"隧道"(tunneling)。

        笔者以前在公司打开虚拟机都是使用"仅主机(Host-Only)网络",只能宿主机访问虚拟机,虚拟机无法与外部网络通信,更别说上网了。今天突然发现网络地址转换可以实现上网功能,以前只知道NAT只能单向访问,虚拟机可以通过网络访问到其他主机,但没有测试过可以上网。关于几个visualbox的网络设置,请参考笔者的文章-Docker应用:容器间通信与Mariadb数据库主从复制。上网功能实现,但是虚拟机并不真实存在于网络中,主机与网络中的任何机器都不能查看和访问到虚拟机的存在,宿主机无法访问虚拟机,使用便利性会大打折扣。SSH端口转发可以解决这个问题,笔者配置完后感觉SSH端口转发真的很神奇!

        那就来设置visualbox虚拟机通过NAT上网,并且设置端口转发来远程访问,两全其美。

        1、虚拟机连接方式:网络地址转换Network Address Translation。

        2、端口转发(F),实现宿主机访问虚拟机功能。

        3、端口转发规则,笔者将虚拟机的呃2端口转发到宿主机的2222端口。

        4、windows上SSH远程虚拟机。

        ssh -p 2222 myubuntu@mywsl 

        ssh -p 2222 myubuntu@192.168.15.253

        需要注意的是ssh需要指定宿主机端口号2222,myubuntu为虚拟机的用户名,mywsl为宿主机windows的主机名,或者可以写成IP地址192.168.15.253。所以,用户名和IP地址不是同一个电脑的用户名和IP地址。笔者发现端口转发时连接认证比不转发时要慢很多,但是连接上后就正常了。

        我们再来看看SSH端口转发模式。

        SSH有三种端口转发模式,即本地端口转发Local Port Forwarding,远程端口转发Remote Port Forwarding以及动态端口转发Dynamic Port Forwarding 。

        关于/etc/ssh/sshd_config配置文件中,需要开启相关参数,AllowTcpForwarding是允许端口转发,AllowAgentForwarding允许进行代理转发,GatewayPorts允许远程主机连接本地的转发端口。

    #AllowAgentForwarding yes

    #AllowTcpForwarding yes

    #GatewayPorts no

    1、本地端口转发Local Port Forwarding

      格式:ssh  -L localport:remotehost:remotehostport sshserver

      本地端口转发, 将发送到本地端口的请求,转发到目标端口,可以通过访问本地端口,来访问目标端口的服务。

        看看笔者的测试,ssh -L localhost:8111:localhost:80 -fN administrator@192.168.15.253,将本地81111端口的请求转发到192.168.15.253的目标端口80,即使http的端口。使用curl localhost:8111/test.html请求本地端口,就可以查看目标192.168.15.253上www目录下的test.html文件内容,就像本地有apache服务一样。

        注意有几个选项:-f 后台启用;-N 不打开远程shell; -g 启用网关功能。

      ps -ef查看进程,杀死端口转发进程,可以发现转发失败。

        如果需要一直端口转发的话,就需要写个脚本加入到开机启动中,脚本内容为:nohup ssh -L localhost:8111:localhost:80 -fN administrator@192.168.15.253 >/dev/null 2>&1  ,同时需要配置免密或者使用expect工具来实现自动化交互,这个就不具体阐述了,笔者以前的文章有service或systemctl设置开机启动,配置免密或使用expect工具的文章。为了方便,一个小脚本直接至于rc.local里面应该可以了。

    2、远程端口转发Remote Port Forwarding

      格式:ssh -R sshserverport:remotehost:remotehostport sshserver

        远程端口转发,也叫反向端口转发,就是将发送到远程端口的请求,转发到目标端口。这样,就可以通过访问远程端口,来访问目标端口的服务。

        笔者使用docker来测试,将mariadb数据库的3306端口映射到虚拟机3306端口。ssh远端端口转发则将远端3000端口转发到本地3306端口,那么在远端的win10上就可以使用端口3000来访问mariadb数据库。

      在win10(192.168.15.253)上使用mysql -hlocalhost -uroot -p123456 -P3000来连接数据库成功。,就像访问本地mariadb数据库一样。

    3、动态端口转发Dynamic Port Forwarding

          格式:ssh -D localhost:localport  sshserver

          动态端口转发,可以将在本地主机发起的请求,转发到远程主机,而由远程主机去真正地发起请求。对于本地端口转发和远程端口转发,都存在两个一一对应的端口,动态端口转发的目标地址:目标端口是由发起的请求决定的。

        动态端口转发:ssh -D localhost:2000 -fN administrator@192.168.15.253

        在本地发起的请求,需要由Socket代理,将发起的请求都会转发到2000端口。然后在windows10 设置 socks 代理,可以在设置代理里面设置,也可以在浏览器里面设置。

      IE浏览器设置socks 代理:

        win10系统设置 socks 代理:

          在这里条件不具备,笔者就不测试动态端口转发了。

          最后总结一下这三种端口转发模式的应用场景。

    1、本地端口转发。作为跳板机或者堡垒机来完成数据包的转发。

    2、远程端口转发。上面设置visualbox虚拟机通过NAT上网,并且设置端口转发来远程访问,即使虚拟机没有公网IP地址,那么需要远程端口转发来访问本地主机。

    3、动态端口转发。笔者的公司网络的linux系统无法认证,那么可以通过动态端口转发,转发到使用其他可以访问外网的电脑。

        囿于笔者水平有限,应用场景不足之处敬请指出。

    相关文章

      网友评论

        本文标题:SSH端口转发的妙用

        本文链接:https://www.haomeiwen.com/subject/uoxukltx.html