Git Product home page Git Product logo

liangnat's Introduction

LiangNat

简介

使用java网络编程实现内网穿透/端口映射,分为服务端和客户端,类似于frp, 概念介绍及程序设计思路详情见博客网址

  1. 更新了web后台管理,能够管理允许登录的IP,设置IP白名单防火墙
  2. 更新了代理上网功能,能够代理内网,例如实现在校外访问校园内网才能访问的网站
  3. 更新了端口可设置是否受ip白名单防火墙保护,字段如客户端配置文件,例如你需要开放某些端口给别人调用api,但调用你api的ip有很多,没法一一设置白名单,且api应用层做了认证管理,因此该端口不需要受防火墙保护

使用

1.1 测试使用

  1. 上线使用时,可直接在GitHub releases中下载使用,也可以自行修改编译出来进行使用
  2. NatServer-v1.jarconfig_server.yaml放置于云端服务器中的某个文件夹NatSoft内,可视情况修改配置文件,并执行 java -jar NatServer-v1.jar即可运行,执行java -jar NatServer-v1.jar trace可以指定日志级别为TRACE,测试调试时可以这样设置,但真实上线使用时不建议打印(耗时) 配置内容及解释示例如下
    common:
      bind_port: 10101    # 服务端口  可更换,保持与客户端一致即可
      token: 123456       # 密码
    
    web:
      bind_port: 10102  # 网页管理登录端口,可管理IP白名单 浏览器输入server_addr:10102可登录
      username: admin   # 登录用户名
      password: 123456  # 登录密码
  3. NatClient-v1.jarconfig_client.yaml放置于局域网内的电脑的某个文件夹NatSoft内,修改config_client.yaml,更改想要映射的端口和云服务器的IP密码等,执行 java -jar NatClient-v1.jar即可 配置内容示例如下
    common:
      server_addr: XXX.XXX.XXX.XXX    # 云服务器地址
      server_port: 10101      # 云服务器服务端口  与服务端配置一致
      token: 123456         # 登录密码 与服务端配置一致
    
    nat:
      ssh-2:
        type: tcp
        local_ip: 127.0.0.1 # 需要被映射的内网机器的IP,可以为局域网中任意机子的ip
        local_port: 22      # 需要被映射的内网机器的端口
        remote_port: 40022  # 对应的云端服务器映射端口    # 达到的效果是访问 server_addr+40022 相当于局域网内local_ip+local_port
    
      vnc-21:
        type: tcp
        local_ip: 127.0.0.1
        local_port: 5901
        remote_port: 45901
    
      api-connect:
        type: tcp
        local_ip: 192.168.1.202
        local_port: 8011
        remote_port: 8011
        firewall_protect: false   # 默认为受防火墙保护,即默认为true,设置为false后将不检查连接方的ip,用于接收某些不能确定ip的连接,为保证端口安全尽量在应用层做一些验证
    
    socks5_proxy: # 代理 将浏览器的代理或系统代理改为 socks5,server_addr:7999 实现穿透学校内网上网, 使用edge或chrome时安装SwitchyOmega插件进行代理配置最佳
      type: tcp
      remote_port: 7999
    

1.2 设置自启动服务

上面的测试使用在终端断开后将停止运行,因此我们需要注册我们的服务,达到开机自启动,或者手动运行服务后终端掉线依然运行

1.2.1 服务端开机自启动

执行vim /etc/systemd/system/natServer.service创建服务,编辑如下

[Unit]
Description=nat server daemon
After=syslog.target  network.target
Wants=network.target

[Service]
Type=simple
User=name	# 如果是root用户可省略
WorkingDirectory=/home/name/NatSoft			# 编辑的时候一定要删除注释 这里更改为自己放置jar包和配置的绝对路径
ExecStart=/path/to/your/java -jar NatServer-v1.jar	# 编辑的时候一定要删除注释 这里更改为自己在java命令的安装位置 可使用 which java查看
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target

执行如下

#启动natServer
systemctl daemon-reload
systemctl start natServer
#设置为开机启动
systemctl enable natServer

1.2.2 客户端开机自启动

执行sudo vim /etc/systemd/system/natClient.service创建服务,编辑如下

[Unit]
Description=nat client daemon
After=syslog.target  network.target
Wants=network.target

[Service]
Type=simple
User=name	# 编辑的时候一定要删除注释 这样可以使得进程归用户所有,使用jps查看时可以查看到,如果不设置,那么普通用户jps查看不到
WorkingDirectory=/home/name/NatSoft			# 编辑的时候一定要删除注释 这里更改为自己放置jar包和配置文件的绝对路径
ExecStart=/path/to/your/java -jar NatClient-v1.jar # 编辑的时候一定要删除注释 这里更改为自己在java命令的安装位置 可使用 which java查看
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target

执行如下

#启动natServer
systemctl daemon-reload
systemctl start natClient
#设置为开机启动
systemctl enable natClient

1.2.3 IP白名单防火墙管理

  1. 输入你设置的web管理端口,server_addr:10102
    在这里插入图片描述
  2. IP白名单列表
    在里面可以删除和修改每条记录
    在这里插入图片描述
  3. 添加IP
    点击上方添加IP,将进入如下界面,下面的IP自动填充为访问设备的IP,属地为联网查询到并填充的,备注可以手动填写,另外我更新了一种IP过滤策略,一个IP是32位的,当添加IP为192.168.0.0/24时,则只需要IP的前24位与给定IP相同即可,即192.168.0开头即可
    在这里插入图片描述

程序相关解释记录

各种socket名词定义

  1. 信息交互socket:指的是服务端与客户端间的通信socket,例如客户端使用随机端口(假设1234)连接到服务端端口(默认为10101),localhost:1234<-->remoteIp:10101建立的socket就是信息交互socket
  2. socketWan: 云端端口(例如20022)与用户之间的连接socket
  3. socketLan: 客户端进程与本地需要监听的端口(例如22)建立的通信socket

转发事件与转发消息

  1. 转发事件: 指的是信息交互socket接收到接收事件的指令,将接收到的消息进行拆解成消息头和消息体,在消息头中找出转发socket标志,解析出需要转发到所需的目标端口,然后将消息体转发给该端口
  2. 转发消息: 指的是普通端口socket接收到的消息,将该消息添加一个消息头,消息头中携带socket标志,将打包封装的消息转发给用于信息交互的socket

加密

AES对称加密

  1. 对于登录事件 对密码\各端口号进行加密、解密,密码长度,端口数量不加密
  2. 对于收到转发事件 对携带的socket名称和消息体进行解密
  3. 对于转发消息 对携带的socket名称和消息体进行加密

maven

maven-shade-plugin maven-compiler-plugin负责项目编译; maven-shade-plugin负责最终的打包操作. 将所有依赖包打包

bug记录

1

长时间未使用时
client显示c2s依然是established,
但是server已经意外关闭了
造成client阻塞在read但无法检测到断开连接了
原因 服务端主机崩溃了,客户端是无法感知到的,在加上客户端没有开启 TCP keepalive,又没有数据交互的情况下,客户端的 TCP 连接将会一直处于 ESTABLISHED 连接状态,当服务端正常上线后,还会依然阻塞在读取而不会关闭连接 解决:增加心跳检测

liangnat's People

Contributors

liangyang666 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.