次のルールを追加すると、すべてiptables
が期待どおりに機能します。違反IPが追加BLACKLIST
および削除されます。
iptables -A INPUT -m recent --rsource --name BLACKLIST --update -j DROP
iptables
私のルールを次のようにリストするときiptables-save
:
-A INPUT -i eth0 -m recent --update --name BLACKLIST --mask 255.255.255.255 --rsource -j DROP
ただし、ルールに別のマスクを明示的に割り当てると、次に変更されたマスクが表示されますが、iptables-save
サブネット全体をブロックするのに望ましい効果はありません。
-A INPUT -i eth0 -m recent --update --name BLACKLIST --mask 255.255.0.0 --rsource -j DROP
しかし、個々のIPが転送されるのを見ることができます。
128.90.177.13
128.90.177.136
128.90.177.35
私のブラックリストに個別に追加されました。
マスクが有効な場合、最初の IP 128.90.177.13 がブラックリストに追加され、同じサブネット上の他の IP がブロックされます。しかしそれは真実ではない。彼らは私のルールに従った。
iptablesの最新の--maskが機能しないのはなぜですか?
カーネル4.14.274でiptablesモジュールを使用しています。
要約すると、次のようになります。
問題のあるIPをブラックリストに追加し、ネットマスクに基づいてそのIPのサブネット全体をブロックしたいと思います。
答え1
完全なnetfilter設定を見ないと、環境で何が起こっているのかを理解するのは難しいかもしれません。しかし、ここでは簡単なものを組み立てることで、それがどのように機能するかを確認できます。
空のnetfilterルールセットから始めて、次のルールを追加してみましょう。
iptables -N bl_add
iptables -A bl_add -j LOG --log-prefix "BL_ADD "
iptables -A bl_add -j DROP
iptables -N bl_update
iptables -A bl_update -j LOG --log-prefix "BL_UPDATE "
iptables -A bl_update -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m recent --name BLACKLIST --update --mask 255.255.0.0 --seconds 20 -j bl_update
iptables -A INPUT -p tcp --dport 80 -m recent --name BLACKLIST -i eth0 --set -j bl_add
これには、パケットがどこに行くかを正確に判断するために使用できる複数のログ/ドロップチェーンがあります。ルール-i lo
は重要ではありません。ただ私が足に銃を撃つのを防ぐだけです。
内部にマニュアルページ、次の文書を参照してください--update
。
[!] --rcheck
Check if the source address of the packet is currently in
the list.
[!] --update
Like --rcheck, except it will update the "last seen"
timestamp if it matches.
したがって、--update
オプションは「アドレスがリストにあるかどうかを確認(つまり一致)し、その場合は「最後に見た」タイムスタンプを更新します」を意味します。この例では、これを実際に見ることができます。
192.168.122.1 でこのホストのポート 80 に接続しようとすると、journalctl -kfl
log() に次のように表示されます。
[ 4152.729894] BL_ADD IN=eth0 OUT=
MAC=52:54:00:01:89:30:52:54:00:5d:a7:ff:08:00 SRC=192.168.122.1
DST=192.168.122.51 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=22836 DF PROTO=TCP
SPT=41698 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0
[ 4153.775211] BL_UPDATE IN=eth0 OUT=
MAC=52:54:00:01:89:30:52:54:00:5d:a7:ff:08:00 SRC=192.168.122.1
DST=192.168.122.51 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=22837 DF PROTO=TCP
SPT=41698 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0
最初のパケットは--update
ルールをスキップして(まだブラックリストに登録されていないため)、ルールに到達するため、ログ出力が--set
表示されます。BL_ADD
次のパケットはルールで停止し、--update
ブラックリストにあるため、BL_UPDATE
ログ出力が表示されます。
この設定では、192.168.122.1から接続すると、次の項目が生成されます/proc/net/xt_recent/BLACKLIST
。
src=192.168.0.0 ttl: 64 last_seen: 4303109595 oldest_pkt: 13 4303017951, 4303018971, 4303035387, 4303035595, 4303035803, 4303036211, 4303037019, 4303038685, 4303041947, 4303048411, 4303061723, 4303108569, 4303109595
src
アドレスは192.168.0.0です。引数--mask
は元の192.168.122.1
ソースアドレスを変換するために適用されます。
もし私たちが削除するルール--set
は次のとおりです。
iptables -N bl_add
iptables -A bl_add -j LOG --log-prefix "BL_ADD "
iptables -A bl_add -j DROP
iptables -N bl_update
iptables -A bl_update -j LOG --log-prefix "BL_UPDATE "
iptables -A bl_update -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m recent --name BLACKLIST --update --mask 255.255.0.0 --seconds 20 -j bl_update
192.168.122.1からポート80に接続すると、ログ出力は発生せず、.rule/proc/net/xt_recent/BLACKLIST
--update
何もしなかった以前にルールをBLACKLIST
使用してソースアドレスを追加していない場合。--set
有用な場合、iptables-save
出力は次のようになります。布材構成は次のとおりです。
*filter
:INPUT ACCEPT [31:2152]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [16:1520]
:bl_add - [0:0]
:bl_update - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m recent --update --seconds 20 --name BLACKLIST --mask 255.255.0.0 --rsource -j bl_update
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m recent --set --name BLACKLIST --mask 255.255.255.255 --rsource -j bl_add
-A bl_add -j LOG --log-prefix "BL_ADD "
-A bl_add -j DROP
-A bl_update -j LOG --log-prefix "BL_UPDATE "
-A bl_update -j DROP
COMMIT