Debian 7.7「wheezy」ファイアウォールiptables/ip6tablesの設定

2014/11/27[公開]

自宅サーバーを実際の運用で公開するにはファイアウォールiptablesの設定はセキュリティ上必須項目ですね。いろいろググッて一番カンタンと思ってる自分のサーバーでの設定方法の記録です。

前提

iPv6については全通信拒否の設定にしておきます、将来iPv6が必要になったら変更できるようにしておきます。

そもそも私の契約しているspaaqs光ホームタイプ(旧USEN)は新規契約受付終了しており、将来にわたってiPv6未対応確定と思われるのでたいして考慮する必要もないのですが…

スポンサー リンク

iptables/ip6tablesの状態を調べる

iptablesはDebianインストール時にインストール済みですが、デフォルトのままでは設定が入っていない状態です。

suコマンドで管理者権限になってから調べて見ます。

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

INPUTもOUTPUTも全ポート通信許可という状態です。

IPv6の状態も調べる場合は

ip6tables -L

IPv6も同じく全ポート許可状態です。

iptables-persistentのインストール

iptablesだけで設定を進めることもできますが、それはlinux上級者の話です。ここはiptables-persistentをインストールしたほうが簡単なので迷わずインストールします。

aptitude install iptables-persistent

iptables1

IPv4のルールを保存するか聞いてくるので、「はい」で進みます。

iptables2

IPv6も同じく「はい」で進んでインストールを完了させます。

これでサーバー起動時に自動的にiptablesが有効になり、読み込む設定ファイルrules.v4とrules.v6が出来上がっています。

ファイルの場所はDebianならば

  • IPv4の設定ファイルは /etc/iptables/rules.v4
  • IPv6の設定ファイルは  /etc/iptables/rules.v6

これを書き換えていきます。

設定ファイルを書き換える

ファイアウォールのルールを設定するわけですが、ここは上級者ならいかようにも設定できると思いますが、やはりテンプレート的なものがあるようで、WEBサーバー単体の場合、定番の記述方法が Debian wiki にあるので丸々コピペで頂いてしまいます。

Debian Wiki / iptables

https://wiki.debian.org/iptables

WEBサーバー単体の場合 rules.v4

デフォルト状態の/etc/iptables/rules.v4の中身を全部消して、下のように書き換えます。

コピペ用ファイルを用意しています→→rules.v4のサンプル1

下に表示されている記述をコピペすると、iptablesがエラーを出してしまいます。iptablesは相当シビアみたいで、プラグインSyntaxHighlighter Evolvedで表示されたのをそのままコピペだと設定ファイルを読み込むときに失敗します。必ず上のファイルを開いてからコピペしてください。

【2014/12/27追記】プラグインをCrayon Syntax Highlighterに変更しました。

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections 
# The --dport number is the same as in /etc/ssh/sshd_config
-A INPUT -p tcp -m state --state NEW --dport 55555 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access 
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
#  note that blocking other types of icmp packets is considered a bad idea by some
#  remove -m icmp --icmp-type 8 from this line to allow all kinds of icmp:
#  https://security.stackexchange.com/questions/22711
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

20行目のSSHのポート番号だけは、環境に合わせて変更してください。

入ってくるのはWEBサーバーのポート80と443、SSHのポートを許可、ping許可、こちらから出して戻ってきたものを許可。それ以外は拒否。出ていくのは全部許可。5分以内に連続した不正アタックをログにとる。

 ということになっているようです。

rules.v6も書き換えます。

全通信拒否にするためetc/iptables/rules.v6は、ACCEPTをDROPに変えます。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

動作確認

設定が有効になるのはサービス再起動後のようです。

/etc/init.d/iptables-persistent start

【2015/05/07】Debian8.0 jessieではサーバーの再起動が必要のようです。

エラーが出ずに再起動したら、状態を確認します。

iptables -L
ip6tables -L

追加で必要なポートを開ける

私の場合は、メールサーバー用のポートを開けています。

コピペ用ファイルを用意しています→→ メールサーバー設定を追加したrules.v4サンプルコピペは必ず上のファイルを開いてからコピペしてください。

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections 
# The --dport number is the same as in /etc/ssh/sshd_config
-A INPUT -p tcp -m state --state NEW --dport 55555 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access 
# for everyone is really desired. Most likely you will only allow access from certain IPs.

#POPメールサーバー用
-A INPUT -p tcp --dport 110 -j ACCEPT

#SMTPメールサーバー用
-A INPUT -p tcp --dport 25 -j ACCEPT

#サブミッションポート用
-A INPUT -p tcp --dport 587 -j ACCEPT

#IMAPメールサーバー用
-A INPUT -p tcp --dport 143 -j ACCEPT

# Allow ping
#  note that blocking other types of icmp packets is considered a bad idea by some
#  remove -m icmp --icmp-type 8 from this line to allow all kinds of icmp:
#  https://security.stackexchange.com/questions/22711
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

追加する行の順番があるようで注意です。お尻に追加するとダメということもあったりします。

最後にひとこと

これでファイアウォールの設定ができました。入ってくるものだけ制限して、出て行くものは制限無し、たとえるならばマンション入口のオートロック的なセキュリティレベルだと思います。あとは、ご自身の環境に合わせてルール作りをしていってください。

スポンサー リンク

こちらの記事もどうぞ

“Debian 7.7「wheezy」ファイアウォールiptables/ip6tablesの設定” への2件の返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です