为什么需要内网穿透功能

从公网中访问自己的私有设备向来是一件难事儿。
自己的主力台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。
我有一台计算机位于一个很复杂的局域网中,我想要实现远程桌面和文件访问,目前来看其所处的网络环境很难通过简单的端口映射将其暴露在公网之中,我试过这么几种方法:

  1. 远程桌面使用TeamViewer。可用,但需要访问端也拥有TeamViewer软件,不是很方便,希望能使用Windows自带的远程桌面。且TeamViewer不易实现远程文件访问。

  2. 使用蒲公英VPN软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。

  3. 使用花生壳软件进行DDNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。

  4. 搭建frp服务器进行内网穿透,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享。

frp是什么

简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。
截至本文完成,frp的最新版本为v0.22.0,本文使用最新版本。

准备工作

搭建一个完整的frp服务链,我们需要

  1. VPS一台(也可以是具有公网IP的实体机)

  2. 访问目标设备(就是你最终要访问的设备)

  3. 简单的Linux基础(会用cp等几个简单命令即可)

VPS相关

  • 因为frp的原理是利用服务端(所准备的VPS)进行转发,因而VPS的速度直接决定了之后连接的质量,请根据自己的需要选择相应主机配置。

  • 我使用了DigitalOcean的新加坡机房,北京移动、中国教育网下测试速度尚可。

  • 系统使用Ubuntu 16.04.5 x64,frp客户端和服务端本身同时均支持Linux和Windows,且配置方法一样,请根据实际环境自行测试,如果你是新建的VPS,那选择Ubuntu 16.04.5 x64就可以了。

服务端设置

SSH连接到VPS之后运行如下命令查看处理器架构,根据架构下载不同版本的frp
arch
查看结果,如果是“X86_64“即可选择”amd64”,
运行如下命令,根据架构不同,选择相应版本并进行下载
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
然后解压
tar -zxvf frp_0.22.0_linux_amd64.tar.gz
文件夹改个名,方便使用
cp -r frp_0.22.0_linux_amd64 frp
把解压出来的文件夹复制到你想要的目录下,为了方便我直接放在用户目录下了,进入该目录
cd frp
查看一下文件
ls -a
我们只需要关注如下几个文件

  • frps

  • frps.ini

  • frpc

  • frpc.ini

前两个文件(s结尾代表server)分别是服务端程序和服务端配置文件,后两个文件(c结尾代表client)分别是客户端程序和客户端配置文件。
因为我们正在配置服务端,可以删除客户端的两个文件
rm frpc
rm frpc.ini
然后修改frps.ini文件
vim frps.ini
这个文件应有如下格式

[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443

如果没有必要,端口均可使用默认值,token、user和password项请自行设置。

  • “bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。

  • “dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。

  • “token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。

  • “dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。

  • “vhost_http_port”和“vhost_https_port”用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。

编辑完成后保存(vim保存如果不会请自行搜索)。
之后我们就可以运行frps的服务端了
./frps -c frps.ini
如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。

2019/01/12 15:22:39 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000
2019/01/12 15:22:39 [I] [service.go:172] http service listen on 0.0.0.0:10080
2019/01/12 15:22:39 [I] [service.go:193] https service listen on 0.0.0.0:10443
2019/01/12 15:22:39 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500
2019/01/12 15:22:39 [I] [root.go:210] Start frps success

此时访问 x.x.x.x:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面

frp服务端仪表板界面frp服务端仪表板界面


服务端后台运行

至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用 nohup命令将其运行在后台。

nohup后台程序管理或关闭相关命令可自行查询资料,上面这个连接中也有所提及。

nohup ./frps -c frps.ini &
输出如下内容即表示正常运行

nohup: ignoring input and appending output to 'nohup.out'

此时可先使用Ctrl+C关闭nohup,frps依然会在后台运行,使用jobs命令查看后台运行的程序
jobs
在结果中我们可以看到frps正在后台正常运行

[1]+  Running                 nohup ./frps -c frps.ini &

此时访问 x.x.x.x:7500 依然可以打开仪表板界面,至此,服务端即设置完成,你可以关闭SSH窗口了。

客户端设置

frp的客户端就是我们想要真正进行访问的那台设备,大多数情况下应该会是一台Windows主机,因而本文使用Windows主机做例子;Linux配置方法类似,不再赘述。

同样地,根据客户端设备的情况选择相应的frp程序进行下载,Windows下下载和解压等步骤不再描述。
假定你下载了“frp_0.22.0_windows_amd64.zip”,将其解压在了C盘根目录下,并且将文件夹重命名为“frp”,可以删除其中的frps和frps.ini文件。
用文本编辑器打开frpc.ini,与服务端类似,内容如下。

[common]
server_addr = x.x.x.x
server_port = 7000
token = won517574356
[rdp]
type = tcp
local_ip = 127.0.0.1           
local_port = 3389
remote_port = 7001  
[smb]
type = tcp
local_ip = 127.0.0.1
local_port = 445
remote_port = 7002

其中common字段下的三项即为服务端的设置。

  • “server_addr”为服务端IP地址,填入即可。

  • “server_port”为服务器端口,填入你设置的端口号即可,如果未改变就是7000

  • “token”是你在服务器上设置的连接口令,原样填入即可。

自定义规则

frp实际使用时,会按照端口号进行对应的转发,原理如下图所示。

frp的原理frp的原理
上面frpc.ini的rdp、smb字段都是自己定义的规则,自定义端口对应时格式如下。


  • “[xxx]”表示一个规则名称,自己定义,便于查询即可。

  • “type”表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册。

  • “local_port”是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。

  • “remote_port”是该条规则在服务端开放的端口号,自己填写并记录即可。

RDP,即Remote Desktop 远程桌面,Windows的RDP默认端口是3389,协议为TCP,建议使用frp远程连接前,在局域网中测试好,能够成功连接后再使用frp穿透连接。

SMB,即Windows文件共享所使用的协议,默认端口号445,协议TCP,本条规则可实现远程文件访问。

配置完成frpc.ini后,就可以运行frpc了

frpc程序不能直接双击运行!

使用命令提示符或Powershell进入该目录下
cd C:\frp
并执行
./frpc -c frpc.ini
运行frpc程序,窗口中输出如下内容表示运行正常。

2019/01/12 16:14:56 [I] [service.go:205] login to server success, get run id [2b65b4e58a5917ac], server udp port [0]
2019/01/12 16:14:56 [I] [proxy_manager.go:136] [2b65b4e58a5917ac] proxy added: [rdp smb]
2019/01/12 16:14:56 [I] [control.go:143] [smb] start proxy success
2019/01/12 16:14:56 [I] [control.go:143] [rdp] start proxy success

不要关闭命令行窗口,此时可以在局域网外使用相应程序访问 x.x.x.x:xxxx (IP为VPS的IP,端口为自定义的remote_port)即可访问到相应服务。

客户端后台运行及开机自启

frpc运行时始终有一个命令行窗口运行在前台,影响美观,我们可以使用一个批处理文件来将其运行在后台,而且可以双击执行,每次打开frpc不用再自己输命令了。
在任何一个目录下新建一个文本文件并将其重命名为“frpc.bat”,编辑,粘贴如下内容并保存。

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:\frp
frpc -c frpc.ini
exit

将cd后的路径更改为你的frpc实际存放的目录。

之后直接运行这个 .bat 文件即可启动frpc并隐藏窗口(可在任务管理器中退出)。
至于开机启动,把这个 .bat 文件直接扔进Windows的开机启动文件夹就好了 :)
至此,客户端配置完成,之后就是你自己根据需要在frpc.ini后追加规则即可。
强烈建议你在使用frp直接测试内网穿透前,先在局域网内测试好相关功能的正常使用,并配置好可能会影响的Windows防火墙等内容,在内网调试通过后再使用frp进行内网穿透测试。


一.介绍

前面介绍了ngrok,也说了它的1.x版本具有一些Bug并且作者放弃了维护,那么,谁能够取代ngrok在内网穿透工具中的地位呢?我觉得frp也许可以,frp是fast reverse proxy的缩写,其可用于反向代理和内网穿透,支持tcp, udp, http, https 协议,这比ngrok还多了个udp。并且发布以来广受欢迎,积累了不少用户,作者也是很勤快,一直在修复bug和更新新特性。

并且,作者是个中国人,所以在GitHub上还有中文文档,写的还挺详细的,不过……不去看文档是很多人的特点,所以我这边还是记点东西来介绍下简单的安装和操作配置。

二.安装配置

frp提供了热门平台的程序文件,所以安装也变得比较简单了,我这边的是Linux 64位平台的,其它的请自己去下——>传送门

1

2

3

4

5

wgethttps://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz

tarxzffrp_0.12.0_linux_amd64.tar.gz

mvfrp_*/frps/usr/bin/

mkdir/etc/frp/

rm-rf frp_*

然后根据下面配置你自己改了填到配置文件中

1

vi/etc/frp/frps.ini

下面是我翻译的带说明的服务端配置文件,就这么凑和着看吧

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

[common]

#frp服务器监听地址,如果是IPV6地址必须用中括号包围

bind_addr=0.0.0.0

#frp服务器监听端口

bind_port=7000

 

#kcp的udp监听端口,如果不设那就不启用

#kcp_bind_port = 7000

#指定使用的协议,默认tcp,可选kcp

#protocol = kcp

 

#如果要使用vitual host,就必须设置

#vhost_http_port = 80

#vhost_https_port = 443

 

#Web后台监听端口

dashboard_port=7500

 

#Web后台的用户名和密码

dashboard_user=admin

dashboard_pwd=admin

 

#Web后台的静态资源目录,调试用的,一般不设

#assets_dir = ./static

 

#日志输出,可以设置为具体的日志文件或者console

log_file=/var/log/frps.log

 

#日志记录等级,有trace, debug, info, warn, error

log_level=info

#日志保留时间

log_max_days=3

 

#启用特权模式,从v0.10.0版本开始默认启用特权模式,且目前只能使用特权模式

#privilege_mode = true

 

#特权模式Token,请尽量长点且复杂

privilege_token=12345678

 

#特权模式允许分配的端口范围

privilege_allow_ports=2000-3000,3001,3003,4000-50000

 

#心跳超时,不用改

#heartbeat_timeout = 90

 

#每个代理可以设置的连接池上限

#max_pool_count = 5

 

#认证超时时间,一般不用改

#authentication_timeout = 900

 

#如果配置了这个,当你的模式为http或https时,就能设置子域名subdomain

#subdomain_host = frps.com

 

#是否启用tcp多路复用,默认就是true,不用管

#tcp_mux = true

在这个配置文件中老版本是可以不启用特权模式或者同时添加其它的section来在服务端配置其它的转发设置的,但是从v0.10.0版本开始后特权模式暂时是唯一可用的(因为方便,不用为了一个配置而既要改服务端又要改客户端)

在修改好服务端配置文件后,我们可以启用frp的服务端了

1

frps-c/etc/frp/frps.ini

然后服务端就OK了,下面开始配置客户端,客户端程序自己在GitHub上面下,各个平台的包里面frps是服务器,frpc就是客户端

配置文件如下,自己修改后保存为frpc.ini

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

[common]

#frp服务器地址

server_addr=1.2.3.4

#frp服务器端口

server_port=7000

#特权模式Token

privilege_token=12345678

#转发SSH

[ssh]

type=tcp

#可以指定为其它IP,默认是本地

#local_ip = 127.0.0.1

local_port=22

remote_port=6000

#启用加密

use_encryption=true

#启用压缩

use_compression=true

 

#转发Web

[web]

type=http

local_port=80

custom_domains=www.yourdomain.com

#修改header中的host

#host_header_rewrite = dev.yourdomain.com

#启用简单HTTP认证

#http_user = abc

#http_pwd = abc

#在服务端配置了subdomain_host的情况下用于自定义二级域名

#subdomain = test

#在存在多个相同域名的情况下通过请求的URL路由到不同的配置

#locations = /news,/about

 

#转发DNS请求

[dns]

type=udp

local_ip=8.8.8.8

local_port=53

remote_port=6000

 

#转发Unix域套接字(这儿是Docker)

[unix_domain_socket]

type=tcp

remote_port=6000

plugin=unix_domain_socket

plugin_unix_path=/var/run/docker.sock

 

#HTTP代理

[http_proxy]

type=tcp

remote_port=6000

plugin=http_proxy

#配置http代理的简单认证

#plugin_http_user = abc

#plugin_http_passwd = abc

以上是大部分的参考,如果你有啥需要的参照着改就行了

在Linux等平台下,执行如下命令就行

1

frpc-c/path/to/frpc.ini

而在Windows下,需要你创建一个frpc.exe的快捷方式,然后将参数加到快捷方式属性的目标那一栏的frpc.exe后面,也可以自己百度下如果将命令注册为系统服务来实现常驻

成功运行后,访问服务器的7500端口会有一个WebGUI,如下,显示当前的状态,左侧的Proxies里会显示客户端注册的各种转发规则

至于客户端这儿有日志提示是否连上服务器,是否成功启用配置啥的

总的来说还是挺好用的,比较期待以后还有啥新的功能_(:з」∠)_


图片
前言:

此教程可以教大家通过wifi(无线网络)把手机当成监控摄像头,在其他设备上进行监控。

把手机/平板放在宝宝的房间里(婴儿床附近),只要小孩醒了,就可以第一时间知道。如果小孩踢被子了,也可以发现,防止着凉喔!

不过用之前要记得把设备调成静音,免得通知声音打扰到小孩!


准备材料:
1. 手机 或 平板 一部(用于采集端)
2. 手机,平板或笔记本(用于监控端)
3. 设备支架和充电器
4. 家里的wifi(无线局域网)


安装过程:
1. 先在采集端和监控端的设备上(手机或平板,Android为例)
   下载和安装监控用的App:http://pan.baidu.com/s/1c05ZzSO (或者应用商店里搜索“IP摄像头”)
   安装好就可以看到手机上出现了“IP摄像头”的图标:

 

图片

 

2. 设置采集端
   我使用的是一台闲置的三星手机(也可用平板等其它Android设备)
   开启设备的wifi,并连上家里的无线网络
   然后打开App后点击“把手机变成IP摄像头”


图片
   

   能看到实时影像,就说明采集端启动成功了
   App右边显示的数据需要记录下来,一会用得着
    比如: 访问地址 “http://192.168.0.109:8081/”(这个IP地址每个人是不一样的),
               用户名“admin”,密码“admin”(这个是默认的,可以在设置中更改)


图片


3. 设置监控端
   以平板为例,同样安装好“IP摄像头”(也可不安装,方法后面说)


图片


   连上家里wifi后,打开“IP摄像头”,然后点击“添加远程IP摄像头”


图片


   然后输入之前采集端记录下来的数值(名字可以自己取,比如“宝宝房间”)


图片


   点击“确定”后,就可以看到宝宝房间已经在监控列表了


图片


   点击打开宝宝房间的监控,就可以访问到采集端实时传来的画面了


图片


采集端和监控端只要在同一无线局域网覆盖下,就可以看到实时影像


图片


4. 放置采集端
   选择一个合适的底座,把设备安全的放置在上面,并置于宝宝附近(不要离得太近),就搞定了!


图片


注意事项:

1. 采集端的手机/平板因为需要一直运行,所以会消耗很多电量,建议连接着充电器监控;强烈不建议使用山寨机,或者非原装电池,否则有可能发生安全事故,后果不堪设想。
2. 底座要稍微稳一点,不然会被乱动的宝宝碰倒,就没有办法监控了。
3. iPhone和iPad的监控方法类似,需要自行到App Store搜索“网络摄像头”之类的App安装,然后参考教程里的架设方法。
4. 监控端可以是手机,平板或者笔记本,并且不一定需要安装App,只需要打开浏览器,输入采集端里的那个IP地址,如“http://192.168.0.109:8081/”即可访问(IP里的冒号“:”和后面的端口号"8081"不可少)
5. 采集端可以一直开着,监控端想看的时候,打开App就可以监控,非常方便。


   另有任何疑问,可以发在评论,一起讨论!~


转载请注明出处:http://blog.sina.com.cn/s/blog_67f5326b0102uyv8.html 


ChangeStartMode Method of the Win32_Service Class


The ChangeStartMode  WMI class method modifies the start mode of a Win32_Service .
This topic uses Managed Object Format (MOF) syntax. For more information about using this method, see Calling a Method .

Syntax

MOF

uint32 ChangeStartMode(

  [in]  string 
);

Parameters

    StartMode
  •  [in]
  • Start mode of the Windows base service.

    ValueMeaning
    • Boot

    Device driver started by the operating system loader. This value is valid only for driver services.

    • System

    Device driver started by the operating system initialization process. This value is valid only for driver services.

    • Automatic

    Service to be started automatically by the Service Control Manager during system startup.(特别需要注意,在检索时间所检索到自启动服务的StartMode为Auto)

    • Manual

    Service to be started by the Service Control Manager when a process calls the StartService method.

    • Disabled

    Service that can no longer be started.

Return Value

Returns one of the values listed in the following table or any other value to indicate an error.

Return codeDescription
  • 0

Success

  • 1

Not Supported

  • 2

Access Denied

  • 3

Dependent Services Running

  • 4

Invalid Service Control

  • 5

Service Cannot Accept Control

  • 6

Service Not Active

  • 7

Service Request Timeout

  • 8

Unknown Failure

  • 9

Path Not Found

  • 10

Service Already Running

  • 11

Service Database Locked

  • 12

Service Dependency Deleted

  • 13

Service Dependency Failure

  • 14

Service Disabled

  • 15

Service Logon Failure

  • 16

Service Marked For Deletion

  • 17

Service No Thread

  • 18

Status Circular Dependency

  • 19

Status Duplicate Name

  • 20

Status Invalid Name

  • 21

Status Invalid Parameter

  • 22

Status Invalid Service Account

  • 23

Status Service Exists

  • 24

Service Already Paused


共享服务

-- 查看服务

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"

-- 设置启动类型

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"  changestartmode 'Manual'


https://blog.csdn.net/dongzhiquan/article/details/3956906

-- 启动服务

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"  call startservice


-- 停止服务

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"  call stopservice


方法执行成功。

外参数:

instance of __PARAMETERS

{

        ReturnValue = 0;  -- 成功,其他属于有异常情况

};