我按照MikroTik 帮助文件中的 Hurricane Electric 示例在 MikroTik 上设置了 6to4 SIT 隧道。
它有效,但与某些资源的连接非常慢并且经常超时。例如,在升级和重新配置guix 期间,默认服务器的下载速度徘徊在 50 KiB/s 左右,并且在下载内核时通常最终失败,可能是因为它是一个大包。
隧道代理的技术支持建议1280的MTU太小,应该使用1480。事实上,如果我将隧道接口的 MTU 更改为该值,连接速度就会变得正常并以 MiB 为单位进行计数。我不知道为什么会这样,但可能是因为在某些时候网络设备不需要将较大的数据包分解成较小的片段,这需要一些开销。
但我遇到了另一个问题:与某些服务器的连接挂起。guix pull
挂起。针对有问题的 URL运行curl -v
会导致 TLS 协商超时 ( curl: (28) SSL connection timeout
) 或加密库失败 ( curl: (35) gnutls_handshake() failed: Помилка у функції pull.
)。
对服务器进行 ping 操作可以正常工作,但使用 MTU 大小(ping6 -s
后跟八位字节数)的消息进行 ping 操作会收到Packet too big
第一个 ping 操作的响应,然后丢弃其余的操作。TCP 连接成功,但 TLS 协商超时。MTU 对于与此服务器的连接来说太大。
RFC 4213规定:
使用静态隧道 MTU 的节点将隧道接口视为具有固定接口 MTU。默认情况下,MTU 必须介于 1280 和 1480 字节(含)之间,但它应该为 1280 字节。
RFC 6343有一个关于“PMTUD 失败”的部分,该部分链接到RFC 2923,建议 IPv6 回退到 MTU 1280,除非可以修复“ICMP 黑洞”。
MikroTik 的示例配置建议使用 1280 以避免 MTU 协商的必要性。还有一个clamp-tcp-mss
默认打开的设置:
控制是否更改接收到的 TCP SYN 数据包的 MSS 大小。启用后,如果当前 MSS 大小超过隧道接口 MTU(考虑 TCP/IP 开销),路由器将更改接收到的 TCP SYN 数据包的 MSS 大小。接收到的封装后的数据包仍将包含原始的MSS,只有解封装后MSS才会发生变化。
这也许可以解释为什么 ping 偶尔允许我通过隧道成功发送高达 65527(显然是 65535 减 8)的大量消息。但是,这会尝试匹配隧道 MTU,而我需要确定每个连接的 MTU,该 MTU 可能小于隧道 MTU。我该如何做到这一点,这样我就不需要降低隧道 MTU?
MikroTik 上 IPv6 的默认配置似乎缺少路径 MTU 发现。将此规则添加到 IPv6 防火墙有帮助(来源):
选项含义:
因此,该规则尝试计算每个新连接的 MTU。(上面引用的描述显然是针对 IPv4 的。IPv6 规范期望不存在分段,因此不能使用 DF 位。)