通过WebSocket隧道,尝试将ASP.NET网站空间当作VPS来使用

作者:V君 发布于:2021-1-17 11:50 Sunday 分类:折腾手记

先上 PoC源代码 再开始扯,这次不是着重解决某个问题,而是尝试确定某种可能性。

以前使用过 C9.io 提供的免费在线开发环境来搞各种事情,包括正常上网,无非是利用 Web Sockets 建立隧道,然后配合客户端连接到在上面运行各种应用程序。
现在C9已经被收购且停止免费了,那就公开来说吧w

这次也不例外,只不过花了点钱搞了个支持 ASP.NET 4.5+ 的网站空间,然后在上面搞类似的事情。

基础设施 -- WebSocket 转 TCP 模块

首先要使用 WebSocket 来建立一条隧道,要求网站空间支持且启用 WebSocket,不然没法整。这里有个未经优化,但还能凑合着用的例子,只要挂在 HttpModule 中 HttpApplication 的 PostMapRequestHandler 事件,填好参数就能吃。

折腾1 -- SSH 终端

略去寻找绿色 SSH 服务端的辛酸过程,时间直接转到发现 FxSsh 这个纯托管实现的服务端。这里要分成两个部分来扯,分别是使用基于 ConPTY 的 MiniTerm 和兼容低版本 Windows 的简单兼容实现。由于 FxSsh 主要实现的是 SSH 协议通道,服务端的终端并没有适配,尽管源代码中带了个名为 MiniTerm 的 DEMO 来适配到较新系统的 ConPTY。

第一部分:基于 MiniTerm 的实现。原版的 MiniTerm 虽然导入了 ResizePseudoConsole 这个 API 但并没有使用。而且由于 NuGet 上的 FxSsh 不是最新版,没有窗口大小变更事件的支持。 因此我把他们全都拷贝到自己的项目中并注明来源了。在此之上再加以修改 MiniTerm 使窗口大小变更事件适配到 MiniTerm 的实现。目前并没有发现太多问题。有点小遗憾的是 MiniTerm 使用的 ConPTY 功能是 Windows 10 近些年的更新才引入的,因此许多网站空间的系统都不支持,会报「在 kernel32 中找不到 CreatePseudoConsole 入口」的错误,因此我准备了另一个方案,见接下来的第二部分。

第二部分:另行实现一个兼容低版本 Windows 的控制台进程适配。在项目中起名为 EasyTerminal。起初简单将控制台进程的标准输入输出还有错误输出重定向到 SSH 通道,然鹅,回车键不起作用,而且不回显。将回车键拦截下来,改成 StandardInput.WriteLine 调用,总算是能满足最基本的需求。尽管还是没有实时回显,得按下回车键之后才显示出来,功能按键和窗口大小什么的更无从说起。目前仍在使用零碎的时间持续摸索(咕XD)…

折腾2 -- 正常上网 将网站空间当作 V2 服务端使用

编译部署这个项目,然后将 V2 的两个 exe 和配置文件丢进 App_Data 目录,然后使用 WS 隧道连接到监听的 URL,最后在 V2 客户端指向 WS 隧道客户端,这时候就能吃了。分配了较大的缓冲区大小,这应该能有效减少损耗,如果网速慢,你需要测一下空间到你的网速。

不水。

标签: 软件开发 个人服务器 C# HTTP Web技术 传输协议 Windows .NET IIS WebSocket

评论(0) 引用(0) 浏览(203)

在 IIS 使用 web.config 配置域名端口跳转

作者:V君 发布于:2020-2-9 0:21 Sunday 分类:小服杂记

— TL;DR —

按需将以下配置节点添加到 web.config ,修改目标域名,完成。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
 <security>
   <requestFiltering>
   <fileExtensions allowUnlisted="true">
    <remove fileExtension=".cs" />
   </fileExtensions>
  </requestFiltering>
 </security>
 <rewrite>
  <rules>
    <rule name="RedirectGogs" stopProcessing="true" enabled="true">
      <match url="^gogs/(.*$)" />
      <action type="Redirect" redirectType="Temporary" url="https://gogs.topcl.net:8443/{R:1}"/>
    </rule>

    <rule name="RedirectExaWww" stopProcessing="true" enabled="true">
      <match url="^(?![\._].*$).*" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="www\.example\.com" />
      </conditions>
      <action type="Redirect" redirectType="Temporary" url="https://blog.example.com:8443/{R:0}"/>
    </rule>
    <rule name="RedirectExa" stopProcessing="true" enabled="true">
      <match url="^(?![\._].*$).*" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="example\.com" />
      </conditions>
      <action type="Redirect" redirectType="Temporary" url="https://blog.example.com:8443/{R:0}"/>
    </rule>

    <rule name="DefultRedirectBlog" stopProcessing="true" enabled="true">
      <match url="^(?![\._].*$).*" />
      <action type="Redirect" redirectType="Temporary" url="https://blog.topcl.net:8443/{R:0}"/>
    </rule>
  </rules>
 </rewrite>
</system.webServer>
</configuration>

— 听我扯扯 —

咋一看,不就是 rewrite + redirect (307) 不就好? 其实没有那么简单,比如源代码连接里以 .cs 后缀的代码文件 ()就在跳转的时候被 IIS 拦下来 404 了,因此还得额外加白。你可能会担心安全风险,但我这个空间仅仅用来跳转,根目录下只有这个 web.config 文件。

二月份的文章也只能这么水了,因为疫情只能把自己关在家

— 更新 —

将正则表达式改为 ^(?![\._].*$).* 可以忽略以指定字符开头的路径,方便申请 Let's 证书和临时放些文件,使配置更灵活

— 更新Ⅱ —

使用 conditions 实现别名支持,使空间变跳转 hub,将其利用价值榨干

标签: SSL证书 HTTPS ASP.NET IIS

评论(0) 引用(0) 浏览(583)

Powered by emlog 去你妹的备案 sitemap