现在我们的实验环境位于局域网中,所以外网无法访问。我们的网络处于运营商的层层叠叠的NAT下,所以家用宽带有公网IP地址的情况很少。那么怎么才能向他人展示我们的研究成果呢?
这里我们就会用到一款优秀的内网穿透工具:Frp。Frp可以实现Tcp-Tcp等等多种穿透,而且性能不错,所以我们就选择Frp来发送本地的80端口。

由于Frp需要一台有公网IP地址的服务器,这里推荐一款免费的Frp软件。[https://www.natfrp.org] 比较稳定 而且有很多节点。
我真的不在打广告 我之前用过这个 真心不错 推荐给大家当然实录里还是会使用原版的Frp进行配置。

1. 建立Frp服务器(即Frps)

之前我购入了一台阿里云的学生机,只要9.5元/月,1c2g5m,非常实惠。详情https://promotion.aliyun.com/ntms/act/campus2018.html

这里我的服务器系统是Windows Server 2012 R2,若是Linux,配置雷同。

1.1 下载Frp

Frp的Github releases在此

根据自己需要,下载最新版本即可
这边我下载了https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_windows_amd64.zip
解包,发现有以下文件:

frpc.exe以及其配置
frps.exe以及其配置
systemd文件夹下的服务
我们服务端需要的就是一个frps.exe,上传到服务器任意文件夹。

1.2 Frps的配置

下面我们来创建配置文件。
压缩包下的frps_ful.ini可以给我们参考,我把内容+翻译写在下面。

# 注:一下所有配置里面,ip设为0.0.0.0即不指定,一般用这个不用改的
# [common] 是整体部分

[common]
bind_addr = 0.0.0.0
bind_port = 7000
# 这里设置了服务器的IP地址和端口号,可以根据实际情况修改。
# 当然还可以填入Ipv6的参数,例如"[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"

# 下面用到的Udp端口帮助你把信息从Nat中拿出来,实现穿透。
bind_udp_port = 7001

# udp port跑的是kcp协议,但是bind_port是TCP协议所以它可以与'bind_port'相同
# 如果删掉下面的一条,则在frps中禁用kcp
kcp_bind_port = 7000

# 指定代理将侦听的地址,默认值与bind_addr相同  我们的IP不断变化,所以不用这个(当然你想用我也难不住你)
# proxy_bind_addr = 127.0.0.1

# 如果你想用这个服务器来实现虚拟主机(也就是Http服务发送,需要绑定域名),在这里就可以指定Vhost出去的端口
# 下面两个端口号可以和bind_port一毛一样
# 当然我是搞不懂如果你改掉了这个  虚拟主机还有什么意义...
vhost_http_port = 80
vhost_https_port = 443

# 虚拟主机Http服务器响应超时设置,单位是秒,一般不设(可能你电脑比较垃圾 处理请求比较慢(???))
# vhost_http_timeout = 60

# 下面是控制面板的ip地址哦~
# 记住如果你想自定义ip地址的话,必须把服务器地址设的和这个一样哦~
# 如果你不设这些,就关掉控制台!
# 我个人觉得这个控制台没什么用处,只能显示出Frp的运行状态,所以..就开了吧!
dashboard_addr = 0.0.0.0
dashboard_port = 7500

# 下面是控制面板的账号和密码!
dashboard_user = admin
dashboard_pwd = admin

# 日志文件保存的目录!
log_file = ./frps.log

# Frps日志的保存模式!有trace, debug, info, warn, error,一般用info
log_level = info

# 最大的日志保存天数
log_max_days = 3

# 这项很重要!要设置的长、复杂些,对Frp有控制权!
token = FrpToken_ZhenTaMaShiHaoDongXi

# 心跳配置,不建议修改默认值呢
# heartbeat_timeout = 90

# 这是允许的Frp发送端口,按照实际情况设置。如果为空,则不限。
allow_ports = 2000-3000,3001,3003,4000-50000

# 下面这个变量设定了每个代理的最大Pool值,根据需要更改
max_pool_count = 5

# 下面这个东西定义了每一个Frp Client连接的最大端口数,可以根据需要限制。如果值是0,那么就不限制哦~
max_ports_per_client = 0

# 如果下面这个域名不是空的,而且泛解析指向了服务器,那么就可以在客户端中指定http/https的子域名。
subdomain_host = frps.com

# 如果重复使用Tcp流,请开启。默认是开启(???)
tcp_mux = true

# 下面可以设置默认的404页面。去掉注释就可以用
# custom_404_page = [Path]

上面的内容只是我自己的理解,可能不对,如有错,请大佬指出。
这边我就按照上面的默认设置保存成frps.ini,frps.exe -c frps.ini写入bat文件、运行,没有出错,访问ip:7500也正常。

来自阿里云学生机用户的提醒:放行端口时注意,有两种协议,一定要把udp port放开!

2.Frp客户端

2.1 Frp客户端的下载

依旧在Git上寻找并且下载客户端,我下载了https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz用于我的测试机。

wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz -O frp.tar.gz
tar -xf frp.tar.gz
mv ./frp*/* ./ && rm -rf ./frps*

这样就下载好了,只留下了frpc等文件。
Github在国内的速度真的感人...3k/s左右 反正下了很久

2.2 Frpc的配置

目录下依旧有一个Frpc_full.ini作为参考,这里我把具体格式写在下面。

# Common下是基础配置。
[common]
# 下面对应的填上Frp服务器的地址、端口,如果要用ipv6,方法同上。
server_addr = 0.0.0.0
server_port = 7000

# 如果你想用代理连接的话,用下面的代码
# http_proxy = http://user:[email protected]:8080
# http_proxy = socks5://user:[email protected]:1080

# 指定log文件所在之处
log_file = ./frpc.log

# log等级,这类设置都和上面的一样
log_level = info

log_max_days = 3

# 这个东西很重要,必须和Frp服务器填的一毛一样。
token = ********************

# 这是frpc的控制面板入口,按照喜好设置。
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

# 池大小,可以和Frps中匹配,一般不会设
pool_count = 5

# Tcp重复流,与Frps保持一致。(当然我不会设)
tcp_mux = true

# 设置下面的选项就可以把代理名直接改成 {你的名字}+{代理名字}
user = your_name

# 下面的设置可以让你第一次登陆服务器失败的时候终止Frp服务。这有助于防止烦死服务器。
login_fail_exit = true

# 连接服务器的方式,可以用tcp,websocket和kcp
protocol = tcp

# 设置下面的选项会启用tls连接服务器,可以加密传输。
tls_enable = true

# 设置下面的可以定义Frpc使用的DNS服务器地址。
# dns_server = 8.8.8.8

# 设置想要打开的Porxy
# start = ssh,dns

# 心跳设置,一般不设
# heartbeat_interval = 30
# heartbeat_timeout = 90




# 下面开始是穿透配置。[]内设置的是代理名称。如果你在前面的配置中设定了Yourname选项,那么你的代理会被更名为  你的名字+[]
[ssh]
# 有这几种协议选择。 tcp | udp | http | https | stcp | xtcp 酌情选择吧
type = tcp

# 设置要穿透的ip和端口,ip设本机就好
local_ip = 127.0.0.1
local_port = 22
# 设置加密,这样服务端和客户端之间传递信息会被加密。
use_encryption = false
# 下面的设置可以设置压缩,可以节省流量。
use_compression = false
# 设置在服务端要映射的端口,记得与最上面的配置照应。
remote_port = 6001
# frps将为同一组中的代理加载平衡连接
group = test_group
# 每组之间要有一样的秘钥
group_key = 123456
# 下面的设置用于检查运行状态,支持协议有'tcp'和'http'
health_check_type = tcp
# 设置超时时间
health_check_timeout_s = 3
# 设置重试最大次数,如果次数太多,会直接删掉Porxy
health_check_max_failed = 3
# 设置状态检查间隔
health_check_interval_s = 10



# 注明:
# 如果在remote_port中设值为0,则会分配一个随机端口给你。

#下面还有一些示例,这里我就不一一说明了。(因为我用不到)
#我会在文末展示出来的。

这边我就编辑我的frpc.ini,具体如下:

[common]
server_addr = ***
server_port = 7000
token = ***
log_file = ./frpc.log
log_level = info
log_max_days = 3
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = ***
admin_pwd = ***
user = test_centosvm1
login_fail_exit = true

[http-80]
type = tcp
local_ip = 127.0.0.1
local_port = 80
use_encryption = true
remote_port = 7607

好了,也就是把本地的80端口映射到服务器上的7607端口上。
下面我们编写一个启动脚本

./frpc -c ./frpc.ini

一般我们会使用screen守护进程,由于其可以保证进程在ssh退出后继续运行,还可以随时切入,管理。
首先安装screen,然后新建一个socket并且运行脚本。

yum install screen -y
screen -S frp -S
./***.sh

这样就可以了。
由于我们设置了log,所以在控制台不会有输出。这边我们关掉这个ssh连接,再开一遍,连上控制台看看。
访问ip:7400,输入密码
frpc
可以看到我们设置的Porxy已经在跑了。
我们先来看一下本地访问的状况。ssh输入:

curl 127.0.0.1

可以看到输出了Hello World。下面我们访问服务端的7607端口试一下:

success

输出了Hello World!大功告成!

文末补充

  • 关于Frpc的控制面板
    推荐开启!可以非常方便的变更配置!
  • 一些Frpc的其他示例
# frpc will generate multiple proxies such as 'tcp_port_6010', 'tcp_port_6011' and so on.
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 6010-6020,6022,6024-6028
remote_port = 6010-6020,6022,6024-6028
use_encryption = false
use_compression = false

[dns]
type = udp
local_ip = 114.114.114.114
local_port = 53
remote_port = 6002
use_encryption = false
use_compression = false

[range:udp_port]
type = udp
local_ip = 127.0.0.1
local_port = 6010-6020
remote_port = 6010-6020
use_encryption = false
use_compression = false

# Resolve your domain names to [server_addr] so you can use http://web01.yourdomain.com to browse web01 and http://web02.yourdomain.com to browse web02
[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = false
use_compression = true
# http username and password are safety certification for http protocol
# if not set, you can access this custom_domains without certification
http_user = admin
http_pwd = admin
# if domain for frps is frps.com, then you can access [web01] proxy by URL http://test.frps.com
subdomain = web01
custom_domains = web02.yourdomain.com
# locations is only available for http type
locations = /,/pic
host_header_rewrite = example.com
# params with prefix "header_" will be used to update http request headers
header_X-From-Where = frp
health_check_type = http
# frpc will send a GET http request '/status' to local http service
# http service is alive when it return 2xx http response code
health_check_url = /status
health_check_interval_s = 10
health_check_max_failed = 3
health_check_timeout_s = 3

[web02]
type = https
local_ip = 127.0.0.1
local_port = 8000
use_encryption = false
use_compression = false
subdomain = web01
custom_domains = web02.yourdomain.com
# if not empty, frpc will use proxy protocol to transfer connection info to your local service
# v1 or v2 or empty
proxy_protocol_version = v2

[plugin_unix_domain_socket]
type = tcp
remote_port = 6003
# if plugin is defined, local_ip and local_port is useless
# plugin will handle connections got from frps
plugin = unix_domain_socket
# params with prefix "plugin_" that plugin needed
plugin_unix_path = /var/run/docker.sock

[plugin_http_proxy]
type = tcp
remote_port = 6004
plugin = http_proxy
plugin_http_user = abc
plugin_http_passwd = abc

[plugin_socks5]
type = tcp
remote_port = 6005
plugin = socks5
plugin_user = abc
plugin_passwd = abc

[plugin_static_file]
type = tcp
remote_port = 6006
plugin = static_file
plugin_local_path = /var/www/blog
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc

[plugin_https2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1

[secret_tcp]
# If the type is secret tcp, remote_port is useless
# Who want to connect local port should deploy another frpc with stcp proxy and role is visitor
type = stcp
# sk used for authentication for visitors
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false

# user of frpc should be same in both stcp server and stcp visitor
[secret_tcp_visitor]
# frpc role visitor -> frps -> frpc role server
role = visitor
type = stcp
# the server name you want to visitor
server_name = secret_tcp
sk = abcdefg
# connect this address to visitor stcp server
bind_addr = 127.0.0.1
bind_port = 9000
use_encryption = false
use_compression = false

[p2p_tcp]
type = xtcp
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false

[p2p_tcp_visitor]
role = visitor
type = xtcp
server_name = p2p_tcp
sk = abcdefg
bind_addr = 127.0.0.1
bind_port = 9001
use_encryption = false
use_compression = false
Last modification:July 18th, 2019 at 07:23 pm
如果我的文章对你有帮助,请赞助我吧~