通过frp实现内网穿透功能

2023/03/26 编程人生 共 2131 字,约 7 分钟

让我们从0开始搭建一个很酷的内网穿透功能.

作为一名程序员,谁不想拥有一个自己的云服务器呢. 但是当我们看了各大云服务器厂商的价格后, 不禁陷入了沉思:我好像对云服务器的诉求也没那么大! 等我们回家看到家里闲置的老旧电脑时,又会想,我为啥要用云服务器呢,家里的电脑改吧改吧, 不也就可以用了. 我们又不用做大流量的网站, 最多搞搞博客,跑跑爬虫啥的,只要能让我们可以随时在外面访问我家里的电脑,控制家里的电脑就行了. 好的,说干就干, 经过一番调研, 我们发现, 好像没自己想象的那么简单. 一个最直接的问题就是, 我们没有一个自己的ip,因为众所周知的ipv4资源耗尽的问题, 我们家里实际上网的ip其实不是固定的, 而是多家用户共享一个ip地址,也就是NAT(Network Address Translation)技术. 所以,从外网我们是无法直接访问家里的电脑的. 这个问题怎么解决呢? 就是我们今天要聊的话题, 内网穿透技术.

什么是内网穿透

内网穿透,也即NAT穿透,进行NAT穿透是为了使具有某一个特定源IP地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机. 大致流程如图: 内网穿透图

准备工作

  1. 一台云服务器, 最便宜的即可,我们主要用其来注册内网服务器, 转发请求
  2. frp工具
  3. 家用电脑,台式,笔记本都行,操作系统任意.

开始内网穿透

云服务器搭建frp服务

参考官方安装frp说明, 下载合适自己服务器的frp版本, 解压到自定义的frp服务目录. 因为是服务器部分, 我们直接启用frps 即可启动成功frp的服务部分.

# 启动frps, 并指定配置文件为frps.ini 
./frps -c ./frps.ini

配置部分参考官方配置样例. 我们demo样例只使用ssh基本服务, 就用了默认配置.

[common]
bind_port = 7000

配置frps为系统服务(选做)

为了方便, 我们一般会将frps配置成系统重启自动加载. 这样我们就不用担心服务器系统重启导致内网穿透服务掉线了.
方法如下:

  1. 先确认系统支持systemd, 如果不支持请安装
    # yum
    yum install systemd
    # apt
    apt install systemd
    
  2. 配置frps.service服务
    vim /etc/systemd/system/frps.service
    

    写入下面内容 ``` [Unit]

    服务名称,可自定义

    Description = frp server After = network.target syslog.target Wants = network.target

[Service] Type = simple

启动frps的命令,需修改为您的frps的安装路径

ExecStart = /path/to/frps -c /path/to/frps.ini

[Install] WantedBy = multi-user.target

3. 开机自动启动
```bash
systemctl enable frps

家用电脑安装frp客户端

我家里的电脑是windows10, 当然, Linux更好. 本次内网穿透的目的是可以通过远程ssh控制我的家用电脑.

win10的一些准备功能

windows系统作为家用本, 对网络权限限制的比较多, 需要我们额外做一些操作.
a. 安装windows的ssh服务端
win10默认是不支持ssh的服务端的, 需要我们安装相应的OpenSSH服务器.
操作步骤: 设置->应用-> 应用与功能 -> 可选功能 -> 添加OpenSSH服务器
openssh-s1
openssh-s2
openssh-s3
最后开启ssh服务,以管理员身份打开cmd终端,执行如下命令

net start sshd

b. 防火墙可能会将frpc识别为危险文件, 记得去防火墙那里将工具恢复.

配置frp客户端

从官网下载下frpc客户端后,且成功从防火墙那里逃生, 就可以继续后面的操作了 首先同样先修改配置文件

[common]
# 你的云服务器实际ip
server_addr = x.x.x.x 
# 云服务配置的端口
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
# 本地要暴露的端口, windows网络限制比较严格,记得去防火墙打开相应端口
local_port = 22
# 远程服务器监听的端口. 意思就是frps服务器监听6000的端口, 然后把请求转发的本地的22端口上.
remote_port = 6000

然后打开cmd终端使用命令行的方式启动frpc工具
最后就可以在外网使用ssh命令访问你的系统了

ssh -oPort=6000 你的系统用户名@x.x.x.x

frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口

修改window默认终端为powerShell(选做)

windows的默认终端为cmd, 很多命令不与linux兼容. 所以建议将windows的默认终端改为powerShell, 更方便.

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

参考

文档信息

Search

    Table of Contents