![为什么这些 ip6tables 规则会阻止通过 IPv6 进行 ssh 连接,而 iptables 版本允许通过 IPv4 进行 ssh 连接](https://linux22.com/image/688075/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%BA%9B%20ip6tables%20%E8%A7%84%E5%88%99%E4%BC%9A%E9%98%BB%E6%AD%A2%E9%80%9A%E8%BF%87%20IPv6%20%E8%BF%9B%E8%A1%8C%20ssh%20%E8%BF%9E%E6%8E%A5%EF%BC%8C%E8%80%8C%20iptables%20%E7%89%88%E6%9C%AC%E5%85%81%E8%AE%B8%E9%80%9A%E8%BF%87%20IPv4%20%E8%BF%9B%E8%A1%8C%20ssh%20%E8%BF%9E%E6%8E%A5.png)
我有以下iptables
规则,旨在允许 上的所有流量lo
,eth1
并eth2
允许 上的传出流量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 上的所有流量,eth1和eth2
您的INPUT
规则未针对接口eth1
和实现这些权限eth2
。除 22、80、443、1194、5222 和 5269 之外的任何端口均不是可通过eth1
和到达eth2
。
[...] 但阻止 eth0 上的传入流量,端口 22、80、443、1194、5222 和 5269 除外。
尝试将 中的端口权限限制为 ,INPUT
以eth0
测试您的设置是否按预期工作。您可能希望使用-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 通信也被中断了。