🔗 使用 PF 在 OpenBSD 上拦截流量
作者:Chris Benech 和 Amos Jeffries
🔗 目录
OpenBSD 4.4 及更高版本中的包过滤器 (PF) 防火墙提供了几种非常简单的方法来拦截流量。
本配置示例详细介绍了如何将 PF 防火墙与 Squid 集成,以使用类似 NAT 的拦截和 TPROXY 式 拦截来拦截 80 端口流量。
NAT配置仅在在squid盒子上使用时才有效。这是准确和安全地执行拦截所必需的。要从网关机拦截并将流量指向单独的squid盒,请使用策略路由。
有关在 OpenBSD 上配置 Squid 的更多信息,请参阅 OpenBSD ports 的 README 文件。
🔗 Squid 配置
🔗 完全透明代理 (TPROXY)
此配置需要 Squid-3.3.4 或更高版本。
Squid 需要以下构建选项
--enable-pf-transparent
使用 **tproxy** 流量模式标志来指示 Squid 它正在接收拦截的流量,并在出站连接上伪造客户端 IP。
http_port 3129 tproxy
🔗 NAT 拦截代理
OpenBSD 5.0+ 的 squid 端口/软件包标准支持此功能。
对于 Squid-3.4 或更高版本
--enable-pf-transparent
对于 Squid-3.3 和 Squid-3.2,此功能并未与 –enable-pf-transparent 构建选项集成。但是,Squid 的 IPFW NAT 组件与 PF 兼容。您可以使用以下配置选项构建 Squid:
--disable-pf-transparent --enable-ipfw-transparent
使用 **intercept** 流量模式标志来指示 Squid 它正在接收拦截的流量,并在出站连接上使用自己的 IP(模拟 NAT)。
http_port 3129 intercept
🔗 pf.conf 配置
在 pf.conf 中,需要进行以下更改。
如果您有用于内部接口的 “set skip” 行,请删除它们。它们指示 PF 不处理进入这些接口的任何数据包。
set skip on $int_if
set skip on $wi_if
🔗 OpenBSD 4.4 及更高版本
在运行 Squid 的机器上,添加类似以下的防火墙规则…
用于 IPv6 流量拦截
pass in quick inet6 proto tcp from 2001:DB8::/32 to port www divert-to ::1 port 3129
pass out quick inet6 from 2001:DB8::/32 divert-reply
用于 IPv4 流量拦截
pass in quick on inet proto tcp from 192.0.2.0/24 to port www divert-to 127.0.0.1 port 3129
pass out quick inet from 192.0.2.0/24 divert-reply
divert-reply 规则对于接收绑定到非本地地址的套接字的回复是必需的。如果没有 divert-reply 规则,cache.log 将显示类似以下内容的行:
2013/04/16 14:28:37 kid1| FD 12, 127.0.0.1 [Stopped, reason:Listener socket closed job49]: (53) Software caused connection abort
PF 提供 **rdr-to** 选项。但是,这不被任何 Squid 支持。请改用 **divert-to**。
🔗 OpenBSD 4.1 至 4.3
注意:早于 4.4 的 OpenBSD 版本需要使用 **–enable-pf-transparent** 构建的 Squid-3.2 或更早版本,并且仅支持 NAT 拦截方法。
# redirect only IPv4 web traffic into squid
rdr pass inet proto tcp from 192.168.231.0/24 to any port 80 -> 192.168.231.1 port 3129
block in
pass in quick on $int_if
pass in quick on $wi_if
pass out keep state
使用 **rdr pass** 而不是 **rdr on …**,这是 PF 处理数据包方式的一部分。如果您不使用 **rdr pass**,数据包会通过并被允许,而不是被重定向。
🔗 故障排除
- 请确保添加 **pass in quick** 行。我自己有两个内部接口,一个用于有线互联网,一个用于无线互联网。尽管配置了网桥,但当您不明确允许两个接口上的所有流量时,有时会发生奇怪的情况。如果您不添加这些行,您将失去本地网络连接,并且需要到控制台进行故障排除。
🔗 没有发生重定向
请确保您已删除任何 **set skip on** 行,因为它们会阻止 PF 查看数据包。
确认哪些 PF 规则正在用于处理流量,并确保您的与 squid 相关的规则不会被其他规则掩盖。在调试时,可能有助于在 pf.conf 的顶部添加一个日志规则,例如 “match log(matches) from <IP>”。如果您随后重新加载规则集并监视 pflog 接口(例如,“tcpdump -neipflog0 -s 500”),您将看到每条匹配数据包的规则输出一行,从而更容易确认哪些规则影响了数据包。这会记录规则编号;要按编号查找规则,请使用 “pfctl -sr -R 1”。
🔗 PfInterception: PF open failed: (13) Permission denied
如果您使用 –enable-pf-transparent 且对 /dev/pf 没有写入权限,则会发生这种情况。建议您使用 “divert-to” pf 规则并进行以下配置选项更改为 getsockname() 接口:
--disable-pf-transparent --enable-ipfw-transparent
如果您必须使用 –enable-pf-transparent,请更改 /dev/pf 的权限,以允许运行 squid 的用户 ID 具有写入权限。
🔗 测试
要测试是否有效,请使用 **nc** 工具。停止 squid,然后从 root 命令提示符中输入
nc -l 3129
然后重新启动 squid 并尝试浏览一个页面。
您现在应该看到类似以下的输出
<root:openbsd> [/root]
> nc -l 3129
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; GNotify 1.0.25.0)
Host: example.com
Connection: keep-alive
...
从那时起,只需正常设置您的浏览器,无需代理服务器,您就应该看到缓存已满,并且您的浏览速度加快。
⚠️ Disclaimer: Any example presented here is provided "as-is" with no support
or guarantee of suitability. If you have any further questions about
these examples please email the squid-users mailing list.
类别: ConfigExample
导航:站点搜索、站点页面、分类、🔼 向上