各位听众,大家好!今天咱们来聊聊代理服务器那些事儿,特别是怎么配置一个能“偷窥” WebSocket 和 HTTP/2 流量的透明代理。别害怕,我说的“偷窥”是指技术上的流量分析,不是真的让你去干坏事儿啊!
咱们的目标是,让用户毫无察觉的情况下,他们的 WebSocket 和 HTTP/2 流量经过我们的代理服务器,并且我们可以抓取这些流量进行分析、修改,或者做其他你想做的事情。
开场白:代理服务器的“前世今生”
代理服务器,简单来说,就像一个中间人。你的电脑(客户端)想访问某个网站,不是直接去访问,而是先找到这个中间人,告诉它:“嘿,帮我看看这个网站”,然后中间人再去访问网站,把结果拿回来给你。
传统的代理服务器,需要你在浏览器或者操作系统里设置代理地址和端口。而咱们今天要讲的“透明代理”,就厉害了,它不需要用户做任何设置,流量会自动跑到代理服务器来。
第一幕:为什么要“偷窥” WebSocket 和 HTTP/2?
你可能会问,HTTP/1.1 不是已经够用了吗?WebSocket 和 HTTP/2 到底有什么特别的,值得我们费这么大劲去“偷窥”呢?
- WebSocket: 传统的 HTTP 协议是客户端发起请求,服务器响应。WebSocket 协议实现了客户端和服务器之间的双向通信,可以实时推送数据,比如在线聊天、实时游戏等等。了解 WebSocket 流量,可以帮助我们分析这些应用的通信机制,甚至进行一些安全测试。
- HTTP/2: HTTP/2 是 HTTP/1.1 的升级版,它使用了多路复用、头部压缩等技术,大大提高了网页的加载速度。但是,HTTP/2 的流量是二进制的,不像 HTTP/1.1 那样是文本的,直接用 Wireshark 看会很头疼。所以,我们需要一个工具来把 HTTP/2 的流量“翻译”成人话。
第二幕:透明代理的“葵花宝典”——iptables 和 NAT
要实现透明代理,最常用的工具就是 iptables 和 NAT(Network Address Translation)。iptables 是 Linux 系统上的防火墙工具,可以用来做流量转发;NAT 则可以将一个 IP 地址转换成另一个 IP 地址。
咱们的思路是:
- 拦截流量: 使用 iptables 拦截所有发往 80 端口(HTTP)和 443 端口(HTTPS)的流量。
- 重定向流量: 将这些流量重定向到我们的代理服务器。
下面是 iptables 的配置命令(假设代理服务器运行在同一台机器上,端口为 8080):
# 清空所有 iptables 规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# 设置默认策略
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# 开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# NAT 表,PREROUTING 链,拦截所有发往 80 端口的 TCP 流量,重定向到 8080 端口
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
# NAT 表,PREROUTING 链,拦截所有发往 443 端口的 TCP 流量,重定向到 8080 端口
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
-t nat
:指定操作的表为 NAT 表,用于网络地址转换。-A PREROUTING
:在 PREROUTING 链上添加规则。PREROUTING 链处理所有进入本机的数据包。-i eth0
:指定网卡为 eth0。你需要根据你的实际情况修改。-p tcp
:指定协议为 TCP。--dport 80
:指定目标端口为 80。-j REDIRECT --to-port 8080
:将流量重定向到 8080 端口。
重要提示: 上面的配置会将所有发往 80 和 443 端口的流量都重定向到代理服务器。如果你只想拦截特定 IP 地址的流量,可以使用 -s
参数指定源 IP 地址,或者使用 -d
参数指定目标 IP 地址。
第三幕:代理服务器的“乾坤大挪移”—— mitmproxy
有了 iptables 的“神助攻”,现在所有的流量都会跑到我们的代理服务器上了。接下来,我们需要一个强大的代理服务器来处理这些流量。我推荐 mitmproxy。
mitmproxy 是一个开源的代理服务器,它支持拦截、修改 HTTP、HTTPS、WebSocket 和 HTTP/2 流量。它还提供了一个命令行界面和一个 Web 界面,方便我们查看和分析流量。
- 安装 mitmproxy:
pip install mitmproxy
- 启动 mitmproxy:
mitmproxy -p 8080 --ssl-insecure
-p 8080
:指定代理服务器监听的端口为 8080。--ssl-insecure
:忽略 SSL 证书错误。因为我们是中间人,所以需要自己生成 SSL 证书,但是浏览器会认为这个证书是不受信任的,所以我们需要加上这个参数。注意: 在生产环境中,不要使用--ssl-insecure
参数,而应该配置正确的 SSL 证书。
启动 mitmproxy 后,你就可以在浏览器中访问任意网站,mitmproxy 会拦截所有的 HTTP、HTTPS、WebSocket 和 HTTP/2 流量,并在命令行界面和 Web 界面中显示出来。
第四幕:WebSocket 的“秘密花园”
mitmproxy 可以很好地处理 WebSocket 流量。它会把 WebSocket 的连接当作一个 HTTP 连接来处理,你可以看到 WebSocket 的握手过程,以及 WebSocket 消息的内容。
你可以在 mitmproxy 的 Web 界面中查看 WebSocket 消息,也可以使用 mitmdump 命令将 WebSocket 消息保存到文件中:
mitmdump -p 8080 --ssl-insecure -w websocket.log
然后,你可以使用 Python 脚本来分析这些 WebSocket 消息:
import json
import gzip
def parse_websocket_log(log_file):
with gzip.open(log_file, 'rt', encoding='utf-8') as f:
for line in f:
try:
data = json.loads(line)
if data['_msg_type'] == 'websocket_message':
print(f"Direction: {data['from_client']}, Content: {data['content']}")
except json.JSONDecodeError:
print(f"Skipping invalid JSON line: {line}")
if __name__ == "__main__":
parse_websocket_log('websocket.log.gz') # mitmdump 默认会压缩日志文件
这个 Python 脚本会读取 websocket.log.gz
文件,解析 JSON 格式的 WebSocket 消息,并打印出消息的方向(客户端到服务器,或者服务器到客户端)和内容。
第五幕:HTTP/2 的“黑魔法”
mitmproxy 也支持 HTTP/2 流量的拦截和分析。它会将 HTTP/2 的流量“翻译”成 HTTP/1.1 的格式,方便我们查看。
你可以在 mitmproxy 的 Web 界面中查看 HTTP/2 请求和响应的头部和内容,也可以使用 mitmdump 命令将 HTTP/2 流量保存到文件中:
mitmdump -p 8080 --ssl-insecure -w http2.log
然后,你可以使用 Python 脚本来分析这些 HTTP/2 流量:
import json
import gzip
def parse_http2_log(log_file):
with gzip.open(log_file, 'rt', encoding='utf-8') as f:
for line in f:
try:
data = json.loads(line)
if data['_msg_type'] == 'http':
print(f"URL: {data['request']['url']}, Status Code: {data['response']['status_code']}")
except json.JSONDecodeError:
print(f"Skipping invalid JSON line: {line}")
if __name__ == "__main__":
parse_http2_log('http2.log.gz')
这个 Python 脚本会读取 http2.log.gz
文件,解析 JSON 格式的 HTTP 请求和响应,并打印出 URL 和状态码。
第六幕:高级技巧——脚本扩展
mitmproxy 最强大的地方在于它的脚本扩展功能。你可以使用 Python 脚本来修改 HTTP、HTTPS、WebSocket 和 HTTP/2 流量。
比如,你可以写一个脚本来修改 HTTP 响应的内容:
from mitmproxy import http
def response(flow: http.HTTPFlow):
if "example.com" in flow.request.url:
flow.response.content = b"Hello, mitmproxy!"
这个脚本会在访问 example.com
时,将响应的内容修改为 "Hello, mitmproxy!"。
要使用这个脚本,你需要将它保存为 modify_response.py
文件,然后启动 mitmproxy:
mitmproxy -p 8080 --ssl-insecure -s modify_response.py
mitmproxy 提供了丰富的 API,你可以使用这些 API 来实现各种各样的功能,比如:
- 修改请求和响应的头部: 可以用来添加、删除或修改 HTTP 头部。
- 修改请求和响应的内容: 可以用来修改 HTML、CSS、JavaScript 等文件。
- 拦截特定请求: 可以用来阻止某些请求发送到服务器。
- 模拟网络延迟: 可以用来测试网站在网络状况不佳时的表现。
第七幕:安全注意事项
使用透明代理拦截 HTTPS 流量,涉及到中间人攻击。虽然我们是为了分析流量,但是如果配置不当,可能会导致安全问题。
- SSL 证书: 在生产环境中,一定要配置正确的 SSL 证书。不要使用
--ssl-insecure
参数。 - 只拦截必要的流量: 不要拦截所有的流量,只拦截你需要分析的流量。
- 保护代理服务器: 确保代理服务器的安全,防止被攻击者利用。
总结:
今天我们学习了如何配置一个能拦截 WebSocket 和 HTTP/2 流量的透明代理。我们使用了 iptables 来拦截流量,使用 mitmproxy 来处理流量,并使用 Python 脚本来分析流量。
希望今天的讲座能帮助你更好地理解代理服务器的工作原理,以及如何使用代理服务器来分析网络流量。 记住,技术是把双刃剑,请合理使用这些技术,不要用于非法用途。
感谢大家的收听!