iptables と netfilterを勉強し直す(ゼロからのfirewall構築)その3

575

前回の続きです
 

HASHCECKというチェインを作って処理する方法もある

hashlimitの解説サイトをみるとHASHCHECKというチェインを作って処理する方法もあるようです。

本稿の意図は iptablesをきちんと理解することなので、違う文法で同じことを実現するやり方も見ていきましょう。この場合 /etc/iptables/rules.v4 の記述は以下のようになります。

# Generated by iptables-save v1.8.7 on Tue Jan 25 22:37:44 2022
*filter
:INPUT DROP [2742:384288]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [2815:486555]
:HASHCHECK1 DROP [2815:486555]
-A INPUT -p tcp -m state --state NEW --dport 22 -j HASHCHECK1
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A HASHCHECK1 -m hashlimit --hashlimit-name sshcheck --hashlimit 1/m --hashlimit-burst 6 --hashlimit-mode srcip,dstport --hashlimit-htable-expire 120000 -j ACCEPT
-A HASHCHECK1 -m limit --limit 1/sec -j LOG --log-prefix "IPTABLE HASHCHECK1: "
COMMIT
# Completed on Tue Jan 25 22:37:44 2022

6行目: HASHCHECK1というチェインをポリシーDROPで新しく作ります。
7行目:新しく確立した22番ポートへのTCP接続をHASHCHECK1に飛ばします
9行目:飛んできた通信にバースト6で120秒という制限をかけます
10行目:リミットに引っかかったらログを残します
 

なるほどこういうやり方もあるか、と納得できるでしょう。このやり方のメリットはログをしっかり残したりと、-m –hashlimit ではできない追加処理が個別にできることです。ただし、処理を増やすたびに HASHCHECK2、HASHCHECK3……とチェインを新しく作る必要が出るため、おそらくはメモリの消費量などに問題が出てくるのだろうと思います。
 

ちなみに、/var/log/syslog なんかには以下のようなログが残ります。

Jan 28 16:07:14 hostname kernel: [ 2430.623553] IPTABLE HASHCHECK1: IN=enp0s8 OUT= MAC=08:00:27:44:49:61:00:e0:xx:xx:xx:xx:xx:xx SRC=192.168.1.140 DST=192.168.1.130 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=2266 DF PROTO=TCP SPT=57334 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0 
Jan 28 16:07:15 hostname kernel: [ 2431.654158] IPTABLE HASHCHECK1: IN=enp0s8 OUT= MAC=08:00:27:44:49:61:00:e0:xx:xx:xx:xx:xx:xx SRC=192.168.1.140 DST=192.168.1.130 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=2267 DF PROTO=TCP SPT=57334 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0 
Jan 28 16:07:17 hostname kernel: [ 2433.674248] IPTABLE HASHCHECK1: IN=enp0s8 OUT= MAC=08:00:27:44:49:61:00:e0:xx:xx:xx:xx:xx:xx SRC=192.168.1.140 DST=192.168.1.130 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=2268 DF PROTO=TCP SPT=57334 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0

ここまで触ってみると iptablesの全体の構造と基本的な文法は理解できますね。あとは細かなモジュール(-m で呼び出したり –option をつけたりするやつ)の使い方だとかをこつこつ勉強すればいいわけです。

(次回に続く)