Proxy
概述
参考:
在计算机网络中,Proxy server(代理服务器) 是一种服务器应用程序,充当资源请求的客户端和提供该资源的服务器之间的中介。
Proxy(代理) 有很多种理解,还可以表示一种服务、一个概念。
Proxy 服务在整个 IT 圈子中非常常见
- 利用 Tunneling Protocol 实现的类似 Tunneling(隧道) 功能也可以看做是 Proxy
- VPN 本质也是一种代理
- etc.
Forward/Reverse proxy
Forward proxy(正向代理) 与 Reverse proxy(反向代理)。
| 正向代理 | 反向代理 | |
|---|---|---|
| 代理对象 | 客户端 | 服务端 |
| 隐藏对象 | 客户端 IP | 服务端 IP |
| 主要用途 | 突破限制、匿名访问 | 负载均衡、安全防护、加速 |
| 典型工具 | Clash, Squid, Shadowsocks | Nginx, HAProxy, Cloudflare |
[!Note] 在 Web 中还有一个 User-Agent 的概念,Agent 可以看作是一种代理,只不过代理形式与 Proxy 有点不太一样,Agent 更强调作为用户的代理人执行操作。虽然都是代替真实人类发起网络请求,Agent 更靠近人类。
比如我可以这么描述:DesistDaydream 通过 Chrome 这个 Agent,利用 Clash 这个 Forward proxy 访问 Google 网站,Google 网站使用 Nginx 这个 Reverse proxy 返回其站点的资源给我的 Agent 后,由 Agent 展现给我。
Squid
参考:
Squid 是一款老牌的可以提供代理服务的程序。Squid 版本 1.0.0 于 1996 年 7 月发布。
在服务端安装完成后,将 /etc/squid/squid.conf 文件中的 http_access deny all 修改为 http_access allow all;之后在客户端通过 Linux 代理配置 指定服务端的 3128 端口即可。
关联文件与配置
/etc/squid/
- ./squid.conf # 主要配置文件
GOST
参考:
- GitHub 项目,ginuerzh/gost
- GitHub 项目,go-gost/gost
- ginuerzh/gost 项目的 3.0 版本
GO Simple Tunnel(Go 简单隧道,简称 GOST) 是 Go 语言编写的,实现了简单隧道的程序。
[!Tip] 甚至可以把 GOST 当作没有实现 Secure Shell Protocol 的 OpenSSH 程序
架构
https://gost.run/concepts/architecture/
TODO
配置文件
环境: dept 网络区域;idc 网络区域。idc 可以访问 dept,dept 不可以访问 idc
诉求: dept 想要访问 idc 的 9116 端口
与下面的 实现 SSH 的远程转发功能 一样
dept 配置
services:
- name: tunnel-server
addr: :8080
handler:
type: relay
metadata:
bind: true # 启用 Bind 功能,以便 Gost 可以在本设备上监听其它端口,让该端口与其他 Gost 节点的端口互通
listener:
type: tcp
idc 配置
services:
- name: rtcp-snmp
addr: :19116 # 在 dept 设备上开启 19116 端口,发往 19116 端口的数据包将会转发到本地的 9116 端口上
handler:
type: rtcp
listener:
type: rtcp
chain: chain-to-dept # 让该服务使用 chain-to-dept Chain 进行通信。该名称需要与 chains[x].name 的值一致。
forwarder:
nodes:
- name: snmp-exporter
addr: localhost:9116
chains:
- name: chain-to-dept
hops:
- name: hop0
nodes:
- name: dept-server
addr: ${DEPT-IP}:8080
connector:
type: relay
dialer:
type: tcp
最佳实践
gost -L http://:8080 -L socks5://:1080 使用命令直接启动一个简单的代理。
- 然后在 Shell 中配置代理即可
export hostip="192.168.254.254"
export http_proxy="http://${hostip}:1080"
export https_proxy="http://${hostip}:1080"
export all_proxy="sock5://${hostip}:1080"
实现 SSH 的远程转发功能
环境: A 可以访问 B,B 不可以访问 A。
诉求: B 想要访问 A 的 3100 端口
B 上执行(这其实就类似启动了一个不带 ssh 能力的 sshd 服务。)
/usr/local/bin/gost -L "relay://:13100?bind=true"
A 上执行
/usr/local/bin/gost -L rtcp://${B-IP}:3100/${A-IP}:3100 \
-F relay://${B-IP}:13100
解释:
- 本地使用随机端口,与
${B-IP}:13100建立连接。假如端口是 12345 rtcp://${B-IP}:3100# 告诉 B 的 GOST,在本地开启 3100 监听- B:3100 上收到的数据包会转发给 B:13100,传输到 A:12345。然后,A 的 GOST 将 A:12345 收到的数据包转发到 A:3100
[!Attention] 有时候有防火墙,B 在防火墙后面,A 只能通过防火墙映射的端口访问到 B 的 13100。在这种情况下
/usr/local/bin/gost -L rtcp://0.0.0.0:3100/${A-IP}:3100 -F relay://${映射-IP}:${映射-PORT}
其他
- Go 语言编写,简单的 http 代理
proxychains
项目地址: https://github.com/haad/proxychains
凡是通过 proxychains 程序运行的程序都会通过 proxychains 配置文件中设置的代理配置来发送数据包。
apt install proxychains 即可
修改配置文件
sock5 127.0.0.1 10808 # 指定本地代理服务所监听的地址
proxychains /opt/google/chrome/chrome # 即可通过代理打开 chrome 浏览器
proxychains curl -I https://www.google.com 会成功
Reverse Proxy(反向代理)
参考:
https://github.com/yosebyte/nodepass
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.