适用场景描述:我有一台外网服务器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
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
来源:oschina
链接:https://my.oschina.net/u/117096/blog/551533