这里我们就会用到一款优秀的内网穿透工具:Frp。Frp可以实现Tcp-Tcp等等多种穿透,而且性能不错,所以我们就选择Frp来发送本地的80端口。
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
也正常。
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
,输入密码
可以看到我们设置的Porxy已经在跑了。
我们先来看一下本地访问的状况。ssh输入:
curl 127.0.0.1
可以看到输出了Hello World
。下面我们访问服务端的7607端口试一下:
输出了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
不多说,转载了
给你留个版权
|´・ω・)ノ
ヾ(≧∇≦*)ゝ