Thinkai's Blog

Autohoutkey|Python|php|aardio|VOIP|IT 爱好者

正在浏览分类 网络路由

总共找到 2 篇

LanProxy JAVA编写的内网穿透解决方案及详细说明 1059

作者为 发表

网络路由

部分内容引用遇见,http://www.zuidaima.com/share/3659323964050432.htm上发表的内容。

目前国内部分地区的宽带运营商已经不再提供公网IP地址的服务了,或者当服务环境在防火墙和路由器后面的私网的时候,我们就需要通过内网穿透(打洞)形式访问我们在私网部署的服务。

目前国内的服务商有花生壳和nat123,都是要收费且不能静默部署的,虚拟专用网络连接有的时候有和需求不符。目前开源的穿透方案有ngrok、n2n、lanproxy等,下面我们来介绍下lanproxy。

LanProxy(下载)是一个JAVA便携的内网穿透解决方案,开源地址:https://github.com/ffay/lanproxy

服务端支持linux/Windows,客户端支持linux/Windows和部分嵌入式系统(下载


环境:

    jdk1.7+

   一台外网服务器   有固定ip  这里假设外网ip为10.10.21.22   操作系统linux/windows

服务端配置步骤:

     1. 下载的zip文件解压出来, 打开proxy-server-0.1/conf/config.properties文件,ssl默认是开启的 服务端口4993 ,如果不需要的话可以改为false 服务端口4900。

       搭建自己的内网穿透服务器~

   2. 在proxy-server-0.1/bin目录   windows执行startup.bat    linux执行./startup.sh,   然后就可以在服务端8090端口访问了,账号密码就是config.properties里配置的admin/admin

搭建自己的内网穿透服务器~

  3.  进入网页后点击添加客户端,点击提交,记住客户端的秘钥。方便给客户端使用。可以建立多个客户端,到时候同事要用可以分配一个客户端就好。

搭建自己的内网穿透服务器~

   4. 添加客户端后  左侧导航栏会出现客户端名称,点击然后添加配置、

     代理名称可以描述一下你的服务  比如我要外放mysql服务  就叫mysqlservice好了

     公网端口就是你外网想访问的端口号 也就是外网服务器的某个端口号,配置多个的时候公网端口号不能重复配置。假如这里我外放27036接口

   后端ip端口就是你分配到那台客户端的ip和端口   ip固定127.0.0.1就好,端口根据实际情况,比如是外放mysql 那么就是127.0.0.1:3306

搭建自己的内网穿透服务器~

客户端配置步骤:

   1、 将proxy-client-0.1文件加拷贝到客户端机器上,linux/windows均可。

   2、 修改proxy-client-0.1/conf/config.properties文件

      这里的client.key 就是我们服务端配置的第3步得到的秘钥。

      ssl这里因为服务器是false  这里也配置false就好。

      server.host就是服务端的固定ip地址

  搭建自己的内网穿透服务器~

3. 配置完后在proxy-client-0.1/bin目录  windows执行startup.bat,  linux执行./startup.sh

  然后在服务端的网页的客户端列表里就可以看到客户端已经在线了。  

  这就说明内网穿透已经配置成功。

  然后你就可以使用10.10.21.22:27036的外网地址 访问到你本机的127.0.0.1:3306的本地数据库了。

  这里支持tcp的任何上层协议。

搭建自己的内网穿透服务器~


以上配置文件中的SSL配置说明:

ssl.jks:通过java的keytool生成的ssl证书,有管理密码和口令密码,生成方法详见百度经验

server.ssl.keyStorePassword=口令密码

server.ssl.keyManagerPassword=管理密码

服务端和客户端使用同一证书。


服务端web管理界面配置说明:

config.server.bind=0.0.0.0 (默认0.0.0.0 绑定特定网卡,填写改网卡IP)

config.server.port=8090 (web端口)

config.admin.username=admin (用户名)

config.admin.password=admin (密码)


JAVA环境说明:

需要java 1.7+环境,安装jre或者jdk后需要配置环境变量,具体方法可以搜索。

服务器是CentOS的话shell执行yum -y install java即可安装。

如果想免安装部署可以提取jre的目录到客户端或服务端目录,重命名成jre(和bin、conf同级),然后修改bin下的startup.bat(第一行后面添加三行):

@echo off & setlocal enabledelayedexpansion
setlocal
SET JAVA_HOME=..\jre\
SET PATH=%JAVA_HOME%\bin;


然后通过srvany.exe注册为服务就可以开机后台自动运行。方法详见通过srvany.exe为任意程序创建服务编写

#NoTrayIcon ;不显示图标
IfNotExist, 内外网双用路由.cmd ;检测文件是否存在
	{
	SplashTextOn, 200, 40, 提示, 获取网络信息中! ;悬浮窗口
	RunWait, %ComSpec% /c ipconfig /all >%A_Temp%\ip.tmp, , Hide ;获取ipconfig
	file = %A_Temp%\ip.tmp ;定义路径
	index = 8 ;定义FileReadLine起始行
	id = 0
	ip := Object() ;初始化数组
	gateway := Object()
	name := Object()
	Loop
	{
	index += 1
	FileReadLine, line, %file%, %index% ;循环读取每一行到line变量
	if errorlevel
		Break
	if line <>   ;不为空
		{
		line = `n%line%`n  ;加上首位界限
		head := RegExMatch(line, "\n[^\s].*\s.*:\n") ;正则表达式检测适配器标题
		if head = 1 ;如果是
			{
			id += 1 ;网卡id+1
			name[id] := RegExReplace(line, "\n([^\s].*):\n", "$1") ;正则替换获取适配器名称并添加到数组
			}
		Else
			{
			testip := RegExMatch(line, "\n.*(IPv4 地址|IP Address).*:\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.*\n") ;匹配有地址的ip
			testip2 := RegExMatch(line, "\n.*(IPv4 地址|IP Address).*:.*\n") ;匹配无地址的ip 地址为空的情况下
			testip3 = %testip%%testip2% ;连接两个变量
			if testip3 = 11
				ip[id] := RegExReplace(line, "\n.*(IPv4 地址|IP Address).*:\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*\n", "$2") ;获取ip并添加到数组
			if testip3 = 01
				ip[id] =
			testgw := RegExMatch(line, "\n.*(默认网关|Default Gateway).*:\s\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.*\n")
			testgw2 := RegExMatch(line, "\n.*(默认网关|Default Gateway).*:.*\n")
			testgw3 = %testgw%%testgw2%
			if testgw3 = 11
				gateway[id] := RegExReplace(line, "\n.*(默认网关|Default Gateway).*:\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*\n", "$2")
			if testip3 = 01
				gateway[id] =
			}
		}
	}
	SplashTextOff ;关闭悬浮窗口
	;创建界面
	gui, add, text, x0 y0 w720 h20, 请选择对应的网络适配器并分别设为内网、外网
	gui, add, text, x0 y20 w60 h20, 内网:
	gui, add, text, x60 y20 w300 h20 vnei,
	gui, add, text, x360 y20 w60 h20, 外网:
	gui, add, text, x420 y20 w300 h20 vwai,
	gui, add, button, x0 y40 w360 h20 gsetnei, 设为内网
	gui, add, button, x360 y40 w360 h20 gsetwai, 设为外网
	gui, add, ListView, x0 y60 w720 h100 vlist, ID|网卡名称|IP地址|默认网关
	gui, add, text, x0 y160 w720 h20, 静态路由设置(可复制到CMD直接执行或另存为.bat批处理 当然,下次打开程序会自动执行下面的路由的)
	gui, add, edit, x0 y180 w720 h50 vroute, route delete 0.0.0.0
	gui, add, button, x0 y230 w240 h20 gsubmit, 提交
	gui, add, button, x240 y230 w240 h20 gsexec, 提交并立即执行
	gui, add, button, x480 y230 w240 h20 ghelp, 帮助
	gui, show, , 内外网双用初始化设置 Powered by Thinkai
	;添加网卡信息到列表
	loop
	{
	if A_Index > %id% ;到头退出
		break
	n := name[A_Index] ;赋值临时名称
	i := ip[A_Index] ;赋值临时ip
	g := gateway[A_Index] ;赋值临时网关
	if i <>
		LV_Add("", A_Index, n, i, g) ;添加ip不为空的网卡信息 ""为图标
	}
	LV_ModifyCol() ;自动调整列宽
	}
Else
	{
	MsgBox, 4100, 询问, 请问是否继续设定好的信息执行内外网双用?, 5 ;5秒超时
	IfMsgBox, Yes ;选是
		goto, exec ;跳到exec标签
	IfMsgBox, Timeout ;超时
		goto, exec
	IfMsgBox, no ;选否
		{
		FileDelete, 内外网双用路由.cmd ;删除
		Reload ;重载
		}
	}
Return

setnei: ;设置内网
;获取选中行信息
FocusedRowNumber := LV_GetNext(0, "F")
if not FocusedRowNumber ;没有焦点
	{
	MsgBox, 4144, 提示, 您未选中任何网卡!
	Return
	}
LV_GetText(idx, FocusedRowNumber, 1) ;获取id
namen := name[idx] ;由id从数组读取值并赋值
ipn := ip[idx]
gwn := gateway[idx]
StringSplit, var, ipn, . ;用“.”分割ip
if gwn =
	{
	prompt = 该适配器没有默认网关,请手动输入!例如%var1%.%var2%.%var3%.1 ;变量化提示
	goto, setgwn
	}
if gwn = %gww%
	{
	prompt =  你的内外网为同一个网络适配器,请手动输入内网的网关!`n例如%var1%.%var2%.%var3%.1
	goto, setgwn
	}
GuiControl, , nei, %namen%
GuiControlGet, route ;获取路由编辑控件信息
StringSplit, nn, ipn, .
ipnn = %nn1%.0.0.0 ;内网路由
GuiControl, , route, %route%`nroute add %ipnn% mask 255.0.0.0 %gwn% ;追加路由到窗口
Return

setgwn:
InputBox, gwn, 设置内网网关, %prompt%, , 600, 200
testgwn := RegExMatch(gwn, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") ;检查ip格式
if testgwn = 0
	{
	prompt = 该适配器没有默认网关,请手动输入!例如%var1%.%var2%.%var3%.1
	MsgBox, 64, 提示, 网关格式错误!
	goto, setgwn
	}
if gwn = %gww%
	{
	prompt =  你的内外网为同一个网络适配器,请手动输入内网的网关!`n例如%var1%.%var2%.%var3%.1
	MsgBox, 64, 提示, 网关与外网网关相同,请重新填写!
	goto, setgwn
	}
GuiControl, , nei, %namen%
GuiControlGet, route
StringSplit, nn, ipn, .
ipnn = %nn1%.0.0.0
GuiControl, , route,  %route%`nroute add %ipnn% mask 255.0.0.0 %gwn%
Return

setwai:
FocusedRowNumber := LV_GetNext(0, "F")
if not FocusedRowNumber
	{
	MsgBox, 4144, 提示, 您未选中任何网卡!
	Return
	}
LV_GetText(idx, FocusedRowNumber, 1)
namew := name[idx]
ipw := ip[idx]
gww := gateway[idx]
StringSplit, var, ipw, .
if gww =
	{
	prompt = 该适配器没有默认网关,请手动输入!例如%var1%.%var2%.%var3%.1
	goto, setgww
	}
if gww = %gwn%
	{
	prompt =  你的内外网为同一个网络适配器,请手动输入外网的网关!`n例如%var1%.%var2%.%var3%.1
	goto, setgww
	}
GuiControl, , wai, %namew%
GuiControlGet, route
GuiControl, , route, %route%`nroute add 0.0.0.0 mask 0.0.0.0 %gww%
Return

setgww:
InputBox, gww, 设置外网网关, %prompt%, , 600, 200
testgww := RegExMatch(gww, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
if testgww = 0
	{
	prompt = 该适配器没有默认网关,请手动输入!例如%var1%.%var2%.%var3%.1
	MsgBox, 64, 提示, 网关格式错误!
	goto, setgwn
	}
if gwn = %gww%
	{
	prompt =  你的内外网为同一个网络适配器,请手动输入外网的网关!`n例如%var1%.%var2%.%var3%.1
	MsgBox, 64, 提示, 网关与内网网关相同,请重新填写!
	goto, setgww
	}
GuiControl, , wai, %namew%
GuiControlGet, route
GuiControl, , route, %route%`nroute add 0.0.0.0 mask 0.0.0.0 %gww%
Return


GuiClose:
ExitApp

exec:
RunWait, 内外网双用路由.cmd, ,Hide
ExitApp

submit:
GuiControlGet, route
if gww =
	{
	MsgBox, 64, 提示, 没有设置外网信息!
	Return
	}
if gwn =
	{
	MsgBox, 64, 提示, 没有设置内网信息!
	Return
	}
FileDelete, 内外网双用路由.cmd
FileAppend, %route%, 内外网双用路由.cmd
MsgBox, 64, 提示, 已经保存并生成“内外网双用路由.cmd”
if exec = 1
	RunWait, 内外网双用路由.cmd, ,Hide
exec = 0
Return

sexec:
exec = 1
goto, exec
Return

help:
MsgBox, 64, 帮助, 程序会帮你生成内外网双用的批处理,并在下次打开软件的时候提示你是否按设置好的信息执行。`n网关就相当于出口,内网和外网的出口是不一样的,有宽带连接的需要设置宽带连接的网关为外网网关。`n你也可以添加自定义路由在路由设置里面。
Return

内外网双用路由.zip



友情链接:Autohotkey中文论坛Autohotkey中文帮助Autohotkey官网我的B站直播间如若生涯一场梦博客联系作者免GooglePlay APK下载

 主题设计 • skyfrit.com  Thinkai's Blog | 保留所有权利

50 queries in 0.989 seconds |