frp内网穿透

地址

1. 服务端

  1. 配置 vim /usr/lib/systemd/system/frps.service,实现设置systemctl 管理。类似可配置frpc.service。
    frps.service(vim /usr/lib/systemd/system/frps.service):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=Frps Server Service
    After=network.target

    [Service]
    Type=simple
    User=nobody
    Restart=on-failure
    RestartSec=5s
    ExecStart=/home/frp/frps -c /home/frp/frps.toml

    [Install]
    WantedBy=multi-user.target
    frpc.service(vim /usr/lib/systemd/system/frpc.service):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=Frpc Server Service
    After=network.target

    [Service]
    Type=simple
    User=nobody
    Restart=on-failure
    RestartSec=5s
    ExecStart=/home/frp/frpc -c /home/frp/frpc.toml

    [Install]
    WantedBy=multi-user.target
  2. 下载相应版本的frp(下载到home文件夹内)
    1
    wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz
  3. 解压&复制&给予权限
    1
    2
    3
    4
    5
    tar -xzvf frp_0.54.0_linux_amd64.tar.gz
    cp -r frp_0.54.0_linux_amd64 frp

    # 给予权限
    chmod -R 777 frp
  4. 进入frp文件夹,编辑frps.toml,vim frps.toml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # frp服务器端口,防火墙需要开放
    bindPort = 14000
    # 自定义监听端口,所有对该端口的访问将被转发到本地内网,配合反向代理可不做防火墙放行
    vhostHTTPPort = 14001
    vhostHTTPSPort = 14002
    # QUIC 绑定的是 UDP 端口,可以和 bindPort 一样
    quicBindPort = 14003
    # 认证token,frpc/frps通信认证
    auth.token = "psw"
    # 是否启用端口复用
    transport.tls.disableCustomTLSFirstByte = false

    # 日志输出文件路径
    log.to = "slog"
    # 日志文件最多保留天数
    log.maxDays = 7

    # 服务端监听面板
    webServer.addr = "0.0.0.0"
    webServer.port = 14004
    webServer.user = "admin"
    webServer.password = "psw"
    #webServer.tls.certFile = "Your server.crt"
    #webServer.tls.keyFile = "Your server.key"
  5. 启动&添加到开机自启动
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 启动
    sudo systemctl start frps
    sudo systemctl start frpc
    # 重启
    sudo systemctl restart frps
    sudo systemctl restart frpc
    # 添加到开机自启动
    systemctl enable frps
    systemctl enable frpc
    # 查看状态
    systemctl status frps
    systemctl status frpc

    2. 配置NGINX

    实现反向代理,vim /etc/nginx/conf.d/frp.domain.com.conf
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    # 服务端监听面板
    server {
    listen 443 ssl;
    server_name frpi.domain.com; # 域名
    ssl_certificate /home/certs/domain.com.pem; # ssl路径
    ssl_certificate_key /home/certs/domain.com.key; # ssl路径
    # 其他ssl设置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 10m;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_buffer_size 1400;
    add_header Strict-Transport-Security max-age=15768000;
    ssl_stapling on;
    ssl_stapling_verify on;
    # access_log /etc/nginx/conf.d/logs/example.com.log combined;

    location / {
    proxy_pass http://localhost:14004; # 代理的服务端口
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
    server {
    listen 80;
    server_name frpi.domain.com; # HTTP重定向到HTTPS
    return 301 https://$server_name$request_uri;
    }

    # frp服务端口代理
    server {
    listen 80;
    listen [::]:80;
    server_name frps.domain.com;

    location / {
    proxy_pass http://localhost:14000; # 将流量发送到应用程序所在的端口
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    # 穿透的服务端口
    server {
    listen 80;
    server_name *.frp.domain.com;

    location / {
    proxy_pass http://localhost:14001; # 将流量发送到应用程序所在的端口
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
    重启nginx,sudo systemctl restart nginx。至此,服务端配置完毕。

3. 客户端

编写frpc.toml

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 远程服务器地址,支持域名和ip
serverAddr = "xxx.xxx.xxx.xx"
# 远程服务器监听端口,可以配合nginx反向代理实现去端口
serverPort = 14000
# 启用quic协议
#transport.protocol = "quic"
#quicBindPort = 14003
# 认证token,frpc/frps通信认证
auth.token = "password"
# 启用端口复用
transport.tls.disableCustomTLSFirstByte = false

# 客户端面板
webServer.addr = "127.0.0.1"
webServer.port = 14004
webServer.user = "user"
webServer.password = "password"

# 日志输出文件路径
log.to = "clog"
# 日志文件最多保留天数
log.maxDays = 7

# 以上为frpc固定项配置

[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 8888
customDomains = ["xx.frp.domains.com"]

# 需要增加本地服务的话,增加 proxies 配置和子域名即可

# 相对完整的代理示例,一般情况下http代理只需要填写到 customDomains 即可
# [[proxies]]
# name = "web"
# type = "http"
# localPort = 80
# customDomains = ["www.domains.com"]

# # 代理负载均衡,相同groupKey的代理,会视为负载均衡
# # 对于 tcp 类型代理,需要确保 groupKey 相同以进行权限验证,同时 remotePort 也需一致。
# # 对于 http 类型代理,需要保证 groupKey, customDomains(自定义域名),subdomain 和 locations 相同。
# loadBalancer.group = "web"
# loadBalancer.groupKey = "123"

# # 启用健康检查,类型为 http
# healthCheck.type = "http"
# # 健康检查发送 http 请求的 path,后端服务需要返回 2xx 的 http 状态码
# healthCheck.path = "/status"
# # 建立连接超时时间为 3 秒
# healthCheck.timeoutSeconds = 3
# # 连续 3 次检查失败,此 proxy 会被摘除
# healthCheck.maxFailed = 3
# # 每隔 10 秒进行一次健康检查
# healthCheck.intervalSeconds = 10

# # 获取用户真实IP,具体配置见 https://gofrp.org/zh-cn/docs/features/common/realip/
# transport.proxyProtocolVersion = "v2"
# # 带宽限速,支持MB,KB
# transport.bandwidthLimit = "1MB"

启动:./frpc -c ./frpc.toml

服务器端设置好反向代理、域名供应商处设置好子域名后,即可用xx.frp.domains.com访问本地服务。

4. 加密的SSH链接

按前设置好frp服务器端。然后分别在两台计算机上(A、B,假设要从B访问A)设置好frp客户端,即可进行SSH连接。

  1. 计算机A(目标计算机)

    1
    2
    3
    4
    5
    6
    7
    # frpc.toml
    [[proxies]]
    name = "xx_secret_ssh"
    type = "stcp"
    secretKey = "psw"
    localIP = "127.0.0.1"
    localPort = 22

    在计算机A上启动frpc服务,./frpc -c ./frpc.toml

  2. 计算机B

    1
    2
    3
    4
    5
    6
    7
    [[visitors]]
    name = "xx_ssh_visitor"
    type = "stcp"
    serverName = "xx_secret_ssh"
    secretKey = "psw"
    bindAddr = "127.0.0.1"
    bindPort = 6000

    在计算机B启动frpc服务,./frpc -c ./frpc.toml

设置完毕,在计算机B上可通过ssh -oPort=6000 root@127.0.0.1连接计算机A。

5. 数据库穿透

数据库所在计算机配置:

1
2
3
4
5
6
7
8
# 3306为数据库服务所在端口
# frps服务器计算机开放13306端口
[[proxies]]
name = "mariadb"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3306
remotePort = 13306

则可在任何地方,以frps服务器计算机ip:13306访问数据库。