Skip to content
/ mnh Public

A NAT hole punching tool that allows peers directly connect to your NATed server without client. 一个对端不需要客户端就可以直接连接的NAT打洞工具

License

Notifications You must be signed in to change notification settings

hzyitc/mnh

Repository files navigation

mnh

GitHub release

README | 中文文档

!!! Note: mnh is currently in development, the APIs and command line options may not be backward compatible !!!

Introduction

mnh is a tool that makes exposing a port behind NAT possible.

mnh will produce an ip:port pair for your NATed server which can be used for public access.

--------------------------------
| Help Server (NOT behind NAT) |  <------(query for ip:port pair)-------------
--------------------------------                                             |
        ^                                                                    |
        |                                                                    |
        |       ---------(Use some way to send ip:port pair)-------------    |
        |       |                                                       | or |
        |       |                                                       ↓    |
------------------------                  ~~~~~~~~~~~~                ----------
| Service (behind NAT) |    <--------     { Internet }   <----------  | Guests |
------------------------                  ~~~~~~~~~~~~                ----------

Usage

Pre-requests

  • Your server's network type should be Full-cone NAT.

    If you don't known what it means, no worries, just continue.

  • If your server is behind a firewall or a household router, you probably need to enable UPnP or do a port forwarding to your server on your router since they may block all incoming traffics.

Setup up a Help server

Please check mnh_server.

Only mnhv1 protocol is currently supported, more protocols will be added in the future, such as STUN.

Run mnh

Usage:
  mnh {tcp|udp} --server <server> [flags]

Flags:
  -s, --server string    Help server address(Example: "server.com", "server.com:6641")
                           If only specify hostname, it will try SRV resolve.
                           If SRV failed, it will use default port(6641).
  -i, --id string        A unique id to identify your machine

  -m, --mode string      Run mode.
                           TCP support: demoWeb proxy (default "demoWeb")
                           UDP support: demoEcho proxy (default "demoEcho")
  -p, --port int         The local hole port which incoming traffics access to
  -t, --service string   Target service address. Only need in proxy mode (default "127.0.0.1:80")

  -r, --routerForward    A comma-split list which will be used sequentially to request router to do port forwarding (default: "upnp,notice")
                           upnp: UPnP protocol
                           notice: Will notice you to do port forwarding manually
                           none: Do port forwarding manually

  -x, --event-hook       Execute command when event triggered:
                           escape:
                             %%: percent sign
                             %e: Event: connecting fail success disconnected
                             %m: Error message
                             %p: Local hole port
                             %a: Hole addr

  -h, --help             help for mnh

Example:

Run a Web server for test:

./mnh tcp --server server.com --id test

Run a UDP Echo server for test:

./mnh udp --server server.com --id udpEcho --mode demoEcho

Expose a local web server:

./mnh tcp --server server.com --id web --mode proxy --service 127.0.0.1:80

mnh will attempt to request router to do port forwarding with upnp protocol by default.

If failed, it will show a notice.

You can disable these two functions by set --routerForward none, make sure you have set up port forwarding correctly. (See Pre-requests)

./mnh tcp --server server.com --id web --mode proxy --service 127.0.0.1:80 --port 8888 --routerForward none

About

A NAT hole punching tool that allows peers directly connect to your NATed server without client. 一个对端不需要客户端就可以直接连接的NAT打洞工具

Topics

Resources

License

Stars

Watchers

Forks