被围观了 5,420 次

局域网穿透术 2013年6月18日

(****现在有人专门开发了穿透软件frp,网站在这里 http://diannaobos.com/frp/ *****)

一、在内网有一台服务器,上面部署了一个网站,外面的人如何访问这个网站?

条件:自己能设置出口路由器,内网服务器的ip地址假设为192.168.1.100

1、首选在路由器上设置端口转发,让发到路由器80端口的数据包转发到内网服务器的80端口。

然后就可以通过访问路由器的公网ip地址的80端口来访问内网服务器上的网站了,登录到路由器中可以查看公网ip(假如查到的是202.10.198.155,那么外面的人可以浏览 http://202.10.198.155,从而可以看到内网服务器上的网站了。

二、如何访问完全内网里的一个网站?

条件:你没有权限设置出口路由器,但是有一个自由支配的位于公网上的VPS,假设VPS的公网IP是184.178.10.65

1、在VPS里安装ssh服务器,然后修改服务器配置sshd_config,加入如下的配置项:

GatewayPorts yes

然后重启ssh服务

创建一个普通用户sun,登录SHELL为/sbin/nologin,并设好密码,比如123456。注意:普通用户只能转发普通端口(端口号大于1024)

2、在内网网站服务器上安装ssh客户端,然后运行如下命令:

ssh -qnfNT -g -R *:8080:localhost:80 -o ServerAliveInterval=600 -o ServerAliveCountMax=3  -p 7208 sun@184.178.10.65

然后会提示输入sun用户的密码,密码输入正确后这个命令会自动切换到后台。最后外面的人就可以通过访问 http://184.178.10.65:8080来间接访问完全内网里的网站了。记住:sun是普通用户,不能直接转发80端口,所以改成了8080了。如果有root密码,那么这条命令也可以写成:

ssh -qnfNT -g -R *:80:localhost:80 -o ServerAliveInterval=600 -o ServerAliveCountMax=3  -p 7208 sun@184.178.10.65

这样公网上的用户就可以直接访问http://184.178.10.65了。

上面的命令中,关键是要理解:

1) -R *:80:localhost:80 *表示VPS的ssh服务器监听来自任意网卡的链接请求,第一个80表示VPS上ssh服务器监听到端口,localhost表示内网服务器上到ssh客户端监听地址,第二个80表示内网服务器上ssh客户端监听到端口。总体意思是VPS上的ssh服务器监听全部网卡上的80端口请求,然后通过安全隧道转发到内网服务器的localhost端口80。

2) -p 7208 ssh服务器的默认端口是22,通过修改配置文件sshd_config,把默认端口改为了7208,这样vps就更安全了。

VPS上80端口往往比较紧张,所以一般转发其他端口,如8069,另外假设ssh的服务端口是默认的22,那么采用如下命令:

ssh -qnfNT -g -R *:8069:localhost:80 -o ServerAliveInterval=600 -o ServerAliveCountMax=3  sun@184.178.10.65

3、可以一次性转发多个端口:

ssh -qnfNT -g -R *:7208:localhost:22 -R *:5901:localhost:5901 -o ServerAliveInterval=600 -o ServerAliveCountMax=3  -p 7208 sun@184.178.10.65

 

如何让机器开机后自动运行上面的命令呢?由于ssh输入密码一定是交互式,这里就采用大名鼎鼎的expect了。首先要安装它:

yum -y install expect -----(在ubuntu上采用apt-get -y install expect安装)

然后编辑以文件,比如/usr/bin/auto_tunnel.exp,输入以下内容:

#!/usr/bin/expect -f

spawn /usr/bin/ssh -qnfNT -g -R *:7208:localhost:22 -R *:5901:localhost:5901 -o ServerAliveInterval=600 -o ServerAliveCountMax=3  -p 7208 sun@184.178.10.65
expect {
"*(yes/no)?" { send "yes\r"; exp_continue }
"*password:" { send "123456\r" }
}
expect eof

 

然后改成可执行:chmod +x /usr/bin/auto_tunnel.exp

把 /usr/bin/auto_tunnel.exp &加到文件/etc/rc.local中 exit 0 语句之前,这样开机时就自动启动了。

 

如果外网服务器重启了,那么原先建立的通道就失效了,因此最好在内网的机器上再做一个定时任务,运行命令 crontab -e,加入如下内容:

0 3 * * * /bin/ps -ef|/bin/grep qnfNT|/bin/awk '{print $2}'|/bin/sort -n|/usr/bin/xargs -i -t /bin/kill -9 {};/usr/bin/auto_tunnel.exp >/dev/null&

 

这个任务每天凌晨3点启动,首先把以前建立的通道拆除,然后建立新的通道。

 

4、穿透到windows机器(如3389端口):

首先从网上下载命令plink.exe,然后执行下面的命令:

plink.exe -C -N -R *:1234:localhost:3389 -P 7208 -pw 123456 sun@184.178.10.65

可以单独运行这个命令,也可以做成一个开机自动运行的后台任务(Win7下:控制面板-->管理工具-->任务五计划程序-->新建基本任务...:名称=plink,触发器=计算机启动时,操作=启动程序,程序或脚本=C:\Windows\System32\plink.bat,勾选“当单击完成时,代开此任务属性的对话框”,点击“完成”,点选“不管用户是否登录都要运行”,点击“确认”,输入用户密码)

 

5、内网linux机器上做翻墙工具,然后就可以上被墙的网站,在机器上运行命令:

ssh -fnqTN -D 8080 sun@moodisk.com -p 7208

在网页浏览器中设置代理,对于firefox浏览器,编辑-->首选项-->网络-->设置-->点选“手动配置代理”,然后在socket主机后面输入127.0.0.1,端口输入8080。

但是wget不支持socket5代理,所以为了能使用wget下载被墙网站上的文件,还需要安装软件tsocks,然后在/etc/tsocks.conf写入如下内容:

server = 127.0.0.1
server_type = 5
server_port = 8080

 

最后可以采用如下形式的命令:

tsocks wget http://www.xxx.com/file.txt

 

 

详细的资料参考这里:https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/

 
目前有0条回应
Comment
Trackback
你目前的身份是游客,请输入昵称和电邮!

Verify Code   If you cannot see the CheckCode image,please refresh the page again!