如何使用Frp进行内网穿透,自建穿透服务器,frp配置toml文件。穿透本地的ssh和网站。

很多东西,在如今,都由各大寡头公司垄断。

但是,依旧有很多人选择 “自己种田,自己自足” 。因以摆脱寡头和付费套餐的监控与枷锁。

我有一台公网的服务器,一台内网的主机。如何使用Frp快速地穿透到外网去呢?

正文

你需要一台拥有公网地址的主机,无论是Windows,Linux还是Mac,甚至是安卓都好,只要官方有支持就行。(Frps服务端和Frpc客户端都在一个压缩包里)

releases

下载地址 Github

官方项目地址:https://github.com/fatedier/frp
官方文档地址:https://gofrp.org/zh-cn/

frp的功能很多很丰富,但本文只专注于内网穿透,ssh公网连接到内网,和网页穿透这一点。

Frps 服务端

下载与配置

由于我是 Linux – x86(amd64) 的服务器,所以我就在服务器去下载对应的 frp_0.64.0_linux_amd64.tar.gz。(要分清楚你的架构是什么,目前x86平台,基本都是amd64的服务器-64位)。

# 注意版本号
wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz        # 下载
tar -zxvf frp_0.64.0_linux_amd64.tar.gz         # 解压
mv frp_0.64.0_linux_amd64 frp           # 目录不好记名字,改个名字
cd frp              # 进入目录
rm -rf LICENSE frpc frpc.toml           # 删除客户端相关文件

完成后,ls 看看,估计就剩下 frpsfrps.toml 两个文件了。

我们编辑 frps.toml 文件:vim frps.toml

#bindPort = 7000
bindPort = 7020                 # frp沟通端口,建议修改。有防火墙的话,记得放行。

# 服务面板可查看frp服务状态信息
webServer.addr = "0.0.0.0"      # 后台管理地址,默认是127.0.0.1,如果是公网访问则改成0.0.0.0,否则可能绑定不上公网IP
webServer.port = 7050           # 后台管理端口(浏览器上,IP+此端口 访问Web管理页)
webServer.user = "admin"        # (可选)Web后台登录用户名
webServer.password = "JbkIp7mzrjJK" # (可选)Web后台登录密码


#transport.tls.force = true  # 服务端将只接受 TLS链接
auth.method = 'token'       # 客户端访问验证方式
auth.token = "cxrCISjm"     # 客户端访问验证密码(自己取),frpc要与frps一致,不然不让连接


# 自定义的监听的端口,所有对服务器该端口访问将被转发到本地内网,做了反向代理可不处理防火墙放行
#vhostHTTPPort = 8000
#vhostHTTPSPort = 45443

启动 frps

建议第一次启动,先前台启动,可以看到连接日志。通过下面命令可以启动:

./frps -c ./frps.toml

# ./frps -c ./frps.toml &       # 后台启动,ssh关闭后依旧可用。但不建议,不好管理。

Frps-Start

Frps-Web

守护进程在文尾


Frpc 客户端 (服务器放行相关端口了吗?)

我的内网客户端是一台 Arm-x64 架构的 Linux系统 开发版,运行了一个网页。我希望穿透网页和ssh。(要分清楚你的架构是什么,同时,arm也分32/64位)。

下载与配置

下载太慢的话,可以用代理的电脑下载完,之后把文件scp上去没有代理的主机。

wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_arm64.tar.gz        # 下载
tar -zxvf frp_0.64.0_linux_arm64.tar.gz     # 解压
mv frp_0.64.0_linux_arm64 frp           # 目录不好记名字,改个名字
cd frp              # 进入目录
rm -rf LICENSE frps frps.toml           # 删除服务端相关文件

完成后,ls 看看,估计就剩下 frpcfrpc.toml 两个文件了。

我们编辑 frpc.toml 文件:vim frpc.toml

serverAddr = "xxx.xxx.xxx.xxx"      # 这里填服务器Frps的IP
serverPort = 7020                   # 这里填服务器的Frp沟通端口
auth.method = 'token'           # 服务端设置的验证方法
auth.token = 'cxrCISjm'         # 服务端设置的密码

[[proxies]]                         # 标准写法,下面是一个块
name = "ssh"                # 在服务器看到的连接信息
type = "tcp"                # 数据类型
localIP = "127.0.0.1"   # 本主机IP,也就是127.0.0.1(穿透自己)
localPort = 22              # SSH 端口
remotePort = 6000       # 让服务器给 6000 这个端口“我”用

[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
# Nginx 默认的网页端口,如果你有多个网页,可以用不同端口。
# 或者干脆docker(docker暴露的端口每个都不一样)
remotePort = 6001

启动 frpc

建议第一次启动,先前台启动,可以看到连接日志。通过下面命令可以启动:

./frpc -c ./frpc.toml

# ./frpc -c ./frpc.toml &       # 后台启动,ssh关闭后依旧可用。但不建议,不好管理。

我没有启动内网Web页面的穿透,只穿透了ssh

Frps 服务端日志
frps-log

Frps 服务端 Web
frps-web

Frpc 客户端日志
frpc-log


守护进程

但是上面的方法并不稳定,所以我们需要分别给服务端和客户端书写一个守护进程。

Frps 服务器

vim /etc/systemd/system/frps.service
[Unit]
Description = frp server        # 服务名称,可自定义
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动命令,改为你实际存放frps的路径,但是一般默认这个目录
ExecStart = /root/frp/frps -c /root/frp/frps.toml

[Install]
WantedBy = multi-user.target

保存后,我们重载配置文件: systemctl reload

之后设置开机启动: systemctl enable --now frps

看看状态: systemctl status frps

可以看到,服务正常启动

frps-status

之后客户端也成功再次连接上了

frpc-log

Frpc 客户端 (服务器放行相关端口了吗?)

我们需要为客户端也写一个守护进程,和上面差不多,做一些小改变即可。

vim /etc/systemd/system/frpc.service
[Unit]
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 这里需要修改 frps为c
ExecStart = /root/frp/frpc -c /root/frp/frpc.toml

[Install]
WantedBy = multi-user.target

保存后,我们重载配置文件: systemctl reload

之后设置开机启动: systemctl enable –now frpc

看看状态: systemctl status frpc

成功:
frpc-status


测试 (服务器放行相关端口了吗?)

ssh

之后我们连接这个ssh试试,也就是上面设置的 6000 端口

服务器IP + 6000 ,就可以连接上内网这台服务器的ssh了

成功:
ssh

Web

刚刚我们假设了一个网页,配置如下

...
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
# Nginx 默认的网页端口,如果你有多个网页,可以用不同端口。
# 或者干脆docker(docker暴露的端口每个都不一样)
remotePort = 6001

使用了服务器的6001端口,如果你想访问这个网页,就只有在浏览器访问 服务器IP+6001 了。所以我们其实可以做一个反向代理,在服务器上面。

apt install nginx       # 你的服务器有nginx吗?
vim /etc/nginx/conf.d/web.conf

配置如下:

server {
    listen 80;

    # 你的域名,或者你服务器的 IP 地址
    server_name xxx.com;

    # 反向代理块
    location / {
        # 将请求转发到你后端应用的地址和端口,也就是本地IP+6001
        proxy_pass http://localhost:6001;

        # 保持客户端的真实IP地址,这样后端日志会更准确
        proxy_set_header X-Real-IP remote_addr;
        proxy_set_header X-Forwarded-Forproxy_add_x_forwarded_for;
    }
}

之后检查配置文件没问题就重载nginx即可

nginx -t
nginx -s reload

之后就可以通过域名访问此“内网网页”了。至于证书申请,就不赘述了,看我之前的文章。


参考

官方文档 – https://gofrp.org/zh-cn/

isedu-Blog – https://isedu.top/index.php/archives/278/

iyatt-Blog – https://blog.iyatt.com/?p=17340


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注