场景

公司 git 仓库一般都禁止外网访问,但是有时候需要在家里办公,如果公司有 vpn 还好,如果没有 vpn,家里的电脑压根就没办法正常拉代码

根据这种情况,做了一个临时的方案:frp + nginx + 云服务器(做内网穿透) 快速实现外网访问内网 git 仓库,随用随开,用完即关

前提条件

(角色:外网电脑):一台云服务器或者有公网 ip 的电脑即可,用作 frp 服务端

(角色:公司电脑):和 git 仓库服务器在同一个网段或能访问 git 仓库的电脑即可,用作 frp 的客户端以及 nginx 服务端

(角色:家里电脑):任何一台能访问外网的电脑即可

frp 安装包:

  • windows:https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_windows_amd64.zip

  • linux:https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz

nginx 安装包:

  • windows(已编译好的):https://nginx.org/download/nginx-1.26.3.zip

  • linux 版本源码:https://nginx.org/download/nginx-1.26.3.tar.gz

原理

假设:

  • git 仓库服务器的内网地址为 http://192.168.0.10:8888

  • 公司电脑的内网 ip 为 192.168.0.20

  • 有公网 ip 的电脑 ip 为 175.175.1.12

原理:

  • 先在有公网 ip 的电脑上启动 frp 服务端

  • 在公司电脑上启动 nginx,监听 11111 端口,配置反向代理请求 git 仓库服务器,从而达到访问 http://127.0.0.1:11111 就能访问到 git 仓库

  • 继续在公司电脑上启动 frp 客户端,将本地的 11111 端口映射到 frp 服务端的 11111 端口,从而达到访问公网 ip 就能访问到 git 仓库的目的

流程如下:

家里电脑 -> 公网电脑(http://175.175.1.12:11111) -> frp转发到公司电脑11111端口 -> 公司电脑nginx反向代理到内网git仓库服务器

开始搭建

有公网 ip 的电脑部署 frp 服务端

1、根据电脑系统类型,下载 frp 部署压缩包

2、修改服务端配置文件 frps.toml

# 服务端监听端口
bind_port = 7000
# 服务端管理界面访问端口
dashboard_port = 7001
# 管理界面的登录账号
dashboard_user = admin
# 管理界面的登录密码
dashboard_pwd = admin123
# frp客户端接入服务端时要填的token,越复杂越安全
token = fafdsafdsafdsafdsaf

3、启动 frp 服务端

linux

sudo ./frps -c ./frps.toml

还可以写一个后台运行的脚本 start_server.sh 放在 frp 目录下

#!/bin/bash
BASE_PATH=`cd $(dirname $0);pwd`

nohup $BASE_PATH/frps -c $BASE_PATH/frps.ini >> $BASE_PATH/log.log 2>&1 &

启动的时候直接执行


sudo ./start_server.sh

windows,命令行窗口别关掉,关掉就停了

.\frps.exe -c .\frpc.toml

公司电脑启动 nginx + frp 客户端

启动 nginx 代理

1、如果是 windows 电脑,直接下载编译好的压缩包解压即可,如果是 linux 电脑,那就得自己编译了(这里就不讲怎么编译了)

2、打开 nginx 目录下的 conf/nginx.conf 文件,添加一个 server 块,如下

server {
    listen       11111;
    server_name  localhost;

    location / {
        # 代理到git仓库服务器
        proxy_pass http://192.168.0.10:8888;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';

        # 设置代理请求头的 host,一定要加上端口,不然到时遇到重定向的时候端口就不见了
        # 如果你的nginx监听端口和映射到frp服务端的端口不一致,那这里的$server_port就换成映射到frp服务端的端口
        # 目的是让浏览器遇到git仓库服务器返回的302重定向后,浏览器(或git客户端)还是访问重定向前的ip:port
        proxy_set_header Host $host:$server_port;
        proxy_cache_bypass $http_upgrade;
    }
}

3、启动 nginx

windows,在 nginx 目录下打开一个 cmd 执行,命令行窗口别关掉,关掉就停了

.\nginx.exe -c ..\conf\nginx.conf

linux,在 nginx 目录下执行

sudo ./sbin/nginx -c ../conf/nginx.conf

启动 frp 客户端

1、根据电脑系统下载对应的压缩包哈,别下错了

2、进入到 frp 目录下,编辑 frpc.toml

# 配置frp服务端的ip和端口
serverAddr = "175.175.1.12"
serverPort = 7000

[[proxies]]
name = "gongsi-diannao-git"
type = "tcp"
# 将本地的11111端口映射到frp服务端的11111端口
localIP = "127.0.0.1"
localPort = 11111
remotePort = 11111
# frp服务端配置的访问token
token = fafdsafdsafdsafdsaf

3、启动 frp 客户端

linux

./frpc -c ./frpc.toml

也可以像上面启动 frp 服务端一样写个后 T 台运行的脚本

windows,命令行窗口别关掉,关掉就停了

.\frpc.exe -c .\frpc.toml

测试

用家里的电脑访问下公网电脑的 11111 端口,看看能不能进入 git 仓库的页面,能进入就是可以了

关闭代理

方式一:

办公室电脑关闭 nginx 或者 frp 客户端

方式二:

公网 ip 的电脑关闭 frp 服务端

如果是云服务器,也可以在防火墙配置里删掉 11111 端口的访问规则