iptablesでファイアウォールを構築する方法!

今回は、iptablesでファイアウォールを構築する方法です。iptables はパケットフィルタリング型のファイアウォールです。必要最低限のファイアウォールですので、自分のサーバーを守るためにも iptables は導入しましょう!

iptables はポートを管理して攻撃を防ぐもので、サイト上からの攻撃 SQLインジェクションやクロスサイトスクリプティングなどの攻撃は防ぐことが出来ません!

iptables の導入方法は、OSによって異なります。アクセスルールは共通で使えますが、アクセスルールを記述するファイルの位置が異なったりします。

今回は、WebminDebian7 の2種類の導入方法をご紹介します!Debian7 の方でも Webmin の方法で導入する事も出来ます。

Webmin で導入する方法(IPv4のみ)

Webmin をお使いの方は、「ネットワーク」 → 「Linux ファイヤウォール」から、iptables の設定が出来ます。特に iptables のソフトをインストールする必要はありませんし、起動時にファイヤウォールを有効にする事も出来ます。

アクセスルールの追加は、Webmin上から作業する事も出来ますが、最初はルールが多いので、直接ファイルを修正する方法で行います。

1.すべて許可する

まず初めに、「ネットワーク」 → 「Linux ファイヤウォール」の「設定を適用」ボタンを押してすべて許可します。

2.アクセスルール作成

Webmin のアクセスルール用のファイルは、/etc/iptables.up.rules になります。

下記のアクセスルールは必要最低限のポートのみ開放してあります。許可してあるもの以外は破棄されます。-A INPUT から始まる行の末尾に -j ACCEPT が付いているのが許可。付いていないのは、何もしない(最終的には破棄される)。にしてあります。使用したいポートに、 -j ACCEPT を付ければポートが許可されます。他にも必要なポートがあれば、ご自分で追記してください。

# vi /etc/iptables.up.rules を修正します。
下記は既に修正済みです。

# Generated by webmin
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Fri Jun 27 19:55:46 2014
# Generated by webmin
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Fri Jun 27 19:55:46 2014
# Generated by webmin
*filter
:FORWARD DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]
# loopback
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow IP
-A INPUT -s 192.168.0.0/24
# Multicast DNS
-A INPUT -p udp -m udp -d 224.0.0.251 --dport 5353 -j ACCEPT
# Ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# SSH
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# HTTP
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# HTTPS
-A INPUT -p tcp -m tcp --dport 443
# Webmin
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
# FTP-Data
-A INPUT -p tcp -m tcp --dport 20
# FTP
-A INPUT -p tcp -m tcp --dport 21
# FTP-Passive
-A INPUT -p tcp -m tcp --dport 49152:65534
# SMTP
-A INPUT -p tcp -m tcp --dport 25
# Submission
-A INPUT -p tcp -m tcp --dport 587
# IDENT
-A INPUT -p tcp -m tcp --dport 113 -j REJECT
# POP3
-A INPUT -p tcp -m tcp --dport 110
# IMAP
-A INPUT -p tcp -m tcp --dport 143
# DNS TCP
-A INPUT -p tcp -m tcp --dport 53
# DNS UDP
-A INPUT -p udp -m udp --dport 53
# Squid
-A INPUT -p tcp -m tcp --dport 3128
COMMIT
# Completed on Fri Jun 27 20:10:18 2014

[0:0] - [パケットカウンタ:バイトカウンタ]

3.アクセスルールを適応する

Webmin の「Linux ファイヤウォール」を再読込すると、上記のアクセスルールが反映されていると思いますので、「設定を適用する」ボタンを押して、起動時に有効にはいを選んで、「起動時に有効」ボタンを押せば、すべての作業は終わりです!

アクセスルールの適応状態の確認方法は、一番下に書いてあります!

Debian7 で導入する方法(IPv4・IPv6)

Debian7 をお使いの方は、こちらの方が便利です。いや、そんなに変わらないかも・・・?

iptables インストール

IPv4 & IPv6 のアクセスルールを作るか聞いてくるので、必要に応じて選んでください。当説明は、IPv4 のみです。

// インストール
# apt-get install iptables iptables-persistent

アクセスルール作成

# vi /etc/iptables/rules.v4 を修正します。

//
// アクセスルールの内容は、Webmin で説明したアクセスルールを参考にしてください。
//

アクセスルールを適応する

// アクセスルールを適応
# /etc/init.d/iptables-persistent restart

アクセスルールの適応状態の確認

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     udp  --  anywhere             224.0.0.251          udp dpt:mdns
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
           tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:webmin
           tcp  --  anywhere             anywhere             tcp dpt:ftp-data
           tcp  --  anywhere             anywhere             tcp dpt:ftp
           tcp  --  anywhere             anywhere             tcp dpts:10021:10024
           tcp  --  anywhere             anywhere             tcp dpt:smtp
           tcp  --  anywhere             anywhere             tcp dpt:submission
           tcp  --  anywhere             anywhere             tcp dpt:auth
           tcp  --  anywhere             anywhere             tcp dpt:pop3
           tcp  --  anywhere             anywhere             tcp dpt:imap2
           tcp  --  anywhere             anywhere             tcp dpt:domain
           udp  --  anywhere             anywhere             udp dpt:domain
           tcp  --  anywhere             anywhere             tcp dpt:3128

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# iptables -L - アクセスルールの適応状態を表示する。
# iptables -L -v - アクセスルールの適応状態とパケットカウンターを表示する。
# iptables -L -Z - アクセスルールの適応状態とパケットカウンターをリセットする。

これで、iptables の状態が確認できると思います。

IPv6もあるんだよ。

実は、今回紹介したのはIPv4向けの設定です。IPv6も利用している方は、別途設定をする必要があります。意外とIPv6のフィルタ設定は忘れられている事が多いです。IPv6の適応方法は、ネットで探してください。m(_ _)m

# ip6tables -L で、IPv6の適応状態が確認出来ます。

IPv6を使用していないならば、無効化したほうが良いかと思います。もしくは、iptables でIPv6の通信をすべてDROPする方が楽で確実かもしれないですね。

// 検索キーワード
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
NETWORKING_IPV6=no

総当たり攻撃(ブルートフォースアタック)

SSHのポートを有効にしていると、総当たり攻撃をほぼ100%受けると思います。今回のアクセスルールでは防ぐことが出来ません。iptables だけでもやれない事は無いですが、「SSHGuard」や「Fail2ban」などのソフトも導入する方が、防御力は上がります。「Fail2ban」がお薦め。

守るのは、SSH、POP3、FTP、ベーシック認証など、アカウント&パスワードを入力するものです。

総当たり攻撃はこんな感じです・・・。
SASL Authentications failed 2098 Time(s)
Service smtp (shadow) - 2098 Time(s):
Realm - 1 Time(s):
User: contact - Unknown - 1 Time(s):
User: abuse - Unknown - 1 Time(s):
User: accounts - Unknown - 1 Time(s):
User: admin - Unknown - 1 Time(s):
User: aoyagi - Unknown - 34 Time(s):
User: backup - Unknown - 1 Time(s):
User: cron - Unknown - 1 Time(s):
User: abuse - Unknown - 46 Time(s):
User: admin - Unknown - 46 Time(s):
User: administrator - Unknown - 46 Time(s):
User: aoyagi - Unknown - 34 Time(s):
User: contact - Unknown - 46 Time(s):
User: deals - Unknown - 46 Time(s):
User: do_not_reply - Unknown - 46 Time(s):
User: donotreply - Unknown - 46 Time(s):
User: feedback - Unknown - 46 Time(s):
User: hello - Unknown - 46 Time(s):
User: help - Unknown - 46 Time(s):
User: hey - Unknown - 46 Time(s):
User: hostmaster - Unknown - 46 Time(s):
User: html-news - Unknown - 46 Time(s):
User: info - Unknown - 46 Time(s):
User: information - Unknown - 46 Time(s):
User: mailing - Unknown - 46 Time(s):
User: mainnewsletter - Unknown - 46 Time(s):
User: marketing - Unknown - 46 Time(s):
User: newletter - Unknown - 46 Time(s):
User: news - Unknown - 46 Time(s):
User: newsletters - Unknown - 46 Time(s):
User: nl-replies - Unknown - 92 Time(s):
User: no-reply - Unknown - 46 Time(s):
User: office - Unknown - 46 Time(s):
User: please-reply - Unknown - 46 Time(s):
User: postmaster - Unknown - 46 Time(s):
User: replyto - Unknown - 46 Time(s):
User: sales - Unknown - 92 Time(s):
User: staff - Unknown - 46 Time(s):
User: subscriptions - Unknown - 92 Time(s):
User: suport - Unknown - 46 Time(s):
User: support - Unknown - 46 Time(s):
User: systemalert - Unknown - 46 Time(s):
User: test - Unknown - 46 Time(s):
User: text-news - Unknown - 46 Time(s):
User: updates - Unknown - 46 Time(s):
User: vanzari - Unknown - 46 Time(s):
User: webmaster - Unknown - 92 Time(s):
User: whatsup - Unknown - 46 Time(s):
User: wordpress - Unknown - 46 Time(s):

読んで頂いて有り難うございます!