Frp内网穿透

本文最后更新于:2024年9月16日 下午

两个问题

1.frps和frpc有什么区别?

s指的是server端,c指的是客户端

2.需要什么东西?

一个vps 或者别人已经搭好的免费的frp服务,比如ddnsto.com

如何利用VPS自建frp服务

1.frps服务端搭建

首先到 frp 的 releases 页面下载最新版的对应 VPS 的处理器架构的压缩包 https://github.com/fatedier/frp/releases 如何知道 VPS 的处理器架构?在 VPS 上运行这个命令:

1
arch

如果输出x86_64则需要下载带linux_amd64的那个压缩包; 如果输出的是其他的,则在文件列表中找 linux 的对应架构的压缩包 以x86_64架构举例(目前大多数都应该是这个架构)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd /root

# 下载
wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.18.0/frp_0.18.0_linux_amd64.tar.gz

# 解压
tar -xzvf frp_0.18.0_linux_amd64.tar.gz

# 文件夹名改成 frp,不然目录太长了不方便
mv frp_0.18.0_linux_amd64 frp
cd frp

# 确保 frps 程序具有可执行权限
chmod +x frps

然后试着运行一下frps,看看能否运行

1
./frps --help

正常情况下会输出一串帮助信息,那么就说明你下载了正确架构的版本 如果提示-bash: ./frps: cannot execute binary file: Exec format error就说明你下错版本了

2.配置frps服务器

参考以下配置说明来书写配置文件frps.ini,你可以先在电脑上打一份草稿 此处只解释说明一些必要和常用的配置,如需研究完整配置说明请看目录下的frps_full.ini,以及参考frp中文说明

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
# 下面这句开头必须要有,表示配置的开始
[common]

# frp 服务端端口(必须)
bind_port = 7000

# frp 服务端密码(必须)
token = 12345678

# 认证超时时间,由于时间戳会被用于加密认证,防止报文劫持后被他人利用
# 因此服务端与客户端所在机器的时间差不能超过这个时间(秒)
# 默认为900秒,即15分钟,如果设置成0就不会对报文时间戳进行超时验证
authentication_timeout = 900

# 仪表盘端口,只有设置了才能使用仪表盘(即后台)
dashboard_port = 7500

# 仪表盘访问的用户名密码,如果不设置,则默认都是 admin
dashboard_user = admin
dashboard_pwd = admin

# 如果你想要用 frp 穿透访问内网中的网站(例如路由器设置页面)
# 则必须要设置以下两个监听端口,不设置则不会开启这项功能
vhost_http_port = 10080
vhost_https_port = 10443

# 此设置需要配合客户端设置,仅在穿透到内网中的 http 或 https 时有用(可选)
# 假设此项设置为 example.com,客户端配置 http 时将 subdomain 设置为 test
# 则你将 test.example.com 解析到服务端后,可以使用此域名来访问客户端对应的 http
subdomain_host = example.com

然后把你的准备好的配置文件内容写入frps.ini

1
2
3
4
5
6
7
8
9
echo "[common]
bind_port = 7000
token = 12345678
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
subdomain_host = example.com" > frps.ini

试着启动一下frps

1
2
# 使用 -c 参数指定配置文件
./frps -c frps.ini

如果没有出现错误提示就说明配置没有问题,可以正常使用 接着按下Ctrl + C可以终止程序运行

3. 使 frps 在后台持续运行

启动 直接使用前面的命令行来运行是不行的,因为在关掉 ssh 窗口后程序frps就会停止运行,因此要使用nohup [command] &这种操作来使其在后台运行

1
nohup /root/frp/frps -c /root/frp/frps.ini &

并且程序的所有输出(日志)会被写入nohup.out文件中,你可以使用cat命令查看其内容

停止 想停止的话,结束frps即可

1
pkill frps

重启 那就先停止再启动

加入开机自启 编辑/etc/rc.local文件,将启动那句命令加到exit 0语句之前(如果有)

注意:debian9需要自行创建rc.local文件,详细看这https://sb.sb/blog/debian-9-rc-local/

4.配置frpc客户端

在梅林固件中,安装“frpc穿透”software,里面的配置对照第3步中的frps.ini进行配置即可,注意ac66u b1必须用虚拟内存软件,必须用虚拟内存软件,必须用虚拟内存软件,重要的事情说三遍 目前自己只是实现了udp的穿透形式:即 example.com:端口 进行穿透,当然首先需要将域名解析到frps服务器的ip

后记

这里只是记录自己目前实现的配置,感谢 https://moe.best/tutorial/frp.html 这个教程

更新于2021年5月4日

由于经过两年时间frp版本的更新,除了以上基本功能外,再记录两个有用的新特性:

安全暴露内网服务

对于某些服务来说如果直接暴露于公网上将会存在安全隐患。

使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端。

1.frps.ini 内容如下:

1
2
[common]
bind_port = 7000

2.在需要暴露到内网的机器上部署 frpc ,且配置如下:

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

3.在想要访问内网服务的机器上也部署 frpc ,且配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = x.x.x.x
server_port = 7000

[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

4.通过 SSH 访问内网机器,假设用户名为 test

1
ssh -p 6000 test@127.0.0.1
更多设置方式见示例

添加为系统服务

目前最新版的frp是0.36.2,下载下来以后其中有一个 systemd 文件夹,当中有文件 frps.servicefrpc.service

查看 frps.service 的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target
因此我们可以如下操作将frps添加为系统服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在下载解压后的frp文件夹内执行
cp frps /usr/bin
mkdir /etc/frp
cp frps.ini /etc/frp

#/etc/systemd/system或/lib/systemd/system是存放系统服务的文件夹
cp ./systemd/frps.service /etc/systemd/system

#激活系统服务
systemctl enable frps.service
#enable的作用就是创建了一个链接到/etc/systemd/system/multi-user.target文件夹

#测试启动服务
systemctl start frps.service
同理在客户端也可以将 frpc 设置为系统服务

参考文献:


Frp内网穿透
https://andyppang.github.io/2019/06/24/Frp内网穿透教程/
作者
PL
发布于
2019年6月24日
许可协议