나만의 ngrok 만들기(self hosted ngrok)

계기



Raspberry pi에 구축한, Node-red와 MQTT에, 외부로부터 액세스 시키고 싶다.
자주 있는 http/https 뿐만이 아니라 MQTT 프로토콜이 사용하는 TCP 포트 지정해의 터널링을 실시할 수 있는 것.
증명서를 사용한 서버 인증을 실시하기 위해(때문에), 고정 IP로 독자 도메인 취득 전제.

집이 아파트 타입의 이중 라우터이므로 그것을 넘을 수 있습니다.

정책 검토:



ngrok: 유료: TCP 포트의 개방을 지원하는 서비스.
시험에 ssh를 TCP 터널 시켜 보면, 아래와 같이.
$ ngrok tcp 22
ngrok by @inconshreveable                                       (Ctrl+C to quit)

Tunnel Status                 online
Version                       2.0.19/2.0.19
Web Interface                 http://127.0.0.1:4040
Forwarding                    tcp://0.tcp.ngrok.io:36198 -> localhost:22

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00


문서에 따르면, 무료 계정에서,
<ランダムな数字1桁>.tcp.ngrok.io:<ランダムなポート番号>


이것으로는 증명서가 보증할 수 있는 URL로서는 접속할 수 없다.
유료라면


연간 99달러로 "2 reserved TCP sddress"라고 있지만, 이것도 포트 번호를 고정할 수 있을 뿐.

serveo: 무료: 전혀 액세스할 수 없어 사용할 수 없었습니다.

독자 도메인이 필요하기 때문에 스스로 서버를 구축할 수 있는 것을 찾아 보았다.

Softether
VPS등의 퍼블릭 고정 IP의 서버에 vpnserver를 인스톨, 그것을 향해 Raspberry pi측으로부터 vpnbridge, 혹은 vpnclient로 접속하는 것이 기본 구성이지만, 어떻게 잘 되지 않았다. Raspberry pi측을 멀티 NIC(Ether+Wifi)로 하면 잘 되었을지도 모른다.

localtunnel
문서를 대충 읽고, 설치해 보았지만, https 밖에 설정할 수 없기 때문에 봇.

ngrok
이전 버전 (1.7)의 ngrok이 서버 클라이언트 모두 소스가 공개되었습니다.
"DO NOT RUN THIS VERSION OF NGROK (1.X) IN PRODUCTION."라고 기재되어 있어 주의가 필요하지만, 상용판의 "ngrok.io"부분을 독자 도메인으로 해 사용할 수 있을 것 같다.
이것을 시도해보십시오.

서버 검토



고정 IP를 사용할 수 있는 VPS 서비스를 검토. 스펙은 최저 레벨.
WEBARENA VPS 클라우드
월액 360엔으로 1코어, SSD20GB, 메모리 1GB로 확실히 애용할 수 있는 서비스이지만,
2019년 11월 현재, 불행히도 재고 없음.

코노하 VPS
월액 630엔으로 1코어, SSD20GB, 메모리 512MB, 부득이 여기를 선택한다.

도메인 얻기



이미 계정이 있습니다 가치 도메인
연간 99엔의(초년도만) 도메인을 구입해, 아래와 같이 1~5를 참고로 설정.
VALUE-DOMAIN에서 얻은 도메인을 Conoha에서 사용해보기

구성



서버: Conoha VPS CentOS7
클라이언트: Raspberry pi Zero WH Raspbian buster

설정



기본적으로 서버와 클라이언트 측 모두 Go를 설정합니다.
아래를 참고로 Go 설정.
Linux(CentOS, Ubuntu)에서 Go 언어 개발 환경 구축
너무 Go가 새로 오류가되기 때문에 Go1.7을 설치합니다.

다음을 수행한다.
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok
#raspbianは下記
GOOS=linux GOARCH=arm make release-client
#CentOS7は下記
GOOS=linux GOARCH=amd64 make release-server


위에서 ngrok/bin/내에 바이너리가 있습니다.

자체 인증 기관, 서버 인증서 만들기



OpenSSL ECDSA에서 자체 인증 기관 작성 를 참고로 루트 CA, 중간 CA를 작성.

인증서 만들기:
서버 인증서의 개인 키와 CSR 만들기
openssl req -new -config openssl.cnf -newkey ec:<(openssl ecparam -name prime256v1) -keyout server.key -out server.csr

서버 인증서를 중간 CA로 서명
openssl ca -config openssl.cnf -extensions svr_cert -keyfile icacert.key -cert icacert.pem -in server.csr -out server.crt -days 3650

openssl.cnf의 주요 변경 사항
[ svr_cert ]
subjectAltName= @alt_names

[ alt_names ]
#SAN対策
DNS.1 = <取得したドメイン>
DNS.2 = *.<所得したドメイン>


인증서 체인 만들기



서버 인증서로 통합하기 위해,
서버 인증서 + 중간 CA 인증서 + 자체 인증 기관 CA 인증서를 붙입니다.

SSLCertificateChainFile Deprecation Warning on Apache 2.4.8+

./bundle.sh server.crt > server.chain
./bundle.sh icacert.pem >> server.chain
./bundle.sh cacert.pem >> server.chain


서버, 클라이언트에 자체 인증 기관 CA 인증서 포함



하기를 참고로 신뢰된 루트 증명서로서 작성한 자기 인증국 CA 증명서를 편입한다.
자체 루트 CA 인증서를 추가하는 방법(Ubuntu, CentOS 7)

ngrok 클라이언트의 CA 인증서 교체



클라이언트 측 ngrokroot.crt을 자체 인증 기관 CA 인증서로 바꿉니다.
다시 GOOS = linux GOARCH = arm make release-client를 실시한다.

서버, 클라이언트 실행.



서버측
bin/ngrokd -tlsKey=server.key -tlsCrt=server.chain -domain=<取得したドメイン>

클라이언트측
구성 파일을 작성하고 실행합니다.
vi .ngrok


server_addr: <所得したドメイン>:4443
trust_host_root_certs: false
tunnels:
  mqtt:
    proto:
      tcp: 8883
    remote_port: 8883
  node-red:
    proto:
      https: 1880
    subdomain: nodered


#実行
bin/ngrok -config=.ngrok start-all

실행 확인



클라이언트측 상태
ngrok                                                           (Ctrl+C to quit)

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    https://nodered.<取得したドメイン> -> 127.0.0.1:1880
Forwarding                    tcp://<取得したドメイン>:8883 -> 127.0.0.1:8883
Web Interface                 127.0.0.1:4040
# Conn                        106
Avg Conn Time                 436138.60ms



HTTP Requests
-------------

GET /icons/node-red/rpi.svg   304 Not Modified
GET /icons/node-red/file.svg  304 Not Modified
GET /icons/node-red/file-in.s 304 Not Modified
GET /icons/node-red/watch.svg 304 Not Modified
GET /icons/node-red/parser-ya 304 Not Modified
GET /icons/node-red/file-out. 304 Not Modified
GET /icons/node-red/parser-xm 304 Not Modified
GET /icons/node-red/parser-js 304 Not Modified
GET /icons/node-red/parser-ht 304 Not Modified

문제없이 TCP 연결을 확인할 수있었습니다.

좋은 웹페이지 즐겨찾기