Docker 容器内进行 frp 内网穿透
开始之前需要有一台可以进行公网访问的服务器
下载安装 frp
这个直接到 github 官网就可以下载了
点击Releases
就可以查看到可以下载的源,根据自己电脑的型号进行选择就好了。
linux服务器上下载
如果是在linux的服务器上的话可以直接通过wget
进行下载
例如:
wget https://github.com/fatedier/frp/releases/download/v0.63.0/frp_0.63.0_android_amd64.tar.gz
然后你就会得到一个tar.gz
的一个压缩包
然后把压缩包进行解压
tar -zxvf frp_0.63.0_android_amd64.tar.gz
解压完后你就可以在本地看到一个frp_0.63.0_android_amd64
的文件夹
文件夹中一般有 4 个文件,frpc
开头是进行客户端连接的,也就是你要穿透的电脑运行的,而frps
是开头的是运行在服务端的,也就是有公网 IP 的服务器上面的
服务端配置
服务端的配置全部写在文件frps.toml
里面(有可能是frpc.ini
),最开始的设置只有一个,那就是这个服务端运行绑定的端口是哪里,这里默认是 7000 端口,我们不用改,只不过在服务器的控制台中需要把这个端口给开放,不然客户端无法访问。
如果你只是需要简单的进行测试,看是否能够跑通内网穿透,那么你就不用再进行其他的配置了。
如果你是需要长期使用的话还需要一些其他的配置,更利于我们使用,例如token
防止服务器被劫持了。
同样这些设置都是放在frps.toml
里面的
# 最新设置请参考官网 https://gofrp.org/zh-cn/docs/features/common/configure/
# 服务端和客户端的TCP通信端口, 建议1024以上端口
bind_port = 7000
# 客户端访问服务端的密码
token = abcdefg
# 服务端仪表盘的端口, 可以用浏览器访问查看
dashboard_port = 7500
# 服务端仪表盘的用户密码
dashboard_user = frp
dashboard_pwd = frp123# 日志保存设定, 保存位置、保存时长
log_file = ./frps.log
log_level = info
log_max_days = 7
如果要长期进行访问的话建议把token
设置的强一点,不容易攻破
启动服务端
启动服务端非常简单,把二进制文件frps
运行起来就好了。
- 如果只是简单的单词运行
# 在frp的目录下
./frps -c frps.toml
- 如果要后台运行
# 同样在frp目录下,使用nohup,控制台的输出会保存在当前文件夹的nohup.out文件中,查看输出即可了。
nohup ./frps -c frps.toml &
这样服务端就能运行起来啦!
如果启动失败,有可能是端口没开放,7000端口进的查看哦,有的可能防火墙也没开放,记得检查。两层一个云服务提供商的安全策略,一个就是自己服务器的防火墙
客户端配置
客户端的配置就是frpc.toml
文件
初始的内容如下:
下面对配置进行说明
serverAddr = "x.x.x.x"
serverPort = 7000[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
启动客户端
# 后台启动
# 同样在frp目录下,使用nohup,控制台的输出会保存在当前文件夹的nohup.out文件中,查看输出即可了。
nohup ./frpc -c frpc.toml &
# 前台启动
# 在frp的目录下
./frpc -c frpc.toml
Windows 操作无异,一样的修改配置文件,然后运行就好了
踩坑
此次进行
frp
内网穿透,目标是穿透 Docker 容器,使得我能够通过外网直接访问我创建的容器
前面的下载步骤,以及配置服务端很简单,一下就配置好了,但是当我要进行连接的时候,就算我设置了Docker
容器的密码,也是不行,总是出现 Authentication Rejected
拒绝访问。
但是我明明都已经穿透好了,为什么不行呢?
我进行了一下对比实验,我不进行ssh
连接,看看内网穿透可不可行,就能发现到底是软件问题,还是本身Docker
就不能进行穿透了。
通过下载nginx
打开端口80,发现是可以进行内网穿透的,所以问题不是在软件上,在 Docker
镜像的设置上面。
经过多方查找,终于找到原因:
-
Ubuntu Lastest
镜像下载的ssh
工具不允许通过密码连接,所以要打开密码连接的设置。- 把
/etc/ssh/sshd_config
中的PasswordAuthentication yes
的注释删掉.
- 把
-
同时,
ssh
默认不运行进行root
用户进行连接- 需要把
/etc/ssh/sshd_config
中#PermitRootLogin prohibit-password
下面添加一行PermitRootLogin yes
当然你把prohibit-password
改成yes
也可以,当然了这样的话就要去掉注释了。
- 需要把