Linux iptables Firewall Simplified Examples
前の記事では、強化のベストプラクティスを使用してLinuxサーバーを保護する方法について説明しました。 何人かの人々は、iptablesファイアウォールの簡単な紹介であったファイアウォールのセクションについて私に尋ねました。 今日は、Linux iptablesファイアウォールとその素晴らしいファイアウォールを使用してサーバートラフィックを保護する方法を詳細に説明します。
目次
CentOS7のIptables
CentOS7を使用している場合は、firewalldがiptablesを管理していることがわかりますので、iptablesに戻りたい場合は、firewalldを停止してマ
$ systemctl stop firewalld$ systemctl mask firewalld
次にiptablesサービスをインストールして有効にします。
$ yum install iptables-services$ systemctl enable iptables
次に起動できます。
$ systemctl start iptables
Linuxファイアウォールがどのように動作するか
Iptablesファイアウォール機能は、利用可能なNetfilterフレームワーク上に構築されていますパケットフィルタリングのためのlinuxカーネルで。
ファイアウォールの種類
ファイアウォールには二つのタイプがあります。
ステートレスファイアウォールは各パケットを独自に処理します。
ステートフルファイアウォールこのタイプのファイアウォールは、それを通過するすべてのパケットを気にするので、接続の状態を知っています。 これは、トラフィックをより詳細に制御できます。
Netfilterにはテーブルが含まれています。 これらのテーブルにはチェーンが含まれており、チェーンには個々のルールが含まれています。
パケットがいずれかのルールに一致する場合、iptablesはそのパケットにルールアクションを適用します。
アクションは次のようになります: より多くの処理のために、パケットを受け入れる、拒否する、無視する、または他のルールに渡す。
Netfilterは、IPアドレスとポート番号を使用して着信または発信トラフィックを処理できます。
iptablesコマンドはNetfilterを管理および設定します。
ファイアウォールコマンドの記述を開始する前に、ファイアウォールルールを簡単に記述できるように、ファイアウォールの構造を少し理解する必要が
iptables firewall tables
Netfilterには、処理のためのルールを運ぶことができる三つのテーブルがあります。
iptablesフィルタテーブルは、トラフィックを処理するためのメインテーブルです。2番目はNATテーブルで、NATルールを処理します。
第三のテーブルは、パケットをマングリングするためのマングルテーブルです。
テーブルチェーン
上記のテーブルの各テーブルにはチェーンが含まれています。
フィルタテーブルには、順方向、入力、および出力チェーンが含まれています。 カスタムチェーンを作成してルールを保存することができます。
パケットがホストに来ている場合、iptablesは入力チェーンルールによってそれを処理します。
パケットが別のホストに送信されている場合、それは出力チェーンルールがそれを処理することを意味します。
iptablesは、ホストにアクセスしたが別のホストに宛てられているパケットを処理するためにフォワードチェーンを使用します。
チェーンポリシー
フィルタテーブル内の各チェーンにはポリシーがあります。 ポリシーは、iptablesが実行するデフォルトのアクションです。
ポリシーは、DROP、REJECT、およびACCEPTにすることができます。
ACCEPTポリシーは、パケットがファイアウォールを通過することを許可します。 ドロップポリシーは、クライアントに通知せずにパケットをドロップします。 拒否ポリシーはまた、パケットをドロップし、送信者に通知します。
セキュリティの観点からは、ホストに来るすべてのパケットを削除し、信頼できるソースから来るパケットのみを受け入れる必要があります。
Iptablesルールの追加
次のようにiptablesコマンドを使用して新しいルールを追加できます。
$ iptables -A INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT
このコマンドを分割して、すべてを理解できるようにしましょう。
-Aは、新しいルールを追加していることを意味します。 デフォルトでは、iptablesは、別のテーブルを指定しない限り、すべての新しいルールをフィルタテーブルに追加します。
-iフラグは、ルールを適用するデバイスを指定します。 デバイスを指定しない場合、iptablesはデバイスに関係なくすべての着信トラフィックにルールを適用します。
-pフラグは、処理するパケットのプロトコルを指定します。
–dportフラグは、宛先ポートを指定します。
-dは、宛先IPアドレス1.2.3.4を指定します。 宛先IPアドレスが指定されていない場合、IPアドレスに関係なく、ルールはeth1上のすべての着信トラフィックに適用されます。
-jは、実行するアクションまたはジャンプアクションを指定します。 ここでは、acceptポリシーを使用してパケットを受け入れています。
上記のルールは、ポート80にある着信HTTPトラフィックを許可します。
発信トラフィックを許可するにはどうすればよいですか?P>
$ iptables -A OUTPUT -o eth1 -p tcp --sport 80 -j ACCEPT
-aフラグを使用して、出力チェーンにルールを追加できます。
-oフラグは、発信トラフィックに使用されるデバイスに使用されます。
-sportフラグは、送信元ポートを指定します。sportまたはdportでは、数値のポート番号の代わりに、httpまたはhttpsなどのサービス名を使用できます。 すべてのサービス名は/etc/servicesファイルにあります。
ルールの読み取りを容易にするために、ポート番号ではなくサービス名を使用する必要があります。
iptablesルールの順序
iptablesはチェーンの最後に新しいルールを配置します。 -Iオプションを使用してトップに追加できます。あなたが今見るようにルールの順序が重要です。
あなたが今見るようにルールの順序が重要です。
Iフラグを使用して、必要な場所にルールを正確に挿入できます。
ルールの順序付けがどのように重要であるかを理解するために、次のルールを見てください。
$ iptables -I INPUT 3 -i eth1 -p udp -j ACCEPT$ iptables -I INPUT 4 -i eth1 -p udp --dport 80 -j DROP
最初のルールはすべてのUDPトラフィッ
第二のルールは、ポート80に入るトラフィックをドロップします。
最初のルールはすべてのトラフィックを受け入れ、iptablesが最初のルールでトラフィックを渡すので、トラフィックをドロップする第二のルールは何もしチェーン内のルールの順序が重要なので、あなたのルールは意味をなさないはずです。
あなたのルールは意味をなさないはずです。
list iptables rules
-Lフラグを使用してチェーン内のルールを一覧表示できます。
$ iptables -L INPUT
–line-numbersを使用してルールの行番号を表示できます。
$ iptables -L INPUT --line-numbers
リストにはサービスの名前が表示されます。 代わりに-nオプションを使用してポート番号を表示できます:P>
$ iptables -L INPUT -n --line-numbers
上記のルールは、IPTABLESがDNS解決とサービス検索を妨げるため、リストを高速化します。
すべてのチェーンのすべてのルールを次のように一覧表示できます。
$ iptables -L -n --line-numbers
各ルールで処理されたパケットの数を取得するには、-vフラグを使用できます。
$ iptables -L -v
また、-Zフラグを使用してカウンタをゼロにリセットすることもできます。これで、必要なチェーンに新しいルールを追加し、特定の順序でルールを挿入し、チェーンまたはすべてのチェーンのルールを一覧表示できますが、ルールを削除す
ルールの削除
-Dフラグを使用してルールを削除できます。
$ iptables -D INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT
このコマンドは、前に指定したHTTPルールを削除します。
ルールを削除する前に、ルールの指定をリストして確認してから削除してください。
ルール仕様を記述する代わりに、注文番号を使用してルールを削除することができます。p>
$ iptables -D INPUT 2
-Fフラグを使用して、特定のチェーン内のすべてのルールを削除することができます。
$ iptables -F INPUT
-Fフラグを使用するときにチェーン名を言及するのを忘れた場合、すべてのチェーンルールが削除されます。
ルールの置換
-Rフラグを使用して、既存のルールを独自のルールに置き換えることができます。
$ iptables -R INPUT 1 -i eth1 -p tcp --dport httpht -d 1.2.3.4 -j ACCEPT
このコマンドは、入力チェインの最初のルールを入力されたルールに置き換えます。
特定のテーブルのリスト
特定のテーブルをリストするには、次のようなテーブル名で-tフラグを使用します。
$ iptables -L -t nat
ここでは、natテーブル
Iptablesユーザー定義チェーン
ユーザー定義チェーンを作成するには、-Nフラグを使用します。また、-Eフラグを使用して名前を変更することもできます。p>
$ iptables -E MY_CHAIN NEW_NAME
そして、-Xフラグを使用してユーザー定義のチェーンを削除することができます。
$ iptables -X MY_CHAIN
-Xフラグを使用するときにチェーン名を言及しないと、すべてのユーザー定義チェーンが削除されます。 入力や出力などの組み込みチェーンを削除することはできません。
ユーザー定義チェーンへのリダイレクト
-jフラグを使用して、組み込みチェーンのようなユーザー定義チェーンにパケットをリダイレクトできます。
$ iptables -A INPUT -p icmp -j MY_CHAIN
上記のルールは、すべてのICMPトラフィックをチェーンMY_CHAINにリダイレクトします。
チェーンのデフォルトポリシーの設定
-Pフラグを使用して、特定のチェーンのデフォルトポリシーを設定できます。 デフォルトのポリシーは、ACCEPT、REJECT、およびDROPです。
$ iptables -P INPUT DROP
だから今、入力チェーンは、任意の着信トラフィックを許可するルールを記述しない限り、来る任意のパケットをドロップします。
SYN Flooding
攻撃者はTCPハンドシェイクを完了せずにSYNパケットのみを送信し、その結果、受信ホストは多くの開いた接続を持ち、サーバーはビジー状態に
iptables firewallのlimitモジュールを使用して、SYNフラッドから私たちを保護することができます。
$ iptables -A INPUT -i eth1 -p tcp --syn -m limit --limit 10/second -j ACCEPT
ここでは、毎秒10個のSYNパケットのみを指定します。 この値は、ネットワークのニーズに応じて調整できます。
これによりネットワークが制限される場合は、SYN cookieを使用できます。
SYN Cookie
ファイルに
/etc/sysctl.conf
次の行を追加します。
net.ipv4.tcp_syncookies = 1
保存してリロードします。
$ sysctl -p
DROP INVALID State Packets
無効な状態パケットは、どの接続にも属していないパケットであり、それらをドロップします。p>
$ iptables -A INPUT -m state --state INVALID -j DROP
このルールは、すべての着信無効な状態パケットを削除します。
Drop Fragmented Packets
断片化されたパケットは、大きな不正な形式のパケットの断片であり、それらを削除するルールを記述する必要があります。
-fフラグは、iptablesファイアウォールにすべてのフラグメントを選択するように指示します。 したがって、iptablesをルーターとして使用していない場合は、断片化されたパケットを削除できます。サーバーを再起動すると、書いたすべてのルールが失われるため、それらを永続化するにはどうすればよいですか?CentOSまたはRed Hatを使用している場合は、iptables-saveコマンドを使用してすべてのルールを保存できます。CentOS7では、次のようなルールを保存できます。
$ service iptables save
フィルタテーブルのような特定のテーブルのみを保存できます:また、iptables-restoreを使用してルールを復元することもできます。Debianベースのディストリビューションでは、iptables-persistentパッケージを使用してルールを保存および復元できます。まず、それをインストールします:
$ apt-get install iptables-persistent
次に、ルールを保存して復元することができます:
$ netfilter-persistent save
$ netfilter-persistent reload
iptablesファイアウォールが簡単であることを願っています。 戻ってきてありがとうございます。
ありがとうございます。
Likeeksの創設者。 私は2010年からLinuxシステム管理者として働いています。 私は、世界中の複数のクライアントのLinuxサーバーの維持、保護、およびトラブルシューティングを担当しています。 私は自分の仕事を自動化するためにシェルとPythonスクリプトを書くのが大好きです。p>
Leave a Reply