内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。目前较为成熟稳定的是花生壳和神卓互联,花生壳的技术是PHtunnel,神卓互联使用的是WanGooe tunnel,和nginx架构一样都是采用C语言编写,性能上是比较优异的,适合很多嵌入式的设备搭载使用,而frp采用的是Go语言。
UDP 内网穿透的实质是利用路由器上的NAT 系统。NAT 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐蔽。
网络地址转换(Network Address Translation,NAT)机制的问题在于,NAT设备自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了一定困难。Internet上的NAT设备大多是地址限制圆锥形NAT或端口限制圆锥形 NAT,外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使 NAT设备产生一个映射条目,这就有必要研究一下内网穿透技术。
根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。
将 frps 及 frps.ini 放到具有公网 IP 的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上。
# frps.ini
[common]
bind_port = 1000
./frps -c ./frps.ini
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 1000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
./frpc -c ./frpc.ini
ssh -oPort=6000 test@x.x.x.x
# frps.ini
[common]
bind_port = 1000
vhost_http_port = 8080
./frps -c ./frps.ini
www.yourdomain.com
:# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 1000
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
./frpc -c ./frpc.ini
将 www.yourdomain.com
的域名 A 记录解析到 IP x.x.x.x
,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。
通过浏览器访问 http://www.yourdomain.com:8080
即可访问到处于内网机器上的 web 服务。
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# 要对外暴露的文件目录
plugin_local_path = /tmp/file
# 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
http://x.x.x.x:6000/static/
来查看位于 /tmp/file
目录下的文件,会要求输入已设置好的用户名和密码。通过 https2http
插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000
[test_htts2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
# HTTPS 证书相关的配置
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
https://test.yourdomain.com
即可。# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000
[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000
[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000
ssh -oPort=6000 test@127.0.0.1
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000
[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000
frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。
使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。
目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。
bind_udp_port = 7001
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[p2p_ssh]
type = xtcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[p2p_ssh_visitor]
type = xtcp
# xtcp 的访问者
role = visitor
# 要访问的 xtcp 代理的名字
server_name = p2p_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000
ssh -oPort=6000 test@127.0.0.1
由于 frp 目前支持的功能和配置项较多,未在文档中列出的功能可以从完整的示例配置文件中发现。
frps 完整配置文件
frpc 完整配置文件
export FRP_SERVER_ADDR="x.x.x.x"
export FRP_SSH_REMOTE_PORT="6000"
./frpc -c ./frpc.ini
frpc 会自动使用环境变量渲染配置文件模版,所有环境变量需要以 .Envs
为前缀。
frp 支持根据请求的 URL 路径路由转发到不同的后端服务。
通过配置文件中的 locations
字段指定一个或多个 proxy 能够匹配的 URL 前缀(目前仅支持最大前缀匹配,之后会考虑正则匹配)。例如指定 locations = /news
,则所有 URL 以 /news
开头的请求都会被转发到这个服务。
# frpc.ini
[web01]
type = http
local_port = 80
custom_domains = web.yourdomain.com
locations = /
[web02]
type = http
local_port = 81
custom_domains = web.yourdomain.com
locations = /news,/about
按照上述的示例配置后,web.yourdomain.com
这个域名下所有以 /news
以及 /about
作为前缀的 URL 请求都会被转发到 web02,其余的请求会被转发到 web01。
在只能通过代理访问外网的环境内,frpc 支持通过 HTTP PROXY 和 frps 进行通信。
可以通过设置 HTTP_PROXY
系统环境变量或者通过在 frpc 的配置文件中设置 http_proxy
参数来使用此功能。
仅在 protocol = tcp
时生效。
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080
在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。
这一功能通过 range:
段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。
例如要映射本地 6000-6005, 6007 这6个端口,主要配置如下:
# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007
实际连接成功后会创建 8 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_7
。
默认情况下,frpc 只会转发请求到本地 tcp 或 udp 端口。
插件模式是为了在客户端提供更加丰富的功能,目前内置的插件有 unix_domain_socket
、http_proxy
、socks5
、static_file
。具体使用方式请查看使用示例。
通过 plugin
指定需要使用的插件,插件的配置参数都以 plugin_
开头。使用插件后 local_ip
和 local_port
不再需要配置。
内网穿透是我们在进行网络连接时的一种术语,也叫做NAT穿透,内网穿透的功能就是,当我们在端口映射时设置时,内网穿透起到了地址转换的功能。 内网穿透的原理很简单的说就是: 两台计算机A和B都处于不同的局域网中,A想要访问B, 就需要通过一台服务器做桥接的,桥接的方式有两种,一种是服务器相互转发流量 到A和B,另一种是告诉对方公网IP地址,自己充当一个介绍人的角色, 专业术语叫DNAT目标地址转换。
蜻蜓映射(内网穿透) 蜻蜓映射是内网穿透,端口映射的软件服务商。支持HTTP、HTTPS、TCP、UDP、等多种协议。无需设置路由器端口映射即可外网访问内网服务器。适用于远程桌面、 远程服务器、远程办公、游戏联机、微信开发调试等内网穿透场景。 官方地址 frp frp是一个高性能反向代理应用程序,它支持内网穿透、提供外网服务、支持tcp、http、https等协议 github项目地址 ngrok
今日,蜻蜓映射内网穿透发布了客户端v3.6.0版本。新版本极大简化了用户操作。蜻蜓映射内网穿透客户端v3.6.0主要更新有: 实时流量显示 界面优化 开放http/https映射 流量计费服务动态调整带宽 实时流量显示 以往用户只能通过客户端查看所有映射使用的总流量,现在蜻蜓映射内网穿透可以查看每条映射的流量使用情况。 界面优化 如下图: 开放http/https映射 这是此次更新的一大亮点, 客
我司是做硬件网管设备的。想通过openvpn实现内网穿透,不仅要实现对网关本身的透传,也要支持对能和网关通信的直连设备、局域网设备等进行直接透传操作。 举个例子: 正常情况下 S、A、B之间是可以互相访问的,但是如何做才能实现 A、C 之间也能通信?
本文向大家介绍SSH端口转发实现内网穿透的实现,包括了SSH端口转发实现内网穿透的实现的使用技巧和注意事项,需要的朋友参考一下 我们局域网的机器能够访问外网,但是外网不能访问内网。因为内网访问互联网时候能确定外网的地址,外网却不能确定我们局域网内的具体地址。(ip地址有限)如果 我们在访问外网的时候,这个链接让他保持、不断,那么这个链接就相当于我们建了一条路,内网数据能出去,外网数据能进来,ssh
本文向大家介绍详解基于docker搭建lanproxy内网穿透服务,包括了详解基于docker搭建lanproxy内网穿透服务的使用技巧和注意事项,需要的朋友参考一下 文档更新说明 2018年04月06日 v1.0 内网穿透相信是后端开发者经常遇到的需求,可是怎么实现呢?其实有现成的服务:花生壳、ngrok等,但是,最近花生壳宣布,免费版的内网穿透将不支持80端口映射了,而免费版的ngrok也不够