iptables 和 ip6tables 处理数据包的区别

iptables 和 ip6tables 处理数据包的区别

我查看了各种 netfilter、iptables 和 ip6tables 资源。我在 Google 和 StackExchange 网站上搜索了相关信息,但找不到简单或清晰的链接来了解 iptables 和 ip6tables 处理数据包的方式之间的区别。

以下是我的标准 iptables 规则:

* filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

对于传入和传出的 HTTP、DNS 解析以及基本 ICMP(v4 0、3、8、11、12),也存在类似的规则。

当我使用 ip6tables 实施相同的规则时,我的服务器对 HTTP、SSH 和 ICMP 连接的响应为“主机宕机“”。

我可以将初步规则设置为:

-P INPUT ACCEPT
-P OUTPUT ACCEPT

这样服务器就会再次打开。但是它不会过滤数据包(所有数据包的任意规则,FORWARD 除外)。

我尝试过附加:

-A INPUT -i eth0 -j DROP

但这又开始引发问题。

在其他数据包验证中使用 telnet 进行双重和三重检查(如果使用 DROP,服务器日志只是简单地丢弃连接,对于 REJECT 也是一样)。

或者,我还看到了简单的接受(全部)规则集,其中 dport 和 sport 范围除了必需的规则之外。

简而言之,我习惯于典型的 iptables(ipv4)规则,即删除所有内容,但以下规则除外。

理想情况下,我正在寻找能够提供有关 iptables 和 ip6tables 如何以不同方式处理(以及丢弃或接受)数据包之间的差异的深入、详细技术信息的链接或信息。

如果这些是基本的协议规则,ip6tables 似乎会任意删除所有内容,但是,在第一组规则中不被接受的情况下,我尝试删除所有接口输入的后一个规则继续导致问题(假设初始规则集是接受,但无处可去)。

FWIW:这是 Debian Jessie (v8),在 DigitalOcean droplet 上从 Debian Wheezy (v7) 进行 dist-upgrade。除 ip6tables 规则(服务器无法用于 ipv6 资源)外,其他一切都运行正常。

最初发布在 StackOverflow 上,后来被删除,复制/粘贴到 ServerFault 上(建议更相关)。

答案1

您的规则正在丢弃 ICMP。这对于 IPv4 和 IPv6 都是错误的,并且会严重破坏 PMTU 发现;但是,大多数 IPv4 堆栈都会针对这种(非常常见的)错误配置实施变通方法。但是对于 IPv6,许多事情都会被破坏,尤其是来自 Teredo 主机的访问。

一个简单的解决方案是添加规则以允许 ICMP:

iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT

ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
ip6tables -A FORWARD -p icmpv6 -j ACCEPT

一个可能更安全的解决方案是只允许正常运行所必需的 ICMP 消息类型,遵循以下建议:RFC 4890

答案2

答案正如迈克尔·汉普顿在评论中所说的那样......几乎与以下问题完全相同:

Debian ip6tables 为 IPv6 设置规则

我最终的ip6tables规则如下:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
COMMIT

这一切都说明了什么:

  • 接受一切。
  • 接受已建立和相关的连接(遵循接下来的 3 个端口规则)。
  • 接受目标端口 22 (ssh)、80 (http)、443 (https) 上的连接
  • 接受任何 IPv6 ICMP 类型(不同于 v4)
  • 拒绝任何其他输入
  • 拒绝任何转发

我可以通过 ipv6 进行 SSH 连接,wget -6 http...

总之,制定 ip6tables 规则与制定 iptables 规则略有不同。下一步:测试是否同样适用于 iptables (v4),并尽可能保持相似。(感谢 Michael。)

相关内容