All Articles

使用frp内网穿透进行ssh登录

前言

内网穿透工具frp,有需要的人肯定已经了解它是什么了,不知道的可以去官网看下:

架构与场景理解

这块网上其实已经有相当多的文章进行过阐述了,这里就简单说一些我的理解。

首先需要明确角色:

  • 用户:需要从外部(公网上)访问内部服务的人
  • frp服务端:处于公网上,拥有固定IP或者固定域名的主机;必须是主机,需要可以在这台主机上安装frp的服务端程序
  • frp客户端:处于内网上,缺失固定IP或者从公网上无法访问得到的一些局域网内主机;同样必须是主机,必须可以安装frp的客户端程序
  • 内部服务:可以是和frp客户端安装在同一台主机上的应用程序,也可能是和frp客户端处于同一内网的某一台主机上的一些应用程序

如果内部服务这台主机在公网上可以直接访问得到,那么用户就可以直接过去访问,就没有frp什么事情了。但很多情况就是如此不尽如人意,某些服务和主机就是隐藏在一些内部私有的网络里面的,在公网上是没办法直接访问的。

这时候就需要在公网的主机上安装frp服务端程序,作为一个大家的目标(后续用户和frp客户端都会主动连接到这台主机上,这个主机是双向标的)。用户连接上来是为了访问内部服务,而frp客户端连接上来,则是为了告知frp服务端,内部服务到底在哪里。因为处于内网的服务,frp服务端也不能主动得知,必须frp客户端主动连接上去告知服务端,我在这里。

上面是一些比较感性的理解,具体的可以看图(注意图上的sc,frps就是刚才说的frp服务端,而frpc则是frp客户端):

安装

安装分为服务端和客户端两部分。frp在大部分的linux发行版本上都是没有的,所以一般需要直接从github上下载release包,具体可以到这里查看。

下面的例子都以ubuntu为例,应用场景都是:

用户 => frp服务端(公网) => frp客户端(私有网络) => 目标内部主机ssh(私有网络)

服务端

$ uname -m
x86_64
$ wget https://github.com/fatedier/frp/releases/download/v0.34.1/frp_0.34.1_linux_amd64.tar.gz
$ tar zxvf frp_0.34.1_linux_amd64.tar.gz
$ rm ./frp_0.34.1_linux_amd64.tar.gz
$ mv -f ./frp_0.34.1_linux_amd64 ./frp
$ cd frp
$ vim frps.ini
bind_port = 7000
token = some_secret_string
dashboard_port = 7500
dashboard_user = user_name
dashboard_pwd = user_password

说明:

  • bind_port:frp客户端连接frp服务端的端口号
  • token:frp客户端连接服务端需要一致的秘钥(客户端和服务端两者的ini配置文件里这个字串必须一致)
  • dashboard_port:frp服务端暴露出来,让管理员监控的面板的端口号
  • dashboard_user:监控面板的用户名
  • dashboard_pwd:监控面板的用户密码

接下来创建ubuntu的开机启动和daemon控制:

$ sudo vim /etc/systemd/system/frps.service

填写内容:

[Unit]
Description=frps daemon
After=syslog.target  network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/path_to_frp/frps -c /path_to_frp/frps.ini
Restart= always
RestartSec=1min
ExecStop=/usr/bin/killall frps

[Install]
WantedBy=multi-user.target

启动、设置开机启动、重启,三个命令:

$ sudo systemctl start frps
$ sudo systemctl enable frps
$ sudo systemctl restart frps

客户端

$ uname -m
x86_64
$ wget https://github.com/fatedier/frp/releases/download/v0.34.1/frp_0.34.1_linux_amd64.tar.gz
$ tar zxvf frp_0.34.1_linux_amd64.tar.gz
$ rm ./frp_0.34.1_linux_amd64.tar.gz
$ mv -f ./frp_0.34.1_linux_amd64 ./frp
$ cd frp
$ vim frpc.ini
[common]
server_addr = some_ip
server_port = 7000
token = some_secret_string

[ssh]
type = tcp
local_ip = 127.0.0.1 
local_port = 22
remote_port = 6000

说明:

  • server_addr:frp服务端所在的机器的IP,也就是公网上的那台
  • server_port:这个端口号记得和之前服务端的配置一致
  • token:这个也必须和之前服务端的配置一致
  • local_port:内部服务所在那台机器,也就目标登录机的ssh端口号
  • remote_port:这个端口号,是指frpc的local_port应该映射到frps主机上的哪个端口号,也就是最终用户ssh登录时使用的端口号

仍旧需要创建ubuntu的开机启动和daemon控制:

$ sudo vim /etc/systemd/system/frpc.service

填写内容:

[Unit]
Description=frpc daemon
After=syslog.target  network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/path_to_frp/frpc -c /path_to_frp/frpc.ini
Restart= always
RestartSec=1min
ExecStop=/usr/bin/killall frpc

[Install]
WantedBy=multi-user.target

启动、设置开机启动、重启,三个命令:

$ sudo systemctl start frpc
$ sudo systemctl enable frpc
$ sudo systemctl restart frpc

最终使用

最终用户ssh登录的时候,使用的命令如下:

$ ssh -v -p 6000 user@frps_ip

EOF

Published 2020/10/19

Some tech & personal blog posts