(1) Netfilter は、Rusty Russell によって提案された Linux 2.4 カーネル ファイアウォール フレームワークであり、パケット フィルタリング、データなどのセキュリティ ポリシー アプリケーションで多くの機能を実現できます。パケット処理、アドレス マスカレード、透過プロキシ、動的ネットワーク アドレス変換 (ネットワーク アドレス変換、NAT)、およびユーザーおよびメディア アクセス制御 (メディア アクセス コントロール、MAC) アドレス ベースのフィルタリング、ステータス ベースのフィルタリング、パケット レート制限、等Iptables/Netfilter のこれらのルールは、その優れた設計思想のおかげで、あらゆる側面をカバーする多数の機能を形成するために柔軟に組み合わせることができます。
Netfilterは、Linuxオペレーティングシステムのコア層内のパケット処理モジュールであり、次の機能があります:
パケット内容の変更
パケットフィルタリングファイアウォール
( 2) Netfilter プラットフォームは、データ パケットの 5 つのマウント ポイント (コールバック関数ポイントとして理解できるフック ポイント) を定式化しています。データ パケットがこれらの場所に到達すると、関数がアクティブに呼び出され、方向を変更できるチャンスが与えられます。データ パケットがルーティングされるときのコンテンツ)、これら 5 つのマウント ポイントは、PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING。
PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。
(3)Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables
、链chains
、规则rules
组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。
(1)table有 filter、nat、mangle等规则表;
filter表
主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:
INPUT
链:INPUT针对那些目的地是本地的包
FORWARD
链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的
OUTPUT
链:OUTPUT是用来过滤所有本地生成的包
nat表
主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过
这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链
PREROUTING
链:作用是在包刚刚到达防火墙时改变它的目的地址
OUTPUT
链:改变本地产生的包的目的地址
POSTROUTING
(3) Netfilterの設定ルールは以下の通りです。 iptables は、カーネル メモリに格納されている XXtables (Netfilter の構成テーブル) を、Netfilter がリリースしたインターフェイスを介して変更するアプリケーション層アプリケーションです。この XXtables は、テーブル tables
、チェーン chains
、およびルール rules
で構成されます。iptables は、アプリケーション層でこのルール ファイルを変更します。同様のアプリケーションに firewalld があります。
2. フィルター、ナット、マングルとその他のルールの 4 つのテーブル
(1) テーブルにはフィルター、ナット、マングル、その他のルール テーブルがあります フィルターテーブル主にデータパケットをフィルタリングし、パッケージの特定のルール (DROP、ACCEPT、REJECT、LOG など) に従ったデータ。フィルター テーブルに対応するカーネル モジュールは iptable_filter で、これには 3 つのルール チェーンが含まれています:
INPUT code>チェーン: <img src="https://img.php.cn/upload/article/000/000/194/2b77b1dd802310258032a27a0b928085-2.png" alt="">INPUTは、宛先がローカルであるパケット用です
FORWARD
チェーン: 🎜FORWARDは、ローカルで生成されておらず、宛先がローカルではないすべてのパケットをフィルタリングします(つまり、 、ローカルマシンは転送のみを担当します) 🎜🎜🎜🎜🎜OUTPUT
チェーン: 🎜OUTPUT は、ローカルで生成されたすべてのパケットをフィルターするために使用されます 🎜🎜🎜🎜🎜🎜🎜 nat テーブル 🎜🎜🎜🎜🎜主にパケットの IP アドレス、ポート番号、その他の情報 (SNAT、DNAT、MASQUERADE、REDIRECT などのネットワーク アドレス変換) を変更するために使用されます。フローに属するパケット (パケット サイズの制限により、データが複数のパケットに分割される場合があります) は、このテーブルを 1 回だけ通過します。最初のパケットに NAT またはマスカレードが許可されている場合、残りのパケットには自動的に同じ操作が適用されます。つまり、残りのパケットはこのテーブルを通過しません。テーブルに対応するカーネル モジュールは iptable_nat で、これには 3 つのチェーン 🎜🎜PREROUTING
が含まれています。 > チェーン: 🎜この機能は、パケットがファイアウォールに到達したときに、パケットの宛先アドレスを変更することです🎜🎜🎜🎜🎜OUTPUT
チェーン: 🎜ローカルに生成されたパケットの宛先アドレスを変更します🎜🎜🎜🎜 🎜POSTROUTING code> チェーン: 🎜ファイアウォールを離れる前にパケットの送信元アドレスを変更します🎜🎜🎜🎜🎜🎜 🎜マングルテーブル🎜🎜🎜🎜 主にTOS(サービスタイプ、サービスタイプ)を変更するために使用されます)、データ パケットの TTL (Time To) Live、ライフ サイクル) は、Qos (Quality Of Service、サービス品質) 調整およびポリシー ルーティング アプリケーションを実装するためにデータ パケットのマーク マークを設定することを指します。これは、対応するルーティング機器のサポートを必要とするためです。あまり広く使われていません。 PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD の 5 つのルール チェーンが含まれます。 🎜🎜 🎜🎜raw table🎜🎜🎜🎜 は、バージョン1.2.9以降、iptablesに追加された新しいテーブルで、主にデータパケットがステータス追跡メカニズムによって処理されるかどうかを判断するために使用されます。データ パケットを照合する場合、生のテーブルのルールが他のテーブルより優先されます。 2 つのルール チェーン - OUTPUT、PREROUTING が含まれます🎜🎜🎜🎜🎜🎜<p>(2) iptables のデータ パケットの 4 つの異なる <strong> 状態と </strong> 追跡される接続の 4 種類 <strong>: </strong></p>
<ul class=" list-paddingleft-2"><ul class=" list-paddingleft-2" style="list-style-type: square;">
<li><p><strong><code>NEW
: NEW
:该包想要开始一个连接(重新连接或将连接重定向)
RELATED
:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0
( ping 应答) 就是--icmp-type 8
(ping 请求)所RELATED出来的。
ESTABLISHED
:只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
INVALID
:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。
(1)在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:
INPUT
链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT
链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD
链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
PREROUTING
链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
POSTROUTING
パッケージは接続を開始しようとしています (再接続またはリダイレクト)接続)
関連
: --icmp-type 0
(ping 応答) は --icmp-type 8
(ping 要求) と関連しています。
ESTABLISHED
: 応答が送受信されている限り、データ接続は NEW から ESTABLISHED に変化し、このステータスはこの接続の後続のデータ パケットと引き続き一致します。
INVALID
: データ パケットがどの接続に属しているかを識別できないか、メモリ オーバーフローやどの接続に属さない ICMP エラー メッセージなどのステータスを持っていません。通常、このステータスのデータはすべて DROP する必要があります。
3、INPUT、FORWARD、その他のルール 5 つのチェーンとルール
INPUT
チェーン: 🎜🎜🎜🎜🎜
OUTPUT
チェーン: 🎜🎜このチェーンは、ファイアウォールがルールでネイティブにパケットを送信 (アウトバウンド) するときに適用されます。 。 🎜🎜🎜🎜🎜🎜🎜🎜🎜FORWARD
チェーン: 🎜🎜 を介して他のアドレスに送信する必要があるパケットが受信 (転送) されたとき。ファイアウォール、このチェーンのルールを適用します。 🎜🎜🎜🎜🎜🎜🎜🎜🎜PREROUTING
チェーン: 🎜🎜 パケットをルーティングする前に、DNAT などのこのチェーンのルールを適用します。 🎜🎜🎜🎜🎜🎜🎜🎜🎜POSTROUTING
チェーン: 🎜🎜 パケットをルーティングした後、このチェーン内のルール ( SNAT など) を適用します。 🎜🎜🎜🎜🎜🎜🎜🎜 🎜🎜 (2) その中で、INPUT チェーンと OUTPUT チェーンは、主にサーバー自体に出入りするデータのセキュリティ制御のために使用されることが多いです。 FORWARD、PREROUTING、および POSTROUTING チェーンは、特にファイアウォール サーバーがゲートウェイとして使用される場合に、「ネットワーク ファイアウォール」で広く使用されています。 🎜🎜🎜 4. Linux パケットルーティングの原理 🎜🎜🎜 🎜🎜 − in を介してのパケットルーティングの役割は何ですか? 🎜🎜 ワークフロー: ネットワーク ポート データ パケットは、データ リンク層によって解凍された後 (データ リンク フレーム ヘッダーを削除)、基礎となるネットワーク カード NIC によって受信され、TCP/IP プロトコル スタック (本質的にはネットワーク データ パケット) に入ります。処理カーネル ドライバー) と Netfilter の混合パケット処理フロー。データ パケットの受信、処理、転送のプロセスは、一連のカーネル処理関数と Netfilter フック ポイントを通過した後、最終的にこの上位層アプリケーションによって転送またはダイジェストされます。 🎜🎜図に示すように: 🎜🎜🎜🎜🎜 上の図から、次のルールを要約できます: 🎜🎜🎜🎜🎜 データ パケットがネットワーク カードに入るとき、データ パケットは最初に 🎜PREROUTING チェーン🎜 に入ります。 PREROUTING チェーンでは、データ パケットの DestIP (宛先 IP) を変更する機会があり、その後、カーネルの「ルーティング モジュール」が、「データ パケットの宛先 IP」と「ルーティング テーブル」に基づいてパケットを転送する必要があるかどうかを判断します。 (データ パケットの DestIP が当社によって変更されている可能性があることに注意してください)🎜🎜🎜🎜データ パケットがローカル マシンに入った場合 (つまり、データ パケットの宛先 IP が、カーネルのネットワーク ポート IP である場合)ローカルマシン)、データパケットは図に沿って下に移動し、 🎜INPUT チェーン🎜 に到達します。パケットが INPUT チェーンに到達すると、どのプロセスもそれを受け取ります 🎜
このマシン上で実行されているプログラムもデータ パケットを送信できます。これらのデータ パケットは OUTPUT チェーンを通過し、POSTROTING チェーン出力 に到着します (データ パケットの SrcIP は当社によって変更されている可能性があることに注意してください)この時点)
FORWARDチェーンを経て、POSTROUTINGチェーン出力に到達します(サブネットに対応するネットワークポートを選択して送信します)
5 、 iptables の記述ルール
コマンド形式:
例:
1 iptables -I INPUT -秒 0/0 -d 192.168.42.153 -p tcp -m multiport --dports 22, 80,3306 -j ACCEPT
1 iptables -t filter -I INPUT -d 192.168.42.153 -p tcp --dport 80 -j ACCEPT
<strong>1.[-t 表名]</strong>
:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
-A
:新增一条规则,到该规则链列表的最后一行
-I
:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
-D
:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
-R
:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
-P
:设置某条规则链的默认动作
-nL
:-L
、-n
,查看当前运行的防火墙规则列表
2.chain名
:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
[规则编号]
:插入、删除、替换规则时用,--line-numbers
显示号码
[-i|o 网卡名称]
:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
[-p 协议类型]
:可以指定规则应用的协议,包含tcp、udp和icmp等
[-s 源IP地址]
:源主机的IP地址或子网地址
[--sport 源端口号]
:数据包的IP的源端口号
[-d目标IP地址]
:目标主机的IP地址或子网地址
[--dport目标端口号]
:数据包的IP的目标端口号
<strong>3.-m</strong>
:extend matches,这个选项用于提供更多的匹配参数,如:
-m state --state ESTABLISHED,RELATED
-m tcp --dport 22
-m multiport --dports 80,8080
-m icmp --icmp-type 8
<strong>4.<-j 动作></strong>
:处理数据包的动作,包括ACCEPT、DROP、REJECT等
ACCEPT
:允许数据包通过
DROP
:直接丢弃数据包,不给任何回应信息
REJECT
:拒绝数据包通过,必要时会给数据发送端一个响应的信息。
SNAT
:源地址转换。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。MASQUERADE
: このルールがどのテーブルで動作するか。filter、nat などを使用できます。指定されていない場合、デフォルトは filter
-A
: 新しいルールを追加しますルールチェーンリストの最後の行に🎜🎜🎜🎜-I: この位置のルールが順番に移動されます。番号が指定されていない場合は、1🎜🎜🎜になります。 🎜<code>-D
: ルール チェーンからルールを削除するか、「完全なルール」を入力するか、ルール番号を指定して削除します。🎜🎜🎜🎜-R
: ルールを置き換えます。ルールを置換しても順序は変更されないため、番号を指定する必要があります。 🎜🎜🎜🎜-P
: 特定のルールチェーンのデフォルトアクションを設定します🎜🎜🎜🎜-nL
: -L
, - n
、現在実行中のファイアウォール ルールのリストを表示します🎜🎜🎜🎜🎜 🎜2.chain name
: INPUT、OUTPUT、FORWARD、PREROUTING など、ルール テーブルのどのチェーンを指定します。 、など🎜🎜[ルール番号]
: 挿入 ルールを削除または置換するときは、--line-numbers
を使用して番号を表示します 🎜🎜🎜🎜[-i|o network card name]
: iデータ パケットがネットワーク カード エントリから送信されるブロックを指定します。 o データ パケットがどのネットワーク カードから出力されるかを指定します。 tcp、udp、icmp などを含む🎜🎜🎜🎜[-s 送信元 IP アドレス][--sport sourceポート番号]
: データパケット番号の IP の送信元ポート 🎜🎜🎜🎜[-d target IP address]
: ターゲットホストの IP アドレスまたはサブネットアドレス 🎜🎜 🎜🎜[--dport ターゲット ポート番号]
: データ パケットの IP のターゲット ポート番号 🎜🎜🎜🎜🎜 🎜3.-m🎜
🎜: 拡張一致、このオプションは、次のような、より多くの一致パラメータを提供するために使用されます: 🎜🎜同意
: 🎜パケットの通過を許可します🎜🎜🎜🎜🎜DROP
: 🎜応答情報を与えずにデータパケットを直接破棄します🎜🎜🎜🎜🎜REJECT
: 🎜データパケットの通過を拒否します、必要に応じてデータ送信側に応答情報を与えます。 🎜🎜🎜🎜🎜SNAT
: 🎜ソースアドレス変換。ルーティング レベルでルートに入った後、ローカル ネットワーク スタックから出る前に、送信元アドレスは書き換えられ、宛先アドレスは変更されず、データが返されるときにローカル マシン上に NAT テーブル エントリが確立されます。をNATテーブルに従ってデータに書き換えてホストに送信します。イントラネット ユーザーが同じパブリック ネットワーク アドレスを使用してインターネットにアクセスする問題を解決します。 MASQUERADE
は特別な形式の SNAT で、adsl のように一時的に変更される IP アドレスに適しています🎜DNAT
: ターゲットアドレス変換。 SNAT とは対照的に、IP パケットがルートを通過する前に、宛先アドレスは変更されず、ローカル マシン上で NAT エントリが確立され、データが返されると送信元アドレスが変更されます。データがリモート ホストに送信されたときに、同時に NAT テーブルに宛先アドレスに転送されます。バックエンドサーバーの実際のアドレスを隠すことができます。 (この場所が SNAT で逆に書かれていることを指摘してくれたネチズンに感謝します)REDIRECT
: これは、(ターゲットに関係なく) ネットワーク パケットをローカル ホストに転送する特別な形式の DNAT です。このマシンでのポート転送を容易にするために、IP ヘッダーで指定されています) アドレスは何ですか)。 DNAT
:目标地址转换。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。(感谢网友提出之前这个地方与SNAT写反了)REDIRECT
:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。
LOG
:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
除去最后一个LOG
LOG
:ログ情報を /var/log/messages ファイルに記録し、パケットを次のルールに渡します🎜🎜
🎜 最後の LOG
を除き、最初の 3 つのルールがパケットに一致すると、それ以上パケットは一致しないため、記述されたルールの順序は非常に重要です。 🎜🎜🎜以上がLinux の iptables の原理を図で詳しく説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。