パケットフィルタリングとは簡単に言えば「データの通信を許可するか遮断するかを決める機能のこと」です。
パケットフィルタリングは必要最低限な通信のみを許可することで外部からのデータに紛れてコンピュータウイルス等が侵入してくるのを防ぎます。
この記事ではLinuxにおけるパケットフィルタリング機能としてiptablesとfirewalldについて紹介します。
パケットフィルタリングとは?
パソコンはインターネットを通して外部とデータのやり取りをしています。
このデータのやり取りを制限する仕組みをパケットフィルタリング(ファイアウォール)といいます。
外部からの通信を何でも通してしまうと、データにまぎれてウイルスが侵入してくる恐れなどがあるからです。こうした不正アクセスを防ぐ仕組みとしてパケットフィルタリングがあります。
インターネットからの通信を監視・制限するといっても監視する経路は複数あります。
- インターネットからルーター
- ルーターからNIC
- NICからアプリケーション
の経路があります。
ここでいうパケットフィルタリングはNICにおけるフィルタリングを指します。
具体的には、ルーターからPCのNICを通って来たapache(80番ポート)宛てのパケット通信を通すか通さないか、あるいはapacheから外部への通信を通すか通さないか?というのをOSで制御するのがパケットフィルタリングです。
Netfilterの設定を行うのがiptablesやfirewalld
LinuxにはNetfilterというパケットフィルタリングやNATを行うモジュールがあります。
このNetfilterを使ったパケットフィルタリングの設定を行う部分が「iptables」や「firewalld」です。
パケットフィルタリングは
- プロトコル (TCPやUDP、ICMP等)
- 送信元、送信先IPアドレス
- 送信元、送信先のポート番号
を使って条件を設定し、パケットのフィルタリングをします。
iptablesでは上記の情報を指定して条件を作りフィルタリングします。firewalldはiptablesよりも簡易的に設定ができるように「ゾーン」という設定のテンプレートが用意してあります。
簡単な設定で十分な場合はfirewalldを選択
より細かく設定したい場合はiptablesを選択します。
iptablesの設定
チェインとは?
チェインとはパケットが移動する経路のことです。
iptablesではチェインごとにルールを設定します。
ルーターなどから自分のPCに入ってきたデータはNIC(LANアダプタや無線子機)を通して入ってきます。これらのデータはパケットにかかれた宛先のIPアドレス/ポートに送られていくことになります(ルーティング)。
重要なチェインは
- NICからルーティングを通してアプリ(プロセス)に向かう経路のINPUT
- アプリから外の経路に向かうOUTPUT
- 別のコンピュータに転送するFORWARD
の3つです。特に、INPUTとOUTPUTが重要です。
パケットの処理 ターゲット
流れているパケットをどう扱うのか?を表しているのが「ターゲット」です。ターゲットには
- ACCEPT
- DROP
- REJECT
- REDIRECT
- RETURN
- SNAT
- DNAT
- MADQUERADE
- LOG
などがあります。
たくさんありますが、とりあえず知っておくべきものは
- ACCEPT パケットの通過を許可
- DROP パケットを廃棄
- REJECT パケットを廃棄し、エラーを知らせる。
です。
DROPとREJECTの違いはパケットを廃棄したことを通知するかどうか?です。
セキリュティの観点からいえば、DROPにするのが推奨されるようです。なぜなら攻撃者からすればエラー通知をしてくれたほうがテストが早く終わるからです。
一方で、通常の業務を行う上ではエラー通知をしてくれたほうが状況がすぐわかるので時間の節約になります。
パケットフィルタリングの設定
iptablesを操作してパケットフィルタリングの設定をやってみましょう。
設定には大きく分けて2つの設定があります。
- 大きい範囲・チェイン別の設定
- 細かい設定 (IPアドレスやポート番号、プロトコル指定)
チェイン別の設定 デフォルトポリシー
iptablesで特に設定しない場合は各チェインの「デフォルトポリシー」に従います。
- INPUT DROP
- OUTPUT ACCEPT
- FORWARD DROP
となっています。設定の方針としては「中に入れるパケットは基本的には遮断して、必要なら許可してください」ということです。
細かい設定 (IPアドレス、ポート、プロトコル)
チェイン別の設定よりも細かく設定したい場合は、IPアドレスやポート番号、プロトコルを指定して個別に設定できます。
- プロトコル (TCPやUDP、ICMP等)
- 送信元、送信先IPアドレス
- 送信元、送信先のポート番号
各設定は、チェイン別に記載されます。
- Chain INPUT (polisy DROP)
- 詳細設定
- Chain FORWARD (polisy ACCEPT)
- 詳細設定
- etc
ターゲット | プロトコル | オプション | 送信元 | 送信先 | ポート |
ターゲット(ex.ACCEPT) | TCP、all | パケットに対する処理オプション | 送信元IPアドレス,(anywhereも) | 送信先IPアドレス(anywhereも) | dpt, spt |
設定されたものを見るにはiptables -Lのコマンドで調べることができます。
iptables実際の操作
iptablesはCentOS7ではもともと入っていると思います。もしも入っていない場合はyumでインストールしましょう。
「yum install iptables」
また、iptablesを利用する時はfirewalldと共存できないので、firewalldを停止させましょう。
「systemctl disabled firewalld 」
「systemctl stop firewalld」
iptablesの起動はsystemctlで行います。
systemctl start iptables
systemctl enable iptables
iptablesの設定状態の確認
iptablesの設定確認はiptebles -Lで行います。
iptables -L
設定項目はチェイン別に表示されます。
- Chain INPUT (polisy ACCEPT)
- 詳細設定
- Chain FORWARD (polisy ACCEPT)
INPUTチェインの設定はポリシーがDROPになっています。設定されていない部分はDROPになります。
詳細の設定は6つのカラムに分かれて表示されます。
- ターゲット ターゲットはACCEPTやDROPなどのパケット処理を表示ます。
- プロトコル TCPやUDPなどを設定します。記載のない場合「all」になります。
- オプション パケットに対する処理のオプション
- 送信元 送信元のIPアドレス。設定しない場合はanywhereになる
- 送信先 送信先のIPアドレス。設定しない場合はanywhereになる
- ポート 送信元ポート(spt : “source-port”), 宛先ポート (dpt : “destination-port”)はtcp dpt:httpなどのように表記されます
ルールの設定
ルールを実際に設定する方法を解説します。
チェインのデフォルトポリシーを変更するコマンドは
iptables -P (チェイン) (ターゲット) 例:iptables -p INPUT ACCEPT
iptables -A チェイン (オプション)
例:iptables -A INPUT -p tcp -s test.jp -d 127.0.0.1 –dport 22 –sport 80 -j ACCEPT
各オプションが指定している項目は
- -p プロトコル
- -s 送信元アドレス
- -d 宛先アドレス
- -dport 宛先ポート
- -sport 送信元ポート
- -j ターゲット
です。
その他のiptablesのオプションは
iptables -Dチェイン (オプション) 項目の削除
例:iptables -D INPUT -p tcp -s test.jp -d 127.0.0.1 --dport 22 --sport 80 -j ACCEPT
iptables -D INPUT 2
-Lで表示されたINPUTの2番目の設定項目をして消去
iptablesの一括消去
iptables -F
各ルールの先頭に追加する (-Aは最後)
iptables -I
設定の保存
iptablesで設定した項目は/etc/sysconfig/iptablesで保存しなければ消えてしまいます。
iptables-save > /etc/sysconfig/iptables
として書き込んでおきましょう。
firewalldの設定
firewalldはゾーンと呼ばれる設定を選択してフィルタリング設定を行います。
ゾーンには
- drop INPUTはすべてdrop
- block INPUTは基本REJECT
- public ssh、dhcpv6-client許可
- external ssh, マスカレードが有効
- dmz dmz用 ssh許可
- work ssh, dhcpv6-client, ipp-client有効
- home ssh, dhcpv6-client, ipp-client, samba, mdns有効
- internal ssh, dhcpv6-client, ipp-client, samba, mdns有効
- trusted すべて許可
が用意されていおり、基本的に下に行くにつれてフィルタリングが甘いです。
dropはすべての外部からの通信を遮断する設定、trustedはすべてを許可する設定です。
firewall-cmd --zone=trusted --permanent
状態を確認するコマンドは
firewall-cmd --list-all-zones
で確認できます。「firewall-cmd –get-default-zone」でデフォルトゾーンの確認もできます。
firewalldとiptablesは一方のみを使います。必要に応じて使いわけましょう。