最近有个工作上的需求,需要把远程主机上的一个端口映射到本地主机上,比如将1.1.1.1:1234
映射到本地机器上的127.0.0.1:2234
上来,实现访问127.0.0.1:2234
和直接访问1.1.1.1:1234
一样的效果。
(图源 :pixabay)
为了达成这个目的,我的大脑是高速运转啊,都有什么方法能实现这个功能呢?
以前在Linux下实现类似的功能,我一般可以选择用SSH转发
、iptables转发
或者Nginx代理转发
等方式来实现。
不过Windows下似乎没有iptables;Nginx代理转发需要安装Nginx软件且不说,是不是只支持http\https流量;那么貌似只有SSH转发可选了?
使用SSH转发
既然暂时没啥可选的,那就试试SSH转发喽,先来回顾一下SSH转发的三种类型:
- 动态转发:
-D [bind_address:]port
- 本地转发:
-L [bind_address:]port:host:hostport
- 远程转发:
-R [bind_address:]port:host:hostport
对比一下我们的需求,貌似本地转发是我们所需要的。
不过虽然指令看起来很简单,但是由于好久没用过,已经很是生疏,所以还是费了一番力气之后才搞定它。
为了便于演示,我将演示如何将本地127.0.0.1:23
和一台远程服务器的上SSH端口(假设是1.1.1.1:1234,实际IP和端口隐掉啦)建立映射,并测试映射后的效果。
根据我们的需求,最基本的指令如下:
plink.exe -L 127.0.0.1:23:1.1.1.1:1234 [email protected] -P 1234
对上述指令的简单解释如下:
127.0.0.1:23
是我们要访问的端口1.1.1.1:1234
是远程服务器的目标地址和端口[email protected]
是使用用户user
登录到远程服务器1.1.1.1
-P 1234
远程服务器SSH服务使用1234
端口(而不是默认的22
端口)
执行上述指令,会弹出SSH窗口并提示我们输入密码,然后回车启动会话,这时端口映射就建立起来了。
好了,现在我们来测试一下:
看熟悉的登录界面出来了,我们登录上去后,发现确实也是目标主机:
所以,上述使用SSH本地转发,将本地端口映射到目标端口的操作是可行的呢。
而且上述操作,不限于SSH端口,对远程服务器上的任何端口和服务都是适用的,完全可以满足我们的需求。我们还可以加入-C启用压缩
以及-N 不执行远程指令
等参数来优化设置,这里就不再赘述了。
使用netsh
转发
虽然SSH本地转发能达成我们的目标,但是依然有几个问题。
第一需要使用plink软件(之后又测试了一下,在对指令稍作修改后,windows 10之后自带的ssh就可以完美满足需求)。
如果说第一个还可以避免掉,第二问题就有些不能忍受了,就是我们需要登录远程服务器才能建立起来这个映射,而实际上我们并不需要登录就可以访问远程服务器上的端口,那么这个登录操作就有些多余(且不安全)。
所以,windows下有没有不需要使用额外软件,且不需要登录远程服务器,就实现相应的映射功能呢?
答案是有的,那就是使用netsh 设置转发
。
首先,以管理员方式运行命令行窗口:
然后使用如下指令添加转发:
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=23 connectaddress=1.1.1.1 connectport=1234
使用如下指令查看转发:
netsh interface portproxy show all
使用如下指令删除转发:
netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=23
看,刚才新增的被我们删除啦。
至于使用netsh
设置的映射是否好用?那当然是非常好用啦,O哥也逐一测试过,不过测试方法和上边的相同,所以就不再赘述啦。
总结
我们可以使用SSH转发或者netsh转发来将远程端口映射到本地,想必之下使用netsh无需额外安装(或下载)软件,也无需登录远程服务器,感觉更加方便。
你学废了吗?
反正经过我一番努力之后,成功实现了远程端口到本地的映射,但是我的工作却遇到了新问题,非映射所能解决,我是彻底废了,呜呜呜。
👍👍
感谢O哥的分享,字和数字我都认识,但具体学没学废,这个不太确定呢。
我有验证办法
你让O哥给你做一个你的本地映射,在你电脑上输入:8.8.8.8:888,就能直接访问O哥的比特币账户,就像O哥本人在操作一样
哈哈哈
这些都是伟大的发明,是让头脑保持忙碌的更好方法,也是让系统变得更好的方法
我工作时也是天天都在用SSH转发,偶尔也会遇到另一个问题,那就是SSH连接可能会断掉,然后就需要手动重连……
netsh看起来挺方便的,不过我这里十多个伺服器总共百多个需要根据情况映射的远程端口,转发脚本一个一个改感觉会吐血呢。哈哈。
可以写成bat,执行一下就全部搞定
目前就是用着十多个.sh的脚本……一个环境一个,哈哈哈。
挺好玩的
可惜我不会
要不我也整个玩玩