frp内网穿透以及nginx反代理

  • 2020-01-02
  • 89
  • 2

记录 frp 穿透 http 以及 ssh 服务的相关配置,以及 nginx 反代理 frp 的 http 到三级域名。

我的环境:

  • 阿里云ECS
  • OS: Ubuntu16.04

1. 服务端

官方 repo: fatedier/frp

下载:

# 下载
wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz
# 解压与删除安装包
tar -xzvf frp_0.30.0_linux_amd64.tar.gz && rm frp_0.30.0_linux_amd64.tar.gz
# 删除不需要的客户端程序与配置
cd frp_0.30.0_linux_amd64 && rm -rf frpc*

配置:

[common]
# 服务端地址,客户端连接时需要同一端口
bind_addr = 0.0.0.0
bind_port = 7000

# 虚拟端口,用户访问客户端时的端口号
vhost_http_port = 8080
vhost_https_port = 8443

# dashboard地址,可以查看frp状态
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

# 日志文件目录、过滤等级、最大天数
log_file = ./frps.log
log_level = trace
log_max_days = 3

# token 客户端需要相同的值
token = 12345678

# 允许的端口,逗号间隔,端口区间-间隔???
#allow_ports = 10000-50000

# 每个代理可以创建的最大连接数量,客户端代理中使用 pool_count 指定预创建的连接数量。
max_pool_count = 5

# 每个客户端最大使用端口数量
max_ports_per_client = 0

# 自定义到子级域名
subdomain_host = frp.yourdomain.com

上面配置文件修改后还需要在云服务里开放对应的端口入方向,如上面的 7000 和 7500 以及虚拟端口(如果反代理了虚拟 http 或者 https 的端口,则就不需要开启对应虚拟端口的入方向)。

如果使用了二级域名则还需要配置域名解析,将 *.yourdomain.com 解析到服务器公网 ip。

服务端运行:

./frps -c ./frps.ini

后台运行(推荐使用 tmux):

#!/bin/bash
# frp - start tmux with frpServer

sess_name="frpServer"

export DISABLE_AUTO_TITLE="true"

tmux has-session -t $sess_name
if [ $? = 0 ];then
    echo $sess_name "already exist. attaching..."
    tmux attach-session -t $sess_name
    # exit
else
    echo $sess_name "doesn't exist. creating..."
    tmux new -d -s $sess_name -n home
    tmux send-keys -t $sess_name:1 "cd frp_0.30.0_linux_amd64" Enter
    tmux send-keys -t $sess_name:1 "./frps -c ./frps.ini" Enter
fi

这样如果有客户端连接后,访问其 http 的 url 为:sub.yourdomain.com:8080,如果按下下面配置了 http 的反代理,则 url 为:sub.yourdomain.com,保持默认就好。

2. nginx 反代理 frp 的 http 到三级域名

nginx 反代理 frp 的 http 或者 https 有两个好处:一是不需要在云主机上开启对应的端口的出入规则,二是每次输入 url 时不需要更改默认端口。

由于我主机上二级域名还有 jupyterhub 等服务,所以本次将其反代理到三级域名,过程如下:

新建 nginx 配置文件

# 在 sites-available 下创建配置文件
touch /etc/nginx/sites-available/frpserver.conf
# 创建软连接到 site-enabled
ln -s /etc/nginx/sites-available/frpserver.conf /etc/nginx/sites-enabled/frpserver.conf

# 编辑文件配置如下信息
vim /etc/nginx/sites-enabled/frpserver.conf

配置文件内容:

server {
    listen       80;
    server_name  *.frp.brothereye.cn;

    access_log /var/log/nginx/frp.access.log;
    error_log /var/log/nginx/frp.error.log;

    location / {
        # add_header Content-Type text/plain;  # debug
        # return 200 http://$host:8080;  # debug
        proxy_pass http://127.0.0.1:8080;  # vhost http port
        proxy_set_header Host $host:80;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }

    # 屏蔽各搜索网站的爬虫
    if ($http_user_agent ~* ".*spider.*|.*bot.*")
    {
        return 403;
    }
}

2. 客户端

官方repo: fatedier/frp release 中下载与服务端相同的版本即可。

http 以及 ssh 配置(官方最全配置:frpc_full.ini),新建文件 frpc_http_ssh.ini写入以下内容:

[common]
# 服务端地址,填自己服务器 ip 和上面服务端设置的端口
server_addr = xxx.xxx.xxx.xxx
server_port = 7000

# 日志文件目录、过滤等级、最大天数
log_file = ./frpc.log
log_level = info
log_max_days = 3

# token 需要与服务端相同
token = 12345678

# 查看客户端连接信息
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

# 预建立的连接数量
pool_count = 2

# 代理名字前缀,实际代理名为 {user}.{proxy}
user = user01

# 首次登陆到服务端失败则终止客户端程序
login_fail_exit = true

# 连接服务端的传输层协议。支持tcp, kcp, websocket
protocol = tcp

[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
# 是否加密流量。开启后可绕过防火墙
use_encryption = false
# 是否压缩,开启后可以压缩报文但消耗 cpu
use_compression = true
# 访问客户端代理的网页时验证
http_user = admin
http_pwd = admin
# 子级域名前缀
subdomain = web01
# 自定义域名,自定义域名不能属于子级域名或者泛域名
#custom_domains = web02.yourdomain.com
# URL 路由,根据此前缀过滤请求转发到客户端,逗号间隔,仅支持http
locations = /
# 更改用户访问到的 host,仅支持 http
#host_header_rewrite = example.com
# 更改用户访问到的请求头
#header_X-From-Where = frp

[ssh]
type = tcp
local_ip = 127.0.0.1 
local_port = 22
remote_port = 2222
use_encryption = true
use_compression = true

注意:

frpc 中的健康检查(health_check开头)有时会无法验证心跳包,导致穿透失败,故不推荐加健 康检查,除非确认过健康检查可用。

运行:

./frpc -c ./frpc_http_ssh.ini

加上上面配置过的反代理,访问的完整 url 为: http://web01.frp.brothereye.cn
如果未配置 nginx 反代理则需要加主机中配置的 vhost_http_port,这里的具体 url 为: http://web01.frp.brothereye.cn:8080


版权声明: 本网站所有资源采用BY-NC-SA 4.0协议进行授权,转载应当以相同方式注明文章来自:frp内网穿透以及nginx反代理 - 一方的天地

评论

  • 飞扬的旋律回复

    其实tmux没有必要…现在下载下来的压缩包解压后有个systemd,更改下frps.service的配置然后把frps.service放到/etc/systemd/system中就可以方便管理了。

    • root回复

      好的,谢谢啦。

发表评论

陕ICP备18010914号
知识共享许可协议
本作品由一方天地采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资源请尽快联系站长,本站会在24h内删除有争议的资源。 -