Node.js 200줄로 만든 셀프 호스팅 Ngrok 대안
Source: Dev.to
Problem
여러 로컬 서비스를 터널링해야 하지만, Ngrok 무료 플랜은 단일 터널만 제공합니다.
Solution
약 200줄의 Node.js 로 작성된 자체 호스팅 터널입니다. 한 번의 명령으로 여러 개의 퍼블릭 URL을 생성할 수 있습니다.
liptunnel http 3000,8080,5000 --multi
이 명령은 도메인에 세 개의 퍼블릭 URL을 만들고 트래픽을 다음과 같이 라우팅합니다:
User → yourdomain.com → VPS → WebSocket → Your PC → localhost
Core concept
Server (forward HTTP via WebSocket)
// server.js (Express middleware)
app.use((req, res) => {
const subdomain = req.headers.host.split('.')[0];
tunnels[subdomain].ws.send(JSON.stringify(req));
// Wait for response, then send it back to the client
});
Client (receive, proxy, respond)
// client.js
ws.on('message', (data) => {
const request = JSON.parse(data);
const proxy = http.request(
{
hostname: 'localhost',
port: request.port,
path: request.path,
method: request.method,
headers: request.headers,
},
(response) => {
let body = '';
response.on('data', (chunk) => (body += chunk));
response.on('end', () => {
ws.send(
JSON.stringify({
statusCode: response.statusCode,
headers: response.headers,
body,
})
);
});
}
);
proxy.end(request.body);
});
나머지 구현은 오류 처리, 연결 관리 및 정리 작업을 담당합니다.
Features
- Privacy – 트래픽이 여러분의 인프라를 벗어나지 않습니다.
- Cost – VPS 비용만 발생합니다(그 외는 무료).
- Branding – 터널 URL에 자체 도메인을 사용할 수 있습니다.
- Control – 라우팅 및 처리에 대한 완전한 커스터마이징이 가능합니다.
Performance
- 메모리: 터널당 약 25 MB
- 지연시간: 약 5 ms 오버헤드
- 처리량: 초당 100+ 요청
Use cases
- 로컬에서 마이크로서비스를 빠르게 설정
- 배포 없이 웹훅(Stripe, GitHub 등) 테스트
- 클라이언트 브랜드 URL을 활용한 시연
- 제3자 서비스를 사용할 수 없는 규제‑민감 환경(헬스케어, 금융 등)
Setup
# Clone the repository
git clone https://github.com/ibrahimpelumi6142/liptunnel
cd liptunnel
# Install dependencies
npm install
# Run the server on your VPS
node server/server.js # <-- 원격 머신에서 시작
# Start a tunnel from your local machine
liptunnel http 3000 # <-- 노출하려는 포트로 3000을 교체
Technology stack
- Node.js – 런타임
- WebSocket – 터널 전송 수단
- Express – 선택적인 대시보드(무거운 프레임워크 아님)
모든 코드는 약 200줄짜리 단일 프로젝트에 포함됩니다.
Roadmap (coming soon)
- Let’s Encrypt를 이용한 HTTPS 지원
- 고정 서브도메인
- 터널 접근을 위한 인증 토큰
- 요청 인스펙터 UI
Contributing
프로젝트가 유용하다면 GitHub에서 별을 눌러 주세요:
이슈를 열거나 개선을 위한 풀 리퀘스트를 자유롭게 제출해 주세요.