SSH隧道访问内网服务

不想你离开。 提交于 2020-02-29 12:44:34

适用场景描述:我有一台外网服务器a,1台内网服务器b,我想让别人在外网访问b上的网站。b跟a不在同一个局域网。b没有公网ip地址a有


解决方案1:通过花生壳实现

我的解决方案:

    两台机器都是linux系统通过ssh,b可以访问a,a不可以访问b。由b到a建立ssh隧道。
    b上的本地端口是80,a上的隧道监听入口是20001.这样在a上访问端口20001就跟直接访问b上的80端口的结果一致。
    此时由于隧道是监听在本地的端口上的。从外网访问不到a上的20001. 我们在a上现在启动一个端口转发程序rinetd  。让访问a上20002端口的数据全部转发给a上的20001,a上的20002是监听在任意ip地址的,所以通过外网可以访问a上的20002端口
    这样就实现了通过a的20002端口访问内网b上的80端口,只要隧道保持不断,b就像真的拥有了固定ip地址一样。
    由于ssh直接建立的隧道有可能会断开,所以我使用了autossh工具来自动完成断线重连功能。

    说明一下:隧道是在b上建立的,把下边a.a.a.a替换成a的公网ip地址即可

隧道建立方式1

autossh -p22  -M 5000 -NR 20001:0.0.0.0:80 root@a.a.a.a

隧道建立方式2


ssh -R 20001:localhost:80 root@a.a.a.a



端口转发配置

# bindadress    bindport  connectaddress  connectport
0.0.0.0 20002 127.0.0.1 20001



抽空要试下windows的远程桌面能否通过此方法来访问也就是b是windows,a是linux的前提下进行隧道建立和端口数据转发

ssh隧道另外常用的功能就是通过隧道建立sockes服务来实现科学上网


把下面expect脚本放在后台运行,内网主机就可以通过外网访问了

#!/usr/bin/expect
spawn autossh -p**** -i /root/.ssh/id_dsa_1024_178  -M 5000 -NR 20001:0.0.0.0:22 root@a.a.a.a
expect {Enter passphrase for key}
send "*****\n"
expect eof




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!