文章分类

相关文章

将家里电脑发布到互联网(内网穿透:实现HTTP服务器和远程连接)

分类:学习总结     发布:2019-10-11     来源:本站     浏览:444 次
一、原始需求
因为各种原因,想把家里的电脑发布到互联网上,可以随时随地通过互联网来访问家里的电脑。主要实现两个功能:
1.可以通过互联网,远程连接访问家里的电脑。(远程虚拟主机)
2.可以通过互联网,访问家里电脑上部署的网站。(Http服务器)

二、实现步骤
1.理解网络结构,家庭路由器做端口映射
家里上网是使用的社区宽带,电脑通过路由器拨号进行上网。大致示意图如下:

在路由器上做端口映射,就可以通过公网IP访问到内网电脑了。路由器设置界面大概像这样(不同路由器品牌设置界面不同):

其中:
3390端口用于远程连接。(为什么不用默认的3389呢?因为电信默认是屏蔽了3389和80端口的)
8001端口用于HTTP服务器。
IIS部署一个网站,以做测试。
查看外网IP:

用本地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;
                }
        }
    }
}
到此,就可以通过远程连接工具访问家里的电脑了,家里电脑上面部署的网站,在外网也可以直接访问了。


如果觉得文章对您有帮助,您可以对我进行打赏 ¥1.24 元(金额随机^_^,每次刷新金额不同)。

请使用支付宝扫码支付

留言评论

*称  呼:
*联系方式: 方便与您取得联系,推荐使用邮箱。
*内  容:

已有评论

暂无数据

上一篇:考点:CMMI的5个级别和25个过程域

下一篇:简笔画教程-人物素描