00. 目次
01. iptablesの概要
初期の Linux システムでは、ファイアウォールの構成にデフォルトで iptables ファイアウォール管理サービスが使用されていました。新しい firewalld ファイアウォール管理サービスは長年使用されてきましたが、多くの企業がさまざまな理由から運用環境で iptables を使用し続けています。iptables は、現在の運用環境でも依然として粘り強い活力を持っています。各ファイアウォール管理ツールの構成の考え方は一貫しており、iptables を習得した後に他のファイアウォール管理ツールを学習する際の参考としても役立ちます。
02. 戦略とルールチェーン
ファイアウォールは、設定されたポリシー ルールを上から下の順に読み取り、一致が見つかると、ただちに一致作業を終了し、一致で定義された動作 (つまり、許可またはブロック) を実行します。すべてのポリシー ルールを読み取った後に一致するものがなかった場合、デフォルト ポリシーが実行されます。一般に、ファイアウォール ポリシー ルール設定には、「pass」(つまり許可) と「block」(つまりブロック) の 2 種類があります。ファイアウォールのデフォルト ポリシーが拒否 (ブロック) の場合、許可ルール (パス) を設定する必要があります。そうしないと誰も侵入できません。ファイアウォールのデフォルト ポリシーが許可の場合、拒否ルールを設定する必要があります。それ以外の場合は誰も侵入できません。は侵入できますが、ファイアウォールは侵入できません。防御効果が失われます。
iptables サービスは、トラフィックの処理またはフィルタリングに使用されるポリシー エントリをルールとして呼び出します。複数のルールでルール チェーンを形成でき、ルール チェーンはデータ パケット処理の場所に従って次のように分類されます。
- ルーティング前にパケットを処理します (PREROUTING)。
- 受信パケットを処理します (INPUT)。
- 送信データ パケットを処理します (OUTPUT)。
- 転送されたパケットを処理します (FORWARD)。
- ルーティング後のパケットの処理 (POSTROUTING)。
一般に、内部ネットワークから外部ネットワークに送信されるトラフィックは一般に制御可能で無害であるため、最も一般的に使用されるルール チェーンは INPUT ルール チェーンであり、ハッカーが外部ネットワークから内部ネットワークに侵入する難易度が高くなる可能性があります。
たとえば、あなたが住んでいるコミュニティでは、不動産管理会社によって 2 つの規制があります。1 つは小規模の業者やベンダーのコミュニティへの立ち入りを禁止する、1 つはコミュニティに入るときにすべての種類の車両を登録することです。明らかに、これら 2 つの規制は、各世帯の防犯ドアではなく、コミュニティの正門 (交通が通過する必要がある場所) に適用されるべきです。前述のファイアウォール ポリシーの一致順序に応じて、いくつかのシナリオが存在する可能性があります。たとえば、訪問者が小規模なビジネスマンや行商人の場合、不動産管理会社の警備によって直接追い返され、車両を登録する必要はありません。訪問者が車でコミュニティの正門に入る場合、「ベンダーとベンダーのコミュニティへの立ち入り禁止」という最初のルールが一致しないため、2 番目のポリシーが順番に一致します。つまり、車両を登録する必要があります。 。地域住民が正門への侵入を希望した場合、これら 2 つの規制のどちらにも一致しないため、デフォルトの解放ポリシーが実行されます。
ただし、ポリシー ルールだけでコミュニティのセキュリティを保証することはできません。警備員は、これらの一致するトラフィックに対処するために「許可」、「拒否」、「登録」、「無視」などのどのようなアクションをとるべきかを知っておく必要もあります。これらのアクションは、iptables サービスの用語、ACCEPT (トラフィックの通過を許可)、REJECT (通過トラフィックの拒否)、LOG (ログ情報の記録)、および DROP (通過トラフィックの拒否) に対応します。「トラフィックの通過を許可する」と「ログ情報を記録する」はどちらもわかりやすいですが、ここで説明しなければならないのはREJECTとDROPの違いです。DROP に関する限り、トラフィックを直接破棄して応答しませんが、REJECT はトラフィックを拒否した後に「情報は受信されましたが破棄されました」というメッセージで応答するため、トラフィックの送信者はデータが送信されたことを明確に認識できます。応答メッセージが拒否されました。
これら 2 つの拒否アクションの違いを読者がより直観的に理解できるように、次の例を示します。たとえば、ある日、家でテレビを見ていると、突然ドアをノックする音が聞こえ、防犯ドアののぞき穴から、物を売っている人だと気づき、勝手にドアを開けてしまうことがあります。それが必要であり、それらを拒否します(REJECT)。しかし、もし債権者が十数人の部下を連れてきて借金を取り立てていることがわかったら、ドアを開けるのを拒否するだけでなく、黙って家にいないふりをすべきです(DROP)。
Linux システムのファイアウォール ポリシーが REJECT アクションに設定されている場合、トラフィック送信者にはポート到達不能応答が表示されます。
[deng@local ~]# ping -c 4 192.168.1.10
PING 192.168.10.10 (192.168.1.10) 56(84) bytes of data.
From 192.168.10.10 icmp_seq=1 Destination Port Unreachable
From 192.168.10.10 icmp_seq=2 Destination Port Unreachable
From 192.168.10.10 icmp_seq=3 Destination Port Unreachable
From 192.168.10.10 icmp_seq=4 Destination Port Unreachable
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3002ms
Linux システムのファイアウォール ポリシーを DROP アクションに変更すると、トラフィック送信者には応答タイムアウトのリマインダーが表示されます。ただし、トラフィック送信者は、トラフィックが拒否されたのか、受信ホストが現在オフラインなのかを判断できません。
[deng@local ~]# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3000ms
03. iptablesコマンド
iptables は、多数のパラメータを備えたコマンド ライン ベースのファイアウォール ポリシー管理ツールです。幸いなことに、毎日のファイアウォール ポリシーの構成では、よく使用されるパラメータをマスターし、それらを柔軟に一致させるだけで済み、日常の作業には十分対応できます。
OSI 7 層モデルの定義によれば、iptables は第 2 層、第 3 層、第 4 層で動作するサービスであるため、送信元アドレス、宛先アドレス、伝送プロトコル、サービス タイプなどの情報に基づいて照合できます。トラフィック。照合が成功すると、iptables はポリシーに基づいてトラフィックを照合し、ルールによって事前に設定されたアクションがこのトラフィックの処理に使用されます。さらに、ファイアウォール ポリシー ルールの一致順序は上から下であるため、エラーを避けるために、より厳格で優先度の高いポリシー ルールを最初に配置する必要があることを再度思い出してください。
iptables で一般的に使用されるパラメータと関数
パラメータ | 効果 |
---|---|
-P | デフォルトのポリシーを設定する |
-F | 明確なルールチェーン |
-L | ルールチェーンを表示する |
-A | ルールチェーンの最後に新しいルールを追加します |
-私はどうか | ルールチェーンの先頭に新しいルールを追加します |
-D かどうか | ルールを削除する |
-s | 送信元アドレスの IP/MASK と一致し、この IP 以外を示すには感嘆符「!」を追加します。 |
-d | ターゲットアドレスの一致 |
-i ネットワークカード名 | このネットワーク カードから流入するデータと一致する |
-o ネットワークカード名 | このネットワークカードから流出するデータを照合します |
-p | TCP、UDP、ICMP などの一致するプロトコル |
–dポート番号 | ターゲットポート番号の一致 |
–スポーツ番号 | 送信元ポート番号の一致 |
04. iptablesの例
4.1 既存のファイアウォール ルール チェーンを表示するには、iptables コマンドの後に -L パラメータを追加します。
deng@local:~/code$ sudo iptables -L
[sudo] deng 的密码:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/code$
4.2 iptables コマンドの後に -F パラメータを追加して、既存のファイアウォール ルール チェーンをクリアします。
deng@local:~/code$ sudo iptables -F
deng@local:~/code$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/code$
4.3 INPUT ルール チェーンのデフォルト ポリシーを拒否に設定します。
deng@local:~/桌面$ sudo iptables -P INPUT DROP
[sudo] deng 的密码:
deng@local:~/桌面$ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/桌面$
ファイアウォールポリシールールを設定するには、「パス」と「ブロック」の 2 つの方法があります。INPUT チェーンをデフォルトで拒否するように設定した後、そのチェーンに許可ポリシーを書き込む必要があります。そうしないと、すべての受信データ パケットがデフォルトで拒否されます。
ルールチェーンのデフォルトのポリシー拒否アクションは、削除のみであり、拒否はできません。
4.4 ICMP トラフィックが INPUT チェーンに入るのを許可するポリシー ルールを追加する
ping コマンドは、相手のホストがオンラインかどうかを確認するためによく使用されます。ICMP トラフィックがファイアウォールの INPUT ルール チェーンに入るのを許可するポリシー ルールを追加すると、デフォルトでこの ping コマンドの検出動作が許可されます。
deng@local:~/桌面$ sudo iptables -I INPUT -p icmp -j ACCEPT
deng@local:~/桌面$ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/桌面$ ping -c 4 192.168.1.254
PING 192.168.1.254 (192.168.1.254) 56(84) bytes of data.
64 bytes from 192.168.1.254: icmp_seq=1 ttl=255 time=29.5 ms
64 bytes from 192.168.1.254: icmp_seq=2 ttl=255 time=16.9 ms
64 bytes from 192.168.1.254: icmp_seq=3 ttl=255 time=34.0 ms
64 bytes from 192.168.1.254: icmp_seq=4 ttl=255 time=18.3 ms
--- 192.168.1.254 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 16.895/24.681/34.016/7.282 ms
deng@local:~/桌面$
4.5 INPUT ルール チェーンに追加したばかりのポリシー (ICMP トラフィックを許可) を削除し、デフォルト ポリシーを許可に設定します。
-F パラメータを使用すると、既存のファイアウォール ポリシーがすべて削除されます。-D パラメータを使用すると、指定したポリシーを削除できるため、より安全で正確です。
deng@local:~/桌面$ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/桌面$ sudo iptables -D INPUT 1
deng@local:~/桌面$ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/桌面$
deng@local:~/桌面$ sudo iptables -P INPUT ACCEPT
deng@local:~/桌面$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/桌面$
4.6 指定されたネットワーク セグメント内のホストのみがローカル マシンのポート 22 にアクセスできるようにし、他のすべてのホストからのトラフィックを拒否するように INPUT ルール チェーンを設定します。
特定のホストと一致させるには、その IP アドレスを直接書き込むことができますが、ネットワーク セグメントと一致させる必要がある場合は、サブネット マスク (192.168.1.0/24 など) の形式で書き込む必要があります。
deng@local:~$ sudo iptables -I INPUT -s 192.168.2.0/24 -p tcp --dport 22 -j ACCEPT
deng@local:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.2.0/24 anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~$
deng@local:~$
deng@local:~$ sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
deng@local:~$
deng@local:~/桌面$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.2.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/桌面$
deng@local:~/桌面$ sudo iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
deng@local:~/桌面$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 anywhere tcp dpt:ssh
ACCEPT tcp -- 192.168.2.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~/桌面$
4.7 ローカル ポート 12345 へのすべてのアクセスを拒否するポリシー ルールを INPUT ルール チェーンに追加します。
deng@local:~$ sudo iptables -I INPUT -p tcp --dport 12345 -j REJECT
deng@local:~$ sudo iptables -I INPUT -p udp --dport 12345 -j REJECT
deng@local:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT udp -- anywhere anywhere udp dpt:12345 reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:12345 reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.1.0/24 anywhere tcp dpt:ssh
ACCEPT tcp -- 192.168.2.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~$
4.8 192.168.1.5 ホストによるローカル ポート 80 (Web サービス) へのアクセスを拒否するポリシー ルールを INPUT ルール チェーンに追加します。
deng@local:~$ sudo iptables -I INPUT -p tcp -s 192.168.1.5 --dport 80 -j REJECT
deng@local:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 192.168.1.5 anywhere tcp dpt:http reject-with icmp-port-unreachable
REJECT udp -- anywhere anywhere udp dpt:12345 reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:12345 reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.1.0/24 anywhere tcp dpt:ssh
ACCEPT tcp -- 192.168.2.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~$
4.9 ローカル マシンのポート 1000 ~ 1024 へのすべてのホストのアクセスを拒否するポリシー ルールを INPUT ルール チェーンに追加します。
先ほどファイアウォール ポリシーを追加するときに -I パラメーターが使用されましたが、デフォルトではルールが先頭に追加されるため、優先度が最も高くなります。作業に最終的な「シークレット」ルールを追加する必要がある場合は、-A パラメーターを使用します。これら 2 つのパラメータの効果は依然として大きく異なります。
deng@local:~$ sudo iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
deng@local:~$ sudo iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
deng@local:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 192.168.1.5 anywhere tcp dpt:http reject-with icmp-port-unreachable
REJECT udp -- anywhere anywhere udp dpt:12345 reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:12345 reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.1.0/24 anywhere tcp dpt:ssh
ACCEPT tcp -- 192.168.2.0/24 anywhere tcp dpt:ssh
REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpts:1000:1024 reject-with icmp-port-unreachable
REJECT udp -- anywhere anywhere udp dpts:1000:1024 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
deng@local:~$
4.10 設定されたファイアウォール ポリシーは永続的に有効になります
デフォルトでは、iptables コマンドを使用して構成されたファイアウォール ルールは、次回システムが再起動されると無効になります。構成されたファイアウォール ポリシーを永続的に有効にしたい場合は、save コマンドも実行する必要があります。
deng@local:~$ sudo iptables-save
# Generated by iptables-save v1.8.7 on Sun Sep 24 10:46:55 2023
*filter
:INPUT ACCEPT [1398:218485]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s 192.168.1.5/32 -p tcp -m tcp --dport 80 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 12345 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 12345 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 1000:1024 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 1000:1024 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Sun Sep 24 10:46:55 2023
deng@local:~$