因为各种原因,想把家里的电脑发布到互联网上,可以随时随地通过互联网来访问家里的电脑。主要实现两个功能:
1.可以通过互联网,远程连接访问家里的电脑。(远程虚拟主机)
2.可以通过互联网,访问家里电脑上部署的网站。(Http服务器)
二、实现步骤
1.理解网络结构,家庭路由器做端口映射。
家里上网是使用的社区宽带,电脑通过路由器拨号进行上网。大致示意图如下:
在路由器上做端口映射,就可以通过公网IP访问到内网电脑了。路由器设置界面大概像这样(不同路由器品牌设置界面不同):
其中:
3390端口用于远程连接。(为什么不用默认的3389呢?因为电信默认是屏蔽了3389和80端口的)
8001端口用于HTTP服务器。
在IIS部署一个网站,以做测试。
用本地IP和外网IP访问测试:
注意:
1.电脑要开启允许远程连接,我的电脑->属性->高级系统设置->远程->允许任意版本远程桌面的计算机连接。
2.防火墙的3390和8001端口需打开,或者关闭防火墙。
二、阿里云主机跳转
完成了上面的设置,通过域名http://14.196.81.159:8001/在局域网内可以正常访问的,但是到了公共互联网,这个地址还是无法访问的。
不知道是社区宽带做了什么限制,但是发现在阿里云主机,这个地址是可以访问的。通过阿里云主机做跳转,就可以访问到这个地址了。
1.解决HTTP请求代理。
大致思路:
①用一个域名解析到阿里云服务器。
②用户访问域名时,请求将到阿里云服务器。
②阿里云服务器上安装软件,将Http请求转发到 http://14.196.81.159:8001/ ,就可以访问家庭电脑上的网站了。
因为之前习惯使用Apache httpd 做代理分发,直接在Apache的 httpd-vhosts.conf 配置文件,增加一条解析记录就可以了。
详情可以参考《Apache、IIS、Tomcat共用80端口》
<VirtualHost *:80>
ServerName tt.qingshanboke.com
ProxyPass / http://14.196.81.159:8001/
ProxyPassReverse / http://14.196.81.159:8001/
</VirtualHost>
2.解决远程端口转发。
跟上面解决http服务器方式类似,要建立远程连接,需要将请求云服务器的端口,转发到家庭网络端口。
大致思路:
①在云服务器开启一个端口侦听,如:3391。
②用远程连接工具连接到云服务器的3391端口时,通过技术手段,将请求转发到14.196.81.159的3390端口。
③编写端口转发程序,实现上述功能。
经过一番的资料查找,最终,写了一个客户端,实现上面描述的功能,程序界面如下图所示:
核心代码:
using System; using System.Net.Sockets; using System.Threading; using RC.Software.Proxy.Framework; namespace RC.Software.Proxy.Code { public class TcpProxy { public static TcpListener Listener; /// <summary> /// 启动侦听 /// </summary> public static void Start() { var config = ConfigHelper.GetConfig<AppConfig>(); Listener = new TcpListener(Convert.ToInt32(config.LocalPort)); Listener.Start(); while (true) try { var local = Listener.AcceptTcpClient(); var target = new TcpClient(config.TargetIP, Convert.ToInt32(config.TargetPort)); local.SendTimeout = 300000; local.ReceiveTimeout = 300000; target.SendTimeout = 300000; target.ReceiveTimeout = 300000; var obj1 = new[] { local, target }; var obj2 = (object)new[] { target, local }; ThreadPool.QueueUserWorkItem(Transfer, obj1); ThreadPool.QueueUserWorkItem(Transfer, obj2); } catch (Exception ex) { MainForm.LogToFile(ex.Message); } } /// <summary> /// 端口相互转发 /// </summary> /// <param name="obj"></param> public static void Transfer(object obj) { var tc1 = ((TcpClient[])obj)[0]; var tc2 = ((TcpClient[])obj)[1]; var stream = tc1.GetStream(); var networkStream = tc2.GetStream(); while (true) try { var bytes = new byte[10240]; var count = stream.Read(bytes, 0, bytes.Length); networkStream.Write(bytes, 0, count); } catch { stream.Dispose(); networkStream.Dispose(); tc1.Close(); tc2.Close(); break; } } } }到此,就可以通过远程连接工具访问家里的电脑了,家里电脑上面部署的网站,在外网也可以直接访问了。
发表评论
电子邮件地址不会被公开。 必填项已用*标注