Nginx 反向代理
- 什么是反向代理?
- 反向代理是一种服务器架构模式,客户端向反向代理服务器发起请求,反向代理服务器再将请求转发到内部网络中的实际服务器(内网服务),并将实际服务器的响应返回给客户端。从客户端角度看,仿佛是直接和反向代理服务器交互,无需知晓背后内网服务的存在。Nginx 作为高性能的 Web 服务器和反向代理服务器,很适合承担这个角色。
-
任务:在一台可以从公网访问的服务器(或本地虚拟机)上安装 Nginx,并将其配置为反向代理,以转发流量到你的内网服务(例如,在另一台机器上运行的 Web 服务器)。
-
具体操作:
- 在公网服务器上安装 Nginx。
- 修改 Nginx 配置文件,添加一个
server块,并使用proxy_pass指令将请求转发到你的内网 IP 地址和端口。
1 2 3 4 5 6 7 8 9 10 11 12 13# /etc/nginx/conf.d/reverse-proxy.conf # 需要先把 /etc/nginx/nginx.conf 里监听 80 端口的 server 注释掉 server { listen 80; # 监听80端口(HTTP默认端口) server_name 8.137.38.223; # 公网服务器的IP地址 location / { proxy_pass http://127.0.0.1:8001; # 转发到内网Web服务器的IP和端口 proxy_set_header Host $host; # 传递请求头中的Host信息,确保内网服务器能正确识别 proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录代理链的IP } }- 验证:通过公网 IP 访问 Nginx 服务器,确认能成功显示内网服务的页面。

Autossh 端口转发
- 任务:使用
autossh建立一个持久的 SSH 反向隧道,将内网服务的端口暴露到公网服务器上。
- SSH 反向隧道:通常情况下,SSH 隧道是从客户端(能访问公网的机器)主动连接到服务端(公网服务器),实现从客户端到服务端的端口转发。而反向隧道则是让服务端(公网服务器)主动连接到客户端(内网机器),从而将内网机器的端口暴露到公网服务器上,使得公网可以访问内网服务。
- Autossh:是 SSH 的一个封装工具,它能够自动监控 SSH 连接的状态,当连接断开时会自动重新建立连接,保证隧道的持久性,避免因为网络波动等原因导致隧道中断后需要手动重新建立。
- 具体操作:
- 在内网机器上安装
autossh。 - 执行
autossh命令,将内网服务的端口(例如 8080)反向隧道到公网服务器的一个指定端口(例如 8000)。
- 在内网机器上安装
- 配置 ssh 公钥:
- 内网:
ssh-keygen- 上传到服务器:
ssh-copy-id -i /root/key.pub user@8.137.38.223
1autossh -M 20000 -fCNR public_server_ip:8000:localhost:5000 root@public_server_ip
- 各参数解释:
-M 20000:指定一个监视端口,autossh 通过这个端口来监视 SSH 连接的状态,确保连接的持久性。-f:将 autossh 放入后台运行。-C:启用压缩,减少数据传输的大小,提高传输效率。-N:不执行远程命令,只进行端口转发。-R public_server_ip:8000:localhost:8080:建立反向隧道,将公网服务器的8000端口转发到内网机器的localhost:8080(即内网服务的端口)。user是公网服务器上的用户名。
- 验证:通过访问公网服务器的
8000端口,确认能访问到内网服务。
docker ps -a看所有容器;docker rm删除
docker insepct <image>看一下端口
- 配了很久,要注意的点:
- autossh 指令:
public_server_ip:8000这里要写0.0.0.0,不然只能服务器本地访问 - 不知道为什么密钥上传了但是没用
- 需要将服务器上的
/etc/ssh/sshd_config中GatewayPorts改为 yes,否则隧道仅允许目标服务器本地访问 8000 端口 netstat -tuln | grep 8000看服务器 ssh 连接状态;ps(process status) aux | grep autossh看内网的 autossh 命令- 云服务器还要看一下安全组是不是拦截了
- autossh 指令:

Tailscale 零配置网络
- 任务:使用
Tailscale建立一个零配置的虚拟私有网络(VPN),实现内网设备的点对点互联。
不需要复杂的网络配置(如端口转发、防火墙规则调整等),就能让分布在不同网络环境(如内网、公网)的设备,像在同一个局域网内一样实现点对点的互联互通。Tailscale 用于简化 VPN 搭建流程
-
具体操作:
- 在你的公网服务器和内网机器上分别安装
Tailscale。
curl -fsSL https://tailscale.com/install.sh | sh- 使用你的账户登录并加入
Tailscale网络。
1 2 3 4 5 6 7 8[root@localhost ~]# tailscale ip 100.124.165.66 [root@iZ2vc96n4f90pw7f8dfbfsZ ~]# tailscale ip 100.75.140.47 # 访问 OK [root@iZ2vc96n4f90pw7f8dfbfsZ ~]# curl http://100.124.165.66:5000 Hello from Flask!- 验证:在公网服务器上,通过内网机器的
Tailscale IP或主机名直接访问其内网服务,无需任何端口转发。
- 在你的公网服务器和内网机器上分别安装
Frp (Fast Reverse Proxy)
- 任务:使用 Frp 客户端-服务端模式,将内网服务暴露到公网。
Frp(Fast Reverse Proxy)是一款专注于内网穿透的高性能反向代理应用
下载
wget https://github.com/fatedier/frp/releases/download/v0.32.1/frp_0.32.1_linux_amd64.tar.gz安装参考:CentOS 7 部署frp穿透内网_centos frp-CSDN博客
1 2 3 4 5 6 7 8 9 10 11 12 13 14# 关防火墙 systemctl stop firewalld && systemctl disable firewalld # 关 SELinux setenforce 0 # 创建安装路径 mkdir -p /usr/local/frps # 解压备用 tar zxvf frp_0.32.1_linux_amd64.tar.gz -C /tmp # 复制 frps 和 frps.ini 两个配置文件 # 注意!!! 客户端要复制的是 frpc 和 frpc.ini cd /tmp/frp_0.32.1_linux_amd64 cp frps frps.ini /usr/local/frps # 配置 vim /usr/local/frps/frps.ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# 内网 frpc.ini [common] server_addr = 8.137.38.223 # 公网服务器 IP server_port = 7000 # 服务端 bind_port [web_tcp] # 模块名可自定义 type = tcp # 改为 TCP 类型 local_ip = 127.0.0.1 local_port = 5000 remote_port = 8001 # 公网服务器上用于访问的端口(需和服务端端口不冲突??冲突!) # 服务器 frps.ini [common] bind_port = 7000 # Frp 服务端与客户端通信的端口 vhost_http_port = 8080 # 若要通过 HTTP 访问内网 Web 服务,设置此端口
-
具体操作:
-
在一台公网服务器上运行
frps(服务端)。 -
在内网机器上运行
frpc(客户端),并配置其连接到服务端,将内网服务的端口暴露出去。
启动
./frps -c ./frps.ini- 验证:通过公网服务器的 IP 和 Frp 配置的端口,确认能访问到内网服务。
-
-
错了几个点:
-
运行内网的时候运行成
frps了 …… -
如果配置为
http的话,还需要域名,所以改成了tcp
-
