首先纠正,你写的 inonat 正确名称是 innat,它是一款轻量级 NAT 内网穿透工具,核心作用就是把内网机器的服务暴露到公网,让外网设备可以直接访问内网里面的 web 服务数据库服务或者其他 TCP UDP 业务,它的工作原理是在内网部署客户端,公网服务器部署服务端,两端建立长连接隧道,外网请求先到达公网服务器,再通过隧道转发回内网主机,不需要在内网路由器上面做端口映射,适合家里 NAS 开发机局域网测试环境这类没有公网 IP 的场景,innat 相比传统 frp 配置更加简洁,资源占用很低,支持 TCP UDP 转发,启动之后会维持稳定隧道连接,当公网端收到访问请求,就会按照预先配置好的转发规则,把数据包转发到内网指定 IP 和端口,它适合临时调试远程访问,不适合超大规模高并发生产业务,使用的时候必须区分公网服务器端程序和内网客户端程序,两端版本尽量保持一致,否则很容易出现隧道握手失败。
基础运行架构
innat 分为 server 服务端和 client 客户端两个部分
服务端部署在拥有公网 IP 的云服务器上面,负责监听公网端口,接收外网访问流量,同时等待内网客户端主动连上来建立隧道
客户端部署在内网主机,主动向外网服务端发起连接,注册转发规则,把内网本地端口映射出去
外网用户访问公网服务器的映射端口,流量经由隧道回到内网客户端,再转发到内网目标服务
服务端部署与用法
第一步 下载对应系统版本 innat 程序,支持 linux windows mac
第二步 给程序添加执行权限,linux 系统执行 chmod 加 x
第三步 启动服务端,核心参数是监听端口,这个端口是客户端用来连接服务端的隧道端口,同时可以设置鉴权密钥,防止陌生客户端随意接入
基础启动命令格式
innat server p 隧道端口 k 鉴权密钥
参数说明
p 代表服务端监听的隧道通信端口
k 代表鉴权密钥,客户端必须填写完全相同的密钥,不然握手会拒绝
可选参数还可以设置日志级别,后台运行,最大连接数
客户端部署与用法
客户端核心任务是定义转发规则,每一条规则代表一个映射,把公网服务端上的公网端口,转发到内网的目标地址和端口
基础启动命令格式
innat client s 公网服务器 IP p 隧道端口 k 鉴权密钥 r 公网端口内网目标 IP 内网目标端口
参数说明
s 填写公网服务器的公网 IP 或者域名
p 和服务端保持一致的隧道端口
k 和服务端保持一致的鉴权密钥
r 就是转发规则,一条规则对应一组映射,可以同时写多条 r 参数,一次性映射多个业务端口
常用场景实操示例
场景一 映射内网 web 服务
内网主机 192.168.1.100 上面 nginx 监听 80 端口,想要外网通过云服务器 8080 端口访问
服务端启动 innat server p 9000 k mykey123
客户端启动 innat client s 云服务器公网 IP p 9000 k mykey123 r 8080 192.168.1.100 80
启动完成之后,外网访问 http 云服务器公网 IP 8080 就可以打开内网 nginx 页面
场景二 映射 SSH 远程登录
内网机器 ssh 默认端口 22,公网映射端口设置成 2222
客户端增加转发规则 r 2222 127.0.0.1 22
外网执行 ssh 用户名 云服务器公网 IP 端口 2222,就可以登录内网机器
进阶用法与注意事项
可以把 innat 配置成系统自启,linux 使用 systemd 服务单元,开机自动拉起服务端或者客户端,避免重启之后隧道断开
网络波动的时候隧道会自动重连,但是如果鉴权密钥不匹配,公网防火墙没有放行隧道端口,客户端是无法建立连接的
安全重点,公网服务器的隧道端口一定要放行防火墙,同时鉴权密钥不要使用简单弱密码,暴露到公网的服务本身也要做好账号密码防护,不然会有被扫描入侵风险
innat 原生主要支持 TCP 转发,UDP 支持要看你下载的版本,部分旧版本不支持 UDP 业务
不要把高敏感数据库裸端口直接暴露公网,建议额外增加防火墙白名单或者加密代理
【常见问题】
问题 1 innat 用法里面客户端和服务端密钥不一致会出现什么情况
回答 1 innat 用法当中客户端和服务端鉴权密钥必须完全一致,如果密钥不一致,客户端发起隧道握手的时候会被服务端直接拒绝,隧道无法建立,公网端口不会生效,外网访问会连接失败。
问题 2 innat 用法可以一次性映射多个内网端口吗
回答 2 innat 用法支持同时配置多条转发规则,客户端启动命令里面可以添加多个 r 参数,每一条 r 对应一组公网端口和内网目标端口,实现多个业务同时穿透,不需要启动多个客户端进程。
问题 3 使用 innat 用法的时候公网端口能重复占用吗
回答 3 innat 用法里面同一个服务端上面,公网映射端口不能重复,多条转发规则不能把同一个公网端口分配给不同内网目标,否则服务端启动注册规则的时候会报错,隧道注册失败。
【免责申明】
本文 innat 用法属于开源工具学习演示,内网穿透会把内网服务暴露到公网,存在网络安全风险,请遵守当地网络相关法律法规,仅用于本人合法自有设备的调试访问,禁止用于非法访问他人网络,不同版本 innat 参数可能存在改动,实际使用请以官方文档为准。


