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

IPTables ルールで Linux ファイアウォールを保護する方法

サーバーのハッキングと不正アクセスは真の脅威です。これらの理由により、全体的なネットワーク セキュリティ戦略の一部としてファイアウォールを実装する必要があります。 iptables ルールを使用してファイアウォールを構成することは、Linux システムでのこのようなリスクを軽減する 1 つの方法です。

幸運なことに、このチュートリアルでは、要件に基づいてカスタマイズできる基本的な iptables ルール構成を使用してファイアウォールを実装する方法を説明します。手を汚す準備はできましたか?飛び込む時間です!

前提条件

このチュートリアルには、実践的なデモンストレーションが含まれています。先に進みたい場合は、Linux サーバーまたはデスクトップ コンピューターがあることを確認してください。このチュートリアルでは、例として Ubuntu 14.04 を使用していますが、他の Linux ディストリビューションや新しい Ubuntu バージョンでも動作するはずです。

iptables パーシステント ファイアウォール サービスのインストール

名前が示すように、IPTables Persistent Firewall は、ルールセットを保存し、サーバーの再起動時に IPTables ルールを自動的に適用するサービスです。ただし、最初に永続的なファイアウォール パッケージをインストールする必要があります。

IPTables Persistent Firewall をインストールするには、次の手順に進みます。

1. サーバー上でローカルまたは SSH 経由でターミナル セッションを開きます。

2. 次に、以下のコマンドを実行して、サーバーのパッケージ ソース キャッシュを更新します。

# Updating the package source cache
sudo apt update -y

3. 次に、以下のコマンドを実行して、IPTables Persistent Firewall をインストールします。

# Installing the Persistent Firewall Package
sudo apt install iptables-persistent -y

4.現在の IPv4 ルールを維持する 、[はい] を選択します プロンプトで Enter キーを押します。インストーラーは、IPv4 ルールをファイル /etc/iptables/rules.v4. に保存します。

5. 次のプロンプトで、現在の IPv6 ルールを保存するように求められます 、[はい] を選択します。 し、Enter を押します。インストーラーは、IPv6 ルールをファイル /etc/iptables/rules.v6. に保存します。

最後に、netfilter-persistent.service アクティブで有効です。

sudo systemctl status netfilter-persistent

基本的な iptables ルールの設定

基本的なファイアウォールのセットアップでは、ファイアウォールを構成するために構築できる拡張可能なフレームワークを構築します。通常、「すべて拒否 - すべて受け入れる」を設定します。 つまり、あなたの IP と SSH ポート 22 (管理者アクセス用) を除いて、どの IP からの着信要求も拒否されます。

サーバー IP からより広範なインターネットへの進行中の接続はすべて許可されます。着信接続はドロップされます (SSH を除く)。その後、必要な特定のサービスとトラフィック タイプの例外を作成し、このチュートリアルの後半で徐々に学習します。

1. /etc/iptables/rules.v4 を開きます テキストエディタでファイル。この例では nano を使用しています 編集者として。

sudo nano /etc/iptables/rules.v4

次に、/etc/iptables/rules.v4 のすべてのコンテンツを削除します ファイルを開き、次の行に置き換えます。各行/セクションの機能を理解するには、インライン コメントを参照してください。

注:以下のファイアウォール構成は、厳密に記述できるものであり、後でカスタマイズできる基本的なファイアウォール ルールを作成するためだけのものです。

*filter
# Setting up a "deny all-accept all" policy
# Allow all outgoing, but deny/drop all incoming and forwarding traffic
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Custom per-protocol chains
# Defining custom rules for UDP protocol.
:UDP - [0:0]
# Defining custom rules for TCP protocol.
:TCP - [0:0]
# Defining custom rules for ICMP protocol.
:ICMP - [0:0]

# Accept SSH UDP traffic
-A TCP -p udp --dport 22 -j ACCEPT
# Accept SSH TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

# Acceptable ICMP traffic

# Boilerplate acceptance policy
# Allowing packets based on the CONNTRACK connection states of ESTABLISHED and RELATED
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Allowing packets through the loopback interface, which is used for local connections
-A INPUT -i lo -j ACCEPT

# Packets that do not match any rules in the protocol-specific should be dropped.
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Allowing new protocol-specific chains to process packets for UDP that have a NEW conntrack state.
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# Allowing new protocol-specific chains to process packets for TCP that have a NEW conntrack state.
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
# Allowing new protocol-specific chains to process packets for ICMP that have a NEW conntrack state.
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

# Reject anything at this point. And print out rejection message with its specific protocol.
# Issuing an ICMP "port unreachable" message to any new incoming UDP packets, rejecting them.
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
# Issuing a "tcp-reset" message to any new incoming TCP packets, rejecting them.
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
# Issuing an "icmp-proto-unreachable" message to any new incoming TCP packets, dropping all other incoming packets.
-A INPUT -j REJECT --reject-with icmp-proto-unreachable

# Commit the changes
COMMIT

*raw
# Allowing packets in the PREROUTING chain
:PREROUTING ACCEPT [0:0]
# Allows packets in the OUTPUT chain, which is used for locally generated packets
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
# NAT table is used to alter packets as they are routed through the system
*nat
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for NAT
:INPUT ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for NAT
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for NAT
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*security
# Allowing packets in the INPUT chains for security
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for security
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for security
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*mangle
# Allowing packets in the PREROUTING chains for mangle
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for mangle
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for mangle
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for mangle
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for mangle
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

3. ファイルを保存します。 nano で 、CTRL+X、Y、Enter を押します。

4. iptables-restore を実行します 以下のコマンドを実行して、構文エラーを検証または検出します。エラーがなければ、ファイルで定義したルールでファイアウォールが再起動します。エラーがある場合、コマンドはエラーのリストとその修正方法を返します。

sudo iptables-restore -t /etc/iptables/rules.v4

5. 次に、/etc/iptables/rules.v6 を編集します。 IPv6 のファイアウォール ポリシーとフレームワークを実装します。

sudo nano /etc/iptables/rules.v6

6. /etc/iptables/rules.v6 ファイルを置き換えます 次の行で。 /etc/iptables/rules.v6 を保存して終了します CTRL+X、Y、Enter を押します。

以下の iptables ルールは、すべての IPv6 トラフィックをドロップし、サーバー上に IPv6 に依存または使用するアプリケーションまたはサービスがないことを前提としています。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

7. 以下のコマンドを実行して、構文エラーを見つけて修正します。

sudo ip6tables-restore -t /etc/iptables/rules.v6

8. netfilter-persistent をリロードします iptables ルールを有効にするためのサービス。

sudo service netfilter-persistent reload

9. 以下のコマンドを実行して、新しい iptables ルールを保存します。

sudo service netfilter-persistent save

10. 以下のコマンドを実行して、現在使用されている IPv4 のすべてのルールを一覧表示します。

sudo iptables -S

10. 最後に、IPv6 の iptables ルールをリストします。

sudo ip6tables -S

サーバーの DNS サーバー IP アドレスの変更 (条件付き)

すべての IPv6 トラフィックをブロックすると、特にサーバーが名前解決に IPv6 に依存している場合、好ましくない副作用が生じる可能性があります。

この例では、ネットワーク構成は IPv6 ネーム サーバー (2001:4860:4860::8888 や 2001:4860:4860::8844 など) に依存しています。ファイアウォールは IPv4 トラフィックのみを適用しているため、システムは IPv6 のネーム サーバーを検索できません。

たとえば、ファイアウォールがすべての IPv6 トラフィックをブロックすると、一部の APT リポジトリが機能しない場合があります。 sudo apt update を再実行しようとすると コマンドを実行すると、次のエラーが発生する場合があります。

解決策は、IPv4 ネーム サーバー (8.8.8.8 や 8.8.4.4 など) の使用を優先して、ネットワーク構成ファイルを更新することです。

1. /etc/network/interfaces を開きます テキストエディタでファイル。

ネットワーク インターフェイス構成ファイルは、Linux ディストリビューションまたはバージョンによって異なる場合があります。以下の例は、Ubuntu 14.04 LTS 専用です。

sudo nano /etc/network/interfaces

2. dns-nameservers を探します 指令。このディレクティブを dns-nameservers 8.8.8.8 8.8.4.4 に変更します .

8.8.8.8 と 8.8.4.4 は、Google が運営するパブリック DNS サーバーです。これらのパブリック DNS サーバーは、信頼性が高く高速です。 OpenDNS や組織内の内部 IPv4 DNS など、他の DNS サーバーを自由に使用してください。

3. 以下のコマンドを実行して、サーバーのネットワーク インターフェイスを循環させ、新しいネーム サーバーを使用します。

sudo ifdown eth0 && sudo ifup eth0

4. 次に、/etc/apt/apt.conf.d/99force-ipv4 をテキスト エディターで開きます。このデフォルト設定ファイルは APT 永続的な設定に使用します。

sudo nano /etc/apt/apt.conf.d/99force-ipv4

5. 99force-ipv4 に入力します 次の行を含むファイル。この値は、APT が名前解決に IPv4 を使用することを強制します。 99force-ipv4 を保存して終了します .

Acquire::ForceIPv4 "true";

6. SSH セッションからログアウトして再度ログインし、sudo apt update を再実行します。 指図。名前解決エラーは表示されなくなります。

特定のサービスに対する免除の追加

「すべて許可 - すべて拒否」の iptables ルールが機能するようになったので、必要に応じて特定のサービスに対して特定のポートを開くことができます。たとえば、サーバーが Web サイトをホストしている、またはホストする予定の場合、HTTP ポート 80 または HTTPS ポート 443 トラフィックを許可する必要があります。そのためには、次の手順に従ってください。

1. ターミナルで次のコマンドを実行して、HTTP トラフィック用に TCP ポート 80 を開き、HTTPS トラフィック用にポート 443 を開きます。

  • -A パラメータは、ルールを追加するチェーンを受け入れます
  • -p パラメータは、ルールが適用されるプロトコル タイプを指定します。
  • --dport パラメータ値は宛先ポート番号です。
  • -j パラメータは、ルールが一致したときに実行するアクションを指示します。
sudo iptables -A TCP -p tcp --dport 80 -j ACCEPT
sudo iptables -A TCP -p tcp --dport 443 -j ACCEPT

2. 以下のコマンドを実行して、新しいルールが有効になっていることを確認します。

sudo iptables -L -v

HTTP と HTTPS の 2 つのエントリがそれぞれ表示されます。

3. 最後に、以下のコマンドを実行して、変更を iptables ルールに保存します。

sudo service netfilter-persistent save

ソースに基づく接続の許可

iptables では、1 つ以上の IP アドレスなど、特定のソースからのトラフィックを許可するルールを作成することもできます。たとえば、会社に 3 つのサイトがあり、それぞれに IP アドレス (例:192.168.1.20、192.168.1.30、および 192.168.1.40) があるとします。

おそらく、各サイトからサーバーへの接続を許可したいでしょう。そのために、-s を使用して 3 つの個別のルールを作成します。 特定のソースを指定します。

1. 次のコマンドを実行して、3 つの特定の IP アドレスからの接続を許可します。

以下の IP アドレスは単なる例であり、実際のシナリオを反映していない場合があります。サイトの IP アドレスは異なります。

# Allowing connection from 192.168.1.20
sudo iptables -A TCP -s 192.168.1.20 -j ACCEPT
# Allowing connection from 192.168.1.30
sudo iptables -A TCP -s 192.168.1.30 -j ACCEPT
# Allowing connection from 192.168.1.40
sudo iptables -A TCP -s 192.168.1.40 -j ACCEPT

2. 以下のコマンドを再実行して、新しいルールが追加されたことを確認します。

sudo iptables -L -v

3 つの特定のソースに対して 3 つのエントリが表示され、サーバーに接続できるようになります。

3. 最後に、以下のコマンドを実行して iptables ルールを保存することを忘れないでください。

sudo service netfilter-persistent save

iptables ルールのリセット

これで、iptables ルールを使用してファイアウォールを正常に構成できました。しかし、すべてが常に計画どおりに進むわけではありません。しかし、失敗してやり直したい場合はどうすればよいでしょうか?

1 つのオプションは、すべての iptables ルールをリセットすることです。そのためには、以下の手順に従ってください。

1. まず、既存の iptables ルールのバックアップ コピーを作成します。以下のコマンドは rules.v4 をコピーします そして rules.v6 ファイルをホーム ディレクトリに追加します。

sudo cp /etc/iptables/* ~/

2. 次に、以下のコマンドを実行して、既存のすべての iptables ルールをフラッシュします。

sudo service netfilter-persistent flush

3. ルールが存在しないことを確認します。

sudo iptables -S

以下に示すように、デフォルトの iptables ルールのみが残り、すべてが許可されます。この動作により、ルールをリセットしても、管理者アクセスのロックアウト シナリオが発生しないことが保証されます。

結論

このチュートリアルを通じて、iptables ルールを使用して Linux ファイアウォールを保護する方法と、除外を構成する方法を学習しました。

一部の Linux 管理者は、Linux ファイアウォールを構成するための iptables は時代遅れであると主張する場合があります。しかし、多くのアプリケーションはいまだに iptables に依存しているため、今後何年も主力であり続ける可能性があります。

永続的な iptables ルールの使用についてどう思いますか?実装を検討しますか、それとも複雑でないファイアウォール (UFW) などの新しいオプションに移行しますか?


Linux
  1. iptablesルールをフラッシュする方法

  2. iptablesルールをフラッシュする方法

  3. CSFファイアウォールにカスタムiptablesルールを追加する方法

  1. 方法:Linux General –一般的なIPTables

  2. Linux IPTables:ファイアウォール ルールを追加する方法 (Allow SSH の例を使用)

  3. iptables が実行されているか、ファイアウォールが有効になっているかを確認する方法

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

  2. Linux IPTables ファイアウォールでドロップされたパケットをログ ファイルに記録する方法

  3. Linuxでパスワードを確認するには?