GNU/Linux >> Linux の 問題 >  >> Linux

Linuxネットワークをfirewall-cmdで保護します

ファイアウォールはネットワークセキュリティの重要な部分であるため、システム管理者がファイアウォールの動作に精通していることが重要です。ファイアウォールを理解している場合は、許可するトラフィックをインテリジェントに選択することで、ネットワークを安全に保つことができます。

「ファイアウォール」は非常にエキサイティングな名前であるため、ネットワークの郊外で複雑なトロンスタイルのネオンバトルが発生し、ユーザーのテクノ要塞を保護するために不正なデータのパケットが送信されることを想像することがよくあります。実際には、ファイアウォールは、着信および発信ネットワークトラフィックを制御するソフトウェアの一部にすぎません。

ポート

ファイアウォールは、ネットワークポートを監視することにより、このトラフィックを管理できます。ファイアウォールの世界では、ポートという用語 USB、VGA、HDMIポートなどの物理的な接続を指すものではありません。ファイアウォールの目的で、ポート は、特定のタイプのデータの経路を表すためにオペレーティングシステムによって作成された人工的な構造です。このシステムは、「連絡先」、「接続」、「ペンギン」など、何とでも呼ばれる可能性がありますが、作成者は「ポート」を使用していました。これは、現在でも使用されている名前です。重要なのは、どのポートにも特別なことは何もないということです。これらは、データ転送が発生するアドレスを指定するための単なる方法です。

よく知られているポートはたくさんありますが、これらも慣例にすぎません。たとえば、HTTPトラフィックはポート80で発生し、HTTPSトラフィックはポート443を使用し、FTPはポート21を使用し、SSHはポート22を使用します。コンピューターが別のコンピューターにデータを送信すると、データにプレフィックスが追加され、アクセスしたいポート。受信側のポートが、送信しているデータと同じプロトコルのデータを受け入れている場合、データは正常に交換されます。

このプロセスの動作は、任意のWebサイトにアクセスして確認できます。ウェブブラウザを開き、example.com:80に移動します 、これにより、コンピューターはexample.comWebサイトにサービスを提供しているコンピューターのポート80にHTTP要求を送信します。見返りにウェブページを受け取ります。ただし、HTTPトラフィックはポート80または443にアクセスすることが想定されているため、WebブラウザではURLに移動するたびにアクセスするポートを入力する必要はありません。

このプロセスは、ターミナルベースのWebブラウザを使用してテストできます。

$ curl --connect-timeout 3 "http://example.com:80" | head -n4
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

同じ表記法を使用して、非標準のポートを使用してWebサイトに移動することにより、強制的に拒否することができます。任意のポートexample.com:79に移動します 例えば。ウェブページのリクエストは拒否されました:

$ curl --connect-timeout 3 "http://example.com:79"
curl: (7) Failed to connect: Network is unreachable

ポートとプロトコルの相関関係は、標準グループとユーザーベースによって相互に合意された規則にすぎません。これらの設定は、個々のコンピューターで変更できます。実際、コンピューティングのパイオニア時代には、人気のあるサービスのポート番号を変更するだけで攻撃が軽減されると多くの人が感じていました。今日、攻撃ははるかに洗練されています。サービスがリッスンするポートを変更することで自動ポートスキャナーを驚かせても、ほとんど価値がありません。

代わりに、ファイアウォールが特定のポートで許可されるアクティビティを管理します。

[無料ダウンロード:高度なLinuxコマンドのチートシート。 ]

ファイアウォール-cmdインターフェース

インフラストラクチャには、ファイアウォールを実行することのみを目的としたサーバーがラックにある場合や、インターネットへのプライマリゲートウェイとして機能するファイアウォールがルーター(またはモデム)に組み込まれている場合があります。おそらく、個人のワークステーションまたはラップトップでファイアウォールが実行されていることもあります。これらのファイアウォールにはすべて、独自の構成インターフェースがあります。この記事では、firewall-cmdについて説明します。 ほとんどのLinuxディストリビューションにあるterminalコマンド。

Firewall-cmdは、firewalldを管理するためのフロントエンドツールです。 Linuxカーネルのnetfilterフレームワークとインターフェースするデーモン。このスタックは、中小規模の企業で一般的な組み込みモデムにはおそらく存在しませんが、systemdを使用するすべてのLinuxディストリビューションで使用可能です。 。

アクティブなファイアウォールがない場合、firewall-cmd 制御するものがないため、最初のステップはfirewalldを確認することです。 実行中:

$ sudo systemctl enable --now firewalld

このコマンドはファイアウォールデーモンを起動し、再起動時に自動ロードするように設定します。

(ほぼ)すべてをブロックする

ファイアウォールを構成する際の一般的なアドバイスは、最初にすべてをブロックしてから、実際に必要であることがわかっているポートを開くことです。つまり、必要なものを知っている必要があり、それを理解することが午後の仕事である場合もあります。

たとえば、組織が独自のDNSまたはDNSキャッシングサービスを実行している場合は、DNS通信を処理するポート(通常は53)のブロックを解除することを忘れないでください。 SSHを使用してサーバーをリモートで構成する場合は、そのポートをブロックしないでください。インフラストラクチャで実行されているすべてのサービスを考慮する必要があり、そのサービスが内部のみであるのか、それとも外部と対話する必要があるのか​​を理解する必要があります。

プロプライエタリソフトウェアの場合、知らないうちに外の世界に電話がかかることがあります。一部のアプリケーションが最近導入された厳格なファイアウォールにうまく反応しない場合は、リバースエンジニアリング(またはアプリケーションのサポートラインに相談)して、作成しようとしているトラフィックの種類とその理由を見つける必要があります。オープンソースの世界では、この問題はあまり一般的ではありませんが、特に複雑なソフトウェアスタックの場合は、可能性の範囲外ではありません(たとえば、今日、メディアプレーヤーでさえ、アルバムアートを取得するためだけに、インターネットに電話をかけます。またはトラックリスト)。

Firewall-cmdはゾーンを使用します プリセットとして、適切なデフォルトから選択できます。これを行うことで、ファイアウォールを最初から構築する必要がなくなります。ゾーンはネットワークインターフェイスに適用されるため、2つのイーサネットインターフェイスを備えたサーバーでは、1つのゾーンが1つのイーサネットインターフェイスを管理し、別のゾーンがもう1つのイーサネットインターフェイスを管理する場合があります。

システムで提供されるゾーンについて理解するために時間をかける価値があります。利用可能なすべてのゾーンを表示するには、次を使用します:

$ sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

特定のゾーンでブロックが解除されているものを確認するには:

$ sudo firewall-cmd --zone work --list-all
work
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

既存のゾーンの1つを独自のファイアウォールルールの開始点として使用するか、独自のゾーンを作成します。

ゾーンを作成する

新しいゾーンを作成するには、--new-zoneを使用します オプション。

すべてのfirewall-cmd アクションは、ファイアウォールまたはファイアウォールを実行しているコンピューターが再起動するまでのみ持続します。永続的にしたいものには、--permanentを付ける必要があります フラグ。

たとえば、corpという新しいパーマネントゾーンを作成します 、次にファイアウォールルールをリロードして、新しいゾーンがアクティブになるようにします。

$ sudo firewall-cmd --new-zone corp --permanent
success
$ sudo firewall-cmd --reload

この新しいゾーンにネットワークインターフェースを割り当てる前に、sshを追加してください リモートでアクセスできるようにするサービス。 --permanentを使用します この追加を再起動後も維持するオプション:

$ sudo firewall-cmd --zone corp --add-service ssh --permanent

corpと呼ばれる新しいゾーン は現在アクティブであり、SSHトラフィックを除くすべてを拒否し、特定のネットワークインターフェイスに割り当てられていません。 corpを作成するには 保護するネットワークインターフェイスのアクティブゾーンとデフォルトゾーン(ens3 この例では)、--change-interfaceを使用します オプション:

$ firewall-cmd --change-interface ens3 \
  --zone corp --permanent
The interface is under control of NetworkManager, setting zone to 'corp'.
success

corpを作成する デフォルトゾーン。今後のすべてのコマンドはcorpに適用されます。 --zoneでない限り オプションは別のゾーンを指定します。 corpを設定するかどうか デフォルトは、このゾーンを新しいプライマリゾーンとして計画するかどうかによって異なります。もしそうなら、以下がその仕事をします:

$ sudo firewall-cmd --set-default corp

各インターフェースに現在割り当てられているゾーンを表示するには、--get-active-zonesを使用します オプション:

$ sudo firewall-cmd --get-active-zones``
corp
  interfaces: ens3
work
  interfaces: ens4
サービスの追加と削除

SSH以外のすべてをブロックしたので、ネットワークが依存しているポートを開くことができます。ファイアウォールを通過するトラフィックをすばやく簡単に許可する方法は、事前定義されたサービスを追加することです。

利用可能な事前定義されたサービスのリストは広範囲にわたっています。表示するには、次を使用します:

$ sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amqp 
amqps apcupsd audit bacula bacula-client
bgp bitcoin bitcoin-rpc bitcoin-testnet ceph
cockpit dhcp dhcpv6 dhcpv6-client distcc dns
[...]

Webサーバーを実行する必要があると仮定します。まず、使用するWebサーバー(httpd)をインストールします。 RHELまたはFedoraのパッケージ、apache2 UbuntuとDebianで)。この例では、httpdを使用します :

$ sudo dnf install httpd
$ sudo systemctl --enable --now httpd 

次に、ウェブサーバーをローカルでテストします:

$ curl --silent localhost:80 | grep title
<title>Test Page for the Apache HTTP Server on Red Hat Enterprise Linux</title>

次に、外部ブラウザからWebサーバーに接続してみます。接続が失敗し、ファイアウォールが有効であることを示しています:

$ curl --connect-timeout 3 192.168.122.206
curl: (28) Connection timed out after 3001 milliseconds
サービスのブロックを解除する

ファイアウォールを通過するHTTPトラフィックを許可するには、httpを追加します サービス:

$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload

次に、外部ソースからテストします:

$ curl --silent 192.168.122.206 | grep title
<title>Test Page for the Apache HTTP Server on Red Hat Enterprise Linux</title>

サービスを追加する方法がわかったので、サービスを削除するのはかなり直感的です。

$ sudo firewall-cmd --remove-service http --permanent
$ sudo firewall-cmd --reload
ポートの追加と削除

事前定義されたサービスが存在しない場合や、ネットワークと一致しないデフォルトを想定している場合があります。サービスを追加する代わりに、--add-portを使用してポート番号とプロトコルタイプを直接追加できます。 。

たとえば、SSH用の非標準ポート1622をカスタムゾーンに追加する必要がある場合(カスタムゾーンがコマンドのデフォルトゾーンでない場合は、--zoneを追加します オプション):

$ sudo firewall-cmd --add-port 1622/tcp --permanent
success
$ sudo firewall-cmd --reload

そのポートを削除するには、--remove-portを使用します :

$ sudo firewall-cmd --remove-port 1622/tcp --permanent
success
$ sudo firewall-cmd --reload

火の壁

firewall-cmdでできることは他にもたくさんあります 、独自のサービスの定義、ICMPブロッキング、許容される着信トラフィックのソースの定義など。学ぶための最良の方法は実験することです。そのため、Red Hat Enterprise LinuxまたはFedoraをGNOMEBoxにインストールし、すべてのオプションfirewall-cmdを使用してトラフィックを整形して実験してください。 提供します。


Linux
  1. LinuxでNetworkManagerを使い始める

  2. Linuxサーバーのネットワーク接続をnetstatで表示する

  3. SELinuxでコンテナを保護する

  1. LinuxメールサービスをSSL/TLSで保護する方法

  2. Linuxファイアウォールの使用を開始する

  3. Linuxサーバーを保護するための6つの必須のオープンソースツール

  1. Fail2BanでLinuxサーバーを保護する[初心者向けガイド]

  2. Linuxでのネットワーク接続の確認

  3. CSF ファイアウォールで Ubuntu サーバーを保護する方法