自己搭建的ngrok服务器如何添加身份验证

虽然成功搭建了ngrok服务器,本地能被访问
但有几个问题:
1. 没有设置密码账号,谁都可以用
2. 尝试连接ngrok.com会连接成功,但立即提示需要付费
3. 怎样给ngrokd服务端添加身份验证

纯粹是问问,分不多

控制台输出

服务端参数

 >ngrokd -help
Usage of ngrokd:
  -domain string
        Domain where the tunnels are hosted (default "ngrok.com")
  -httpAddr string
        Public address for HTTP connections, empty string to disable (default ":80")
  -httpsAddr string
        Public address listening for HTTPS connections, emptry string to disable (default ":443")
  -log string
        Write log messages to this file. 'stdout' and 'none' have special meanings (default "stdout")
  -log-level string
        The level of messages to log. One of: DEBUG, INFO, WARNING, ERROR (default "DEBUG")
  -tlsCrt string
        Path to a TLS certificate file
  -tlsKey string
        Path to a TLS key file
  -tunnelAddr string
        Public address listening for ngrok client (default ":4443")

客户端参数

 >ngrok -help
Usage: ngrok [OPTIONS] <local port or address>
Options:
  -authtoken string
        Authentication token for identifying an ngrok.com account
  -config string
        Path to ngrok configuration file. (default: $HOME/.ngrok)
  -hostname string
        Request a custom hostname from the ngrok server. (HTTP only) (requires CNAME of your DNS)
  -httpauth string
        username:password HTTP basic auth creds protecting the public tunnel endpoint
  -log string
        Write log messages to this file. 'stdout' and 'none' have special meanings (default "none")
  -log-level string
        The level of messages to log. One of: DEBUG, INFO, WARNING, ERROR (default "DEBUG")
  -proto string
        The protocol of the traffic over the tunnel {'http', 'https', 'tcp'} (default: 'http+https') (default "http+https")
  -subdomain string
        Request a custom subdomain from the ngrok server. (HTTP only)

参数倒是意味着 客户端可以发送身份验证信息启动
服务端....没有参数指定谁来处理这个验证消息
该不会要我去学狗浪吧(ˉ▽ ̄~) 切~~

3个回答

wang845252276
很倔也很天真 按因果关系,你也算是解决问题的一个因
一年多之前 回复
dabocaiqq
请你们大家多多姿瓷我菠菜菌 回复wang845252276: 可以举一反三的
一年多之前 回复
wang845252276
很倔也很天真 已经打通了隧道 , 现在需要加密
一年多之前 回复

真是频频遇到百度不能解决的问题,貌似很多程序员将解决方法放到了更大的互联网圈子,例如国外
在百度没搜到,但在必应国际版就找到了想要的结果了

犹如出了新手村寻找世界的真谛一般

解决方案如下

  • 修改ngrok源代码,当然 我没有深究其他解决方案,因为我对golang不太了解

参考地址 : server端增加authtoken验证支持

为了防止地址失效粘贴下:

 package server

import (
    "fmt"
    "io"
    "ngrok/conn"
    "ngrok/msg"
    "ngrok/util"
    "ngrok/version"
    "runtime/debug"
    "strings"
    "time"
    "os"
    "bufio"
)

const (
    pingTimeoutInterval = 30 * time.Second
    connReapInterval = 10 * time.Second
    controlWriteTimeout = 10 * time.Second
    proxyStaleDuration = 60 * time.Second
    proxyMaxPoolSize = 10
)

type Control struct {
    // auth message
    auth            *msg.Auth

    // actual connection
    conn            conn.Conn

    // put a message in this channel to send it over
    // conn to the client
    out             chan (msg.Message)

    // read from this channel to get the next message sent
    // to us over conn by the client
    in              chan (msg.Message)

    // the last time we received a ping from the client - for heartbeats
    lastPing        time.Time

    // all of the tunnels this control connection handles
    tunnels         []*Tunnel

    // proxy connections
    proxies         chan conn.Conn

    // identifier
    id              string

    // synchronizer for controlled shutdown of writer()
    writerShutdown  *util.Shutdown

    // synchronizer for controlled shutdown of reader()
    readerShutdown  *util.Shutdown

    // synchronizer for controlled shutdown of manager()
    managerShutdown *util.Shutdown

    // synchronizer for controller shutdown of entire Control
    shutdown        *util.Shutdown
}

func NewControl(ctlConn conn.Conn, authMsg *msg.Auth) {
    var err error

    // create the object
    c := &Control{
        auth:            authMsg,
        conn:            ctlConn,
        out:             make(chan msg.Message),
        in:              make(chan msg.Message),
        proxies:         make(chan conn.Conn, 10),
        lastPing:        time.Now(),
        writerShutdown:  util.NewShutdown(),
        readerShutdown:  util.NewShutdown(),
        managerShutdown: util.NewShutdown(),
        shutdown:        util.NewShutdown(),
    }

    failAuth := func(e error) {
        _ = msg.WriteMsg(ctlConn, &msg.AuthResp{Error: e.Error()})
        ctlConn.Close()
    }
    readLine := func(token string, filename string) (bool, error) {

        if token == "" {
            return false, nil;
        }
        f, err := os.Open(filename)
        if err != nil {
            return false, err
        }
        buf := bufio.NewReader(f)
        for {
            line, err := buf.ReadString('\n')
            line = strings.TrimSpace(line)
            if line == token {
                return true, nil
            }
            if err != nil {
                if err == io.EOF {
                    return false, nil
                }
                return false, err
            }
        }
        return false, nil
    }
    // register the clientid
    c.id = authMsg.ClientId
    if c.id == "" {
        // it's a new session, assign an ID
        if c.id, err = util.SecureRandId(16); err != nil {
            failAuth(err)
            return
        }
    }

    // set logging prefix
    ctlConn.SetType("ctl")
    ctlConn.AddLogPrefix(c.id)

    if authMsg.Version != version.Proto {
        failAuth(fmt.Errorf("Incompatible versions. Server %s, client %s. Download a new version at http://ngrok.com", version.MajorMinor(), authMsg.Version))
        return
    }
    authd, err := readLine(authMsg.User, "authtokens.txt")

    if authd != true {
        failAuth(fmt.Errorf("authtoken %s invalid", "is"));
        return
    }

    // register the control
    if replaced := controlRegistry.Add(c.id, c); replaced != nil {
        replaced.shutdown.WaitComplete()
    }

    // start the writer first so that the following messages get sent
    go c.writer()

    // Respond to authentication
    c.out <- &msg.AuthResp{
        Version:   version.Proto,
        MmVersion: version.MajorMinor(),
        ClientId:  c.id,
    }

    // As a performance optimization, ask for a proxy connection up front
    c.out <- &msg.ReqProxy{}

    // manage the connection
    go c.manager()
    go c.reader()
    go c.stopper()
}

// Register a new tunnel on this control connection
func (c *Control) registerTunnel(rawTunnelReq *msg.ReqTunnel) {
    for _, proto := range strings.Split(rawTunnelReq.Protocol, "+") {
        tunnelReq := *rawTunnelReq
        tunnelReq.Protocol = proto

        c.conn.Debug("Registering new tunnel")
        t, err := NewTunnel(&tunnelReq, c)
        if err != nil {
            c.out <- &msg.NewTunnel{Error: err.Error()}
            if len(c.tunnels) == 0 {
                c.shutdown.Begin()
            }

            // we're done
            return
        }

        // add it to the list of tunnels
        c.tunnels = append(c.tunnels, t)

        // acknowledge success
        c.out <- &msg.NewTunnel{
            Url:      t.url,
            Protocol: proto,
            ReqId:    rawTunnelReq.ReqId,
        }

        rawTunnelReq.Hostname = strings.Replace(t.url, proto + "://", "", 1)
    }
}

func (c *Control) manager() {
    // don't crash on panics
    defer func() {
        if err := recover(); err != nil {
            c.conn.Info("Control::manager failed with error %v: %s", err, debug.Stack())
        }
    }()

    // kill everything if the control manager stops
    defer c.shutdown.Begin()

    // notify that manager() has shutdown
    defer c.managerShutdown.Complete()

    // reaping timer for detecting heartbeat failure
    reap := time.NewTicker(connReapInterval)
    defer reap.Stop()

    for {
        select {
        case <-reap.C:
            if time.Since(c.lastPing) > pingTimeoutInterval {
                c.conn.Info("Lost heartbeat")
                c.shutdown.Begin()
            }

        case mRaw, ok := <-c.in:
        // c.in closes to indicate shutdown
            if !ok {
                return
            }

            switch m := mRaw.(type) {
            case *msg.ReqTunnel:
                c.registerTunnel(m)

            case *msg.Ping:
                c.lastPing = time.Now()
                c.out <- &msg.Pong{}
            }
        }
    }
}

func (c *Control) writer() {
    defer func() {
        if err := recover(); err != nil {
            c.conn.Info("Control::writer failed with error %v: %s", err, debug.Stack())
        }
    }()

    // kill everything if the writer() stops
    defer c.shutdown.Begin()

    // notify that we've flushed all messages
    defer c.writerShutdown.Complete()

    // write messages to the control channel
    for m := range c.out {
        c.conn.SetWriteDeadline(time.Now().Add(controlWriteTimeout))
        if err := msg.WriteMsg(c.conn, m); err != nil {
            panic(err)
        }
    }
}

func (c *Control) reader() {
    defer func() {
        if err := recover(); err != nil {
            c.conn.Warn("Control::reader failed with error %v: %s", err, debug.Stack())
        }
    }()

    // kill everything if the reader stops
    defer c.shutdown.Begin()

    // notify that we're done
    defer c.readerShutdown.Complete()

    // read messages from the control channel
    for {
        if msg, err := msg.ReadMsg(c.conn); err != nil {
            if err == io.EOF {
                c.conn.Info("EOF")
                return
            } else {
                panic(err)
            }
        } else {
            // this can also panic during shutdown
            c.in <- msg
        }
    }
}

func (c *Control) stopper() {
    defer func() {
        if r := recover(); r != nil {
            c.conn.Error("Failed to shut down control: %v", r)
        }
    }()

    // wait until we're instructed to shutdown
    c.shutdown.WaitBegin()

    // remove ourself from the control registry
    controlRegistry.Del(c.id)

    // shutdown manager() so that we have no more work to do
    close(c.in)
    c.managerShutdown.WaitComplete()

    // shutdown writer()
    close(c.out)
    c.writerShutdown.WaitComplete()

    // close connection fully
    c.conn.Close()

    // shutdown all of the tunnels
    for _, t := range c.tunnels {
        t.Shutdown()
    }

    // shutdown all of the proxy connections
    close(c.proxies)
    for p := range c.proxies {
        p.Close()
    }

    c.shutdown.Complete()
    c.conn.Info("Shutdown complete")
}

func (c *Control) RegisterProxy(conn conn.Conn) {
    conn.AddLogPrefix(c.id)

    conn.SetDeadline(time.Now().Add(proxyStaleDuration))
    select {
    case c.proxies <- conn:
        conn.Info("Registered")
    default:
        conn.Info("Proxies buffer is full, discarding.")
        conn.Close()
    }
}

// Remove a proxy connection from the pool and return it
// If not proxy connections are in the pool, request one
// and wait until it is available
// Returns an error if we couldn't get a proxy because it took too long
// or the tunnel is closing
func (c *Control) GetProxy() (proxyConn conn.Conn, err error) {
    var ok bool

    // get a proxy connection from the pool
    select {
    case proxyConn, ok = <-c.proxies:
        if !ok {
            err = fmt.Errorf("No proxy connections available, control is closing")
            return
        }
    default:
    // no proxy available in the pool, ask for one over the control channel
        c.conn.Debug("No proxy in pool, requesting proxy from control . . .")
        if err = util.PanicToError(func() {
            c.out <- &msg.ReqProxy{}
        }); err != nil {
            return
        }

            select {
            case proxyConn, ok = <-c.proxies:
                if !ok {
                    err = fmt.Errorf("No proxy connections available, control is closing")
                    return
                }

            case <-time.After(pingTimeoutInterval):
                err = fmt.Errorf("Timeout trying to get proxy connection")
                return
            }
    }
    return
}

// Called when this control is replaced by another control
// this can happen if the network drops out and the client reconnects
// before the old tunnel has lost its heartbeat
func (c *Control) Replaced(replacement *Control) {
    c.conn.Info("Replaced by control: %s", replacement.conn.Id())

    // set the control id to empty string so that when stopper()
    // calls registry.Del it won't delete the replacement
    c.id = ""

    // tell the old one to shutdown
    c.shutdown.Begin()
}

修改了 ngrok/src/ngrok/server/control.go

以防版本不同,列出修改的具体内容

在 func NewControl(){} 内添加了一个方法,然后

 func NewControl(ctlConn conn.Conn, authMsg *msg.Auth) {
     //省略
     //读取文件方法
     readLine := func(token string, filename string) (bool, error) {

        if token == "" {
            return false, nil;
        }
        f, err := os.Open(filename)
        if err != nil {
            return false, err
        }
        buf := bufio.NewReader(f)
        for {
            line, err := buf.ReadString('\n')
            line = strings.TrimSpace(line)
            if line == token {
                return true, nil
            }
            if err != nil {
                if err == io.EOF {
                    return false, nil
                }
                return false, err
            }
        }
        return false, nil
}
    //省略
    //调用验证
    authd, err := readLine(authMsg.User, "authtokens.txt")

    if authd != true {
        failAuth(fmt.Errorf("authtoken %s invalid", "is"));
        return
}
     //省略
 }

这个验证直接 比较是否相等如 "123456" 或 "abcd:123456" 并没区别,看自己设计吧

修改后重新编译服务端 , 在执行文件同目录建立一个 用户文件,"authtokens.txt"

//如果 客户端参数 
-authtoken "username:password"
//服务端authtokens.txt包含相同字符串,每一个token一行,循环遍历比较
username:password

至于编译我是参照
一分钟实现内网穿透(ngrok服务器搭建)

ngrok版本 1.7
ubuntu 18.04
VMware 12pro

启动ngrok 客户端 偶现连接到其他端口,如配置的是http:8088 https:8089 连接时,http和https都连接到了8089,更有可能连接到 未配置的80端口去,以至于无法访问,当然 如果只使用80 端口 应该不会出现大问题

老兄为什么我按照你这样配置,然后还是没有身份验证?

wang845252276
很倔也很天真 修改源码,有没有呢
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
搭建自己ngrok服务器
通过阿里云服务器,系统为centos 7按步骤一步一步搭建自己的ngrok服务器,以及生成客户端。
自己搭建ngrok服务器
自己搭建ngrok服务器 需要有一个公网的vps 1、GO环境安装 wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz tar -C /usr/local -xzf go1.4.1.linux-amd64.tar.gz sudo echo &quot;export PATH=$PATH:/usr/local/go...
自己搭建ngrok服务
最近国内国外的ngrok的服务都不能用了,国外的是被墙了,国内的服务器停止续费了。但是微信开发不能缺少ngrok啊,所以决定自己搭建一个ngrok服务。 服务环境:阿里云CentOS 6.5 X64 1、首先要安装go环境,参照我前面的文章安装go环境 2、安装git mkdir ngrok cd ngrok git clone https://github.com/inconshre
搭建自己的ngrok服务
1. 准备工作 一台具有外网IP的服务器, 一个域名(解析到外网服务器), ngrok服务端 2. 开始搭建ngrok服务端 说是搭建, 其实我并没有自己去编译ngrok, 而是从别的地方下载已经编译好的客户端, 下载地址 https://www.sunnyos.com/article-show-74.html 按照上面的教程进行搭建 下载好之后, 传到服务器上, 解压, 进入目录, ...
CentOs之搭建自己的内网穿透服务器(Ngrok)-yellowcong
内网服务器穿透的服务器搭建,ngrok服务器搭建起来,还是比较费事的,因为坑还是不少的,1、go的版本问题,2、bin/go-bindata:命令未找到,3、没有公网ip,也可以通过修改hosts的方式进行实验。
自己搭建ngrok服务器实现树莓派内网穿透
目标实现从公网访问位于家中的树莓派,包括ssh连接和http访问准备 VPS【有公网ip】:ubuntu14.04 树莓派【可连接internet】:raspbian jessy ngrok源码【点此下载】 go 语言(ARM版 for 树莓派和AMD64版 for ubuntu)点此下载,需要扶梯子 VPS配置我的VPS是腾讯的,安装了ubuntu14.04版本的go语言环境。 安装方式如下:
搭建ngrok服务器
推荐阅读:https://segmentfault.com/a/1190000010338848 https://blog.csdn.net/yjc_1111/article/details/79353718 https://yq.aliyun.com/articles/483589?spm=5176.10695662.1996646101.searchclickresult.582f14ee3L...
通过nginx代理搭建自己的ngrok服务器
内网穿透想必开发过微信的同志都很了解,大部分人选择网上寻找各种现成的,比如ngrok官网或者花生壳(花生壳免费的和充值6元也不再给开放80端口,做不了微信开发)之类的。但是世界上没有免费的午餐,要不就是收费,要不就是免费但是偶尔会出现连接失败的问题(当然大多数时间是没有问题的)。 但是公用的总是受制于人的,所以可以自己搭建一个ngrok的服务 我的ngrok是:ngrok.luckylxh.to...
10分钟教你搭建自己的ngrok服务器
内网穿透想必开发过微信的同志都很了解,大部分人选择网上寻找各种现成的,比如ngrok官网、ittun-ngrok、sunny-ngrok或者花生壳之类的。但是世界上没有免费的午餐,要不就是收费,要不就是免费但是偶尔会出现连接失败的问题(当然大多数时间是没有问题的)。 偶然,正在测试微信的某些功能,但是正在使用的ittun-ngrok连接失败了。导致测试无法进行,最终萌生出自己搭建一个ngrok服...
Ubuntu上搭建自己的ngrok服务器
Ubuntu上搭建自己的ngrok服务器 参考网站:http://www.sunnyos.com/article-show-48.html 上面的内容似乎是sunny大神本人写的,了解的越多,发现自己懂得越少,但是对知识的渴求和好奇却越深。 我们暂时做的只是在局域网上搭建ngrok服务器,利用ngrok技术实现局域网上开发板的局域网nat,当我们访问服务器的局域网ip和端口时,实际远程访问控...
阿里云搭建ngrok服务器
阿里云搭建ngrok服务器前提: 需要域名一个,在域名控制台新建一个ngrok.**.cn的A类域名。 1.go环境搭建 通过这个url可以很快获取golang源码,然后编译安装就可以了。cd /usr/local wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz tar -C /usr/local -z
ubuntu搭建ngrok服务器
ubuntu搭建ngrok服务器 http://linfuyan.com/ubuntu-ngrok/
搭建私有ngrok服务器
搭建私有ngrok服务器1. 购买域名和服务器2. 解析域名到服务器3. 安装环境4. 下载 ngrok5. 生成自签名证书6. 替换证书7. 编译8. 启动服务端9. 编译客户端10. 配置客户端windows 1. 购买域名和服务器 注: 服务器的 ip 需要独立 IP 2. 解析域名到服务器 注: 如果是三级域名需要解析两个 www 解析到 a.com *.www 解析到 a.com ...
内网穿透-搭建ngrok服务器
有时需要让外网访问本机的web或者远程或者微信开发调试等其他,但本机没有公网ip就需要内网穿透,用花生壳等又受限制那就可以尝试自己搭建。 需要有个带公网IP的服务器和域名,我们可以用 ngrok 代码编译到自己服务器上(就相当于花生壳服务器),ngrok官方目前只开源1.x版本,下面以我的Centos6,目标域名http://www.wintercoder.com:81/(已废弃)为例。 先推...
Windows搭建ngrok服务器、Linux搭建ngrok服务器、支持用户管理
Windows搭建ngrok服务器,Linux搭建ngrok服务器,支持用户管理,http子域名授权,tcp端口授权,支持各类32位、64位操作系统;利用云计算的强大力量,快速编译生成ngrok服务端和客户端,并自动生成配置脚本,实现绿色免安装,下载即可使用,傻瓜式操作。
构建自己的Ngrok服务器
ngrok是什么(借别人的一段来说明)? 做前端开发的童鞋或许不会太陌生。 如果你完全不知道它是什么东西,可以在它的github项目上了解下:https://github.com/inconshreveable/ngrok 这里只提下它的核心功能:能够将你本机的HTTP服务(站点)或TCP服务,通过部署有ngrok服务的外网伺服器暴露给外网访问! 如上封面图所示,举
从零开始搭建自己的ngrok服务
ngrok是一个能做内网穿透的工具,是开发微信公众号的一个必不可少的工具。 简单说下如何配置: 1.假设你已经有一级域名了,然后进入到域名管理里面,如下为百度云的域名管理 百度云域名管理界面  2.  ...
基于Centos6.10搭建ngrok服务器
一、操作系统描述 服务器:Centos6.10 64位 客户端:Windows 10 64位 二、服务器环境准备 1.安装git yum -y install git 2.安装go 如果wget下载比较慢,可以通过迅雷下载完再拷贝到服务器上 wget https://golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz ...
ubuntu上搭建ngrok服务器
说在前面 :           ngrok是一个比较好用的内网穿透工具,通过他外网用户可以直接访问内网的设备,本文主要讲述如何自己搭建ngrok服务器。 准备:        为了搭建服务器,需要有一个外网ip地址,现在云服务很方便,可以随便租用一台设备来搭建服务器。 安装go编译器:       网上有很多安装的教程,需要注意的是1.4之后的版本需要使用1.4版本来进
搭建ngrok服务器实现内网穿透,
  服务器环境: 阿里云服务器一台(centos7.4-64) 二级域名一个(例:ngrok.xxx.com) 编译环境: go语言,gcc编译 所需软件: golang、gcc、git、ngrok 解析域名: 将ngrok.xxx.xom、*.ngrok.com解析到服务器上 1、安装软件: (1)、安装gcc和git 直接使用yum安装 yum install gc...
ngrok搭建web服务器(内网穿透)
ngrok可以做web服务器,可以做内网穿透,如公司内网外面的网络不能访问,这时候就需要到它了。 可以上官网(https://ngrok.com/)或者中文网(http://www.ngrok.cn/)下载ngrok 。 下载解压后得到这样一个文件,我把它放在了D盘根目录; win+r输入cmd打开控制台, 输入命令 : d: 先切换盘符目录,随后输入命令: ngrok http ...
Ubuntu搭建ngrok内网穿透服务器
前言 服务端安装与配置 安装Git sudo apt-get install git 安装golang 尽量保持最新版本安装,所以弃用apt-get install golang的方式 官网或其他渠道下载golang weget https://studygolang.com/dl/golang/go1.12.linux-amd64.tar.gz 解压golang至usr/bin,也可以指定...
centos下搭建ngrok服务器 内网穿透
最近经常需要做一些需要回调的接口, 本地服务不能收到回调,把服务发布到服务器又太麻烦了. 网上有些免费的ngrok服务用,比如Sunny-Ngrok等, 但有时会掉线,就按照→大佬的博客←搭建了一个, 亲测贼好用. 首先你得有 一个备案的域名, 一个公网服务器, 之前一百多块买的腾讯一核两G服务器就派上用场了 ngrok 简介及作用 ngrok是一款用 go 语言开发的开源软件,它是...
Ubuntu下搭建ngrok服务器及客户端
记录一下自己在Ubuntu下搭建ngrok服务的过程前言最近想要在校园网内搭建一个VPN服务,但是因为校园网,所以没有公网IP,只好做内网穿透了,之前做了一些n2n以及ssh隧道的尝试,这次使用ngrok反向代理尝试一下: 由于最初没有安装go环境,以及下载go环境的一些不方便,曾打算使用ngrok-c,但是尝试以后,发现貌似仅支持openwrt。。。可能是我学艺不精吧,如果可以请私信我。 搭建
Debian 8下搭建Ngrok服务器
注:本文基于Sunny大大的教程“搭建属于自己的ngrok服务器”改编,适合Debian系统使用文章链接:http://www.sunnyos.com/article-show-48.html1.编译环境安装检查并安装 gcc, make 和 gitapt-get install gcc apt-get install make apt-get install git 下载go最新版本进入网页ht...
搭建NTP服务器 开启身份验证
查看NTP 运行状态 运行 watch ntpq -p 命令 可实时查看ntp的运行情况,执行指令后出现如下界面 指令“ntpq -p”可以列出目前我们的NTP与相关的上层NTP的状态,以上的几个字段的意义如下: remote:即NTP主机的IP或主机名称。注意最左边的符号,如果由“+”则代表目前正在作用钟的上层NTP,如果是“*”则表示也有连上线,不过是作为次要联机的NTP主机。 refid:...
自己搭建的ngrok服务器,需要的可以自行下载
部署在自己本地的ngrok服务端,域名自己配置的,有需要的朋友自己下载使用即可。
如何搭建自己的语音聊天服务器?
如题, 就像碧聊那样的.
如何搭建自己的web服务器
本文主要介绍如何将一个前端项目部署到基于nginx或者apache的虚拟机上,介绍如何搭建自己的web服务 虚拟机安装配置 首先是安装虚拟机,安装过程在这里省略,接下来主要介绍虚拟机环境的简单配置,这里使用的是centos7.16 配置虚拟机网卡信息 寻找网卡配置文件目录,并打卡 cd /etc/sysconfig/network-scr...
如何搭建自己的AppRTCDemo服务器
如何搭建自己的AppRTCDemo服务器
阿里云搭建自己的ngrok服务-实现内网穿透
参考博文:https://blog.csdn.net/qq_34292044/article/details/78559128https://blog.csdn.net/huanxiang201311/article/details/72725891一.环境准备        1.固定的ip地址,我用的是阿里云,系统cenos6,比较老的系统。阿里云有自己的安全组策略,请把你自己的端口加进安全组里...
使用ngrok搭建自己的内网服务
使用ngrok搭建内网服务
ngrok服务器
ngrok服务器软件,linux服务器,数据库组建,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
搭建Ngrok服务器实现内网的计算机实现远程桌面
一、部署环境 1、linux外网系统服务器一台 2、一个域名,域名可以不备案,绑定到服务器上 二、搭建Ngrok服务器(开始进行服务器搭建) 1.安装GNU编译器套件、git(用于下载Ngrok源码)、以及GO语言环境 [root@centos ~]#  yum -y install gcc [root@centos ~]#  yum install git -y [root@ce...
腾讯云等云服务器搭建Ngrok内网穿透服务器
2019-08-07更新支持HTTPS: https://blog.csdn.net/qq_24484085/article/details/98767732 第一部分:准备工作 域名解析(一般域名解析需要10分钟生效,所以我们第一步来做域名解析) 由于我的备案主体在腾讯云,所以我就以我的域名为例子 一定要添加一条主机记录为* 的这样我们才能通过 *...
ngrok自己电脑做服务器一键生成
ngrok可一键生成服务器方便外网访问调试
搭建自己的服务器HTTP
呵呵。。。简单好用的HTTp服务器,软件类的,呵呵。。。抓鸡必备,也可以暂时性的当网站用
搭建自己的tfs服务器
我买的服务器比较小 1核 1G内存 40G硬盘 的服务器 团队项目的使用人数也比较少 不会超过5个人 服务器用的太好也是浪费 使用的sqlserver用的是2012 express tfs版本为 tfs2012 tfs2012密钥 BVGTF-T7MVR-TP46H-9Q97G-XBXRB 买了域名还没来的及备案 好处:上传和下载速度非常快 毕竟如果用微软的使用的是国外的网站 虽然没被...
搭建自己的Nuget服务器
搭建自己的Nuget服务器大概步骤分为四个 1、自己发布一个可以看到自己Nuget包的网站 2、打包好自己需要引用的插件,写好相关备注 3、将打包好的.nupkg放到发布好的网站的packge文件夹中 4、在项目中引用自己的Nuget包 下面是具体步骤 Nuget服务网站的搭建 (1)新建Web站点,选择 文件–>新建项目–>Asp.Net 空 Web应用程序 (2)选择 工具–>Li
搭建自己的KMS服务器
使用vlmcsd搭建自己的KMS激活服务器 搭建环境:debian-8.0-x86_64-minimal 使用如下命令确认机器的cpu架构,一般都是intel cat /proc/cpuinfo 我的机器cpu信息如下图 用wget从github上下载项目文件 wget https://github.com/Wind4/vlmcsd/releases/download/sv...
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法