遇到一个用例,我需要阻止 IPv6 地址访问网站。通过跳过白名单范围内的特定地址来阻止 IPv4 地址相当简单。有人知道如何对 IPv6 地址做类似的事情吗?或者这是否可行?
PS:白名单是我唯一的选择,没有黑名单选项。我不太了解 IPv6 地址的网络概念,所以请将这个问题视为新手问题。我可以编辑问题以包含更多细节,使问题更易于理解。我正在使用 Salesforce 体验云网站为问题设置更多背景。
答案1
这可能是可行的,但可能需要大约 64 条白名单规则来阻止某个地址。
因此,在您去那里之前,我会问自己是否有更好的方法来做到这一点,例如 - 在沿途的其他地方实现这种过滤。如果您可以控制沿途的代理或服务本身,并向服务添加一些特定的逻辑。
假设您必须这样做,我首先要说的是,通过阻止被阻止的 IP 所属的整个 /64 子网,您可能是安全的,因此,如果您被阻止的 IPv6 地址是 2001:4860:4860::8888,您可以安全地阻止 2001:4860:4860:0000/64(通常写为 2001:4860:4860::/64)原因是 /64 子网通常是用于表示物理站点的最小子网(IPv6 不需要 NAT),因此该站点内的任何其他内容都可以安全地阻止。
您还可以减少问题,只允许 2000::/3(以十六进制数字 2 或 3 开头的所有内容),因为这些都是全球单播地址(点击此处了解 GUA 地址)
因此,基本上你想允许 2000::/3 中的所有内容,除了 2001:4860:4860::/64
剩下的问题与 IPv6 无关,更多的是二进制算术。您需要执行如下操作:为简单起见,假设我们有一个 8 位地址 0x34,我们想要阻止它但允许剩余的地址空间,0x34 是二进制 0011:0100b。因此,这里有一个执行此操作的过程:
我们将整个 8 位空间标记为 xxxx:xxxx 我们将其分成两部分:
- 0xxx:xxx
- 1xxx:xxxx
0011:0100 属于 (1),因此我们可以允许完整的 1xxx:xxxx
现在我们有一个 0xxx:xxxx 的问题,将其拆分为
- 00xx:xxxx << 屏蔽号码在此
- 01xx:xxxx
所以我们也可以允许 01xx:xxxx
再次,问题不是 00xx:xxxx,将其拆分为
- 000x:xxx
- 001x:xxxx << 屏蔽号码在此
所以我们可以允许 000x:xxxxx
依此类推,直到剩下确切的被阻止的地址。