Webminでiptablesの設定

参考:Vine3.2 + TP535E 簡易ウェブサーバ 備忘録 iptables

ネットワーク > Linux ファイヤウォールを選択。

Linux ファイヤウォール
Rules file /etc/iptables.up.rules
IPtablesファイヤウォールがまだ設定されていません。Webminは下で選択したファイヤウォールのタイプに合わせた基本的な初期設定をファイル /etc/iptables.up.rules に保存することができます。

ひとまずは「全てのトラフィックを許可する」にチェックし、「起動時にファイヤウォールを有効にしますか?」にもチェックして「ファイヤウォールを設定する」ボタンを押す。

この状態でのiptablesの状態。

degas@debian:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

何も無し。当たり前ですが。

ルールを一つずつ作っていけるようになっているようだ。左上に「IPtablesを表示」ボタンがあり、その下のセレクタが「パケットフィルタリング(filter)」「パケット変換」「ネットワークアドレス変換(nat)」から選べるようになっている。セレクタから選択して、「IPtablesを表示」ボタンを押せば設定画面が下に出るようになっている。

  • パケットフィルタリングでは「着信パケット(INPUT)」「転送パケット(FORWARD)」「発信パケット(OUTPUT)」のそれぞれを設定。
  • パケット変換では「ルーティング処理前のパケット (PREROUTING)」「着信パケット(INPUT)」「転送パケット(FORWARD)」「発信パケット(OUTPUT)」「ルーティング処理後のパケット (POSTROUTING)」のそれぞれを設定。
  • ネットワークアドレス変換(nat)では「ルーティング処理前のパケット (PREROUTING)」「発信パケット(OUTPUT)」「ルーティング処理後のパケット (POSTROUTING)」のそれぞれを設定。

これをいちいち作るのは大変なので、テキトーなのを取ってくる事にする。
ステートフルパケットフィルタを使ったサービスの公開 (1/6):習うより慣れろ! iptablesテンプレート集(1) - @IT

…いやしっかり読んでしまいましたな。
方針は以下の通り。

  • LAN内からのみの接続を可能とする。
  • アウトプットは全て可能。
  • ループバック(lo)は接続可能。
  • 内部から外部への接続は内部から開始した分だけ可能とする。(-m state --state ESTABLISHED,RELATED)
  • ICMPはping応答のみ。tracerouteなど他のコマンドには答えない。(--icmp-type echo-request)
  • 外部からの接続は正規の接続(3way handshakeつまりSYNから始まる接続)のみ応答。(-p tcp ! --syn -m state --state NEW -j DROP
  • 接続可能なのはssh(22), smtp(25), www(80), pop3(110), webmin(10000)。
  • ログも取る。なおログは/var/log/messagesに保存される。

↓をiptables.shとして保存。

#! /bin/sh

trusthost='192.168.***.0/24'
myhost='192.168.***.*'
any='0.0.0.0/0'

###############
#Flush & Reset
###############
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -X
##############
#Default Rule
##############
iptables -P INPUT DROP
## all OUTPUT accept!
# iptables -P OUTPUT DROP
iptables -P FORWARD DROP
## connection from inside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##########
#loopback
##########
iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
##############################
#ICMP(PING) trusthost->myhost
##############################
iptables -A INPUT -p icmp --icmp-type echo-request -s $trusthost -d $myhost -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type echo-reply  -s $myhost -d $trusthost -j ACCEPT
##############################
#ICMP(PING) myhost->trusthost
##############################
# iptables -A OUTPUT -p icmp --icmp-type echo-request -s $myhost -d $trusthost -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -s $trusthost -d $myhost -j ACCEPT
######################################################
#accept connection from trusthost-> myhost SYN packet
######################################################
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
#######################
#ssh trusthost-> myhost
#######################
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 22 -j ACCEPT
# iptables -A OUTPUT -p tcp -s $myhost --sport 22 -d $trusthost -j ACCEPT
#########################
#smtp trusthost-> myhost
#########################
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 25 -j ACCEPT
# iptables -A OUTPUT -p tcp -s $myhost --sport 25 -d $trusthost -j ACCEPT
########################
#www trusthost-> myhost
########################
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 80 -j ACCEPT
# iptables -A OUTPUT -p tcp -s $myhost --sport 80 -d $any -j ACCEPT
#########################
#pop3 trusthost-> myhost
#########################
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 110 -j ACCEPT
# iptables -A OUTPUT -p tcp -s $myhost --sport 110 -d $trusthost -j ACCEPT
###########################
#Webmin trusthost-> myhost
###########################
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 10000 -j ACCEPT
# iptables -A OUTPUT -p tcp -s $myhost --sport 10000 -d $trusthost -j ACCEPT
#########
#logging
#########
iptables -N LOGGING
iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
iptables -A LOGGING -j DROP
iptables -A INPUT -j LOGGING
# iptables -A OUTPUT -j LOGGING

これを実行する。

degas@debian:~$ sudo sh iptables01.sh 

確認。

eiji@debian:~$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     0    --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     0    --  anywhere             anywhere            
ACCEPT     icmp --  192.168.***.0/24     192.168.***.**      icmp echo-request 
ACCEPT     icmp --  192.168.***.0/24     192.168.***.**      icmp echo-reply 
DROP       tcp  --  anywhere             anywhere            tcp flags:!FIN,SYN,RST,ACK/SYN state NEW 
ACCEPT     tcp  --  192.168.***.0/24     192.168.***.**      state NEW,RELATED,ESTABLISHED tcp dpt:ssh 
ACCEPT     tcp  --  192.168.***.0/24     192.168.***.**      state NEW,RELATED,ESTABLISHED tcp dpt:smtp 
ACCEPT     tcp  --  192.168.***.0/24     192.168.***.**      state NEW,RELATED,ESTABLISHED tcp dpt:www 
ACCEPT     tcp  --  192.168.***.0/24     192.168.***.**      state NEW,RELATED,ESTABLISHED tcp dpt:pop3 
ACCEPT     tcp  --  192.168.***.0/24     192.168.***.**      state NEW,RELATED,ESTABLISHED tcp dpt:webmin 
LOGGING    0    --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain LOGGING (1 references)
target     prot opt source               destination         
LOG        0    --  anywhere             anywhere            limit: avg 3/hour burst 5 LOG level warning prefix `DROP:' 
DROP       0    --  anywhere             anywhere            

さて。
Webminのネットワーク > Linux ファイヤウォールに、この設定を取り込みたい。
「元に戻す」ボタンの横の説明には「このボタンをクリックするとリストされた設定をリセットし現在有効な設定をリストします。」とあったので、これを押してみる。すると、ちゃんと取り込んでくれた!


着信パケット(INPUT)

アクション 状態
許可 もし 接続の状態が RELATED,ESTABLISHED である
許可 もし 着信インターフェースが lo である
許可 もし プロトコルが ICMP である 且つ 発信元が 192.168.***.0/255.255.255.0 である 且つ 宛先が 192.168.***.** である 且つ ICMPタイプが 8 である
許可 もし プロトコルが ICMP である 且つ 発信元が 192.168.***.0/255.255.255.0 である 且つ 宛先が 192.168.***.** である 且つ ICMPタイプが 0 である
破棄 もし プロトコルTCP である 且つ TCPフラグ FIN,SYN,RST,ACK が SYN でない 且つ 接続の状態が NEW である
許可 もし プロトコルTCP である 且つ 発信元が 192.168.***.0/255.255.255.0 である 且つ 宛先が 192.168.***.** である 且つ 宛先ポートが 22 である 且つ 接続の状態が NEW,RELATED,ESTABLISHED である
許可 もし プロトコルTCP である 且つ 発信元が 192.168.***.0/255.255.255.0 である 且つ 宛先が 192.168.***.** である 且つ 宛先ポートが 25 である 且つ 接続の状態が NEW,RELATED,ESTABLISHED である
許可 もし プロトコルTCP である 且つ 発信元が 192.168.***.0/255.255.255.0 である 且つ 宛先が 192.168.***.** である 且つ 宛先ポートが 80 である 且つ 接続の状態が NEW,RELATED,ESTABLISHED である
許可 もし プロトコルTCP である 且つ 発信元が 192.168.***.0/255.255.255.0 である 且つ 宛先が 192.168.***.** である 且つ 宛先ポートが 110 である 且つ 接続の状態が NEW,RELATED,ESTABLISHED である
許可 もし プロトコルTCP である 且つ 発信元が 192.168.***.0/255.255.255.0 である 且つ 宛先が 192.168.***.** である 且つ 宛先ポートが 10000 である 且つ 接続の状態が NEW,RELATED,ESTABLISHED である
チェイン LOGGING を実行 常に



なおバックアップも取れるし、バックアップからの復元もiptables-restoreコマンドで可能。

sudo cp /etc/iptables.up.rules /etc/iptables.up.rules.ssh-original

もし何かあったら、ssh から、

sudo iptables-restore < /etc/iptables.up.rules.ssh-original

としたら、この値に戻すことができる。(覚えておくと、設定を失敗したときに焦らないですむ)。
http://now.ohah.net/setu/wiki?Debian_etch%3AServer%3ABasic