内网穿透



1.用于在公开网络环境访问特定局域网环境下的节点
2.需要有一个具有公网IP的服务器作为中转节点,可参考阿里云腾讯云,这里我们选用腾讯云服务器
3.需要使用frp,详情可见Github项目
4.可以使用xshellxftp进行远程管理,软件下载见官网下载免费的教育版即可
5.原参考教程可见中之的视频


配置frp文件

  • 分别下载frp客户端frpc与frp服务端frps, windows 64位下载 windows_amd64,linux下载linux_amd64
  • 客户端即局域网中需要穿透到外网的节点,服务端即为作为中转的云服务器

本地配置

可以先在本地上把配置⽂件编辑好,再上传到Windows PC和Linux

  • 配置服务端文件frpc.ini
    [common]
    bind_port = 7000
    vhost_http_port = 8080
  • 其中bind_port是SSH用端口,vhost_http_port是用来映射Jupyter notebook的端口,完整的参数可以参考frps_full.ini ,这⾥不作展开;
  • 配置客户端文件frpc.ini:
    [common]
    server_addr = [cloud_ip]
    server_port = 7000
    
    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000
    
    [web]
    type = http
    local_port = 8888
    custom_domains = [cloud_ip]
  • 主要修改了server_addr为我们的云服务器IP, 并配置了两个映射规则,分别是SSH与web,用于SSH远程访问与映射jupyter notebook。
  • 将frp分别上传到服务器和客户端(可以把没⽤的⽂件删掉,服务端只保留frps相关的文件,客户端只保留frpc相关的文件)

中转服务端设置

  • 在服务器防火墙开启配置文件中的端口
    13.内网穿透-2
    不确定协议类型可以两个都加上

启动frp进程

先使用命令符加载进frp文件侠下

  • 服务端
    ./frps -c ./frps.ini
    出现权限问题可使用chmod 777 ./frps提升frps文件权限
  • 客户端
    frpc -c frpc.ini
    linux 命令:
    ls #列出当前目录的所有文件和子目录名称
    CD #用于更改当前工作目录 cd ..为返回上一级
    pwd #用于显示当前所在的工作目录的全路径名称
    windows 命令:
    dir #列出当前目录的所有文件和子目录名称
    CD #用于更改当前工作目录 cd ..为返回上一级
  • 在其他电脑上使用ssh测试:
    windows命令行:
    ssh username@cloud_ip -p portnumber
    mac命令行:
    ssh -p portnumber username@cloud_ip
    xshell:
    ssh username@cloud_ip portumber

自启动配置

云端linux

  • 确保安装了systemd
    # yum
    yum install systemd
    # apt
    apt install systemd
  • 使用文本编辑器,如 vim 创建并编辑 frps.service 文件。此处的文件名称决定了服务的名称。
    vim /etc/systemd/system/frps.service
    vim /lib/systemd/system/frps.service
  • ps: 1. /lib/systemd/system/(或 /usr/lib/systemd/system/
    • 系统级服务文件存放位置
    • 通常由软件包管理器自动安装到这里
    • 不建议直接修改这里的文件(系统更新可能覆盖)
      2./etc/systemd/system/
    • 用户自定义服务文件存放位置
    • 优先级高于 /lib/systemd/system/
    • 适合用户自己创建的服务
  • 写入以下内容:
    [Unit]
    Description=Frp Server Service
    After=network.target
    
    [Service]
    Type=simple
    User=root
    #此处用户名需要修改
    Restart=on-failure
    RestartSec=5s
    ExecStart=/root/frp_0.51.3_linux_amd64/frps -c /root/frp_0.51.3_linux_amd64/frps.ini
    #此处文件路径需要修改
    LimitNOFILE=1048576
    
    [Install]
    WantedBy=multi-user.target
    路径要使用绝对路径,可以通过pwd来查看路径
  • 使用以下命令,实现开机自启动:
    systemctl daemon-reload  
    systemctl enable frps  
    systemctl start frps  
    systemctl status frps
    显示以下内容则表示自启成功:
    13.内网穿透-3
    命令功能参考如下:
    systemctl start frps #启动frps
    systemctl enable frps #打开自启动
    systemctl disable frps #关闭自启动
    systemctl restart frps #重启进程
    systemctl stop frps #停止进程
    systemctl status frps #查看进程日志

linux客户端

同上,使用vim /lib/systemd/system/frpc.service创建并编辑 frpc.service 文件。写入以下内容:

[Unit]
Description=Frp cliant Service
After=network.target

[Service]
Type=simple
User=ps
#此处用户名需要修改
Restart=always
RestartSec=5
ExecStart=/home/ps/tools/frp_0.51.3_linux_amd64/frpc -c /home/ps/tools/frp_0.51.3_linux_amd64/frpc.ini
#此处文件路径需要修改
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

路径要使用绝对路径,可以通过pwd来查看路径,并使用systemctl enable frps打开自启动

windows客户端

  • frps文件中新建批处理文件autostart.bat文件:
    @echo off
    chcp 65001
    title 内网穿透_不要关闭此窗口!!!
    echo ---------------------分割线-----------------
    echo 不要关闭此窗口!!! 
    echo 不要关闭此窗口!!!
    echo 不要关闭此窗口!!!
    echo ---------------------分割线-----------------
    
    if not defined TAG (
    	set TAG=1
    	start wt -p "cmd" %0 #要确保安装了windows terminal,如果没有安装,可以在Microsoft store中安装
    	exit
    )
    
    :home
    frpc -c frpc.ini
    goto home #为了崩溃或者异常后可以重启
  • 创建autostart.bat的快捷⽅式
  • 打开 C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\,将快捷⽅式粘贴到进去
  • 这个⽅法在每次PC开机时,就会弹出Windows Terminal的窗⼝,可能有点碍事,但你可以直接看到frpc的运⾏状态
  • 如果你暂时不需要启动frpc,直接Ctrl + C终⽌即可,然后需要运⾏的时候再去⼿动运⾏ autostart.bat 即可
  • 使用shutdown /r /t 0重启windows服务器

jupyter notebook配置

详情可见frp实现内网穿透以及配置Jupyter Notebook远程连接使用frp穿透远程访问Jupyter Notebook方法

生成nootbook配置文件

执行以下命令,会在用户目录下生成的配置文件~/.jupyter/jupyter_notebook_config.py,之后在这个文件中再进行配置。

jupyter notebook --generate-config

详细配置设置

  1. 进入python环境:
    from notebook.auth import passwd
    passwd()
    #设置自己的密码,例如123
    #然后两次输入确认生成加密字符串
    #一定保留好加密字符串
  2. ~/.jupyter/jupyter_notebook_config.py进行配置允许访问:
    c.NotebookApp.allow_remote_access = True  #允许远程访问
    c.NotebookApp.allow_root = True          #允许root访问
    c.NotebookApp.ip='*'                     # 这一项为noteboook运行所占用的IP
    c.NotebookApp.password = '上面复制的加密字符串'  
    c.NotebookApp.open_browser = False       # 禁止自动打开浏览器  
    c.NotebookApp.port =8888                 # 端口
    c.NotebookApp.notebook_dir = '设置Notebook启动进入的目录' 
    注意:如果用frp做内网穿透的话,这里的端口需要对应上面frp客户端web服务配置的端口号,tensorboard可视化等等其他web服务也是一样
  3. 配置完成,重启notebook即可
    使用nohup命令后台运行jupyter notebook,并将输出的内容追加的内容输出到jupyter.out文件中,同时将错误信息也输出到文件中。
    nohup jupyter notebook >>jupyter.out 2>&1 &
  4. 使用frp配置中的云服务器IP+端口号即可以远程访问

多个 SSH 服务复用同一端口

修改不同实例名即可

[ssh3]#修改这里的实例名
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2333

由于云主机的frp服务器端口是开放的,任意的frp客户端都可以随意在服务器注册端口映射,这样子在公网上及其不安全,所以建议要

默认情况下只要知道 FRP 服务端开放的端口,任意 FRP 客户端都可以随意在服务端上注册端口映射,这样对于在公网上的 FRP 服务来说显然不太安全。FRP 提供了身份验证机制来提高 FRP 服务端的安全性。
可以使用token加强验证。详见frp帮助文档

#在common中加入以下参数
token = [密码] #在frps与frpc的common中都加入以下参数

frp配置实现转发多个http站点

将新加的[web]项type改为tcp,后面也不用加域名或者ip。
frp会直接将其当作tcp数据包处理,只处理到了传输层(tcp),而没有到应用层(http)。
配置如下:

[web]
type = http
local_port = 8501
remote_port = 8080
custom_domains = 122.51.109.45

[web2]
type = tcp
local_ip = 127.0.0.1
local_port = 9995
remote_port = 9995

[web3]
type = tcp
local_ip = 127.0.0.1
local_port = 8502
remote_port = 8081

文章作者: 沈仲华
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沈仲华 !
  目录