Iptables は、Linux オペレーティング システム用に特別に構築された非常に柔軟なファイアウォール ツールです。 Linux マニアやシステム管理者にとって、iptables は非常に便利です。この記事では、最も汎用性の高い Linux ファイアウォールを構成する方法を説明します。
iptables について
Iptables は、ルールチェーンを使用してネットワークトラフィックを許可/ブロックするコマンドラインベースのファイアウォールツールです。システム上でネットワーク接続を確立しようとすると、iptables は一致するルールを探します。見つからない場合、iptables はデフォルトのアクションを実行します。
ほぼすべての Linux ディストリビューションには、iptables がプリインストールされています。 Ubuntu/Debian で iptables を更新/インストールするコマンドは次のとおりです:
sudo apt-get install iptables
Firestarter などの一部の既存のグラフィカル インターフェイス ソフトウェアも iptables を置き換えることができます。しかし、iptables の使い方は難しくありません。 iptables ルールを設定するとき、特にサーバーにリモートでログインするときは、特に注意してください。この時点でエラーが発生すると、サーバーとの接続が永久に失われる可能性があり、それを解決するにはサーバーにアクセスする必要があるためです。
Iptables ルールチェーンの種類
Iptables ルールチェーンは、入力、転送、出力の 3 つのタイプに分類されます。
入力 - このチェーンは、宛先アドレスがローカル マシンである接続をフィルターするために使用されます。たとえば、ユーザーが SSH を使用して PC/サーバーにログインしようとすると、iptables はまずユーザーの IP アドレスとポートを iptables 入力チェーン ルールと照合します。
転送 - このチェーンは、宛先アドレスと送信元アドレスの両方がローカルではない接続をフィルターするために使用されます。たとえば、ルーターが受信したデータのほとんどは、他のホストに転送する必要があります。システムで NAT などのルーターのような機能が有効になっていない場合は、このチェーンを使用する必要はありません。
システムに転送チェーンが必要かどうかを検出する安全で信頼性の高い方法があります:
iptables -L -v
上の写真は、数週間稼働しているサーバーのスクリーンショットです。このサーバーは入出力に制限を設けません。見てわかるように、入力チェーンと出力チェーンはそれぞれ 11GB と 17GB のデータを処理しましたが、転送チェーンはデータをまったく処理していません。これは、このサーバーではルーターのような転送機能が有効になっていないためです。
出力 - このチェーンは、ソースアドレスがローカルマシンである接続をフィルタリングするために使用されます。たとえば、howtogeek.com に ping を実行しようとすると、iptables は出力チェーンで ping と howtogeek.com に関連するルールをチェックし、接続リクエストを許可するか拒否するかを決定します。
注: 外部ホストに ping を実行すると、出力チェーンのみが動作しているように見えます。ただし、外部ホストから返されたデータは入力チェーンを通じてフィルター処理する必要があることに注意してください。 iptables ルールを構成するときは、多くのプロトコルは双方向通信を必要とするため、入力チェーンと出力チェーンの両方を構成する必要があることに注意してください。 SSH を設定するとき、入力チェーンと出力チェーンの両方で SSH を設定することを忘れることがよくあります。
チェーンのデフォルト動作
特定のルールを設定する前に、これらのチェーンのデフォルト動作を設定する必要があるかもしれません。言い換えれば、既存のルールと一致しない場合に iptables に何をしてもらいたいのでしょうか?
次のコマンドを実行すると、一致しない接続に対する現在の iptables のデフォルト アクションを表示できます:
iptables -L
上記のように、grep を使用して出力をより簡潔にすることができます。上のスクリーンショットでは、すべてのチェーンがデフォルトですべての接続を受け入れます。
通常、システムがデフォルトですべてのネットワーク データを受信するようにする必要があります。この設定は、iptables のデフォルト構成でもあります。ネットワーク接続を受信するための設定コマンドは次のとおりです。
iptables --policy INPUT ACCEPT iptables --policy OUTPUT ACCEPT iptables --policy FORWARD ACCEPT
デフォルト設定を使用しながら、特定の IP アドレスまたはポート番号をフィルタリングするいくつかのコマンドを追加することもできます。これらのコマンドについては、この記事の後半で紹介します。
すべてのネットワーク接続をデフォルトで拒否し、その上に許可された IP アドレスまたはポート番号を追加する場合は、以下の図に示すように、デフォルト設定の ACCEPT を DROP に変更できます。これは、機密データを含むサーバーにとって非常に便利です。通常、これらのサーバーは特定の IP アドレスのみにアクセスを許可します。
iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP
特定の接続の設定
特定の IP アドレスまたはポートを設定する方法を見てみましょう。この記事では、最も基本的で一般的な 3 つの設定を主に紹介します。
受け入れる – すべてのデータを受け入れます。
ドロップ – データをドロップします。アプリケーション シナリオ: データのソース アドレスにシステムの存在を認識させたくない場合 (これを処理する最良の方法)。
拒否 – 接続の確立を許可しませんが、エラー応答を返します。アプリケーション シナリオ: 特定の IP アドレスにシステムにアクセスさせたくないが、ファイアウォールがアクセスをブロックしていることを知らせたい場合。
为了直观的区分上述三种情况,我们使用一台PC来ping一台配置了iptables的Linux电脑:
允许或阻止特定的连接
在配置完基本的规则链之后,你就可以配置iptables来允许或者阻止特定的IP地址或者端口。
注意:在这些例子中,我们使用iptables -A将额外的规则添加到现存的链中。Iptables在执行匹配的时候,会从列表的顶端开始搜索。你可以使用iptables -I [chain] [number]将新的规则插入到列表的指定位置。
来自同一IP地址的连接
下面这个例子展示了如何阻止来自IP地址为10.10.10.10的所有连接。
iptables -A INPUT -s 10.10.10.10 -j DROP
来自一组IP地址的连接
下面这个例子展示了如何阻止来自子网10.10.10.0/24内的任意IP地址的连接。你可以使用子网掩码或者标准的/符号来标示一个子网:
iptables -A INPUT -s 10.10.10.0/24 -j DROP
或
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
特定端口的连接
这个例子展示了如何阻止来自10.10.10.10的SSH连接。
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
你可以将“ssh”替换成其它任何协议或者端口号。上述命令中的-p tcp告诉iptables连接使用的是何种协议。
下面这个例子展示了如何阻止来自任意IP地址的SSH连接。
iptables -A INPUT -p tcp --dport ssh -j DROP
连接状态
我们之前提到过,许多协议均需要双向通信。例如,如果你打算允许SSH连接,你必须同时配置输入和输出链。但是,如果你只想允许来自外部的SSH请求,那该怎么做?
下面这个例子展示了如何允许源IP地址为10.10.10.10同时阻止目的地址为10.10.10.10的SSH连接:
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
保存更改
上述方法对iptables规则作出的改变是临时的。如果你想永久保存这些更改,你需要运行额外的命令(不同Linux发行版下的保存命令也不相同):
Ubuntu:
sudo /sbin/iptables-save
Red Hat / CentOS:
/sbin/service iptables save
或者
/etc/init.d/iptables save
其它命令
列出iptables的当前配置:
iptables -L
使用-v选项将显示数据包和字节信息;使用-n选项将以数字形式列出信息,即不将IP地址解析为域名。
换句话讲,主机名,协议和网络都以数字的形式列出。
清除当前所有的配置规则:
iptables -F
原文 The Beginner’s Guide to iptables, the Linux Firewall