写在开始

  换了新的实验室,以前实验室的服务器在学校的内网,从外网无法直接访问,利用内网穿透的服务,能够暴露内网服务器中的服务,甚至是SSH,这样就可以通过具有公网IP的服务器进行间接访问内网服务器,甚至能进一步绑定域名。做内网穿透服务时,需要你有一台具有公网IP的服务器,或者可以选择一些公益内网穿透项目,如果追求稳定,你可以使用贝瑞花生壳服务进行内网穿透,有免费的隧道,但是限速很严重,收费隧道价格昂贵,不值得推荐。
  我前段时间使用过一个公益的内网穿透服务器,叫ME Frp镜缘映射,这个公益平台是每天签到会有流量赠送,且出网速率能达到30Mbps,当然也要看节点的最大速率,但这种公益类型的机器较不稳定,且超多人同时使用(一个机器有时候端口数上万都建立了隧道),用着用着就嗝屁了(下图所示),嗝屁了只能换节点,我曾经有一次碰到过所有节点都嗝屁的情况,让人很被动。所以说重要的服务尽量避免使用此类内网穿透服务,但小打小闹,是可以尝试着用的。
Me Frp遭遇cc与ddos攻击
Me Frp的服务器状态
  我目前手里有几台云服务器,所以我基于第一种情况进行详细的介绍。

利用内网穿透暴露内网服务器中的服务

前置条件:

  • 拥有一台具有公网IP的服务器[或使用公益内网穿透,或使用贝瑞花生壳]
  • 拥有一台内网服务器


  现在的内网穿透服务多种多样,但内核大多数都是fatedier的Frp技术,fatedier/frp服务器开源于Github,目前已经有84.4k Star了,我们选择最原始的fatedier/frp进行部署

Frp的部署

  首先我们下载fatedier/frp的release版本v0.59.0,以我为例,我两台服务器都是linux版本,所以我下载的是linux版本的frp_0.59.0_linux_amd64.tar.gz,可以使用下面的命令直接下载。

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

  fatedier/frp分为服务端与客户端,服务端是提供穿透服务的,即访问服务端,服务端将请求转发给客户端;客户端是被穿透的一方,是提供真实服务的一方。解压frp_0.59.0_linux_amd64.tar.gz,我们可以看到一下目录:

frp_0.59.0_linux_amd64/
│
├── frpc
├── frpc.toml
├── frps
├── frps.toml
└── LICENSE

  frpc是客户端启动程序,frpc.toml是客户端配置文件,frps是服务端启动程序,frps.toml是服务端配置文件,我们需要分别配置客户端与服务端。

服务端的配置(配置在公网服务器上)

  编辑frps.toml文件,将以下配置粘贴:

bindAddr = "0.0.0.0"
bindPort = 7777
kcpBindPort = 7777
webServer.addr = "0.0.0.0"
webServer.port = 7776
webServer.user = "web服务中你设置的账户名"
webServer.password = "web服务中你设置的账户名密码"
log.to = "frps.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "建立隧道所需要的认证密码"
allowPorts=[{start=39000, end=40000}]

bindPort是frps服务所使用的端口,webServer.port是frps web服务所使用的端口,需要设置账户名与密码访问frps的web控制台,bindAddr与webServer.addr设置为0.0.0.0分别代表所有人都可以建立隧道、所有人都可以访问frps web服务,auth代表的是建立隧道的认证手段,allowPorts则代表能够建立隧道的端口。
  配置好上述配置文件后,需要启动服务端,这里给两种启动方式,第一种是直接启动,cd进入frp_0.59.0_linux_amd64所在的目录,直接执行frps可执行文件,并链接其配置文件,指定后台运行:

./frps -c ./frps.toml &

这种情况难以配置自启动,比较麻烦,万一重启还需要自己手动启动,不推荐。第二种方式是指定为系统服务,以系统服务的形式启动,首先创建frps的系统服务:

vim /lib/systemd/system/frps.service

将以下内容复制进/lib/systemd/system/frps.service中

[Unit]
#服务描述
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#执行命令(注意替换安装的路径)
ExecStart=[安装路径]/frps -c [安装路径]/frps.toml

[Install]
WantedBy=multi-user.target

创建完系统服务后,一定要重载系统服务。

sudo systemctl daemon-reload

就可以使用systemctl对frps进行控制,启动、关闭、重启、查看状态、开机启动。

#启动
sudo systemctl start frps
#关闭
sudo systemctl stop frps
#重启
sudo systemctl restart frps
#查看状态
sudo systemctl status frps
#开机启动
sudo systemctl enable frps

启动frps后,我们也可以使用lsof -i:端口号查询是否启动成功。

lsof -i:7776 # frps web 服务
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
frps    8207 root    7u  IPv6 1450838      0t0  TCP *:7776 (LISTEN)
lsof -i:7777 # frps 服务
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
frps    8207 root    8u  IPv6 1450839      0t0  TCP *:cbt (LISTEN)
frps    8207 root    9u  IPv6 1450840      0t0  UDP *:cbt

要访问web服务的话,记得要把防火墙打开
frps web服务预览

客户端的配置(配置在内网服务器上)

  同理,在需要被穿透的服务器上下载frp_0.59.0_linux_amd64,并编辑客户端配置文件frpc.toml,以穿透内网服务器的ssh(22端口)为例:

serverAddr = "服务器的IP地址"
serverPort = 7777 # 服务端启动端口
auth.method = "token"
auth.token = "服务端所设置的认证密码"

[[proxies]]
name = "linux.ssh.tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 39322 # 必须在frps设置的allowPorts之内

  配置好上述配置文件后,需要启动客户端,同样有两种启动方式,第一种是直接启动,在内网服务器中cd进入frp_0.59.0_linux_amd64所在的目录,直接执行frpc可执行文件,并链接其配置文件,指定后台运行:

./frpc -c ./frpc.toml &

第二种方式是指定为系统服务,以系统服务的形式启动,首先创建frpc的系统服务:

vim /lib/systemd/system/frpc.service

将以下内容复制进/lib/systemd/system/frpc.service中

[Unit]
#服务描述
Description=frpc service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#执行命令(注意替换安装的路径)
ExecStart=[安装路径]/frpc -c [安装路径]/frpc.toml

[Install]
WantedBy=multi-user.target

创建完系统服务后,同样一定要重载系统服务。

sudo systemctl daemon-reload

就可以使用systemctl对frpc进行控制,启动、关闭、重启、查看状态、开机启动。

#启动
sudo systemctl start frpc
#关闭
sudo systemctl stop frpc
#重启
sudo systemctl restart frpc
#查看状态
sudo systemctl status frpc
#开机启动
sudo systemctl enable frpc

当服务器的frps与客户端的frpc全部启动成功后,就可以使用ssh [frps服务器IP]:[映射端口号]对服务器进行访问了。
成功访问被穿透端ssh

服务反向映射

  如果你有域名的话,可以设置域名解析后,nginx反向映射到对应的端口,即可通过域名来访问相应的服务了。比如我使用宝塔的反向映射功能,设置完成后,就可以直接ssh username@[域名]进行访问了。
宝塔nginx反向映射

写在结尾

  本来以为ssh内网穿透后做反向映射后还能套cdn的,貌似不行,连可以连上,但是连上了立刻就被断开了...
套CDN后的情况,似乎不行

最后修改:2024 年 09 月 13 日
如果觉得我的文章对你有用,请随意赞赏