Linux下配置frp内网穿透

注:需要访问内网资源,内网资源缺少公网ip被墙

要访问内网资源,内网资源缺少公网ip被墙,现在我们假设需要在内网主机上运行python,我们需要在公网访问到它,并考虑安全性。

原理图

/frp_by_docker/architecture.png

准备工作

  • 一台公网服务器,以及本地内网需要穿透到的主机

  • 一个域名,本次配置中的web服务需要注册域名

  • 下载好了最新版本的frp 发布,如:博主使用的是v0.41.0👇(现阶段github被墙,科学上网或使用其他方式下载)

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

目录树👇

image-20220328182405111
  • 保证在公网服务器上经过设置的所有端口不被防火墙限制。

搭建流程

如果需要搭建ssh服务等操作类似,Demo详情见官方文档,此处博主仅进行web服务搭建。

  • 将刚刚下载的文件解压到~/frps下👇

    1
    2
    3
    
    mkdir ~/frp
    tar zxvf frp_0.41.0_linux_amd64.tar.gz -C ~/frp
    cd ~/frp/frp_0.41.0_linux_amd64
    

    然后编辑文件frps.ini,写入以下内容👇

    1
    2
    3
    4
    5
    
    [common]
    ;公网服务器与内网主机通信的端口
    bind_port = 1234
    ;访问公网服务器端口
    vhost_http_port = 4231
    

    启动frps服务👇

    1
    
    ./frps -c ./frps.ini
    

    /frp_by_docker/image-20220328185023448.png

    如显示frps started successfully即为成功,端口也会写明

  • 将刚刚下载的文件解压到~/frps下👇

    1
    2
    3
    
    mkdir ~/frp
    tar zxvf frp_0.41.0_linux_amd64.tar.gz -C ~/frp
    cd ~/frp/frp_0.41.0_linux_amd64
    

    然后编辑文件frpc.ini,写入以下内容👇

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    [common]
    ;你的服务器ip
    server_addr = xx.xx.xx.xx
    ;公网服务器与主机通信的端口(和服务器端的vhost_http_port一致)
    server_port = 1234
    [web]
    type = http
    ;你想要映射到的内网主机端口,常用的有22(ssh端口)、443等
    local_port = 8888
    ;你的服务器域名
    custom_domains = xxxx.com
    

    启动frpc服务👇

    1
    
    ./frpc -c ./frpc.ini
    

    /frp_by_docker/image-20220328190409653.png

  • 服务器端反应👇

    image-20220328190542133
  • 浏览器访问公网域名http://xxxx.com:vhost_http_port端口号👇

    /frp_by_docker/image-20220328193117511.png

动机:使用docker提供服务,外网访问的服务在内网主机的docker内运行,相当于做了一层内网隔离,较为安全。

配置条件同基础版

  • 一台公网服务器,以及本地内网需要穿透到的主机

  • 一个域名,本次配置中的web服务需要注册域名

  • 下载好了最新版本的frp 发布,如:博主使用的是v0.41.0👇(现阶段github被墙,科学上网或使用其他方式下载)

1
wget https://github.com/fatedier/frp/releases/download/v0.41.0/frp_0.41.0_linux_amd64.tar.gz
  • 保证在公网服务器上经过设置的所有端口不被防火墙限制。
  • 另:需要在内网主机安装docker环境 官网安装地址

    1. 安装需要用来使用https利用仓库的包
    1
    2
    3
    4
    5
    6
    7
    
    sudo apt-get update
    
    sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
    1. 设置稳定存储库
    1
    2
    3
    
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    1. 安装docker engine
    1
    
     sudo apt-get install docker
    

将刚刚下载的文件解压到~/frps下👇

1
2
3
mkdir ~/frp
tar zxvf frp_0.41.0_linux_amd64.tar.gz -C ~/frp
cd ~/frp/frp_0.41.0_linux_amd64

然后编辑文件frps.ini,写入以下内容👇

1
2
3
4
5
[common]
;公网服务器与内网主机通信的端口
bind_port = 1234
;访问公网服务器端口
vhost_http_port = 4231

启动frps服务👇

1
./frps -c ./frps.ini
image-20220328185023448

如显示frps started successfully即为成功,端口也会写明

这里选择unbuntu作为我们的基础镜像

1
2
3
sudo docker pull python

sudo docker pull ubuntu

/frp_by_docker/image-20220328205825873.png

/frp_by_docker/image-20220329134450695.png

本文中docker 使用的一些命令

拉取镜像命令

sudo docker pull 镜像名

通过Dockerfile构建镜像命令

sudo docker build -t

查看镜像命令 目标镜像名 .

sudo docker images

删除镜像命令

sudo docker image rm 镜像名

进入运行中的docker 容器,退出时不关闭容器

sudo docker exec -it 容器名 /bin/sh

其中 bin/sh是指令运行器在镜像中的位置,可以使用以下命令查看

image-20220328102009292

sudo docker inspect 容器名 或者 镜像名

删除所有容器

sudo docker container prune

sudo docker system prune –volumes

sudo docker system prune –all

停用所有并删除所有,上面那条命令删除不了在运行的容器(需要多重复运行回车几次就干净了)

sudo docker stop $(sudo docker ps -q) & sudo docker rm $(sudo docker ps -aq)

使用该镜像创建容器,起名为jupyterlab,并将8888端口映射到内网主机

1
sudo docker run -p 8888:8888 --name jupyterlab -itd python 

注:-d可以省略来调试无法启动的信息,正式使用在本次配置中需要加上。

查看是否在运行

1
sudo docker ps -a

/frp_by_docker/image-20220329151928975.png

Up表示在正常运行

1
sudo docker exec -it jupyterlab /bin/bash

/frp_by_docker/image-20220329151855969.png

1
apt-get update
1
apt install git vim curl nodejs
1
由于选择的是python仓库,不需要考虑python的依赖问题
1
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
1
exec $SHELL
1
2
3
4
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc

查看可安装的python版本命令

pyenv install -l

1
2
3
4
5
6
pyenv install 3.10.4
pyenv virtualenv 3.10.4 jupyterlab
pyenv global jupyterlab

pip install update pip
pip install jupyterlab

生成jupyter lab的登陆口令

1
jupyter lab password

输入你想要的口令,如:2933194thg309rgbn13495y1tb1

启动jupyter lab, 让它在后台运行 ~

1
nohup jupyter lab --allow-root --no-browser --ip '*' --port '8888' > ~/.jupyter/jupyterlab.log 2>&1 & 

查看它的运行状态

1
 ps -a

/frp_by_docker/image-20220329151708196.png

乖乖在后台呆着

更好一点,设置jupyter服务并让它开机自启动

增加system配置,创建并编辑名为jupyterlab的服务

1
sudo vi /etc/systemd/system/jupyterlab.service

注意ExecStart一定要精确到jupyterlab的执行文件,后续可以自行添加指定端口等命令-p等,指定启动路径直接跟在后面就好了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=jupyterlab service
After=network.target

[Service]
Type=simple
User=oliver
ExecStart=/home/oliver/.pyenv/versions/jupyterlab/bin/jupyter-lab p 9001 /home/

Restart=on-failure
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target

然后保存退出,继续执行如下命令

1
sudo systemctl daemon-reload
1
sudo systemctl enable jupyterlab
1
sudo systemctl start jupyterlab
1
sudo systemctl status jupyterlab

/frp_by_docker/MD_img/image-20220522112228683.png

ok,服务设置完成

/frp_by_docker/image-20220329151750751.png

浏览器访问127.0.0.1:8888

/frp_by_docker/image-20220329152111154.png

输入刚刚的密码2933194thg309rgbn13495y1tb1

/frp_by_docker/image-20220329152309372.png

进来了,证明这时我们的jupyter还在容器后台乖乖呆着。,因为端口映射出来了,访问在主机8888端口相当于访问docker容器的8888端口。

1
2
3
cd ~/frp/frp_0.41.0_linux_amd64/

./frpc -c ./frpc.ini

/frp_by_docker/image-20220328215630421.png

ok,服务起来了

在网址中输入我们的http://域名xxx.com:4321

/frp_by_docker/image-20220328215809332.png

ok,访问到了

然后输入我们的jupyter口令2933194thg309rgbn13495y1tb1

/frp_by_docker/image-20220329152634046.png

OK,通了

大功告成~

https://blog.csdn.net/weixin_43975924/article/details/104046790

情景1:用户通过主机A访问C

image-20220414185407978

待续……