从各方面来看,互联网向 IPv6 的过渡是件很缓慢的事情。不过在最近几年,可能是由于 IPv4 地址资源的枯竭,IPv6 的使用处于上升态势。相应的,开发者也有兴趣确保软件能在 IPv4 和 IPv6 下工作。但是,正如近期 OpenBSD 邮件列表中的讨论所关注的,一个使得向 IPv6 转换更加轻松的机制设计同时也可能导致网络更不安全——并且 Linux 发行版们的默认配置可能并不安全。

地址映射

IPv6 在很多方面看起来可能很像 IPv4,但它是一个不同地址空间的不同的协议。服务器程序想要接受使用二者之中任意一个协议的连接,必须给两个不同的地址族分别打开一个套接字——IPv4 的 AF_INET 和 IPv6 的 AF_INET6。特别是一个程序希望在主机上的使用两种地址协议的任意接口都接受连接的话,需要创建一个绑定到全零通配符地址(0.0.0.0)的 AF_INET 套接字和一个绑定到 IPv6 等效地址(写作 ::)的 AF_INET6 套接字。它必须在两个套接字上都监听连接——或者有人会这么认为。

多年前,在 RFC 3493,IETF 指定了一个机制,程序可以使用一个单独的 IPv6 套接字工作在两个协议之上。有了一个启用这个行为的套接字,程序只需要绑定到 :: 地址从而在所有接口上接受使用这两个协议的连接。当创建了一个 IPv4 连接到该绑定端口,源地址会像 RFC 2373 中描述的那样映射到 IPv6。所以,举个例子,一个使用了这个模式的程序会将一个 192.168.1.1 的传入连接看作来自 ::ffff:192.168.1.1(这个混合的写法就是这种地址的通常写法)。程序也能通过相同的映射方法打开一个到 IPv4 地址的连接。

RFC 要求默认实现这个行为,所以大多数系统这么做了。不过也有些例外,OpenBSD 就是其中之一;在那里,希望在两种协议下工作的程序能做的只能是创建两个独立的套接字。但一个在 Linux 中打开两个套接字的程序会遇到麻烦:IPv4 和 IPv6 套接字都会尝试绑定到 IPv4 地址,所以不论是哪个,后者都会失败。换句话说,一个绑定到 :: 指定端口的套接字的程序会同时绑定到那个端口上的 IPv6 的 :: 和 IPv4 的 0.0.0.0 地址。如果程序之后尝试绑定一个 IPv4 套接字到 0.0.0.0 的相同端口上时,这个操作会失败,因为这个端口已经被绑定了。

当然有个办法可以解决这个问题;程序可以调用 setsockopt() 来打开 IPV6_V6ONLY 选项。一个打开两个套接字并且设置了 IPV6_V6ONLY 的程序应该可以在所有的系统间移植。

读者们可能对不是每个程序都能正确处理这一问题没那么震惊。事实证明,这些程序的其中之一是网络时间协议(Network Time Protocol)的 OpenNTPD 实现。Brent Cook 最近给上游 OpenNTPD 源码提交了一个小补丁,添加了必要的 setsockopt() 调用,它也被提交到了 OpenBSD 中了。不过那个补丁看起来不大可能被接受,最可能的原因是因为 OpenBSD 式的理由(LCTT 译注:如前文提到的,OpenBSD 并不受这个问题的影响)。

安全担忧

正如上文所提到,OpenBSD 根本不支持 IPv4 映射的 IPv6 套接字。即使一个程序试着通过将 IPV6_V6ONLY 选项设置为 0 来显式地启用地址映射,它的作者也会感到沮丧,因为这个设置在 OpenBSD 系统中无效。这个决定背后的原因是这个映射带来了一些安全隐忧。攻击打开的接口的攻击类型有很多种,但它们最后都会回到规定的两个途径到达相同的端口,每个端口都有它自己的控制规则。

任何给定的服务器系统可能都设置了防火墙规则,描述端口的允许访问权限。也许还会有适当的机制,比如 TCP wrappers 或一个基于 BPF 的过滤器,或一个网络上的路由器可以做连接状态协议过滤。结果可能是导致防火墙保护和潜在的所有类型的混乱连接之间的缺口造成同一 IPv4 地址可以通过两个不同的协议到达。如果地址映射是在网络边界完成的,情况甚至会变得更加复杂;参看这个 2003 年的 RFC 草案,它描述了如果映射地址在主机之间传播,一些随之而来的其它攻击场景。

改变系统和软件正确地处理 IPv4 映射的 IPv6 地址当然可以实现。但那增加了系统的整体复杂度,并且可以确定这个改动没有实际地完整实现到它应该实现的范围内。如同 Theo de Raadt 说的:

有时候人们将一个糟糕的想法放进了 RFC。之后他们发现这个想法是不可能的就将它丢回垃圾箱了。结果就是概念变得如此复杂,每个人都得在管理和编码方面是个全职专家。

我们也根本不清楚这些全职专家有多少在实际配置使用 IPv4 映射的 IPv6 地址的系统和网络。

有人可能会说,尽管 IPv4 映射的 IPv6 地址造成了安全危险,更改一下程序让它在实现了地址映射的系统上关闭地址映射应该没什么危害。但 Theo 认为不应该这么做,有两个理由。第一个是有许多破旧的程序,它们永远不会被修复。而实际的原因是给发行版们施加了压力去默认关闭地址映射。正如他说的:“最终有人会理解这个危害是系统性的,并更改系统默认行为使之‘secure by default’。”

Linux 上的地址映射

在 Linux 系统,地址映射由一个叫做 net.ipv6.bindv6only 的 sysctl 开关控制;它默认设置为 0(启用地址映射)。管理员(或发行版们)可以通过将它设置为 1 来关闭地址映射,但在部署这样一个系统到生产环境之前最好确认软件都能正常工作。一个快速调查显示没有哪个主要发行版改变这个默认值;Debian 在 2009 年的 “squeeze” 中改变了这个默认值,但这个改动破坏了很多的软件包(比如任何包含 Java 的程序),在经过了几次的 Debian 式的讨论之后,它恢复到了原来的设置。看上去不少程序依赖于默认启用地址映射。

OpenBSD 有以“secure by default”的名义打破其核心系统之外的东西的传统;而 Linux 发行版们则更倾向于难以作出这样的改变。所以那些一般不愿意收到他们用户的不满的发行版们,不太可能很快对 bindv6only 的默认设置作出改变。好消息是这个功能作为默认已经很多年了,但很难找到被利用的例子。但是,正如我们都知道的,谁都无法保证这样的利用不可能发生。

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux防火墙屏蔽ip6,观点|Linux 发行版们应该禁用 IPv4 映射的 IPv6 地址吗?相关推荐

  1. Linux防火墙屏蔽ip6,Linux 发行版们应该禁用 IPv4 映射的 IPv6 地址吗?

    原标题:Linux 发行版们应该禁用 IPv4 映射的 IPv6 地址吗? 本文导航 -地址映射 -安全担忧 -Linux 上的地址映射 从各方面来看,互联网向 IPv6 的过渡是件很缓慢的事情.不过 ...

  2. Linux防火墙屏蔽ip6,SUSE Linux 10 SP2 关闭IPV6及防火墙

    部分一:关闭ipv6 # ip add sh 1: lo: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:0 ...

  3. linux 容器与外部网络_Linux发行版仍然与容器相关吗?

    linux 容器与外部网络 有人说Linux发行版不再与容器有关. 诸如一次性容器和临时容器之类的替代方法似乎风行一时. 似乎我们正在考虑和做出技术决策时更多地基于时尚感和即时的情感满足,而不是通过选 ...

  4. Linux搭建虚拟专用,Ubuntu的发行版如何搭建虚拟专用网

    是通过因特网上将局域网扩展到远程网络和远程计算机用户的一种成本效益极佳的办法.那么Ubuntu的发行版如何搭建虚拟专用网呢?下面学习啦小编就为大家带来了Ubuntu发行版搭建虚拟专用网的方法. Ubu ...

  5. puppy linux 版本,Puppy Linux 8.0 发布,轻量级发行版

    Puppy Linux项目生成了一个轻量级的发行版,其中包含许多图形工具,只需一个小小的下载.该项目的最新版本是Puppy Linux 8.0 "BionicPup". findn ...

  6. linux桌面发展方向,观点|Linux 桌面的发展之路!

    Ken Starks 在 fossforce.com 网站上问 你们是如何优化 Linux 的?,我很高兴他问了这个问题,因为我有话要说!对我来说,Linux 桌面就是一连串的承诺,但是这些承诺却总是 ...

  7. linux防火墙策略文件夹,Linux防火墙iptables的策略

    iptables策略 iptables -L #查看现有防火墙所有策略 iptables -F #清除现有防火墙策略 只允许特定流量通过,禁用其他流量 1.允许SSH流量(重要) iptables - ...

  8. linux防火墙常用控制协议,linux防火墙配置及管理.doc

    linux防火墙配置与管理2 ufw防火墙简介 我们在工作中使用防火墙保护服务器的网络服务,实际上是通过防火墙来拒绝对服务器的访问.iptable 工具根据系统管理员编写的一系列规则筛选网络数据包对于 ...

  9. linux防火墙阻断目的,基于Linux防火墙的内部邮件监控与阻断系统

    基于Linux防火墙的内部邮件监控与阻断系统 给出了一种邮件监听与阻断系统的设计和实现方案.方案的实现建立在Linu (本文共3页) 阅读全文>> 毫无疑问,通过电子邮件发送各种信息是个简 ...

最新文章

  1. 楼盘历史价格管理导入功能优化
  2. 我家车模初长成 - K车模养成要点
  3. 160个Crackme013之投机取巧
  4. ARM GIC简介与Linux中断处理分析
  5. css修改select选择框option被选中的背景颜色_5个容易忽视的 CSS 属性
  6. 关于他们回答的 怎样在桌面建一个python GUI的快捷方式 这个问题
  7. C++单元测试框架的比较(zz)
  8. python爬虫学习之页面登陆
  9. Nginx(零):背景
  10. Eclipse中代码自动添加注释及代码注释模板
  11. logo是啥_logo是什么?
  12. php_字符编码浅谈_积累中。。。
  13. 写给新入IT的新人们(转载)
  14. 【课本】【No.2】集合表示法、一维离散变量定义,分布函数为了解决计算时间概率,二项分布,泊松分布,一维连续型分布函数与密度函数
  15. 【ShaderLab学习】AlphaTest AlphaBlend理解[2]
  16. DTOJ5057 英雄联盟
  17. Python探路-多重继承
  18. 任天堂(Nintendo)(什么是ps4,什么是ns(switch))
  19. 陶哲轩实分析 习题5.5.2
  20. 物联网(IOT) 数据库需求和当前技术解析

热门文章

  1. scrollTop的兼容性小结
  2. Microsoft JET Database Engine 错误 #39;80004005#39;的解决方法
  3. 计算机二级考试python_全国计算机等级考试考试大纲(2018年版)
  4. zookeeper命令行操作
  5. Hive的数据模型—桶表
  6. android tcpdump log分析,android 系统启动过程中加入tcpdump和logcat
  7. mysql计算机二级选择题题库_全国计算机二级mysql数据库选择题及答案
  8. python 神经网络工具_神经网络15分钟入门!使用python从零开始写一个两层神经网络...
  9. python scrapy框架基如何实现多线程_Python实现在线程里运行scrapy的方法
  10. android 转场动画兼容问题,【Android】关于ARouter转场动画的问题