🔗 Squid 中的 IPv6
- 版本: 3.1
- 状态:已完成。
- 开发者:AmosJeffries
- 更多: https://squid.org.cn/Versions/v3/3.1/
🔗 如何启用 IPv6?
您将需要 Squid 3.1 或更高版本以及具有 IPv6 功能的计算机系统。
IPv6 在所有当前操作系统中都可用。现在大多数系统都默认启用它。有关其功能和配置,请参阅您的系统文档。
IPv6 支持在 Squid-3.1 中默认启用。如果您使用的是不带此功能的 3.1 打包版本,请联系打包维护者以启用它。
Windows XP、OpenBSD 和 MacOS X 在出站连接方面存在一些重大的已知问题,这些问题会阻止它们连接到 IPv6 网站。Squid 在这些系统上可以愉快地接受 IPv6 客户端,但只能访问 IPv4 网站。这些问题对于任何配置了分栈 IPv6 支持或非映射双栈 IPv6 支持的操作系统都存在。这个问题在最新的 3.1 系列中已部分得到解决。
当 Squid 构建完成后,您将能够启动 Squid 并看到一些 IPv6 操作。最活跃的将是 DNS,因为每个网站都会查找 IPv6 地址,并且缓存管理器报告和日志中会显示 IPv6 地址。
| 确保您的辅助脚本能够处理 IPv6 地址作为输入 |
🔗 如何为 IPv6 设置 squid.conf?
与 IPv4 使用 CIDR 类似。IPv6 只是地址稍有不同而已。
大多数 IPv6 升级更改只是对现有后台行为的非常小的扩展。
对某些人来说,可能只有以下几点值得关注:
- external_acl_type 标志 ‘ipv4’ 或 ‘ipv6’
- tcp_outgoing_address 魔术 ACL
- 需要 CIDR - 这个全新的概念(来自 1993 年)。
- localhost 有两个 IP 地址。
🔗 优化 IPv6 性能
- DNS 通过 Squid 内置的内部解析器工作效果最好,速度最快。检查您的配置选项是否禁用了它。
- IPv6 链路可能仍然存在一些隧道延迟。Squid 最能从快速链路中受益,因此请测试各种可用的隧道方法和代理以获得速度。这对于您的 IPv6 体验总体来说是个好主意。一旦您的上游提供原生路由,请尽快使用。Squid-3.1.16 及更高版本提供了 dns_v4_first 指令,以避免最糟糕的隧道延迟情况。仅在必要时启用此选项。
- 单个监听端口 **http_port 3128** 比为每个 IPv4 和 IPv6 设置端口资源消耗更少。此外,它完全兼容 IPv6 自动配置和链路本地寻址的对等方。
- 在输入模式(标准、tproxy、intercept、accel、ssl-bump)下拆分监听端口比在一个端口上混合两种模式要好。当前最旧的 Squid 版本都需要这种拆分。
- Squid 已经能够处理错误或无法访问的 IP。通过将 connect_timeout 和 dns_timeout 调整到几秒钟可以改善这一点。
🔗 故障排除 IPv6
🔗 Squid 支持 IPv6 构建,但它不监听 IPv6 请求。
您的 Squid 可能配置为仅监听 IPv4。
Squid.conf 中的 UDP 端口监听地址(udp_incoming_address、snmp_incoming_address)可以是 IPv4 或 IPv6。默认是接受发往相关 UDP 端口的任何 IP 地址的流量。如果您将其配置为特定类型的 IP 地址,它将不会接受其他类型的流量。
请注意,将 UDP 入站地址配置为 **0.0.0.0**,如一些旧的 Squid-2 配置所示。这会明确使入站端口仅限于 IPv4,这可能会破坏对使用默认启用了 IPv6 的出站 UDP 端口发送的数据包的响应。
Squid.conf 中的每个 TCP 端口行(http_port、https_port、ftp_port)都可以接受端口、hostname:port 或 ip:port 组合。
当这些行包含 IPv4 地址或仅包含 IPv4 地址的主机名时,Squid 将只打开您配置的那些 IPv4。您可以使用 [ipv6]:port 为 IPv6 添加新的端口行,为 DNS 中的主机名添加 AAAA 记录,或仅使用端口。
当只设置端口时,它应该同时为 IPv6 和 IPv4 访问打开。默认 IPv6 监听的唯一例外是设置了 'transparent'、'intercept' 或 'tproxy' 选项的端口行。IPv6 的 NAT 拦截(通常称为透明代理)支持各不相同,内核中的 TPROXYv4 支持也是如此。Squid 将检测功能并为您的内核打开适合的端口类型,但这可能仅限于 IPv4。
您的 Squid 可能配置了限制性 ACL。
良好的 Squid 配置将只允许其必须的流量,并拒绝其他所有流量。如果您正在使用现有配置测试 IPv6,您可能需要更新您的 ACL 行以包含应允许的 IPv6 地址或网络范围。现在,接受 IPv4 地址或网络掩码的 src、dst 以及其他 ACL 也将接受 IPv6 地址和 CIDR 掩码。例如,用于匹配来自 localhost 流量的旧 ACL 现在是
acl localhost src 127.0.0.1 ::1
您的操作系统可能配置为阻止双栈套接字。
从 3.1.6 版本开始,Squid 将检测您内核的 TCP 套接字类型,并根据它发现的套接字功能按需打开一个或两个套接字。
双栈最容易通过一种称为 v4 映射的方法实现。在这种方法中,所有 IPv4 地址都映射到 IPv6 空间的一个特殊部分以用于套接字连接。Squid 在发现此功能时会利用 IPv6 的这一特性。它期望启用它所使用的套接字上的此功能。
如果您通过许多博客教程中建议的简单强制关闭此套接字功能(而不是在不带 IPv6 的情况下重新编译内核)来手动“禁用 IPv6”,您的 TCP 栈将声称具有无法实现的 IPv6 功能。检查您的 cache.log 中有关 ‘V6ONLY’ 的警告或错误。
🔗 Squid 监听 IPv6,但显示“拒绝访问”或“无法转发”等消息。
您的 Squid 可能配置为仅通过特定的 IPv4 出站。
许多网络已知需要在其 squid.conf 中配置 tcp_outgoing_address(或各种其他 *_outgoing_address)。这些配置可能会强制 Squid 通过 IPv4 链路请求网站,而实际上应该尝试 IPv6 链路。使用 tcp_outgoing_address 可以进行一些 ACL 魔术,这将绕过 DIRECT 请求的此问题。
这仅适用于 Squid-3.1 系列。后来的 Squid 版本在选择出站连接属性时会自动执行此操作。
acl to_ipv6 dst ipv6
# Magic entry. Place first in your config. This makes sure Squid has the IP available.
http_access deny to_ipv6 !all
tcp_outgoing_address 10.255.0.1 !to_ipv6
tcp_outgoing_address dead:beef::1 to_ipv6
That will split all outgoing requests into two groups, those headed for
IPv4 and those headed for IPv6. It will push the requests out the IP
which matches the destination side of the Internet and allow IPv4/IPv6
access with controlled source address exactly as before.
请注意,dst ACL 仅适用于 DIRECT 请求。发往对等方的流量需要保持未设置出站地址。此错误在 Squid-3.2 中已修复。
🔗 人们正在犯的错误
请不要这样做。尤其是在不朽的在线文档中。如果不是因为人们这样做然后询问为什么它不起作用,我甚至不会在这里提到它们。
🔗 定义 acl all src ::/0 0.0.0.0/0
- all 在每个 Squid-3 版本中都已预定义。
- 它现在会给困惑的人带来令人沮丧的警告。
🔗 使用 ::ffff:a.b.c.d 定义 IPv4
- Squid 仍然理解 IPv4。
- 无需编写任何新颖且令人困惑的内容。
🔗 将 IPv6 定义为 2000::/3
- 这是不正确的。
-
Squid 提供了一个 ACL 魔术标识符 **ipv6**,表示当前路由的 IPv6 空间。
acl globalIPv6 src ipv6
🔗 将 IPv6 空间定义为包含任何以 F 开头的地址
- 它们是**仅本地**范围。
- 在实际需要时将其添加到您的 localnet ACL 中。
🔗 定义 3ffe::/16
- 曾经有一个名为 6bone 的实验性网络。
- 它现在已经死了。无需再提了。
🔗 如何让 Squid 对其辅助程序使用 IPv4?
对于 Squid 外部 ACL 辅助程序,有两个新选项 **ipv4** 和 **ipv6**。Squid 倾向于使用 Unix 管道连接到辅助程序,此时这些选项被忽略。但在某些网络上需要 TCP 套接字。Squid 默认会通过 IPv6 连接,但对于只能接受 IPv4 的旧辅助程序,您可能需要明确指定。
external_acl_type hi ipv4 %DST /etc/squid/hello_world.sh
🔗 如何阻止 IPv6 流量?
为什么您会想要这样做,而又不对 IPv4(使用 **all**)设置类似的限制,我不得而知,但这是方法。
以前 Squid 定义了 **all** ACL,这意味着整个互联网。现在仍然是,但现在它同时意味着 IPv6 和 IPv4,所以使用它不会只阻止 IPv6。
添加了一个新的 ACL 标签 **ipv6** 来匹配仅 IPv6 公共空间。
squid.conf 中的示例创建
acl to_ipv6 dst ipv6
acl from_ipv6 src ipv6
🔗 为什么我无法连接到我的 localhost 对等方?
在现代启用了 IPv6 的系统中,特殊的 **localhost** 名称至少有两个 IP 地址。IPv4 (127.0.0.1) 和 IPv6 (::1)。
如果您的对等方是仅 IPv4 的对等方,Squid 将无法在 IPv6 上打开到它们的连接。结果是一系列“TCP 连接到 localhost/* 失败”,最终显示“DEAD”对等方。
例如,此配置已知会显示此问题
cache_peer localhost parent 3128 0
解决方案是配置 127.0.0.1 作为对等方地址而不是 localhost,直到您能够启用 IPv6 的对等方。
感谢 Artemis Braja 揭示了这个问题
🔗 那么 IPv6 会破坏什么?
此外,一些功能无法与 IPv6 地址一起使用。通过 Squid 的 IPv4 流量不受此影响。特别是来自 IPv4 客户端的流量。但是,它们需要被注意。
🔗 NAT 拦截代理(又名“透明”)
IPv6 最初设计为无需 NAT 即可工作。这一切在 2010 年随着 NAT66 和 NPT66 的引入而改变。
- Linux TPROXY v4 支持 IPv6。包含 IPv6 TPROXYv4 的内核和 iptables 版本现在都很容易获得。
- Linux 版本在 3.x 系列后期添加了 IPv6 NAT 功能。它应该足够稳定,可以在 Linux 4.0+ 中使用,但具体情况可能因您而异。
- BSD **divert** 套接字为最新的 OpenBSD 和派生系统提供了 TPROXY 等效功能。Squid-3.4 中添加了对 BSD 上 *tproxy* 模式的支持。
- BSD **redirect** 套接字为最新的 OpenBSD 和派生系统提供了 NAT66 功能。但由于内核 API 问题,Squid 不支持它们。
🔗 延迟池
Squid 的延迟池仍然与 class-B 和 class-C 网络(来自 1995 年之前的互联网设计)相关联。在这些被现代化之前,基于地址的池类无法应用于 IPv6 地址大小。
应该仍然可以工作的池是 Squid-3 基于用户名的池,或基于标签的池。
🔗 WCCP (v1 和 v2)
WCCP 是一个非常围绕 IPv4 设计的思科协议。
WCCP 草案规范已更新以定义 IPv6 支持。但 Squid 尚未更新以使用新语法。
🔗 ARP(MAC 地址 ACLs)
IPv6 中不存在 ARP。它已被一个称为 NDP(邻居发现协议)的协议取代。网络正确的 IPv6 自动配置可以在 IPv6 地址本身提供等效功能。
从 Squid-3.2 开始,acl、logformat 和 external_acl_type 中增加了处理 EUI-64 的支持。它目前仍需要 IPv6 SLAAC(IPv6 自动配置客户端地址)来提供 EUI 信息。
使用 MAC 地址和 ARP 已经存在的安全问题,对于 EUI-48 (MAC) 和 EUI-64 (IPv6) 的 EUI 处理同样存在。
🔗 RADIUS 认证
简而言之,我们需要一个新的 RADIUS 认证辅助守护程序。有适用于 IPv6 的 RADIUS 协议升级。但是我们还没有人能够编写和测试该辅助程序。
🔗 其他资源
类别:功能
导航:站点搜索,站点页面,类别,🔼 向上