个人服务器Ngrok 反向代理配置,需要绑定公网域名

本文指导如何在Linux主机上安装Ngrok,包括准备公网IP和一级域名、安装必备软件包、解决SSL错误、定制证书、编译与启动、配置客户端及防火墙设置。适合开发者快速搭建本地服务映射到公网。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 准备好一台主机,带公网IP

 

2. 准备一个一级域名,做好泛解析(二级域名的没有配置成功,汗。。。) 切记 一定要做好域名泛解析

 

二、安装必备软件包

 

yum install gettext curl-devel perl-devel zlib-devel

 

解决git clone 报SSL错误,需要执行下面的命令

 

yum update -y nss curl libcurl

 

三、安装到/usr/local

 

cd /usr/local

 

从github上下载软件包

 

git clone https://github.com/inconshreveable/ngrok.git ngrok

 

三、安装go

 

cd /usr/local

yum -y install wget

wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz

 

tar -zxvf go1.11.linux-amd64.tar.gz

 

环境变量(vim /etc/profile)

 

export GOROOT=/usr/local/go

 

export NGROK_DOMAIN="ec2-54-180-30-121.ap-northeast-2.compute.amazonaws.com"

 

export PATH=$GOROOT/bin:$PATH

 

生效

 

source /etc/profile

 

四、安装准备-证书

 

进入到第一步下载的ngrok源码根目录,执行以下命令,会在当前文件夹生成六个文件

 

cd /usr/local/ngrok

 

mkdir cert

 

cd cert

 

运行下面5条命令

 

openssl genrsa -out rootCA.key 2048

 

openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem

 

openssl genrsa -out server.key 2048

 

openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr

 

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

 

五、证书覆盖

 

yes|cp rootCA.pem ..assets/client/tls/ngrokroot.crt

 

或者使用

yes|cp rootCA.pem ../assets/client/tls/ngrokroot.crt 直接覆盖 不提示

 

yes|cp server.crt ../assets/server/tls/snakeoil.crt

 

yes|cp server.key ../assets/server/tls/snakeoil.key

 

六、编译

 

在下载的ngrok根目录编译

 

cd /usr/local/ngrok

 

make release-server 或者使用 GOOS=linux GOARCH=amd64 make release-server , 只要和操作系统能对应即可

 

# Linux客户端

 

GOOS=linux GOARCH=amd64 make release-client

 

# win客户端

 

GOOS=windows GOARCH=amd64 make release-client

 

编译完成之后把bin目录下windows的启动工具下载下来

 

# MacOS

 

GOOS=darwin GOARCH=amd64 make release-client

 

七、启动

 

cd /usr/local/ngrok

(不用)./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083"

./bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083"

 

如果不指定tunnelAddr 端口默认是 4443

 

八、配置客户端启动

 

1. 编译对应平台的客户端软件地址在cd /usr/local/ngrok/bin 下面,可以使用 fileZilla 等软件连接到Linux系统进行下载接口

 

2. 编写ngrok.cfg配置文件(注意冒号后面的空格,其实是yaml文件)

 

server_addr: "ongis.cn:4443"

 

trust_host_root_certs: false

 

九、客户端启动

 

./ngrok -config=ngrok.cfg -subdomain=ngrok 8080

 

十、客户端ngrok.cfg 复杂配置

 

server_addr: "myngrok.com:8083"

 

trust_host_root_certs: false

 

 

 

tunnels:

 

http:

 

subdomain: "www"

 

proto:

 

http: "8081"

 

 

https:

 

subdomain: "www"

 

proto:

 

https: "8082"

 

 

web:

 

proto:

 

http: "8050"

 

tcp:

 

proto:

 

tcp: "8001"

 

remote_port: 5555

 

ssh:

 

remote_port: 2222

 

proto:

 

tcp: "22"

 

ngrok -config=ngrok.cfg start web #启动web服务

 

ngrok -config=ngrok.cfg start tcp #启动tcp服务

 

ngrok -config=ngrok.cfg start web tcp #同时启动两个服务

 

ngrok -config=ngrok.cfg start-all #启动所有服务

 

*****第二种启动方式

同级目录下新建一个启动脚本startup.bat

 

@echo on

cd %cd%

ngrok -config=ngrok.cfg -log=ngrok.log 8080

 

*****************3.使用 ip 做域名时,随机生成的子域名导致地址错误

ngrok 客户端会自动生成一个随机子域名或者用户自定义一个,总之无论如何都会有一个域名,这就会导致 ip 域名无效, 例如http://92832de0.1.1.1.1 -> localhost:80, 解决办法就是改源码,去掉随机生成的 subdomain

 

// src/ngrok/server/tunel.go #89 行

// Register for random URL

t.url, err = tunnelRegistry.RegisterRepeat(func() string {

return fmt.Sprintf("%s://%x.%s", protocol, rand.Int31(), vhost)

}, t)

删掉 %x. rand.Int31(), 以及该文件第一行引入的 math/rand,重新编译出服务端与客户端即可。这样不加 -subdomain 选项就不会有子域名

 

 

 

*****设置开机自启动(可以启动停止,但是不能自启动

设置启动:执行以下操作,可以了

 

systemctl enable ngrok

systemctl start ngrok

 

systemctl is-enabled iptables.service

systemctl is-enabled servicename.service #查询服务是否开机启动

systemctl enable *.service #开机运行服务

systemctl disable *.service #取消开机运行

systemctl start *.service #启动服务

systemctl stop *.service #停止服务

systemctl restart *.service #重启服务

systemctl reload *.service #重新加载服务配置文件

systemctl status *.service #查询服务运行状态

 

设置:

vim /usr/lib/systemd/system/ngrok.service

cd /etc/systemd/system/ngrok.service

systemctl daemon-reload

systemctl start ngrok.service

systemctl status ngrok.service

systemctl enable ngrok.service

 

ngrok.service脚本内容:

[Unit]

Description=Share local port(s) with ngrok

After=syslog.target network.target

[Service]

PrivateTmp=true

Type=simple

Restart=always

RestartSec=1min

StandardOutput=null

StandardError=null

ExecStart=/usr/local/ngrok/bin/ngrokd -domain=ec2-54-180-30-121.ap-northeast-2.compute.amazonaws.com -httpAddr=:80 -httpsAddr=:443

ExecStop=/usr/bin/killall ngrok

[Install]

WantedBy=multi-user.target

 

 

*****防火墙设置(打开指定端口,不然启动了也无法访问):

systemctl disable firewalld(永久关闭防火墙)

firewall-cmd --zone=public --add-port=80/tcp(永久生效再加上 --permanent)

firewall-cmd --zone=public --add-port=4443/tcp --permanent

设置完成后重新启动防火墙: firewall-cmd --reload

 

*********************,优化ngrok服务-设置开机启动(可以不用)

一,在ngrok程序目录下新建一个启动脚本,例如:

    start.sh

    path=/usr/local/ngrok

    $path

    ./bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083"

 

path为当前目录的路径

启动脚本要写后台启动的脚本,后面的启动项目根据自己需要来写

 

二,把ngrok程序制作成系统服务

 

在 /etc/rc.d/init.d目录下新建一个服务项目(ngrok),如下:

 

[plain] view plain copy

 

#!/bin/sh:  

#chkconfig:2345 70 30  

#description:ngrok  

      

    ngrok_path=/usr/local/ngrok 

    case "$1" in  

        start)  

            echo "start ngrok service.."  

            sh ${ngrok_path}/start.sh  

            ;;  

        *)  

        exit 1  

        ;;  

    esac  

 

 

给该文件赋权限755

 

chmod 755 ngrok

 

 

三,注册ngrok服务自启动

 

chkconfig --add  ngrok

 

测试服务是否能启动成功

 

service ngrok start

 

检查自启动的服务

 

 

chkconfig

 

 

 

设置启动:

 

systemctl enable ngrok

systemctl start ngrok

 

reboot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值