我最近将 Raspberry Pi 从 Raspbian 8 (Jessie) 升级到 9 (Stretch)。 Pi 可通过 IPv4 和 IPv6 在我的 LAN 上访问。我应用了一些 iptables 规则(仅限 IPv4)来阻止无法通过 SSH 多次进行身份验证的主机。目前还没有针对 IPv6 的 iptables 规则。
但现在,如果我尝试连接多次,iptables(在 IPv4 上)会阻止从我的工作站到 Pi 的 SSH 连接。具体来说:我可以通过 IPv4 成功打开第一个 SSH 会话,但是当我尝试同时打开另一个会话时,它会将我锁定。然后我只能通过 IPv6 连接,或者必须等到阻塞时间结束(10 分钟)。
到目前为止我还无法找到这个问题的原因。 iptables 的设置方式是使用关键字“iptables returned”在 syslog 中记录所有失败的连接尝试。在那里我可以看到 SSH 端口上的连接失败,如下所示:
$ tail -f syslog | grep "iptables denied" | grep "DPT=22"
Mar 29 15:39:45 raspberry kernel: [ 179.988501] iptables denied: IN=wlan0 OUT= MAC=b8:27:eb:16:b3:1d:e4:b3:18:e3:47:f7:08:00 SRC=192.168.133.51 DST=192.168.133.50 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=32145 DF PROTO=TCP SPT=58723 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0
这是 iptables 的规则集:
$ cat rules.v4
# Generated by iptables-save v1.6.0 on Mon Mar 26 22:54:58 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:LOG_AND_DROP - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --mask 255.255.255.255 --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 4 --name DEFAULT --mask 255.255.255.255 --rsource -j LOG_AND_DROP
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -s 192.168.133.0/24 -p igmp -m addrtype --dst-type MULTICAST -j ACCEPT
-A INPUT -s 192.168.133.1/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.133.0/24 -p udp -m udp --dport 137:138 -m addrtype --dst-type BROADCAST -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
-A LOG_AND_DROP -j LOG --log-prefix "iptables denied: " --log-level 7
-A LOG_AND_DROP -j DROP
COMMIT
# Completed on Mon Mar 26 22:54:58 2018
如果你们希望我可以提供成功的 SSH 会话的完整记录(最大调试详细程度“-vvv”)以及失败的连接尝试(如果这有助于调试)。
答案1
根据您的 ipv4 iptables 规则,您应该每 10 分钟窗口允许 4 个连接。
您只期望一种连接,即您自己尝试过的一种连接。但是,其他连接尝试可能会攻击端口 22(这是端口扫描的一个非常常见的目标!)。您的 Raspberry Pi 是否在接口 wlan0 上暴露了公共 ipv4 地址?
答案2
参见 iptables hashlimit 模块,或者谷歌搜索“iptables 速率限制源地址”
作为更具体的东西,找到了一个例子:
iptables -I INPUT -m hashlimit -m tcp -p tcp --dport 80 --hashlimit-above 20/sec --hashlimit-mode srcip --hashlimit-name http -m state --state NEW -j DROP
根据您的端口、费率等进行定制。
或者使用fail2ban,这可能是一个非常好的解决方案,我自己只将它用于SSH,但它可以通过“失败登录计数”来保护其他资源,因此您不会因合法登录而超出自己的速率限制。尽管您可能必须自定义配置才能在非标准端口上工作:)