ウェブサイト検索

Linuxでサービスへのリモートアクセスを有効にするためのIptablesファイアウォールの設定方法 - パート8


Linuxファウンデーション認定プログラムの紹介

第1部 - Iptablesに関して、私たちがこのLFCE(Linux Foundation Certified Engineer)シリーズの中でファイアウォールについて基本的な説明をしたことを思い出すでしょう。それはネットワークに入ってくるパケットと出ていくパケットを管理するメカニズムです。「管理する」ということは実際には次の意味を持つのです:

  1. 特定のパケットが私たちのネットワークに入るか出るかを許可または防ぐために。
  2. ネットワークのあるポイントから別のポイントに他のパケットを転送するため。

あらかじめ定められた基準に基づいて。

この記事では、基本的なパケットフィルタリングの実装方法と、ファイアウォールを設定する方法について説明します。iptablesは、ファイアウォール用のネイティブカーネルモジュールであるnetfilterのフロントエンドです。

ファイアウォーリングは広範なテーマであり、この記事はそれについて知っておくべきすべてを理解するための包括的なガイドを意図したものではなく、このトピックをより深く学ぶための出発点としてのものです。しかし、特定のユースケースをいくつか探る際に、このシリーズの第10部で再びこのテーマについて触れる予定です。

ファイアウォールを24時間営業の国際空港と考えることができます。個人のパスポートの有効性や出身国などのいくつかの条件に基づいて、その人物が特定の国に入国または出国できるかどうかが決まります。

同時に、空港の職員は、必要に応じて人々に空港の一地点から別の地点に移動するよう指示することができます。例えば、税関サービスを通過する必要がある場合などです。

このチュートリアルの残りの部分で空港のアナロジーが役立つかもしれません。進めるにあたり、以下の関係を念頭に置いてください:

  1. 人はパケットです
  2. ファイアウォール=空港
  3. 国#1=ネットワーク#1
  4. 国#2=ネットワーク#2
  5. 空港の規制は警官によって施行される=ファイアウォールルール

Iptables - 基礎

低レベルでは、カーネル自体が決定します。パケットの処理方法は、チェーンや文にグループ化されたルールに基づいています。これらのチェーンは、パッケージが彼らによって指定された基準に一致した時にどのようなアクションを取るべきかを定義しています。

iptablesによって取られる最初のアクションは、パケットに対して何をするかを決定することです。

  1. それを受け入れますか?(私たちのネットワークに通過させますか?)
  2. それを拒否しますか(私たちのネットワークへのアクセスを防ぎますか)?
  3. 別のチェーンに転送しますか?

このツールがiptablesと呼ばれる理由が気になる場合に備えて説明しますが、これはこれらのチェーンがテーブルに整理されているためであり、最もよく知られているフィルターテーブルは、パケットフィルタリングを実装するために使用されるもので、そのデフォルトの3つのチェーンがあります:

1. 入力チェーンは、ネットワークに入ってくるパケットを処理し、それらはローカルプログラムに送られます。

2. OUTPUTチェーンは、ローカルネットワークから発信されたパケットを分析し、外部に送信されるものを対象としています。

3. FORWARDチェーンは、別の宛先に転送されるべきパケットを処理します(ルーターの場合など)。

これらのチェーンごとにデフォルトポリシーがあり、これはパケットがチェーン内のルールに一致しない場合にデフォルトで何をすべきかを決定します。各チェーンに対して作成されたルールとデフォルトポリシーは、次のコマンドを実行することで確認できます:

# iptables -L

利用可能なポリシーは以下の通りです:

  1. 受け入れ → パケットを通過させます。チェーン内のルールに一致しないパケットは、ネットワークへの進入が許可されます。
  2. ドロップ → パケットを静かに破棄します。チェーン内のいずれのルールにも一致しないパケットは、ネットワークに入ることを防止されます。
  3. 拒否 → パケットを拒否し、情報メッセージを返します。この特定のものはデフォルトポリシーとして機能しません。代わりに、パケットフィルタリングルールを補完することを目的としています。

どの方針を実施するかを決定する際には、上記で説明した各アプローチの利点と欠点を考慮する必要があります。全てに適した単一の解決策は存在しないことに注意してください。

ルールを追加する

ファイアウォールにルールを追加するには、iptablesコマンドを次のように実行します:

# iptables -A chain_name criteria -j target

どこで、

  1. -A は追加を意味します(現在のルールをチェーンの最後に追加します)。
  2. chain_name は INPUT、OUTPUT、または FORWARD のいずれかです。
  3. ターゲットは、この場合に適用するアクションまたはポリシーです(受け入れる、拒否する、またはドロップする)。
  4. criteria は、パケットが検査される条件のセットです。これは、次のフラグのうち少なくとも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用のDROPポリシーを定義します。つまり、icmpパケットは静かにドロップされます。

# 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)スイッチを使用する必要があります。

ルールは一つずつ評価され、DROPまたはACCEPTポリシーが一致すると評価が停止(またはスキップ)されることを覚えておく必要があります。そのため、必要に応じてルールをチェーンリストの上下に移動させる必要が生じることがあります。

これを示すために簡単な例を使います:

次のルールを設定しましょう、

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

入力チェーンの位置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: /etc/sysconfig/iptables-config ファイルに次の 2 行を追加します。

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: 許可されたポート、プロトコル、アドレスなどを/etc/sysconfig/SuSEfirewall2にカンマで区切ってリストします。

詳細については、コメントが豊富に記載されたファイル自体を参照してください。

結論

この記事で提供されている例は、iptablesのすべての機能を網羅しているわけではありませんが、入出力トラフィックを有効または無効にする方法を示す目的を果たします。

ファイアウォールファンの皆様にお知らせしますが、このトピックはLFCEシリーズのパート10で、さらに具体的なアプリケーションと共に再訪しますので、ご期待ください。

質問やコメントがあれば、お気軽に知らせてください。

関連記事: