最近、Raspberry PiをRaspbian 8(Jessie)から9(Stretch)にアップグレードしました。 PiはIPv4とIPv6を介して自分のLANからアクセスできます。 SSH経由で複数回認証できないホストをブロックするために、いくつかのiptablesルール(IPv4のみ)を適用しました。現在、IPv6のiptablesルールはありません。
ただし、複数回接続しようとすると、iptables(IPv4)は私のワークステーションからPiへのSSH接続をブロックします。具体的には、IPv4を介して最初のSSHセッションを正常に開くことができますが、同時に別のセッションを開こうとするとロックされます。その後、IPv6を介してのみ接続できるか、ブロック時間(10分)が終了するまで待つ必要があります。
これまで、この問題の原因が見つかりませんでした。 iptables は、「iptables return」というキーワードを使用して、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つの接続を許可する必要があります。
あなたは1つの接続、あなたが直接試した接続だけを期待します。ただし、他の接続試行はポート22(ポートスキャンの非常に一般的な宛先)を攻撃する可能性があります。 Raspberry Piのインターフェイスwlan0に公開ipv4アドレスが公開されていますか?
答え2
iptables hashlimitモジュールまたはGoogleの「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
ポート、料金などに合わせてカスタマイズされます。
あるいは、fall2banを使用すると、本当に良い解決策かもしれません。 SSHでのみ使用しますが、「失敗したログイン数」で他のリソースを保護するため、正当なログインでレート制限を超えません。非標準ポートで動作するには、設定をカスタマイズする必要があります。 :)