iptables 是Linux的防火墙和NAT工具,可以:
核心概念:
NAT(Network Address Translation)表专门处理地址转换:
网络 → PREROUTING → 路由决策 → FORWARD/INPUT → POSTROUTING → 网络
透明代理是一种特殊的代理模式,客户端无需任何配置就能使用代理服务。客户端完全不知道代理的存在,认为自己直接与目标服务器通信。
| 特性 | 透明代理 | 普通代理 |
|---|---|---|
| 客户端配置 | ❌ 无需配置 | ✅ 需要配置代理 |
| 感知度 | 完全透明 | 需要手动设置 |
| 部署方式 | 网络层面拦截 | 应用层面配置 |
| 适用范围 | 全网络流量 | 指定应用流量 |
在NAT网络中,内网设备使用私有IP(如192.168.x.x),无法直接与公网通信。需要将私有IP转换为公网IP才能访问互联网。
静态源地址转换:固定地将一个内部IP转换为特定外部IP。
# 将内网服务器192.168.1.100的流量伪装成公网IP 203.0.113.1
iptables -t nat -A POSTROUTING -s 192.168.1.100 -j SNAT --to-source 203.0.113.1
适用场景:
动态源地址转换:自动选择出口接口的IP作为源地址。
# 将所有从eth0发出的包的源IP改为eth0接口的IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
适用场景:
| 特性 | SNAT | MASQUERADE |
|---|---|---|
| IP类型 | 静态固定IP | 动态接口IP |
| 性能 | 更高 | 稍低(查询接口) |
| 适用 | 固定公网IP | DHCP/PPPoE |
| 维护 | 需要手动更新 | 自动适应 |
# 去程:DNAT重定向到代理
iptables -t nat -A PREROUTING -i lan0 -p tcp --dport 80 -j DNAT --to-destination PROXY_IP:8080
# 返程:MASQUERADE确保响应能回流
iptables -t nat -A POSTROUTING -o lan0 -j MASQUERADE
为什么返程需要MASQUERADE? 代理服务器发回的响应包源IP是代理IP,但客户端不知道如何路由到代理IP。MASQUERADE将源IP改为网关IP,客户端就能收到响应了。
透明代理 = 用户无需配置,系统自动重定向流量
[内网设备:192.168.x.x] → [网关路由器:A.B.C.D] → [代理服务器:X.Y.Z.W]
↑
bettercap代理运行在这里
1. 设备访问 http://example.com
2. 数据包到达网关: 源IP=192.168.x.x, 目的IP=example.com, 目的端口=80
3. PREROUTING规则匹配: --dport 80 → DNAT到X.Y.Z.W:8080
4. 数据包被修改: 目的IP=X.Y.Z.W, 目的端口=8080
5. 包转发到代理服务器
6. 代理服务器的bettercap收到包并处理
1. bettercap处理后发送响应
2. 响应包: 源IP=X.Y.Z.W, 目的IP=192.168.x.x
3. 通过网关的POSTROUTING链
4. MASQUERADE修改源IP为网关IP(A.B.C.D)
5. 包正确路由回设备
iptables -t nat -A PREROUTING -i LAN_INTERFACE -p tcp --dport 80 -j DNAT --to-destination PROXY_IP:8080
作用:修改数据包的目的地址
-i LAN_INTERFACE:只处理来自内网接口的包(如eth1、br0)--dport 80:匹配目的端口80--to-destination PROXY_IP:8080:重定向到代理服务器iptables -t nat -A POSTROUTING -o LAN_INTERFACE -j MASQUERADE
作用:修改数据包的源地址为出口接口IP
-o LAN_INTERFACE:对发往内网接口的包应用-j MASQUERADE:自动选择合适的源IP(通常是网关IP)为什么需要MASQUERADE? 代理服务器发回的响应包,源IP是代理IP,但客户端设备不知道如何到达代理IP(可能不在同一网段)。 MASQUERADE将源IP改为网关IP,客户端就能收到并正确处理响应了。
只有PREROUTING (去程) ❌:
设备 → 网关(DNAT) → 代理服务器 → 处理 → 响应 → 网关 → 设备
↑
源IP=PROXY_IP
目的IP=CLIENT_IP
客户端收到源IP=代理IP的包,但不知道如何响应(路由问题)。
加上POSTROUTING (返程) ✅:
设备 → 网关(DNAT) → 代理服务器 → 处理 → 响应 → 网关(MASQUERADE) → 设备
↑
源IP改为GATEWAY_IP
现在源IP是网关IP,客户端能正确收到并处理响应。
原因:缺少POSTROUTING规则
解决:添加 iptables -t nat -A POSTROUTING -o LAN_INTERFACE -j MASQUERADE
原因:接口限制太严格
解决:检查 -i LAN_INTERFACE 参数是否正确
原因:DNAT目标地址错误 解决:确保代理服务器IP和端口正确
原因:代理没有正确转发 解决:检查代理服务是否正常运行
# 查看NAT规则
iptables -t nat -L -n -v
# 查看连接跟踪
conntrack -L 2>/dev/null || echo "conntrack工具不可用"
# 测试连接
telnet PROXY_IP 8080 # 或使用 nc PROXY_IP 8080
# 查看网络接口
ip addr show
-i指定入口,-o指定出口man iptables - 官方文档iptables -L -n -v - 查看当前规则