为什么这些 ip6tables 规则会阻止通过 IPv6 进行 ssh 连接,而 iptables 版本允许通过 IPv4 进行 ssh 连接

为什么这些 ip6tables 规则会阻止通过 IPv6 进行 ssh 连接,而 iptables 版本允许通过 IPv4 进行 ssh 连接

我有以下iptables规则,旨在允许 上的所有流量loeth1eth2允许 上的传出流量eth0但阻止 上的传入流量,eth0但端口 22、80、443、1194、5222 和 5269 除外。这些规则成功允许通过 IPv4 上的端口 22 进行 ssh 访问。

# Generated by iptables-save v1.4.12 on Sat Nov 16 13:03:07 2013
*raw
:PREROUTING ACCEPT [247:18556]
:OUTPUT ACCEPT [278:35544]
COMMIT
# Completed on Sat Nov 16 13:03:07 2013
# Generated by iptables-save v1.4.12 on Sat Nov 16 13:03:07 2013
*mangle
:PREROUTING ACCEPT [247:18556]
:INPUT ACCEPT [247:18556]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [278:35544]
:POSTROUTING ACCEPT [278:35544]
COMMIT
# Completed on Sat Nov 16 13:03:07 2013
# Generated by iptables-save v1.4.12 on Sat Nov 16 13:03:07 2013
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [1:164]
:POSTROUTING ACCEPT [1:164]
COMMIT
# Completed on Sat Nov 16 13:03:07 2013
# Generated by iptables-save v1.4.12 on Sat Nov 16 13:03:07 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p icmp -m limit --limit 1/sec -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1194 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5222 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5269 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -m pkttype --pkt-type broadcast -j DROP
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth1 -j ACCEPT
-A OUTPUT -o eth2 -j ACCEPT
-A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sat Nov 16 13:03:07 2013

我将它们复制ip6tables并添加一堆ipv6-icmp规则以允许动态配置 IPv6 地址。

# Generated by ip6tables-save v1.4.12 on Sat Nov 16 13:03:12 2013
*raw
:PREROUTING ACCEPT [60:5920]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Sat Nov 16 13:03:12 2013
# Generated by ip6tables-save v1.4.12 on Sat Nov 16 13:03:12 2013
*mangle
:PREROUTING ACCEPT [60:5920]
:INPUT ACCEPT [4:320]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Sat Nov 16 13:03:12 2013
# Generated by ip6tables-save v1.4.12 on Sat Nov 16 13:03:12 2013
*filter
:INPUT DROP [4:320]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1194 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5222 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5269 -m state --state NEW,ESTABLISHED -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 1 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 2 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 3 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 4 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 133 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 134 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 135 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 136 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 137 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 141 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 142 -j ACCEPT
-6 -A INPUT -s fe80::/10 -p ipv6-icmp --icmpv6-type 130 -j ACCEPT
-6 -A INPUT -s fe80::/10 -p ipv6-icmp --icmpv6-type 131 -j ACCEPT
-6 -A INPUT -s fe80::/10 -p ipv6-icmp --icmpv6-type 132 -j ACCEPT
-6 -A INPUT -s fe80::/10 -p ipv6-icmp --icmpv6-type 143 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 148 -j ACCEPT
-6 -A INPUT -p ipv6-icmp --icmpv6-type 149 -j ACCEPT
-6 -A INPUT -s fe80::/10 -p ipv6-icmp --icmpv6-type 151 -j ACCEPT
-6 -A INPUT -s fe80::/10 -p ipv6-icmp --icmpv6-type 152 -j ACCEPT
-6 -A INPUT -s fe80::/10 -p ipv6-icmp --icmpv6-type 153 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth1 -j ACCEPT
-A OUTPUT -o eth2 -j ACCEPT
-A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sat Nov 16 13:03:12 2013

TCP 端口 22 的行是相同的。但是,这些规则阻止了 IPv6 上的 ssh。

为什么?我需要采取哪些不同措施才能在 IPv6 和 IPv4 上使用相同的 TCP 端口?

一个较旧的问题这表明我仍然遗漏了一些重要的ipv6-icmp东西,但我不清楚是什么,因为答案使用了不同的语法。

答案1

在我看来,ssh 的 ipv6 规则没问题。我怀疑整个设置中可能存在缺陷,这可能与您尝试访问机器的界面有关。

您的规则并未实施您所描述的政策。

[...] iptables 规则旨在允许 lo 上的所有流量,eth1eth2

您的INPUT规则未针对接口eth1和实现这些权限eth2。除 22、80、443、1194、5222 和 5269 之外的任何端口均不是可通过eth1和到达eth2

[...] 但阻止 eth0 上的传入流量,端口 22、80、443、1194、5222 和 5269 除外。

尝试将 中的端口权限限制为 ,INPUTeth0测试您的设置是否按预期工作。您可能希望使用-m multiport --dports 22,80,443,1194,5222,5269,以使规则更具可读性。在INPUT您已经接受ESTABLISHED流量的情况下。因此,在为单个端口编写规则时,匹配--state NEW(没有ESTABLISHED)数据包就足够了。

[...] 并允许传出流量eth0

规则集中也没有实现这一点。由于规则-A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT几乎接受所有数据包,因此可能会意外起作用。


一般进一步调试步骤:

  • 确保使用 加载 IPv6 脚本ip6tables。由于您使用了-6,您还可以使用 加载它iptables,这将忽略以 开头的所有规则-6
  • 进行更改时不要锁定自己。目前,eth0由于规则的原因,您可能只能从意外位置进行 ssh 访问-A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
  • 检查iptables -L -v -n并查看规则计数器以查看哪些规则适用。如有必要,添加不带操作的规则或LOG规则以获取更多计数器/信息。
  • 尝试接受任何 ipv6-icmp 一段时间,以确定问题是否与 icmp 有关。
  • ssh具有-4-6标志以强制使用 IPv4/IPv6。确保您的机器在测试期间没有意外回退到错误的 IP 版本。
  • 如果您已重构规则但 IPv6 问题-ssh 问题仍然存在,则您可能需要将此问题更改为类似以下内容:“我的规则是否实现了我想要的策略?”并使用新规则再次询问 IPv6-ssh 问题(在新线程中)。

答案2

在 IPv6 环境中,ICMPv6 比传统协议更重要。因此尝试将有关 icmpv6-type 的其他规则添加到 ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type 128 -j ACCEPT

然后重新加载,再次验证并测试。

答案3

回复可能有点晚,但较旧的问题答案似乎是正确的。我对 IPv6 协议了解不够,无法解释原因,但是当我通过 iptables 禁用整个 ICMPv6 通信时,SSH 通信也被中断了。

相关内容