参考: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