1. 前提条件

想要通过公网访问到位于校园网下的主机时,由于目标主机没有公网ip,无法直接通过SSH连接到远程主机,此时便需要使用内网穿透

想要配置内网穿透,首先必须先要有一台具有公网ip的服务器,如阿里云、腾讯云等服务器

2. frp工作原理

frp为内网穿透用到的开源软件,分为服务端和客户端。服务端运行在有公网ip的服务器上;客户端运行在内网主机上,二者可以进行数据转发。我们连接到客户端指定的端口便可以实现与内网主机连接

3. 配置公网服务器

下载frp库

# 下载
wget https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.62.1_linux_amd64.tar.gz

打开配置文件

vim frps.toml

修改文件内容

# frps.toml
# frp监听的端口,默认是7000,可以改成其他的
bindPort = 7000
# 用于客户端和服务器通信的身份验证令牌
auth.method = "token"
# 秘钥格式建议配置 用户+@+密码 的格式,方便区分用户,如下所示:
auth.token = "user1@12345678"

启动frps服务

./frps -c ./frps.toml

为了实现服务后台持续运行,可以将命令放在Tmux中,Tmux的使用请参考Tmux

云服务器上的防火墙上要放行bindPort和客户端中的remotePort两个端口

阿里云不仅需要设置防火墙规则,还需要在系统中开放端口

(1)先看看服务器是否开启了任务监听对应端口,我这里端口是7000

sudo netstat -tunlp | grep 7000

(2)如果任务已开始监听,然后看看防火墙是否开放了这个端口,很重要

sudo iptables -L -n --line-numbers | grep 7000

(3)如果防火墙没有开启这个端口,需要自己添加规则开启

sudo iptables -I INPUT -ptcp --dport 7000 -j ACCEPT

(4)补充iptables相关命令

查找所有规则

sudo iptables -L INPUT --line-numbers

4. 配置内网客户端

下载frp库

# 下载
wget https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.62.1_linux_amd64.tar.gz

打开配置文件

vim frpc.toml

修改文件内容

# frpc.toml
serverAddr = "x.x.x.x" # 公网服务器 IP
serverPort = 7000 # 与服务端配置的 bind_port 一致
# 代理名称将会改为 {user}.{proxy},建议配置,取服务器上的token中@前部分。
user = "user1"
auth.method = "token"
auth.token = "user1@12345678"

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1" # 内网服务 IP,一般为 127.0.0.1
localPort = 22 # 内网服务的端口
remotePort = 6000 # 外部访问的端口,注意不要与服务端端口冲突

启动frpc服务

./frpc -c ./frpc.toml

为了实现服务后台持续运行,可以将命令放在Tmux中

5. 本地设置

建议使用密钥连接内网主机,具体教程请参考使用SSH博客

在本地的~/.ssh/config中添加

Host 别名
  HostName 公网IP地址
  User 内网主机用户名
  IdentityFile 内网主机私钥的地址