有时候我们需要让内网的服务器允许访问,但是自己内网家庭常用带宽不是公网ip,没法直接访问IP,所以我们只能进行内网穿透,使用花生壳等软件是付费的,所以我们选择了frp作为内网穿透工具,配置如下,你需要的东西有:

  • 公网服务器,具有外网IP(如阿里云,腾讯云等服务器)
  • 内网服务器,能联网即可。

暂时不需要改安全组

1.下载Frp项目

分别下载frp到公网服务器和内网服务器:

地址:https://github.com/fatedier/frp/releases

wget  https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz

树莓派下载:wget https://github.com/fatedier/frp/releases/download/v0.35.0/frp_0.35.0_linux_arm.tar.gz

下载适合设备的app,不然会报错

天翼云下载:https://cloud.189.cn/t/e2a67z3yMfYv

然后解压并进入服务器,

tar zxvf ./frp_0.37.0_linux_amd64.tar.gz
cd frp_0.37.0_linux_amd64/

# 目录内容如下
# LICENSE  frpc  frpc.ini  frpc_full.ini  frps  frps.ini  frps_full.ini

修改规则(轻量型服务器对应防火墙)

然后进行端口放行,这里返回云产品,点击安全组,点击修改规则:
点击添加规则:添加一条数据如下面所示:到这里我们服务器端配置可以说基本配置完了。
在这里插入图片描述

2.配置公网服务器

进入公网IP服务器中修改目录中的frps.ini配置文件, 将bind_port改为随意可用端口

[common]

# 客户端连接的端口
bind_port = 7000

bind_addr = 0.0.0.0


# 这个是控制面板的配置,如果不需要可以不用
# 这个端口可以访问公网ip+端口号吗
dashboard_port = 7500
dashboard_user = 534640040
dashboard_pwd = 519yang982

 

3.修改内网服务器

在内网IP服务器中修改frpc.ini配置文件:,可以映射多个端口比如rdp

[common]
server_addr = 公网ip
server_port = 7000

[ssh]
type = tcp
# 127.0.0.1是本地网络,也可以其他在一个内网ip如192.168.31.50,就会控制其他设备
local_ip = 127.0.0.1
local_port = 22
# 端口随便可以连接ssh的,默认22
remote_port = 6000

[rdp]
type = tcp
# 127.0.0.1是本地网络,也可以其他在一个内网ip如192.168.31.50,就会控制其他设备
local_ip = 127.0.0.1
local_port = 3389
# 端口随便可以连接ssh的,默认3389
remote_port = 6000

其中解释如下:

  • common表示基本配置
    • server_addr:公网服务器地址
    • server_port:公网bind_port配置的端口
  • ssh表示使用ssh登录内网服务器
    • type:tcp即可
    • local_ip:本地iP,127.0.0.1即可
    • local_port: ssh端口
    • remote_port:ssh链接端口

以上配置连接ssh命令可以是

ssh yys@公网ip -p 6000

 

4.分别启动内网公网服务器FRP

 

1、在公网服务器中启动frps服务端:

为了方便调试,我们先启动桌面版:

cd frp_0.25.0_linux_amd64/
./frps -c ./frps.ini
# 链接成功会出现如下内容
# 2019/03/19 16:41:16 [I] [service.go:88] frps tcp listen on 0.0.0.0:7000
# 2019/03/19 16:41:16 [I] [main.go:112] Start frps success
# 2019/03/19 16:41:16 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues

生产使用中可使用如下命令在后台运行:

服务器后台运行

nohup ./frps -c ./frps.ini > /dev/null 2>&1 &

 

 

2、在内网服务器中启动frpc客户端:

公网服务器启动成功后,在内网服务器中启动frpc,为了方便调试,我们一样启动桌面版:


./frpc -c ./frpc.ini

# 链接成功会出现如下内容
# 2019/03/19 17:43:44 [I] [control.go:276] [f094394cf61f02fe] login to server success, get run id [f094394cf61f02fe]
# 2019/03/19 17:43:44 [I] [control.go:411] [f094394cf61f02fe] [ssh] start proxy success

生产使用中可使用如下命令在后台运行:

nohup ./frpc -c ./frpc.ini > /dev/null 2>&1 &

 

5.ssh登录服务器

如果配置成功,在进入本地服务器就相对容易了,与以前的ssh一样:

ssh root@公网IP -p 6000

也可以使用

ssh -oPort=6000 test@公网IP

 

6.常见问题与解决方案

 

1、内网服务器无法连接frpc客户端:

此问题一般情况是公网IP没有开放bind_port设置的7000端口,此时可以检查防火墙是否允许以及查看服务器安全规则,如腾讯云需要设置安全组规则允许访问。

 

2、ssh无法使用内网账号密码登录,只能使用公网密码登录

ssh无法使用内网账号密码登录,只能使用公网密码登录;一登录直接跳转到外网服务器,没有实现穿透效果,此时需要设置内网服务器frpc.ini文件,修改local_ip = 127.0.0.1

 

3、ssh无法登录到frp服务器,提示超时

此问题的原因是公网未开放ssh配置的端口,开放一下即可,如我的是腾讯云,ssh端口为6000,我去腾讯云安全组规则允许访问6000端口才搞定。

4、tcp拨号提示超时

2020/09/22 10:55:42 [W] [service.go:82] login to server failed: dial tcp xx.xx.xx.xx:7000: connect: connection timed out
dial tcp xx.xx.xx.xx:7000: connect: connection timed out # 检查腾讯云的安全组规则与宝塔的开放端口

更多信息:

 

安全地暴露内网服务

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

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

以下示例将会创建一个只有自己能访问到的 ssh 服务代理。

frps 的部署步骤同上。

  1. 启动 frpc,转发内网的 ssh 服务,配置如下,不需要指定远程端口:
# frpc.ini
[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
  1. 在要访问这个服务的机器上启动另外一个 frpc,配置如下:
# frpc.ini
[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
  1. 通过 ssh 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@127.0.0.1

如果出现问题:

[secret_ssh_visitor] start error: listen tcp 127.0.0.1:6000: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

将本地地址改为127.0.0.2或者其他地址

设置bat文件,这样就不需要每次都定位到指定目录:

cd C:\Users\JChan\Desktop\frp_0.25.0_windows_amd64\frp_0.25.0_windows_amd64
start /b frpc -c frpc.ini

5. [ssh] is already in use

如果连接不上可以用下面命令看看

./frpc -c frpc.ini 


2021/06/25 22:49:12 [I] [service.go:304] [ba1f9b93ec5bab04] login to server success, get run id [ba1f9b93ec5bab04], server udp port [0]
2021/06/25 22:49:12 [I] [proxy_manager.go:144] [ba1f9b93ec5bab04] proxy added: [ssh]
2021/06/25 22:49:12 [W] [control.go:178] [ba1f9b93ec5bab04] [ssh] start error: proxy name [ssh] is already in use
 

把frpc.ini的[ssh]改成其他的如[ssh1]等

 

7.frp开机启动

7.1 客户端开机启动

  方法0:参考

Jenkins开机启动乌班图可以

1.确认路径

/home/yys/frp/frpc -c /home/yys/frp/frpc.ini

2.创建一个名为 frpc.service 的服务单元文件,并将其保存到 /etc/systemd/system 目录下。可以使用以下命令来创建并编辑该文件:

sudo vim /etc/systemd/system/frpc.service

3。在该文件中添加以下内容:

[Unit]
Description=Frp Client
After=network.target

[Service]
Type=simple
ExecStart=/home/yys/frp/frpc -c /home/yys/frp/frpc.ini
Restart=always

[Install]
WantedBy=multi-user.target

其中,Description 是服务描述,After 指定服务启动需要等待的目标单元,ExecStart 是指定 frpc 程序的路径和配置文件路径,Restart 是指定服务出现错误时是否重启服务,WantedBy 是指定服务应该启动的目标单元。

5.现在可以使用以下命令来启动 frpc 服务并设置其开机自动启动:

sudo systemctl start frpc
sudo systemctl enable frpc

第一行命令将启动 frpc 服务,第二行命令将设置 frpc 服务在系统启动时自动启动。

要查看服务的状态,可以使用以下命令: active (running)则正常,died不正常

sudo systemctl status frpc

yys@yys-All-Series:~$ sudo systemctl status frpc
● frpc.service - Frp Client
     Loaded: loaded (/etc/systemd/system/frpc.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-05-09 14:03:03 CST; 15s ago
   Main PID: 3871 (frpc)
      Tasks: 5 (limit: 14103)
     Memory: 5.1M
     CGroup: /system.slice/frpc.service
             └─3871 /home/yys/frp/frpc -c /home/yys/frp/frpc.ini

cpu比较弱的电脑重启电脑可能出现下面保存,不能运行,加延时开机

yys@yys-All-Series:~$ sudo systemctl status frpc
● frpc.service - Frp Client
     Loaded: loaded (/etc/systemd/system/frpc.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2023-05-09 14:20:12 CST; 4min 16s ago
    Process: 828 ExecStart=/home/yys/frp/frpc -c /home/yys/frp/frpc.ini (code=exited, status=1/FAILURE)
   Main PID: 828 (code=exited, status=1/FAILURE)

5月 09 14:20:12 yys-All-Series systemd[1]: frpc.service: Main process exited, code=exited, status=1/FAILURE
5月 09 14:20:12 yys-All-Series frpc[828]: 2023/05/09 14:20:12 [W] [service.go:134] login to server failed: dial tcp 43.138.37.115:9000: connect: network is unreachable
5月 09 14:20:12 yys-All-Series frpc[828]: dial tcp 43.138.37.115:9000: connect: network is unreachable
5月 09 14:20:12 yys-All-Series systemd[1]: frpc.service: Failed with result 'exit-code'.
5月 09 14:20:12 yys-All-Series systemd[1]: frpc.service: Scheduled restart job, restart counter is at 5.
5月 09 14:20:12 yys-All-Series systemd[1]: Stopped Frp Client.
5月 09 14:20:12 yys-All-Series systemd[1]: frpc.service: Start request repeated too quickly.
5月 09 14:20:12 yys-All-Series systemd[1]: frpc.service: Failed with result 'exit-code'.
5月 09 14:20:12 yys-All-Series systemd[1]: Failed to start Frp Client.

要实现在开机1分钟后运行 `frpc.service` 服务,可以按照以下步骤操作:

1. 创建一个新的 `systemd` 定时器单元文件。可以使用以下命令在 `/etc/systemd/system` 目录下创建一个名为 `frpc.timer` 的新文件:

   ```
 

sudo vim /etc/systemd/system/frpc.timer


   ```

2. 在 `frpc.timer` 文件中添加以下内容:   ```
 

[Unit]
Description=Run frpc.service 1 minute after boot

[Timer]
OnBootSec=1min
Unit=frpc.service

[Install]
WantedBy=timers.target


   ```

   在上述配置中,`OnBootSec` 指定了在开机后多少时间后运行服务,这里设置为 `1min` 即1分钟后运行。`Unit` 指定了要运行的服务单元,这里设置为 `frpc.service`。`WantedBy` 指定了定时器单元应该启动的目标单元,这里设置为 `timers.target`。

3. 保存并关闭 `frpc.timer` 文件。

4. 重新加载 `systemd` 守护进程配置并启用 `frpc.timer` 和 `frpc.service` 单元。可以使用以下命令完成此操作:

   ```
   

sudo systemctl daemon-reload
sudo systemctl enable frpc.timer
sudo systemctl enable frpc.service


   ```

   重新加载 `systemd` 配置以使其生效,然后使用 `enable` 命令启用 `frpc.timer` 和 `frpc.service` 单元,以便它们可以在下次启动时自动启动。

5. 重启系统以使更改生效。可以使用以下命令重启系统:

   ```

sudo reboot


   ```

6. 等待1分钟后,系统应该自动启动 `frpc.service` 服务。

现在,`frpc.service` 服务应该会在开机1分钟后自动启动。可以使用 `systemctl status frpc` 命令检查服务的状态以确保它已经成功启动。

 

 

方法1(只有打开终端才生效):

vim ~/.bashrc 
nohup /home/yys/frp/frpc -c /home/yys/frp/frpc.ini > /dev/null 2>&1 &

 把上面那句添加末尾,然后source就可以了

source ~/.bashrc

 

方法2(小米路由器可以,乌班图不行):

vi /etc/rc.local

 

#!/bin/sh -e
nohup /home/yys/frp/frpc -c /home/yys/frp/frpc.ini > /dev/null 2>&1 &
exit 0

如果不执行,给777权限

chmod 777 /etc/rc.local

方法3:

需要sudo权限
1.检查系统目录/lib/systemd/system/rc-local.service,如果没有自己新建,文件内容为(如果文件存在本身是没有[Install]项的,需要自己添加进去)

#### 文件中本身就有的
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

####  需要自己添加
[Install]
WantedBy=multi-user.target
Alias=rc-local.service

方法4

同样etc目录下的文件也需要进行如上修改(有可能已经自动修改),检查/etc/systemd/system/rc-local.service,进行以上修改。

创建/etc/rc.local脚本文件,并写入想要运行的脚本程序
(可以先写个示例验证一下)

sudo vim /etc/rc.local
#! /bin/bash

nohup /home/yys/frp/frp_0.37.0_linux_amd64/frpc -c /home/yys/frp/frp_0.37.0_linux_amd64/frpc.ini > /dev/null 2>&1 &



3.给rc.local执行的权限

sudo chmod +x /etc/rc.local


4.启用服务

sudo systemctl enable rc-local

报错解决

Failed to enable unit: File /etc/systemd/system/rc-local.service already exists.
删除了此文件

sudo rm -rf /etc/systemd/system/rc-local.service

然后

sudo systemctl enable rc-local

 Created symlink /etc/systemd/system/rc-local.service → /lib/systemd/system/rc-local.service.

 

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

7.2 服务端开机启动

类似客户端
 

8.安卓手机刷magisk使用frp内网穿透

magisk 软件大于19.0以上版本

magisk模块下载https://cloud.189.cn/t/u6VRr232QNNj

github:https://github.com/mrh929/magisk-frp

 

写入内容,如连接adb的,adb端口是5555,如下端口是adb连接时候ip:6000 (实测server_addr 不能用域名,只能ip)

[common]
server_addr = 公网ip
server_port = 7000

[adb] # 这个名字不能和其他设备重复
type = tcp
# 127.0.0.1是本地网络,也可以其他在一个内网ip如192.168.31.50,就会控制其他设备
local_ip = 127.0.0.1
local_port = 5555
# 端口随便可以连接adb的,默认5555
remote_port = 6000

方法一:要用re管理器新建文件/data/frp/frpc.ini

方法二:用adb命令(推荐)

提前写好frpc.ini

1. 推送文件到设备的 /sdcard/ 目录

adb push D:\备份\frpc.ini /sdcard/frpc.ini

这条命令将 frpc.ini 文件从本地推送到设备的 /sdcard/ 目录下。

2. 进入设备的 shell 环境

adb shell

这条命令让你进入设备的命令行环境,接下来你可以在设备上执行其他操作。

3. 获取 root 权限(如果设备已经 root):

su

这条命令获取 root 权限,允许你执行需要管理员权限的操作。

4. 创建 /data/frp 目录(如果不存在):

mkdir -p /data/frp

这条命令创建 /data/frp 目录。如果目录已存在,则不会做任何改变。

5. 移动文件到 /data/frp/ 目录

mv /sdcard/frpc.ini /data/frp/

这条命令将刚才推送到 /sdcard/ 目录的 frpc.ini 文件移动到 /data/frp/ 目录下。

执行完这些命令后,frpc.ini 文件就应该成功地被移动到 /data/frp/ 目录中了。

 
9.小米路由安装ssh

首先开启ssh

去下再arm版本如frp_0.41.0_linux_arm.tar.gz

解压用scp命令把解压后文件传到路由器(测试在小米路由不能解压,不能wget,df 查看tmp下容量最大,但是过一段时间文件会擦除,放到/etc下比较号,其他路径容量比较小)

scp -r F:\迅雷下载\frp root@192.168.31.1:/etc

修改好助力修改frp权限,不然会拒绝-ash: ./frpc: Permission denied

chmod 777 frpc
chmod 777 frpc.ini

 

nohup会不存在

-ash: nohup: not found

目前提供两种方案

 9.1 开机运行

 

vi /etc/rc.local
# restore phy config
speed=$(uci -q get xiaoqiang.common.WAN_SPEED)
[ -n "$speed" ] && /usr/sbin/phyhelper swan "$speed"
#延迟启动30s
sleep 30
/etc/misstar/applications/ftp/script/vsftpd start
/etc/misstar/applications/kms/script/kms start
#此处写你的frpc客户端的实际安装目录的绝对路径,output是日志文件
/etc/frp/runfrp.sh
exit 0

 

9.2 crontab运行

让frpc开机自动启动

vim /etc/frp/runfrp.sh

内容 

#!/bin/bash
/etc/frp/frpc -c /etc/frp/frpc.ini

cron 命令

10 12 * * * /etc/frp/runfrp.sh


10.使用docker镜像(与服务器版本匹配)

注意:local_ip 不能127.0.0.1,因为容器ip

要确保你的 frpc 服务能够正常启动并使用正确的配置文件,首先需要在主机上的 /home/frp 目录下创建一个名为 frpc.ini 的配置文件。接下来,我将提供完整的 docker-compose.yml 配置,以及如何创建 frpc.ini 文件的步骤。

1. 创建 frpc.ini 文件

在终端中执行以下命令以创建 /home/frp/frpc.ini 文件。可以使用 nano 或 vim 编辑器创建和编辑文件:

mkdir -p /home/frp  # 确保目录存在
nano /home/frp/frpc.ini

在 frpc.ini 文件中,你可以添加以下示例配置,根据你的需求进行调整:

[common]
server = YOUR_SERVER_IP  # 替换为你的 frp 服务器 IP
server_port = 7000  # frp 服务器的端口

[ssh]
type = tcp
local_ip = 192.168.31.63  # 本地服务的 IP,不能127.0.0.1
local_port = 22  # 本地服务的端口
remote_port = 6000  # frp 服务器上开放的端口

保存并退出编辑器(在 nano 中,按 CTRL + X,然后按 Y 确认保存)。

2. 完整的 docker-compose.yml 示例

以下是一个完整的 docker-compose.yml 配置示例,包括 frpc 服务的设置:

version: '3.8'

services:
  frpc:
    image: snowdreamtech/frpc:0.37.0
    container_name: frpc
    restart: always
    volumes:
      - /home/frp:/etc/frp  # 挂载主机目录到容器
    command: -c /etc/frp/frpc.ini  # 指定配置文件路径

  # 其他服务配置
  # ...

3. 启动 Docker Compose

确保 Docker 和 Docker Compose 已经安装并运行,然后在 docker-compose.yml 所在目录中执行以下命令以启动服务:

docker-compose up -d

4. 检查服务状态

启动后,可以使用以下命令检查 frpc 服务的状态:

docker logs frpc

如果配置正确,frpc 服务应该会成功启动并运行。

总结

以上步骤将帮助你创建所需的 frpc.ini 配置文件并配置 Docker Compose。确保将 YOUR_SERVER_IP 替换为你的 frp 服务器的实际 IP 地址,并根据需要调整其他配置。如果在启动时遇到问题,请检查日志以获取错误信息。