从外网访问内网资源的几种方式

以前写过一个局域网中用花生壳+nginx建站的文章,在那里主要是局域网能够有权限设定DMZ主机或者可以设置端口映射,要是服务器没有路由的设置权限该怎么办呢?尤其是还要访问内网各种资源(可能是非http协议访问)?


 

由于工作环境在外网,而客户的资料数据(非涉密)都在内网,由于项目测试希望使用真实的数据环境进行,因此需要从外网对客户的内网数据进行访问。

客户的网络环境如下:

有一台多网卡的服务器,一个网卡可以访问内网,一个网卡可以访问外网,但是都是通过NAT进行访问的,也就是没有暴露在公网中。我们无权对客户的公网IP进行任何端口的映射。

我们的网络环境如下:

拨号上网,动态IP,有权限进行我们公司路由器的端口映射(客户端的映射)。

 


先说一下最终可以行得通的方案:

1、借助花生壳的内网穿透能力,直接在客户服务器部署,并开启socks5服务,这样就可以直接从外网通过域名和端口的方式进行代理访问,这是所有方法中最简单的方式,但是有两个很大的缺点:无法设置认证登录;非常不稳定(我已经购买了专业级的服务,仍然不稳定),具体原因未知,也无从排查,因为用的是第三方的工具。

客户端可以使用socks全局代理工具,如Proxifier或者SocksCap进行连接,这两个程序都可以设定只让特定的程序使用代理连接,前一个还可以对IP和端口进行过滤,以便只在需要访问代理的时候才访问。

2、借助花生壳的内网穿透能力,在客户服务器的花生壳中(2.x版本)开启自定义端口映射,同时搭配Nginx进行反向代理,这样也比较简单,这种方式可以在nginx中设置各种认证或者ip限制,安全性得到了提高,同时经过测试,稳定性也比较好,但是比第一种方案多配置了一个反向代理。

使用这种方式客户端无需任何辅助软件,直接访问花生壳赠送的域名即可,而且支持外网的80端口访问,跟第一种方案综合起来比,复杂成都差不多,因为一个是服务器多配置,一个是客户端多配置。

3、难道我是花生壳的托儿吗,必须要用花生壳吗?其实也不是,花生壳在这里起到的作用主要是数据中转,先由客户的服务器主动连接花生壳服务器,然后我们的客户端也连接指定的域名,看样子是通过服务器做了中转(下面要介绍的代理反弹),不过实际上如何传输也许只有他们知道。除了使用花生壳,我们还可以使用TeamViewer(下面简称TV),只是在安装的时候两边都必须勾上安装VPN的选项,这样建立远程连接后,可以使用TV的通道搭建VPN,这时我们的客户端和客户的服务器就会处在由TV建立的同一个局域网中,但是此时还不能直接访问数据,因为这个局域网并不是客户服务器能访问内网的那个局域网,所以,还需要结合Nginx进行一个反向代理,这时候就非常简单了,直接把TV提供的客户端服务器的IP加到Nginx配置文件的监听IP中,并正确设置proxy_pass,这样我们在客户端就可以通过TV提供的服务器端IP来访问服务器上的任意内网Http资源了。在这里TV的作用是利用他们的服务器为我们提供了一个VPN的环境。

当然,也可以不通过TV,因为我可以设置公司的路由映射,可以在公司的一台可以访问外网的机器上安装一个Windows Server操作系统,然后把外网的VPN端口(默认1723)映射到这台服务器上,并开始自己Server上的VPN服务,然后在客户的服务器端连接我们公司的VPN服务器(由于我们是拨号,虽然有公网IP,但是不固定,也可以使用花生壳的动态域名解析,这样重新拨号之后客户那边的服务器就不需要改配置),我们的客户端也连接这台服务器,最终也达到了使用TV一样的效果,这样就没有借助任何第三方的软件了。至于如何搭建VPN,谷歌上很多,也可以通过OpenVPN实现。


以下方案也可以参考,不过都有些问题。

1、如果客户的服务器直接是公网静态IP,那就万事大吉了,直接开个VPN,分配拨入客户端和内网同一个网段的IP,这样拨入的机器能直接访问内网资源。

2、如果客户的服务器是动态拨号的,那加个花生壳之类的动态域名解析,同样开个VPN,就和1一样了。

3、以上两种方案还可以使用nginx,而不使用VPN,用法可以参考以前那个内网建站的帖子。

4、在我的网络环境下,我还尝试了使用代理反弹的方式,虽然连通了,但是实际使用还不够稳定。代理反弹的方式就是和普通的VPN代理反着的,普通的是客户端连接服务器上的VPN服务,而反弹是客户的服务器主动连接我们的一个服务器,我们自己的客户端也连接我们的一个服务器,然后我们的服务器通过端口绑定的方式为两边进行数据中转,因为实际客户端连接的代理服务器地址是我们自己的服务器,而不是客户的服务器,所以称为反弹。这是我的理解。

我差点冲动的自己写一个反弹服务端,由于找到了其他的替代方案就放弃了,但是还是在网络中找到了三款类似的工具:

第一个是ssocks,这个是linux下的软件,如果两边(客户服务器和我们自己的服务器)是linux系统,可以优先测试一下,因为我们都是win系统,就没有测试,这个软件比较成熟,效果应该可以。

第二个是xsocks,这个是windows和linux下都可以编译的,但是目前github上的版本经过我的测试(在vs2015下编译要根据报错稍微修改源码),虽然可以连接成功,也能访问到数据,但是如果第一次连接失败了,那就不会再有第二次成功连接了,甚至说,第一次连接成功后,如果后面有一次连接失败,也会导致后续的连接失败。由于找到其他方案,也没去折腾修改其中的BUG,因为socks协议貌似有自动掉线的时间,所以使用这种方案可能还需要注意这个问题。

第三个是黑客喜欢用的软件,一般用来通过肉鸡访问肉鸡所在内网的其他机器,叫做Htran,网上也可以找到下载地址和源码。这个软件因为是特殊软件,所以也不适合我们这种场合,这软件只支持一个客户端连接,所以直接就pass掉了。

 

其实可以补充很多图形,不过还是以后无聊了再补吧!

 

 

从外网访问内网资源的几种方式:等您坐沙发呢!

发表评论

点击正确的图片来提交评论:
快捷键:Ctrl+Enter