
Linux Foundation 認定プログラムの紹介
この LFCE(Linux Foundation Certified Engineer)シリーズの Part 1 – About Iptables からおなじみかもしれませんが、ファイアウォールとは何かについて基本的な説明をしました。それは、ネットワークに入ってくるパケットや出ていくパケットを管理する仕組みです。ここで言う「管理」とは、実際には次のようなことを意味します:
- 特定のパケットをネットワークに入れたり出したりすることを許可または阻止する。
- ネットワーク上のある地点から別の地点へ他のパケットを転送する。
あらかじめ決められた基準に基づいて。
この記事では、基本的なパケットフィルタリングの実装方法や、ファイアウォールの設定方法について iptables を使用して説明します。iptables は、ファイアウォーリングに使用されるネイティブカーネルモジュールである netfilter のフロントエンドです。
ファイアウォーリングは広範なトピックであり、この記事はそれについてすべてを理解する包括的なガイドではなく、このトピックのより深い学習の出発点として提供されています。ただし、Linux におけるファイアウォールのいくつかの具体的なユースケースを探求する Part 10 でこのトピックを再訪します。
ファイアウォールは、国際空港のようなものであり、乗客機がほぼ24時間365日出入りしています。パスポートの有効性や出身国などの条件に基づいて、特定の国に入国または出国を許可するかどうかが決まります。
同時に、空港職員は必要に応じて、たとえば税関手続きを通過する必要があるときなど、空港のある場所から別の場所に人々に指示を出すことができます。
このチュートリアルの残りの部分で、空港のアナロジーが役立つかもしれません。進行するにつれて、以下の関係を心に留めておいてください:
- 人々 = パケット
- ファイアウォール = 空港
- 国#1 = ネットワーク#1
- 国#2 = ネットワーク#2
- 空港の規則は職員によって施行される = ファイアウォールのルール
Iptables – 基本
低レベルでは、カーネル自体が、ルールがグループ化されたチェーンまたは文に基づいてパケットに対して何をするかを「決定」します。これらのチェーンは、パッケージがそれらによって指定された基準に一致する場合に取られるべきアクションを定義します。
iptablesによって取られる最初のアクションは、パケットに対して何をするかを決定することです:
- それを受け入れる(ネットワークに通過させる)か?
- それを拒否する(ネットワークへのアクセスを防ぐ)か?
- それを転送する(別のチェーンに)か?
このツールがiptablesと呼ばれる理由が気になっていた場合のために、これらのチェーンは表に整理されており、フィルターテーブルが最もよく知られており、パケットフィルタリングを実装するために使用されるテーブルであり、その3つのデフォルトのチェーンを持っています:
1. INPUT チェーンは、ネットワークに入ってくる、ローカルプログラム向けのパケットを処理します。
2. OUTPUT チェーンは、ローカルネットワークで発信されたパケットを分析するために使用され、外部に送信されます。
3. FORWARD チェーンは、他の宛先に転送されるべきパケットを処理します(ルーターの場合など)。
これらの各チェーンには、チェーン内のルールに一致しないパケットのデフォルトポリシーがあります。各チェーンで作成されたルールとデフォルトポリシーを表示するには、次のコマンドを実行できます:
# iptables -L
利用可能なポリシーは次のとおりです:
- ACCEPT → パケットを通過させます。チェーン内のルールに一致しないパケットはネットワークに許可されます。
- DROP → パケットを静かに破棄します。チェーン内のルールに一致しないパケットはネットワークに入るのを防ぎます。
- REJECT → パケットを拒否して情報メッセージを返します。これはデフォルトポリシーとして機能しません。代わりに、パケットフィルタリングルールを補完するために使用されます。

実装するポリシーを決定する際には、上記で説明した各アプローチの利点と欠点を考慮する必要があります。ワンサイズフィットオールの解決策はないことに注意してください。
ルールの追加
ファイアウォールにルールを追加するには、次のようにiptablesコマンドを呼び出します:
# iptables -A chain_name criteria -j target
ここで、
- -A はAppend(現在のルールをチェーンの末尾に追加する)を表します。
- chain_name はINPUT、OUTPUT、またはFORWARDのいずれかです。
- ターゲットは、この場合に適用するアクションまたはポリシー(ACCEPT、REJECT、またはDROP)です。
- 基準は、パケットが検査される条件のセットです。これは、おそらく以下のフラグのうちの少なくとも1つ(おそらく複数)で構成されています。角かっこ内のオプションは、縦棒で区切られた等価です。残りはオプションのスイッチを表します:
[--protocol | -p] protocol: specifies the protocol involved in a rule. [--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated. [--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined. [--source | -s] address[/mask]: represents the source address or network/mask. [--destination | -d] address[/mask]: represents the destination address or network/mask. [--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID. [--in-interface | -i] interface: specifies the input interface of the packet. [--out-interface | -o] interface: the output interface. [--jump | -j] target: what to do when the packet matches the rule.
私たちのテスト環境
最初の2つの例には、以下のテスト環境を使用して、3つのクラシックな例をすべて結びつけましょう:
Firewall: Debian Wheezy 7.5 Hostname: dev2.gabrielcanepa.com IP Address: 192.168.0.15
Source: CentOS 7 Hostname: dev1.gabrielcanepa.com IP Address: 192.168.0.17
そして最後の例にはこれを使用します
NFSv4 server and firewall: Debian Wheezy 7.5 Hostname: debian IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 Hostname: dev2.gabrielcanepa.com IP Address: 192.168.0.15
例1:DROPとREJECTポリシーの違いを分析する
まず、ファイアウォールへの入力pingに対する
# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP

REJECT部分に進む前に、INPUTチェーンからすべてのルールをフラッシュして、この新しいルールによってパケットがテストされることを確認します:
# iptables -F INPUT # iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15

例2:dev2からdev1へのsshログインの無効化/再有効化
私たちは、アウトバウンドトラフィックを処理しているため、OUTPUTチェーンで取り扱います:
# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT

例3:NFSクライアント(192.168.0.0/24から)がNFS4共有をマウントすることを許可/防止する
NFSv4サーバー/ファイアウォールで次のコマンドを実行して、すべての種類のトラフィックのポート2049と111を閉じます:
# iptables -F # iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT # iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

さて、これらのポートを開いて何が起こるか見てみましょう。
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT # iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

ご覧の通り、トラフィックを開いた後にNFSv4共有をマウントできました。
ルールの挿入、追加、削除
前の例では、INPUTチェーンとOUTPUTチェーンにルールを追加する方法を示しました。予め定義された位置にルールを挿入したい場合は、-I(大文字のi)スイッチを使用する必要があります。
ルールは1つずつ評価され、DROPまたはACCEPTポリシーに一致すると評価が停止(またはジャンプ)することを覚えておいてください。そのため、必要に応じてチェーンリスト内のルールを上または下に移動する必要がある場合があります。
これを示すために簡単な例を使用します。

次のルールを、
# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
INPUTチェーンの位置2に配置します(その結果、以前の#2が#3になります)。

上記の設定を使用すると、トラフィックがポート80に向かっているかどうかが確認され、次にポート2049が確認されます。
また、ルールを削除し、残りのルールのターゲットをREJECT(-Rスイッチを使用)に変更することもできます。
# iptables -D INPUT 1 # iptables -nL -v --line-numbers # iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT # iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

最後に、ファイアウォールルールが持続的であるためには、ファイルに保存し、ブート時に自動的に復元する必要があることを覚えておいてください(お好みの方法またはディストリビューションで利用可能な方法を使用してください)。
ファイアウォールルールの保存:
# iptables-save > /etc/iptables/rules.v4 [On Ubuntu] # iptables-save > /etc/sysconfig/iptables [On CentOS / OpenSUSE]
ルールの復元:
# iptables-restore < /etc/iptables/rules.v4 [On Ubuntu] # iptables-restore < /etc/sysconfig/iptables [On CentOS / OpenSUSE]
ここでは、上記のようにデフォルトのファイルの代わりにダミーファイルiptables.dumpを使用して、手動でファイアウォールルールを保存および復元する同様の手順を示しています。
# iptables-save > iptables.dump

これらの変更をブート間で持続的にするには:
Ubuntu: iptables-persistentパッケージをインストールし、/etc/iptables/rules.v4ファイルに保存されたルールをロードします。
# apt-get install iptables-persistent
CentOS: 次の2行を/etc/sysconfig/iptables-configファイルに追加します。
IPTABLES_SAVE_ON_STOP="yes" IPTABLES_SAVE_ON_RESTART="yes"
OpenSUSE: 許可されたポート、プロトコル、アドレスなど(カンマで区切られる)を/etc/sysconfig/SuSEfirewall2にリストします。
詳細については、ファイル自体を参照し、コメントが多く付いています。
結論
本記事で提供された例はiptablesのすべての機能を網羅していませんが、トラフィックの入出力を有効または無効にする方法を示す目的で使用されています。
ファイアウォールのファンの方々へ、このトピックについての具体的な応用については、このLFCEシリーズのPart 10で改めて取り上げます。
ご質問やコメントがあれば、お知らせください。
Source:
https://www.tecmint.com/configure-iptables-firewall/