docker部署frp穿透内网
文章目录
- (1)部署frps服务器
- (2)部署frpc客户端
- (3)重启与访问frp
- (4)配置nginx反向代理
(1)部署frps服务器
docker安装参考文档:docker基本知识
1.创建目录
创建目录,用于存放容器持久化存储卷
mkdir -p /data/frp
cd /data/frp
vim frps.ini
2.编辑配置文件
#进入 /data/frp 目录
cd /data/frp
#使用 Vim 编辑器打开 frps.ini 文件
vim frps.ini
配置文件如下:
[common]
bind_addr = 0.0.0.0
bind_port = 7000
dashboard_port = 7001
vhost_http_port = 10080
vhost_https_port = 10443
token = abcd12345
dashboard_user = admin11
dashboard_pwd = admin11
#需要穿透的内网服务1
[could]
type = tcp
local_ip = 192.168.31.100
local_port = 5000
remote_port = 5000
#需要穿透的内网服务2
[chat]
type = tcp
local_ip = 192.168.31.223
local_port = 3000
remote_port = 3000
....
此处省略若干个服务器
你可以根据自己的需求修改这个配置文件,添加或修改代理规则,然后保存退出 Vim 编辑器。
配置内容含义:
[common]:通用配置部分,用于设置 frp 服务器的基本参数。
bind_addr:绑定的 IP 地址,这里设置为 0.0.0.0,表示监听所有的网络接口。
bind_port:服务绑定的端口号,这里设置为 7000。
dashboard_port:frp 仪表盘的端口号,这里设置为 7001。
vhost_http_port:虚拟主机 HTTP 端口号,这里设置为 10080。
vhost_https_port:虚拟主机 HTTPS 端口号,这里设置为 10443。
token:访问 frp 服务器的令牌,这里设置为 abcd12345
dashboard_user:frp 仪表盘的用户名,这里设置为 admin11。
dashboard_pwd:frp 仪表盘的密码,这里设置为 admin11。
[could] 和 [chat]:代理规则部分,用于定义具体的代理规则。
type:代理类型,这里设置为 tcp,表示 TCP 代理。
local_ip:本地 IP 地址,这里设置为 192.168.31.100和192.168.31.223。
local_port:本地端口号,这里设置为 5000 和 3000。
remote_port:远程端口号,这里设置为 5000 和 3000。
3.拉取镜像
拉取和启动一个名为 “frps” 的 Docker 镜像。这个镜像是由 “ryaning/frps” 提供的,它是一个用于部署 frp 服务器的镜像。
通过命令 docker pull ryaning/frps
是用于从 Docker Hub 上拉取 “ryaning/frps” 镜像到本地。
docker pull ryaning/frps
4.启动容器
通过命令 docker run
启动一个容器。这个容器使用了一些参数:
docker run --restart=always --network host -d -v /data/frp/frps.ini:/etc/frp/frps.ini --name frps ryaning/frps
--restart=always
表示容器将会在退出时自动重启。--network host
表示容器使用宿主机的网络命名空间,与宿主机共享网络栈,使得容器中的应用可以直接使用宿主机的网络接口。-d
表示容器以后台模式运行。-v /data/frp/frps.ini:/etc/frp/frps.ini
表示将宿主机上的/data/frp/frps.ini
文件挂载到容器中的/etc/frp/frps.ini
文件,这样可以在容器中使用自定义的配置文件。--name frps
表示给容器指定一个名称为 “frps”。
当容器启动后,frp 服务器就会在容器中运行,使用挂载的配置文件进行配置。
5.安全组配置
在云服务器的安全组中,如果你想要允许入方向的连接到特定的端口,需要开放相应的端口。
以下是一般的步骤:
-
登录云服务提供商的管理控制台
-
导航到安全组配置页面
-
找到服务器实例所使用的安全组,并编辑该安全组的规则。
-
添加一个新的入方向规则,指定协议(如 TCP 或 UDP)和端口号。
根据需求,可以选择指定来源 IP 地址范围或来源安全组。
保存规则并应用更改。 -
具体的步骤和界面可能因云服务提供商而有所不同。你可以参考云服务提供商的文档或向他们的支持团队寻求帮助,以获取更详细的指导。
(2)部署frpc客户端
1.创建目录
创建目录,用于存放容器持久化存储卷
mkdir -p /data/frp
cd /data/frp
2.配置文件
vim frpc.ini
配置内容
[common]
server_addr = 120.78.156.217
server_port = 7000
token = abcd12345
[could]
type = tcp
local_ip = 192.168.31.100
local_port = 5000
remote_port = 5000
[chat]
type = tcp
local_ip = 192.168.31.223
local_port = 3000
remote_port = 3000
配置文件内容含义:
[common]
部分定义了 frpc 的常规配置,包括server_addr
、server_port
和token
。请确保这些值是正确的,并与 frps 服务器的配置相匹配。[could]
部分定义了一个名为could
的隧道,其类型为tcp
。该隧道将本地的192.168.31.100:5000
映射到远程的5000
端口。请确保本地和远程的 IP 和端口设置正确。[chat]
部分定义了一个名为chat
的隧道,其类型也是tcp
。该隧道将本地的192.168.31.223:3000
映射到远程的3000
端口。同样,请确保 IP 和端口设置正确。
3.查看frpc docker镜像
docker search frpc
4.拉取snowdreamtech/frpc 镜像
docker pull snowdreamtech/frpc
5.启动snowdreamtech/frpc 容器
docker run --restart=always --network host -d -v /data/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc
(3)重启与访问frp
服务端重启
docker restart frps
客户端重启
docker restart frpc
查看监听服务
重启完成,查看服务器监听的端口(其中5000和3000端口是我们想要的)
[root@josh-clound frp]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1081/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1020/master
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 550/rpcbind
tcp6 0 0 :::3000 :::* LISTEN 5268/frps
tcp6 0 0 :::7000 :::* LISTEN 5268/frps
tcp6 0 0 :::7001 :::* LISTEN 5268/frps
tcp6 0 0 ::1:25 :::* LISTEN 1020/master
tcp6 0 0 :::10080 :::* LISTEN 5268/frps
tcp6 0 0 :::5000 :::* LISTEN 5268/frps
tcp6 0 0 :::10443 :::* LISTEN 5268/frps
tcp6 0 0 :::111 :::* LISTEN 550/rpcbind
tcp6 0 0 :::80 :::* LISTEN 5786/docker-proxy
尝试访问
浏览器打开http://服务器IP:3000/进行访问
http://服务器IP:5000/ 进行访问
(4)配置nginx反向代理
通过IP+ 端口的访问方式,实现了,那么我不想记IP,那么就通过域名方式进行访问。
docker安装nginx
1.创建挂载目录
用于将宿主机上的目录 /usr/local/nginx
与容器内的目录进行挂载。
mkdir -p /usr/local/nginx/conf
mkdir -p /usr/local/nginx/log
mkdir -p /usr/local/nginx/html
/usr/local/nginx/conf
:用于存放 Nginx 的配置文件。/usr/local/nginx/log
:用于存放 Nginx 的日志文件。/usr/local/nginx/html
:用于存放 Nginx 的静态网页文件。
2.创建临时用容器
docker run --name nginx -p 9001:80 -d nginx
3.复制临时容器的配置到宿主机
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /usr/local/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /usr/local/nginx/
4.创建Nginx容器
docker run \
-p 80:80 \
--name nginx \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx/log:/var/log/nginx \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-d nginx:latest
docker run
:用于创建并运行一个新的容器。-p 80:80
:将容器的 80 端口映射到宿主机的 80 端口,这样可以通过宿主机的 IP 地址或域名访问 Nginx 服务器。--name nginx
:指定容器的名称为nginx
。-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
:将宿主机上的/usr/local/nginx/conf/nginx.conf
文件挂载到容器内的/etc/nginx/nginx.conf
文件,用于配置 Nginx。-v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d
:将宿主机上的/usr/local/nginx/conf/conf.d
目录挂载到容器内的/etc/nginx/conf.d
目录,用于存放 Nginx 的额外配置文件。-v /usr/local/nginx/log:/var/log/nginx
:将宿主机上的/usr/local/nginx/log
目录挂载到容器内的/var/log/nginx
目录,用于存放 Nginx 的日志文件。-v /usr/local/nginx/html:/usr/share/nginx/html
:将宿主机上的/usr/local/nginx/html
目录挂载到容器内的/usr/share/nginx/html
目录,用于存放 Nginx 的静态网页文件。-d nginx:latest
:使用nginx:latest
镜像创建容器,并在后台运行。
5.编辑nginx.conf配置文件
在http模块中添加两个server,分别用于处理两个不同的域名:chat.joshzhong.top
和 could.joshzhong.top
。
#第一个服务器块用于处理 chat.joshzhong.top 域名的请求,配置如下:
server {
listen 80;
server_name chat.joshzhong.top;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
#第二个服务器块用于处理 could.joshzhong.top 域名的请求,配置如下:
server {
listen 80;
server_name could.joshzhong.top;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
模块解释:
listen 80;
:监听 80 端口,表示该服务器块将处理来自该端口的请求。server_name chat.joshzhong.top;
:指定该服务器块处理的域名为chat.joshzhong.top
。(could.joshzhong.top同上)location /
:匹配所有请求路径。proxy_pass http://127.0.0.1:3000;
:将请求代理转发到本地的http://127.0.0.1:3000
地址,这意味着所有来自chat.joshzhong.top
域名的请求都将被转发到本地的 3000 端口。(5000端口也是如此)
当有请求访问 chat.joshzhong.top
域名时,Nginx 将代理转发到本地的 3000 端口;当有请求访问 could.joshzhong.top
域名时,Nginx 将代理转发到本地的 5000 端口
重载nginx
#重启即可,就不进docker容器reload了
docker restart nginx
域名访问
http://chat.joshzhong.top/
http://could.joshzhong.top/