Thinkai's Blog

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

月份归档 2018 / 02

总共找到 3 篇

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

作者为 发表

网络路由

部分内容引用遇见,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为任意程序创建服务编写

通过srvany.exe为任意程序创建服务 393

作者为 发表

IT

首先,下载srvany.exe到任意目录,然后以管理员权限运行cmd,输入

sc create 服务名 binpath= "c:\xxxx\srvany.exe" start= auto

创建完成服务,然后打开注册表(regedit.exe),找到“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\服务名”项目

如果该服务名下没有Parameters项目,则对服务名称项目右击新建项,名称为Parameters,然后定位到Parameters项,新建以下几个字符串值。

名称 Application 值为你要作为服务运行的程序地址。

名称 AppDirectory 值为你要作为服务运行的程序所在文件夹路径。

名称 AppParameters 值为你要作为服务运行的程序启动所需要的参数。


当然也可以通过保存注册表*.reg文件双击导入配置:

Windows Registry Editor Version 5.00 
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名称\Parameters] 
"Application"="值为你要作为服务运行的程序地址"
"AppDirectory"="值为你要作为服务运行的程序所在文件夹路径"
"AppParameters"="值为你要作为服务运行的程序启动所需要的参数"


sc create的用法:

描述:

        在注册表和服务数据库中创建服务项。

用法:

        sc <server> create [service name] [binPath= ] <option1> <option2>…

 

选项:

注意: 选项名称包括等号。

      等号和值之间需要一个空格。

 type= <own|share|interact|kernel|filesys|rec>

       (默认 = own)

 start= <boot|system|auto|demand|disabled|delayed-auto>

       (默认 = demand)

 error= <normal|severe|critical|ignore>

       (默认 = normal)

 binPath= <BinaryPathName>

 group= <LoadOrderGroup>

 tag= <yes|no>

 depend= <依存关系(以 / (斜杠) 分隔)>

 obj= <AccountName|ObjectName>

       (默认 = LocalSystem)

 DisplayName= <显示名称>

 password= <密码>


json文本数据与obj互转 Autohotkey 369

作者为 发表

Autohotkey

ahk官方论坛转载

json_fromobj( obj ) {
	
	If IsObject( obj )
	{
		isarray := 0 ; an empty object could be an array... but it ain't, says I
		for key in obj
			if ( key != ++isarray )
			{
				isarray := 0
				Break
			}
		
		for key, val in obj
			str .= ( A_Index = 1 ? "" : "," ) ( isarray ? "" : json_fromObj( key ) ":" ) json_fromObj( val )
		
		return isarray ? "[" str "]" : "{" str "}"
	}
	else if obj IS NUMBER
		return obj
	;	else if obj IN null,true,false ; AutoHotkey does not natively distinguish these
	;		return obj
	
	; Encode control characters, starting with backslash.
	StringReplace, obj, obj, \, \\, A
	StringReplace, obj, obj, % Chr(08), \b, A
	StringReplace, obj, obj, % A_Tab, \t, A
	StringReplace, obj, obj, `n, \n, A
	StringReplace, obj, obj, % Chr(12), \f, A
	StringReplace, obj, obj, `r, \r, A
	StringReplace, obj, obj, ", \", A
	StringReplace, obj, obj, /, \/, A
	While RegexMatch( obj, "[^\x20-\x7e]", key )
	{
		str := Asc( key )
		val := "\u" . Chr( ( ( str >> 12 ) & 15 ) + ( ( ( str >> 12 ) & 15 ) < 10 ? 48 : 55 ) )
		. Chr( ( ( str >> 8 ) & 15 ) + ( ( ( str >> 8 ) & 15 ) < 10 ? 48 : 55 ) )
		. Chr( ( ( str >> 4 ) & 15 ) + ( ( ( str >> 4 ) & 15 ) < 10 ? 48 : 55 ) )
		. Chr( ( str & 15 ) + ( ( str & 15 ) < 10 ? 48 : 55 ) )
		StringReplace, obj, obj, % key, % val, A
	}
	return """" obj """"
}

json_toobj(str){
	
	quot := """" ; firmcoded specifically for readability. Hardcode for (minor) performance gain
	ws := "`t`n`r " Chr(160) ; whitespace plus NBSP. This gets trimmed from the markup
	obj := {} ; dummy object
	objs := [] ; stack
	keys := [] ; stack
	isarrays := [] ; stack
	literals := [] ; queue
	y := nest := 0
	
	; First pass swaps out literal strings so we can parse the markup easily
	StringGetPos, z, str, %quot% ; initial seek
	while !ErrorLevel
	{
		; Look for the non-literal quote that ends this string. Encode literal backslashes as '\u005C' because the
		; '\u..' entities are decoded last and that prevents literal backslashes from borking normal characters
		StringGetPos, x, str, %quot%,, % z + 1
		while !ErrorLevel
		{
			StringMid, key, str, z + 2, x - z - 1
			StringReplace, key, key, \\, \u005C, A
			If SubStr( key, 0 ) != "\"
				Break
			StringGetPos, x, str, %quot%,, % x + 1
		}
		;	StringReplace, str, str, %quot%%t%%quot%, %quot% ; this might corrupt the string
		str := ( z ? SubStr( str, 1, z ) : "" ) quot SubStr( str, x + 2 ) ; this won't
		
		; Decode entities
		StringReplace, key, key, \%quot%, %quot%, A
		StringReplace, key, key, \b, % Chr(08), A
		StringReplace, key, key, \t, % A_Tab, A
		StringReplace, key, key, \n, `n, A
		StringReplace, key, key, \f, % Chr(12), A
		StringReplace, key, key, \r, `r, A
		StringReplace, key, key, \/, /, A
		while y := InStr( key, "\u", 0, y + 1 )
			if ( A_IsUnicode || Abs( "0x" SubStr( key, y + 2, 4 ) ) < 0x100 )
				key := ( y = 1 ? "" : SubStr( key, 1, y - 1 ) ) Chr( "0x" SubStr( key, y + 2, 4 ) ) SubStr( key, y + 6 )
		
		literals.insert(key)
		
		StringGetPos, z, str, %quot%,, % z + 1 ; seek
	}
	
	; Second pass parses the markup and builds the object iteratively, swapping placeholders as they are encountered
	key := isarray := 1
	
	; The outer loop splits the blob into paths at markers where nest level decreases
	Loop Parse, str, % "]}"
	{
		StringReplace, str, A_LoopField, [, [], A ; mark any array open-brackets
		
		; This inner loop splits the path into segments at markers that signal nest level increases
		Loop Parse, str, % "[{"
		{
			; The first segment might contain members that belong to the previous object
			; Otherwise, push the previous object and key to their stacks and start a new object
			if ( A_Index != 1 )
			{
				objs.insert( obj )
				isarrays.insert( isarray )
				keys.insert( key )
				obj := {}
				isarray := key := Asc( A_LoopField ) = 93
			}
			
			; arrrrays are made by pirates and they have index keys
			if ( isarray )
			{
				Loop Parse, A_LoopField, `,, % ws "]"
					if ( A_LoopField != "" )
						obj[key++] := A_LoopField = quot ? literals.remove(1) : A_LoopField
			}
			; otherwise, parse the segment as key/value pairs
			else
			{
				Loop Parse, A_LoopField, `,
					Loop Parse, A_LoopField, :, % ws
						if ( A_Index = 1 )
							key := A_LoopField = quot ? literals.remove(1) : A_LoopField
				else if ( A_Index = 2 && A_LoopField != "" )
					obj[key] := A_LoopField = quot ? literals.remove(1) : A_LoopField
			}
			nest += A_Index > 1
		} ; Loop Parse, str, % "[{"
		
		If !--nest
			Break
		
		; Insert the newly closed object into the one on top of the stack, then pop the stack
		pbj := obj
		obj := objs.remove()
		obj[key := keys.remove()] := pbj
		If ( isarray := isarrays.remove() )
			key++
		
	} ; Loop Parse, str, % "]}"
	
	Return obj
}



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

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

46 queries in 1.031 seconds |