#########I.はじめに#########
ファイアウォールは、端的に言えば、Linux でアクセス制御機能を実装するために使用され、ハードウェア ファイアウォールとソフトウェア ファイアウォールの 2 つのタイプに分けられます。どのネットワークにいても、ファイアウォールが機能する場所はネットワークのエッジにある必要があります。私たちのタスクは、ファイアウォールの仕組みを定義することです。これは、ネットワークに出入りする IP とデータを検出できるようにするファイアウォールの戦略とルールです。 現在、市場でより一般的なファイアウォールには、ネットワーク層ファイアウォールと呼ばれるレイヤー 3 およびレイヤー 4 ファイアウォールと、実際にはプロキシ層のゲートウェイであるレイヤー 7 ファイアウォールが含まれます。 TCP/IP の 7 層モデルの場合、3 層目はネットワーク層であることがわかっており、3 層ファイアウォールはこの層で送信元アドレスと宛先アドレスを検出します。しかし、7 層ファイアウォールの場合、送信元ポートまたは宛先ポート、送信元アドレスまたは宛先アドレスが何であっても、すべてがチェックされます。したがって、設計原則の観点からは、7 層ファイアウォールの方が安全ですが、その結果、効率が低下します。したがって、市販されている通常のファイアウォール ソリューションは、この 2 つを組み合わせたものです。また、誰もがファイアウォールで制御されているポートを介してアクセスする必要があるため、ファイアウォールの効率がユーザーがアクセスできるデータ量を制御する最も重要な要素となっており、構成が不適切であるとトラフィックのボトルネックになる場合もあります。
2: iptables の歴史と動作原理
1.iptablesの開発: iptables の前身は ipfirewall (カーネル 1.x 時代) と呼ばれ、これは作者が freeBSD から移植したシンプルなアクセス制御ツールで、カーネル内で動作してデータ パケットを検出できます。ただし、ipfirewall の動作機能は非常に限られています (ルールを実行するには、すべてのルールをカーネルに組み込む必要があり、カーネルに組み込むのは一般に非常に困難です)。カーネルが 2. アクセス制御機能まで開発されたとき。
これらはユーザー空間で動作し、ルールを定義するツールであり、それ自体はファイアウォールではありません。定義されたルールは、カーネル空間の netfilter によって読み取られ、ファイアウォールが動作できるようになります。カーネルに配置される場所は、tcp/ip プロトコル スタックが通過する特定の場所である必要があります。この tcp/ip プロトコル スタックが通過する必要があり、読み取りルールを実装できる場所は netfilter と呼ばれます (ネットワーク フィルター) 作成者はカーネル空間内の合計 5 つの場所を選択しました。
1. カーネル空間内: 1 つのネットワーク インターフェイスから入って別のネットワーク インターフェイスに行く
2. データ パケットはカーネルからユーザー空間に流れます
3. データパケットはユーザー空間から流出します
4. 本機の外部ネットワークインターフェースへの出入り
5. ローカル ネットワーク インターフェイスへの出入り
2. iptables の動作メカニズム上記の展開から、作成者が制御の場所として 5 つの場所を選択したことがわかりますが、実際には、最初の 3 つの場所は基本的に完全にパスをブロックできることがわかりましたが、なぜすでにそれらが出入りしているのですか?口の中にレベルを設定しても、まだ内部に詰まった場合はどうなりますか?データ パケットに対するルーティングの決定がまだ行われておらず、データがどこに送信されるかがまだ不明であるため、インポートおよびエクスポート時にデータ フィルタリングを実装する方法はありません。したがって、カーネル空間でのフォワーディングレベル、ユーザー空間に入るレベル、ユーザー空間から出るレベルを設定する必要があります。では、役に立たないのであれば、なぜ配置するのでしょうか? NAT と DNAT を実行する場合、ルーティングの前にターゲット アドレス変換を変換する必要があるためです。したがって、外部ネットワークのインターフェイスにチェックポイントを設定し、次に内部ネットワークにチェックポイントを設定する必要があります。
これら 5 つの位置は、5 つのフック関数とも呼ばれ、5 つのルール チェーンとも呼ばれます。 1.PREROUTING (配線前)
2.INPUT (パケットフローエントリ)
3.FORWARD (転送カード)
4.OUTPUT(データパケットエクスポート)
5.POSTROUTING (ルーティング後)
これらは、NetFilter によって指定された 5 つのルール チェーンです。このマシンを通過するデータ パケットは、これら 5 つのチェーンのいずれかを通過する必要があります。
3. ファイアウォール戦略ファイアウォールのポリシーは一般に「パス」ポリシーと「ブロッキング」ポリシーの 2 種類に分けられ、パス ポリシーではデフォルトでドアが閉まっており、ファイアウォール ポリシーを定義する必要があります。誰が入ることができますか。ブロック戦略は、ドアは開いていますが、ID 認証が必要であり、そうでない場合は中に入ることができないというものです。したがって、私たちは定義する必要があります。入ってくる人には入ってもらい、出て行く人には出て行ってもらいます。オープンとはすべてを許可することを意味し、ブロックとは選択することを意味します。ポリシーを定義するときは、データ パケットで許可または許可されないポリシーの定義、フィルター機能、アドレス変換機能を定義する nat オプションなど、複数の機能をそれぞれ定義する必要があります。これらの機能を交互に動作させるために、さまざまな動作機能や処理方法を定義し区別するための「テーブル」の定義を策定しました。
現在 3 つの関数を使用しています:
1.filter は何が許可されるか何が許可されないかを定義します
2.nat はアドレス変換を定義します
3.mangle関数: メッセージの元のデータを変更します
TTL を変更するためにメッセージの元のデータを変更します。データパケットのメタデータを逆アセンブルし、内部のコンテンツをマーク/変更することが可能です。ファイアウォールタグは実際にはマングルによって実装されます。
小さな拡張機能:
一般的に、フィルターは 3 つのチェーン (INPUT、FORWARD、OUTPUT) でのみ使用できます。
一般に、NAT は PREROUTING、OUTPUT、POSTROUTING の 3 つのチェーンでのみ使用できますそして、mangle は 5 つのチェーンを実行できます: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
iptables/netfilter (このソフトウェア) はユーザー空間で動作します。ルールを有効にすることができます。それ自体はサービスではなく、ルールはすぐに有効になります。そして、iptables はサービスになり、開始と停止が可能になりました。開始するとルールは直接有効になり、停止するとルールは取り消されます。
iptables は独自のチェーンの定義もサポートしています。ただし、定義するチェーンは特定のチェーンに関連付ける必要があります。レベル設定では、データがある場合に特定のチェーンに移動して処理し、そのチェーンが処理された後に戻るように指定します。次に、特定のチェーンのチェックインを続けます。
注: ルールの順序は非常に重要です。ルールが厳格であるほど、上位に配置する必要があります。ルールをチェックするときは、上から下にチェックされます。
#########三つ。ルールの作成:
iptables がルールを定義する方法はさらに複雑です: 形式: iptables [-t table] コマンドチェーン CRETIRIA -j ACTION
-t テーブル: 3 フィルターナットマングル
コマンド: ルールの管理方法を定義します
chain: 次のルールがどのチェーンで動作するかを指定します。これは、ポリシーを定義するときに省略できます
CRETIRIA:一致基準の指定
-j アクション:
の処理方法を指定します。例: 172.16.0.0/24 はアクセスを許可されません。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
もちろん、より徹底的に拒否したい場合は:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
iptables -L -n -v #定義されたルールに関する詳細情報の表示
4: 詳細説明 COMMAND:
1.チェーン管理コマンド (即時有効)
-P: デフォルトのポリシーを設定します (デフォルトのドアが閉じているか開いているかを設定します) 通常、デフォルトの戦略は 2 つだけです
iptables -P INPUT (DROP|ACCEPT) デフォルトはオフ/デフォルトはオンです
###例えば:###iptables -P INPUT DROP これはデフォルトのルールを拒否します。また、アクションが定義されていないため、Xshell 接続を含む外部接続およびリモート接続に関するすべてのルールが拒否されます。
-F: FLASH、ルール チェーンをクリアします (各チェーンの管理権限に注意してください)
iptables -t nat -F PREROUTING
iptables -t nat -F nat テーブル内のすべてのチェーンをクリアします
-N:NEW はユーザーによる新しいチェーンの作成をサポートします
iptables -Nbound_tcp_web は、Web をチェックするために TCP テーブルに接続されていることを示します。
-X: ユーザー定義の空のリンクを削除するために使用されます
使用方法は-Nと同じですが、削除前に内部のチェーンをクリアする必要があります。
-E: チェーンの名前を変更するために使用され、主にユーザー定義のチェーンの名前を変更するために使用されます。-E 古い名前 新しい名前
-Z: チェーンとチェーン内のデフォルト ルールのカウンターをクリアします (カウンターが 2 つあり、一致するパケットとバイトの数)
iptables -Z : クリア
2. ルール管理コマンド-A: 追加、現在のチェーンの最後に新しいルールを追加します
-I num: 挿入、現在のルールをどの番号に挿入します。
-I 3: 3 番目の項目として挿入します -R num: リプレイによって置換/変更されるルール
形式: iptables -R 3…………
-D num: 削除。削除するルールを明確に指定します。
3. 管理コマンド「-L」を表示します
サブコマンドを追加
-n: ip を数値形式で表示します。ip を直接表示します。-n を追加しない場合、ip はホスト名に逆解決されます。
-v: 詳細情報を表示
-vv
-vvv: 多ければ多いほど、より詳細になります
-x: 単位変換せずに正確な値をカウンターに表示します
--line-numbers: ルールの行番号を表示します
-t nat: すべてのレベルに関する情報を表示します
5: 一致基準の詳細説明
1. ユニバーサル マッチング: ソース アドレスとターゲット アドレスのマッチング
-s: 照合する送信元アドレスとして指定します。ここではホスト名を指定できません。IP である必要があります。 IP | IP/マスク | 0.0.0.0/0.0.0.0 また、アドレスを反転することもできます。「!」を追加して、どの IP を除くかを示します
-d: 一致するターゲットアドレスを示します
-p: プロトコルを照合するために使用されます (通常、ここには TCP/UDP/ICMP の 3 つのプロトコルがあります)
-i eth0: このネットワーク カードから流入するデータ
Inflow は通常、INPUT と PREROUTING に使用されます
-o eth0: このネットワーク カードから流出するデータ
アウトフローは通常、OUTPUT および POSTROUTING にあります
2.拡張マッチング
2.1 暗黙の拡張: プロトコルの拡張
-p tcp: TCP プロトコルの拡張機能。拡張子には通常 3 種類あります
--dport XX-XX: 対象ポートを指定します。連続しない複数のポートは指定できません。
のように単一のポートのみ指定できます。--dport 21 または --dport 21-23 (これは 21、22、23 を意味します)
--スポーツ: 送信元ポートを指定します
--tcp-fiags: TCP フラグ (SYN、ACK、FIN、PSH、RST、URG)
その場合、通常、その後に 2 つのパラメータを続ける必要があります:
1. チェックフラグ
2. 1
でなければならないフラグ ビット--tcpflags syn、ack、fin、rst syn = --syn
はこれら 4 ビットをチェックすることを意味します。これらの 4 ビットのうち syn は 1 でなければならず、その他は 0 でなければなりません。つまり、これは 3 ウェイ ハンドシェイクの最初のパケットを検出するために使用されることを意味します。 SYN が 1 である最初のパケットに特に一致するこの種のパケットには、--syn
と呼ばれる省略形もあります。-p udp: UDP プロトコルの拡張機能
--dポート
--スポーツ
-p icmp: icmp データメッセージの拡張子
--icmp-type:
echo-request (エコー要求)、通常は 8
で表されます。つまり、--icmp-type 8 はリクエスト エコー パケットと一致します
エコー応答 (応答データ パケット) は通常 0
で表されます。2.2 明示的な展開 (-m)
さまざまなモジュールを拡張
-m multiport: マルチポート拡張の有効化を示します
その後、たとえば --dports 21,23,80
を有効にできます。6: 詳細説明-j ACTION
一般的に使用されるアクション:
DROP:静かに破棄します
通常、私たちは身元を隠し、リンクされたリストを隠すために DROP を使用します。
REJECT:明示的に拒否します同意する:同意します
custom_chain: カスタム チェーンに切り替えます
DNAT
SNAT
MASQUERADE:送信元アドレスマスカレード
REDIRECT: リダイレクト: 主にポート リダイレクトの実装に使用されます
マーク:
ファイアウォールによってマークされています
戻る:戻るカスタム チェーンの実行後に return を使用して、元のルール チェーンに戻ります。
演習 1:
172.16.0.0/16 ネットワーク セグメントからのものである限り、ローカル 172.16.100.1 の SSHD サービスへのアクセスが許可されます。
分析: まず第一に、許可テーブルで定義する必要があります。 NAT アドレス変換などを行う必要がないため、SSHD サービスを確認してください。ポート 22 では、処理メカニズムは受け入れです。このテーブルには、許可するかどうかの前後の 2 つのルールが必要です。ローカル サービスにアクセスする場合は、INPUT チェーンで定義してから OUTPUT を定義するのが最善です。 (セッションの最初の終了が最初に定義されます)、ルールは次のとおりです:
定義は次のようになります: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
定義: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
デフォルトのポリシーを DROP に変更します:
iptables -P 入力ドロップ
iptables -P 出力ドロップ
iptables -P フォワードドロップ
7: ステータス検出: はセッション間の接続関係を検出するための明示的な拡張機能であり、検出することでセッション間機能の拡張を実現できます。
ステータス検出とは何ですか? TCP プロトコル全体としては接続プロトコルであり、スリーウェイ ハンドシェイクでは最初のハンドシェイクを NEW コネクションと呼び、2 回目以降は ack が 1 となり通常のデータ送信となります。 TCP の 3 回目のハンドシェイクを確立された接続 (ESTABLISHED) と呼びます。SYN=1 ACK=1 RST=1 など、非常に奇妙な状態もあります。このような識別できないものについては、みんな INVALID と呼んでいます。認識されない。 4 番目のタイプもあり、これは FTP の古い機能です。各ポートは独立しています。ポート 21 と 20 はどちらも行ったり来たりします。これらの間には関係があります。この関係を RELATED と呼びます。つまり、合計 4 つの状態があります:
### 新しい### ### 設立### ### 関連している### ### 無効###
それでは、今の演習問題にステータス検出を追加できます。たとえば、NEW および ESTABLISHED ステータスのトロイの木馬のみが侵入を許可され、ESTABLISHED ステータスのみが外出を許可され、より一般的なリバウンド型トロイの木馬に対して優れた制御メカニズムを提供できます。練習問題の拡張:
入ってくる人は外出の許可を拒否し、入ってくる人は ESTABLISHED の入場のみを許可し、外出する人は ESTABLISHED の外出のみを許可します。デフォルトのルールはすべて、deny
を使用します。
iptables -L -n --line-number: 前のルールが存在する行を表示します入力を書き換えます
iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
現時点でさらに 80 ポートを解放したい場合は、どうすれば解放できますか?
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
演習 2:
自分が他の人に ping できるのに、他の人が私に ping できない場合はどうすればよいでしょうか?
分析: ping プロトコルの場合、入ってくるものは 8 (ping)、出ていくものは 0 (応答) です。目標を達成するには、出ていくには 8 が必要で、入ってくるのは 0 にする必要があります。
発信ポート上: iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT受信ポート: iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
小さな拡張機能: 127.0.0.1 は特別なので、明確に定義する必要があります
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
8: SNAT と DNAT の実装
現在、IP アドレスが不足しており、割り当てられているため、残りの IP リソースを節約するためにアドレス変換を実行する必要があります。では、iptables を介して NAT アドレス変換を実装するにはどうすればよいでしょうか?
1. 元のアドレスに基づく SNAT 変換
元のアドレスに基づく変換は、通常、多くの内部ネットワーク ユーザーが外部ネットワーク ポート経由でインターネットにアクセスする場合に使用されます。このとき、内部ネットワーク アドレスを外部ネットワーク IP に変換し、他のネットワーク アドレスに接続できるようになります。外部ネットワークIPの機能。したがって、iptables で変換する方法を定義する必要があります:
定義されたスタイル:
たとえば、192.168.10.0 ネットワーク セグメント内のすべての IP アドレスを、想定される外部ネットワーク アドレス 172.16.100.1 に変換する必要があります。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
このようにして、ローカル ネットワークからネットワーク カード経由でネットワークにアクセスしようとする人は、IP 172.16.100.1.
に変換されます。では、172.16.100.1 が修正されていない場合はどうなるでしょうか?
チャイナユニコムまたはチャイナテレコムを使用してインターネットにアクセスすると、通常、コンピュータの電源を入れるたびに外部 IP アドレスがランダムに生成されることは誰もが知っています。これは、外部ネットワーク アドレスが動的に変更されることを意味します。この時点で、外部ネットワーク アドレスを MASQUERADE (動的カモフラージュ) に変更する必要があります。外部ネットワーク アドレスを自動的に検出し、正しい外部ネットワーク アドレスに自動的に変更します。したがって、次のように設定する必要があります:
iptables -t nat -A ポストアウト中 -s 192.168.10.0/24 -j マスカレード
ここで注意してください: アドレスマスカレードはすべての場所に適用されるわけではありません。
2.DNAT ターゲット アドレス変換ターゲット アドレス変換の場合、データ フローの方向は外部から内部であり、ターゲット アドレス変換を通じて外部はクライアント、内部はサーバー側です。外部の IP が外部の外部ネットワークを介してサーバーにアクセスできるようにすることができます。 IP. サーバーですが、当社のサービスはイントラネット サーバー内の異なるサーバーに配置されます。
ターゲットアドレス変換はどのように行うのですか? :
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
ターゲット アドレス変換は、ネットワーク カードに到達する前に実行する必要があるため、PREROUTING 位置で実行する必要があります。
9: 制御ルールの保存と公開注: 再起動すると、定義した内容はすべて無効になります。有効にしたい場合は、コマンドを使用して保存する必要があります。
1.service iptables 保存コマンドファイル /etc/sysconfig/iptables に保存されます
2.iptables-save コマンド
iptables-save > /etc/sysconfig/iptables
3.iptables-restore コマンド
起動時に、/etc/sysconfig/iptabelsが自動的にロードされます
ロードできない、または起動時にロードされず、自分で作成した設定ファイル (iptables.2 と想定) を手動で有効にしたい場合:
iptables-restore /etc/sysconfig/iptables.2
これで、iptables で定義されたルールの手動検証が完了しました
10: まとめ
Iptables は非常に重要なツールです。すべてのファイアウォールでほぼ必須の設定であり、大規模なネットワークを構築するときにさまざまな理由で設定する必要があるものでもあります。 Iptablesをしっかり学ぶことで、ネットワーク全体の構造をより深く理解できると同時に、カーネル空間におけるデータの方向性やLinuxのセキュリティについてもしっかりと把握することができます。学習する際には、さまざまなプロジェクトや実験を組み合わせて完成させようとしますが、これは iptables の構成やさまざまな技術をさらに深めるのに非常に役立ちます。
以上がCentOS での iptables の使用方法の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。