ウェブサイト検索

IPTABLES VS ファイアウォール


今日は、iptables と firewalld について説明し、これら 2 つの歴史とインストール、および Linux ディストリビューション向けにこれらを構成する方法について学びます。

これ以上時間を無駄にすることなく始めましょう。

まず、iptables とは何かを知る必要があります。上級 IT プロフェッショナルのほとんどはこのことを知っており、かつてはそれを使用していました。 iptables は、Linux カーネル ファイアウォールとチェーンによって提供されるセキュリティまたはファイアウォール セキュリティ テーブルをユーザーが構成できるようにするアプリケーション/プログラムであり、ユーザーはセキュリティ要件を満たすためにそれに応じてファイアウォール ルールを追加/削除できます。 iptables は、ユーザーが最大限に活用できるように、さまざまなカーネル モジュールとさまざまなプロトコルを使用します。たとえば、tcp と udp の両方について、iptables は IPv4 (IP バージョン 4/32 ビット) に使用され、ip6tables は IPv6 (IP バージョン 6/64 ビット) に使用されます。通常、iptables ルールはシステム管理者、システム アナリスト、または IT マネージャーによって構成されます。各 iptables ルールを実行するには、root 権限が必要です。 Linux カーネルは Netfilter フレームワークを使用して、iptables を使用して実行できるさまざまなネットワーク関連の操作を提供します。以前は、ipchains はほとんどの Linux ディストリビューションで同じ目的で使用されていました。すべての iptables ルールは Linux カーネル自体によって直接処理され、これはカーネル義務として知られています。サーバーのファイアウォール セキュリティの構成に使用している GUI ツールやその他のセキュリティ ツールが何であれ、最終的には iptables ルールに変換され、操作を実行するためにカーネルに提供されます。

iptables の台頭は netfilter から始まります。 Paul Rusty Russell は最初の著者であり、netfilter/iptables の背後にあるシンクタンクのトップでした。その後、他の多くの技術者が加わり、Netfilter コア チームを形成して構築し、他の多くのオープンソース プロジェクトと同様に共同作業として netfilter/iptables プロジェクトを開発および維持しました。 2007 年までは Harald Welte が前リーダーで、その後 2013 年までは Patrick McHardy がリーダーでした。現在、netfilter コア チームの責任者は Pablo Neira Ayuso です。

netfilter について詳しくは、このリンクを参照してください。 netfilter の歴史について詳しく知りたい場合は、このリンクを参照してください。

iptables の歴史の詳細については、このリンクを参照してください。

現在では、すべての Linux カーネルに iptables が付属しており、すべての有名な最新 Linux ディストリビューションにプレビルドまたはプレインストールされています。ほとんどの Linux システムでは、iptables はこの /usr/sbin/iptables ディレクトリにインストールされます。 /sbin/iptables にもありますが、iptables は「必須バイナリ」というよりはサービスに近いため、推奨される場所は /usr/sbin ディレクトリのままです。

Ubuntu または Debian の場合

sudo apt-get install iptables

CentOSの場合

sudo yum install iptables-services

RHELの場合

sudo yum install iptables

iptables のバージョンを確認するには、ターミナルで次のコマンドを入力します。

sudo iptables --version

OpenSUSE 42.1 の場合、次のように入力して停止します。

sudo /sbin/rcSuSEfirewall2 stop

もう一度始めるには

sudo /sbin/rcSuSEfirewall2 start

Ubuntu の場合は、次のように入力して停止します。

sudo service ufw stop

もう一度始めるには

sudo service ufw start

Debian と RHEL の場合は、次のように入力して停止します。

sudo /etc/init.d/iptables stop

もう一度始めるには

sudo /etc/init.d/iptables start

CentOS の場合は、次のように入力して停止します。

sudo service iptables stop

もう一度始めるには

sudo service iptables start

iprables に現在存在しアクティブなすべてのルールを確認するには、ターミナルを開いて次のように入力します。

sudo iptables -L

iptables にルールが存在しない場合は、iptables ファイアウォールにこれまでにルールが追加されていない場合に、以下の画像のようなものが表示されることを意味します。

この上の図では、3 つのチェーンがあり、それらは INPUT、FORWARD、OUTPUT であり、ルールは存在しないことがわかります。実はまだ追加してないんです。

iptables ファイアウォールのチェーンのステータスを確認するには、次のように入力します。

sudo iptables -S

上記のコマンドを使用すると、チェーンが受け入れているかどうかを知ることができます。

すべての iptables ルールをクリアします

iptables ファイアウォールからすべてのルールをクリアするには、次のように入力してください。これは通常、iptables ルールのフラッシュとして知られています。

sudo iptables -F

INPUT チェーンのみをフラッシュする場合、または個別のチェーンをフラッシュする場合は、要件に応じて以下のコマンドを発行します。

sudo iptables -F INPUT
sudo iptables -F OUTPUT
sudo iptables -F FORWARD

ACCEPT または DROP チェーン

特定のチェーンを受け入れるか削除するには、要件を満たすために端末で次のコマンドのいずれかを発行します。

iptables --policy INPUT DROP

上記のルールは、そのサーバーに受信されるものは何も受け入れません。再度 ACCEPT に戻すには、次の手順を実行します。

iptables --policy INPUT ACCEPT

他のチェーンでも同様です

iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

注: デフォルトでは、 iptables のすべてのチェーン ( INPUT、OUTPUT、FORWARD ) は ACCEPT モードになっています。これは、ポリシー チェーンのデフォルト動作と呼ばれます。

任意のポートを許可する

ホスト上で Web サーバーを実行している場合は、サーバーがポート 80 をリッスンまたは応答できるように、iptables ファイアウォールを許可する必要があります。デフォルトでは、Web サーバーはポート 80 で実行されます。それでは、これを実行しましょう。

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

上の行で、A は追加を表し、iptables リストに新しいルールを追加することを意味します。 INPUT は INPUT チェーンを表します。 P はプロトコルを表し、dport は宛先ポートを表します。デフォルトでは、Web サーバーはポート 80 で実行されます。同様に、SSH ポートも許可できます。

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

デフォルトでは、SSH はポート 22 で実行されます。ただし、ポート 22 で SSH を実行しないことをお勧めします。常に別のポートで SSH を実行します。別のポートで SSH を実行するには、好みのエディターで /etc/ssh/sshd_config ファイルを開き、ポート 22 を別のポートに変更します。

ポート 135 をブロックしたいとします。これは次のように実行できます。

sudo iptables -A INPUT -p tcp --dport 135 -j DROP

サーバーから別のホスト/サーバーへの SSH 接続を開始するためにサーバーをブロックしたい場合は、次のコマンドを発行します。

sudo iptables -A OUTPUT -p tcp --dport 22 -j DROP

こうすることで、誰もあなたのサーバーを使用してサーバーから SSH 接続を開始できなくなります。 OUPUT チェーンは、別のホストへの送信 TCP 接続をフィルタリングして削除します。

ポート付きの特定の IP を許可する

sudo iptables -A INPUT -p tcp -s 0/0 --dport 22  -j ACCEPT

ここで、-s 0/0 は、任意の IP アドレスを持つ任意の受信ソースを表します。したがって、宛先ポートが 22 である TCP パケットにサーバーが応答するはずはありません。特定の IP のみを許可したい場合は、次の IP を使用してください。

sudo iptables -A INPUT -p tcp -s 12.12.12.12/32 --dport 22  -j ACCEPT

上の例では、12.12.12.12 IP アドレスのみがポート SSH に接続できるようにしています。残りの IP アドレスはポート 22 に接続できません。同様に、CIDR 値を使用して許可できます。のような

sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22  -j ACCEPT

上の例は、IP ブロック全体がポート 22 での接続を受け入れることを許可する方法を示しています。これは、12.12.12.1 から 12.12.12.255 までの IP を受け入れます。

このような IP アドレス範囲をブロックしたい場合は、次のように ACCEPT を DROP に置き換えて逆の操作を行います。

sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22  -j DROP

したがって、12.12.12.1 から 12.12.12.255 の IP アドレスからポート 22 に接続することはできません。

ICMP のブロック

サーバー上で送受信される ICMP (ping) リクエストをブロックしたい場合は、次のことを試してください。最初のオプションは、ICMP ping エコー要求を別のホストに送信しないようにブロックします。

sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP

次に、google.com に ping を実行してみます。 OpenSUSE サーバーは google.com に ping できなくなります。

サーバーへの受信 ICMP (ping) エコー要求をブロックしたい場合は、端末で次のように入力するだけです。

sudo iptables -I INPUT -p icmp --icmp-type 8 -j DROP

現在、ICMP ping エコー要求には応答しません。たとえば、サーバーの IP アドレスが 13.13.13.13 だとします。そして、サーバーのその IP に ping を実行すると、サーバーがその ping 要求に応答していないことがわかります。

MySql/MariaDB ポートのブロック

Mysql はデータベースを保持しているため、データベースを外部接続から保護する必要があります。信頼できるアプリケーション サーバーの IP アドレスのみが MySQL サーバーに接続できるようにします。他をブロックするには

sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

したがって、192.168.1.0/24 IP ブロック以外の MySql 接続は使用されません。デフォルトでは、MySql は 3306 ポートで実行されます。

SMTP のブロック

ホスト サーバー上でメール サーバーを実行していない場合、またはサーバーがメール サーバーのように動作するように構成されていない場合は、サーバーがドメインにスパムやメールを送信しないように SMTP をブロックする必要があります。サーバーからの送信メールをブロックするには、これを行う必要があります。そうするために、

sudo iptables -A OUTPUT -p tcp --dport 25 -j DROP

DDoS をブロックする

DDoS という用語は誰もがよく知っています。これを取り除くには、ターミナルで次のコマンドを実行します。

iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT

要件を満たすように数値を構成する必要があります。これはあくまで維持すべき基準です。

さらに保護できるのは、

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/lo/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling 
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog

ポートスキャンのブロック

サーバーの開いているポートをスキャンし、サーバーのセキュリティを破壊しようとする人が何百人もいます。それをブロックするには

sudo iptables -N block-scan
sudo iptables -A block-scan -p tcp —tcp-flags SYN,ACK,FIN,RST RST -m limit —limit 1/s -j RETURN
sudo iptables -A block-scan -j DROP

ここで、block-scan は新しいチェーンの名前です。

不正なポートのブロック

サーバーの一部の不良ポートもブロックする必要がある場合があります。これを行う方法は次のとおりです。

badport="135,136,137,138,139,445"
sudo iptables -A INPUT -p tcp -m multiport --dport $badport -j DROP
sudo iptables -A INPUT -p udp -m multiport --dport $badport -j DROP

ニーズに応じてポートを追加できます。

Firewalld は、ネットワーク接続またはインターフェイスの信頼レベルを定義するネットワーク/ファイアウォール ゾーンをサポートする、動的に管理されるファイアウォールを提供します。 IPv4、IPv6 ファイアウォール設定、イーサネット ブリッジ、および IP セットをサポートしています。実行時設定オプションと永続的な設定オプションは分離されています。また、サービスまたはアプリケーションがファイアウォール ルールを直接追加するためのインターフェイスも提供します。

system-config-firewall/lokkit を使用した以前のファイアウォール モデルは静的であり、変更を加えるたびにファイアウォールを完全に再起動する必要がありました。これには、ファイアウォール netfilter カーネル モジュールをアンロードし、新しい構成に必要なモジュールをロードすることも含まれます。モジュールのアンロードによりステートフル ファイアウォールが破壊され、接続が確立されました。一方、ファイアウォール デーモンはファイアウォールを動的に管理し、ファイアウォール全体を再起動せずに変更を適用します。したがって、すべてのファイアウォール カーネル モジュールをリロードする必要はありません。ただし、ファイアウォール デーモンを使用する場合は、デーモンの状態とカーネルのファイアウォールの状態が同期していることを確認するために、すべてのファイアウォールの変更をそのデーモンで行う必要があります。ファイアウォール デーモンは、iptables および ebtables コマンド ライン ツールによって追加されたファイアウォール ルールを解析できません。このデーモンは、D-BUS 経由で現在アクティブなファイアウォール設定に関する情報を提供し、PolicyKit 認証方法を使用して D-BUS 経由で変更を受け入れます。

そのため、firewalld はチェーンやルールの代わりにゾーンとサービスを使用して操作を実行し、既存のセッションや接続を中断することなく更新や変更を動的に許可するルールを管理できます。

以下のような特徴があります。

  • D-バス API。
  • 時間制限のあるファイアウォール ルール。
  • 特定のファイアウォール ルールの豊富な言語。
  • IPv4 および IPv6 NAT のサポート。
  • ファイアウォールゾーン。
  • IP セットのサポート。
  • 拒否されたパケットの単純なログ。
  • ダイレクトインターフェース。
  • ロックダウン: ファイアウォールを変更する可能性のあるアプリケーションのホワイトリスト。
  • iptables、ip6tables、ebtables、および ipset ファイアウォール バックエンドのサポート。
  • Linux カーネル モジュールの自動ロード。
  • パペットとの統合。

firewalld について詳しくは、このリンクを参照してください。

firewalld をインストールする前に、必ず iptables を停止し、iptables が使用されていない、または動作していないことを確認してください。そうするために、

sudo systemctl stop iptables

これにより、システムから iptables が停止します。

次に、ターミナルで以下のコマンドを発行して、iptables がシステムで使用されていないことを確認します。

sudo systemctl mask iptables

次に、iptables のステータスを確認します。

sudo systemctl status iptables

これで、firewalld をシステムにインストールする準備が整いました。

Ubuntu の場合

Ubuntu にインストールするには、まず UFW を削除する必要があります。その後、Firewalld をインストールできます。 UFW を削除するには、ターミナルで次のコマンドを実行します。

sudo apt-get remove ufw

UFWを削除した後、ターミナルで以下のコマンドを実行します。

sudo apt-get install firewall-applet

または

Ubuntu ソフトウェア センターを開き、「firewall-applet」を探して検索し、Ubuntu システムにインストールします。

RHEL、CentOS、Fedora の場合

以下のコマンドを入力して、CentOS システムに firewalld をインストールします。

sudo yum install firewalld firewall-config -y

firewalld を構成する前に、インストール後の firewalld のステータスを把握する必要があります。それを知るには、次のように入力します。

sudo systemctl status firewalld

firewalld はゾーンベースで動作するため、まだ設定を行っていませんが、すべてのゾーンとサービスを確認する必要があります。

ゾーンの場合

sudo firewall-cmd --get-active-zones

または

sudo firewall-cmd --get-zones

デフォルトのゾーンを知るには、以下のコマンドを実行します。

sudo firewall-cmd --get-default-zone

そしてサービスのため

sudo firewall-cmd --get-services

ここでは、firewalld でカバーされているサービスを確認できます。

重要な点は、変更を反映するために、変更するたびに firewalld をリロードする必要があることです。

デフォルトゾーンを設定するには

sudo firewall-cmd --set-default-zone=internal

または

sudo firewall-cmd --set-default-zone=public

ゾーンを変更したら、ゾーンが変わるかどうかを確認します。

sudo firewall-cmd --get-default-zone
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp

これにより、firewalld のパブリック ゾーンに TCP ポート 80 が追加されます。 80 を自分のポートに置き換えることで、希望のポートを追加することもできます。

次に、ファイアウォールをリロードします。

sudo firewall-cmd --reload

次に、ステータスを確認して、tcp 80 ポートが追加されているかどうかを確認します。

sudo firewall-cmd --zone=public --list-ports

ここでは、TCP ポート 80 が追加されていることがわかります。

あるいは、このようなことを試してみることもできます。

sudo firewall-cmd --zone=public --list-all

Tcp 80 ポートをパブリック ゾーンから削除するには、次のように入力します。

sudo firewall-cmd --zone=public --remove-port=80/tcp

端末に「成功」というテキストがエコーされるのが見えます。

80 を独自のポートに置き換えることで、希望のポートを指定することもできます。

firewalld に FTP サービスを追加するには、次のコマンドを実行します。

sudo firewall-cmd --zone=public --add-service=ftp

端末に「成功」というテキストがエコーされるのが見えます。

smtp サービスを追加する場合も同様に、以下のコマンドを実行します。

sudo firewall-cmd --zone=public --add-service=smtp

ftp と smtp を、ファイアウォールに追加する独自のサービスに置き換えます。

firewalld から ftp および smtp サービスを削除するには、ターミナルで次のコマンドを実行します。

sudo firewall-cmd --zone=public --remove-service=ftp
sudo firewall-cmd --zone=public --remove-service=smtp

必要に応じて、firewalld を使用して受信または送信のパケットや接続をブロックできます。これは、firewalld の「パニックオン」として知られています。これを行うには、以下のコマンドを発行します。

sudo firewall-cmd --panic-on

端末に「成功」というテキストがエコーされるのが見えます。

これを実行すると、ホストに ping を送信したり、Web サイトを閲覧したりすることさえできなくなります。

これをオフにするには、ターミナルで次のコマンドを発行します。

sudo firewall-cmd --panic-off
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.4" accept'

これにより、firewalld は送信元 IP 192.168.1.4 からの IP v4 パケットを受け入れるようになります。

同様に、任意の IP アドレスをブロックするには

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.4" reject'

これにより、firewalld は送信元 IP 192.168.1.4 からのすべての IP v4 パケットをドロップまたは破棄します。

ここでは、Firewalld の動作方法と iptables との違いを簡単に理解できるように、Firewalld の非常に基本的な内容にこだわりました。

それが今日のすべてです。この記事を楽しんで読んでいただければ幸いです。

気をつけて。