web-dev-qa-db-ja.com

iptablesと一般的なファイアウォールの落とし穴をデバッグしていますか?

これは、Linuxシステムでのソフトウェアファイアウォールの理解とデバッグについての提案標準的な質問 です。

EEAAの回答 と@Shogのコメントに対応して、iptablesに関する一般的な比較的単純な質問を閉じるには、適切な正規のQ&Aが必要です。

Linuxソフトウェアファイアウォール、 netfilter パケットフィルタリングフレームワークの問題をデバッグするための構造化された方法は何ですか?ユーザーランドインターフェイスiptables

よくある落とし穴、繰り返し発生する質問、そして時折ファイアウォール管理者が見過ごすか、そうでなければ知ることから利益を得るかもしれないことを確認するための単純なまたは少しあいまいなものは何ですか?

[〜#〜] ufw [〜#〜] などのツールを使用する場合でも、 FirewallD (aka firewall-cmd)、 Shorewall または同様のツールでは、これらのツールが提供する抽象化レイヤーを使用せずに、内部を調べることでメリットが得られる可能性があります。

この質問は、ファイアウォールを構築するためのハウツーを意図したものではありません。そのための 製品ドキュメント を確認し、たとえば、レシピを iptables Trips&Tricks に投稿するか、タグ付きの検索- iptablesfwfirewalldfirewall-cmd 既存の質問 頻繁に よく評価されている 高得点 Q&A。

18
HBruijn

一般に:

ファイアウォール構成を表示および変更するには、制限されたポート番号範囲でサービスを開く場合と同様に、管理者特権(root)が必要です。つまり、rootとしてログインするか、Sudoを使用してrootとしてコマンドを実行する必要があります。そのようなコマンドをオプションの[Sudo]でマークしようとします。

目次:

  1. 順序の問題、または-I-Aの違い
  2. 現在のファイアウォール構成を表示する
  3. iptables -L -v -nの出力の解釈
  4. あなたの環境を知る
  5. INPUTチェーンとFORWARDチェーン
  6. カーネルモジュール

1.順序の問題、または-I-Aの違い

覚えておくべきことは、ファイアウォールルールはリストされている順序でチェックされるということです。パケットまたは接続を許可または拒否するルールがトリガーされると、カーネルはチェーンの処理を停止します。

最も一般的な間違いは、ファイアウォール管理の初心者にとって、次のような新しいポートを開くための正しい手順に従うことです。

[Sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT

そして、それが有効にならないことを発見します。

その理由は、-Aオプションが新しいルール既存のすべてのルールの後にを追加するためです。既存のファイアウォールの最終ルールは、明示的に許可されていないすべてのトラフィックをブロックするルールであることが多く、に

...
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-Host-prohibited
8        0  0    ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080

またはiptables-saveの同等のもの:

...
iptables -A INPUT  -j REJECT
iptables -A INPUT  -p tcp --dport 8080 -j ACCEPT

また、新しいルールの開始TCPポート8080に到達することはありません(カウンタが頑固に0パケットと0バイトに残っていることからも明らかです)。

-Iを使用してルールを挿入すると、新しいルールがチェーンの最初になり、機能します。

2.現在のファイアウォール構成を表示する

ファイアウォール管理者に対する私の推奨は、ユーザーフレンドリーなツールからファイアウォールの問題を診断しようとするのではなく、Linuxカーネルが実行している実際の構成を調べることです。多くの場合、根本的な問題を理解すると、それらのツールでサポートされている問題を簡単に解決できます。

コマンド[Sudo] iptables -L -v -nはあなたの友達です(ただし、iptables-saveを好む人もいますが)。多くの場合、構成について説明するときに、--line-numbersオプションを使用して行に番号を付けると便利です。ルール#Xを参照すると、それらの議論が多少容易になります。
注: NATルールはiptables-saveの出力に含まれますが、-t natオプション、つまり[Sudo] iptables -L -v -n -t nat --line-numbersを追加して個別にリストする必要があります。

コマンドを複数回実行し、増加するカウンターをチェックすることは、新しいルールが実際にトリガーされるかどうかを確認するのに役立つツールです。

[root@Host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     784K   65M fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
2    2789K  866M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3       15  1384 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-Host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-Host-prohibited

Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain fail2ban-SSH (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       117.239.37.150       0.0.0.0/0           reject-with icmp-port-unreachable
2        4   412 REJECT     all  --  *      *       117.253.208.237      0.0.0.0/0           reject-with icmp-port-unreachable

または、iptables-saveの出力は、上記のファイアウォール構成を再生成できるスクリプトを提供します。

[root@Host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-Host-prohibited
-A FORWARD -j REJECT --reject-with icmp-Host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT

何を理解しやすいかは好みの問題です。

3. iptables -L -v -nの出力を解釈する

Policyは、一致する明示的なルールがない場合にチェーンが使用するデフォルトのアクションを設定します。すべてのトラフィックを受け入れるように設定されているINPUTチェーン内。

INPUTチェーンの最初のルールはすぐに興味深いもので、TCPポート22(tcp dpt:22)宛てのすべてのトラフィック(送信元0.0.0.0/0および宛先0.0.0.0/0)を送信しますカスタムターゲットへのSSHのデフォルトポート(fail2ban-SSH)。名前が示すように、このルールはfail2banによって維持されます(特に、悪用の可能性がないかシステムログファイルをスキャンし、不正ユーザーのIPアドレスをブロックするセキュリティ製品)。

そのルールは、iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSHと同様のiptablesコマンドラインによって作成されたか、-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSHとしてiptables-saveの出力にあります。多くの場合、これらの表記のいずれかがドキュメントに記載されています。

カウンターは、このルールが784'000パケットと65メガバイトのデータに一致したことを示しています。

この最初のルールに一致するトラフィックは、非標準チェーンとしてOUTPUTチェーンの下にリストされているfail2ban-SSHチェーンによって処理されます。

そのチェーンは、ブロックされている(reject-with icm-port-unreachableで)不正ユーザーごとに1つ(ソースIPアドレス117.253.221.166または58.218.211.166)の2つのルールで構成されています。

 -A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
 -A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable

これらのブロックされたホストからのものではないSSHパケットはまだ許可も禁止もされておらず、カスタムチェーンが完了したため、INPUTチェーンの2番目のルールに対してチェックされます。

ポート22宛てではないすべてのパケットは、INPUTチェーンの最初のルールを通過し、INPUTルール#2でも評価されます。

INPUTルール番号2により、これは接続を追跡するstatefull firewallになることを意図しています。これにはいくつかの利点があります。新しい接続のパケットだけを完全なルールセットに対してチェックする必要がありますが、いったん許可されると、確立された接続または関連する接続に属する追加のパケットは、それ以上チェックされずに受け入れられます。

入力ルール#2はすべての開いている関連する接続に一致し、そのルールに一致するパケットはさらに評価する必要はありません。

注:ステートフルファイアウォールの構成におけるルールの変更は、確立された接続ではなく、新しい接続にのみ影響します。

対照的に、単純なパケットフィルターは、接続状態を追跡することなく、すべてのパケットを完全なルールセットに対してテストします。そのようなファイアウォールではstateキーワードは使用されません。

INPUTルール#3は非常に退屈で、ループバック(loまたは127.0.0.1)インターフェースに接続するすべてのトラフィックが許可されます。

INPUTルール4、5、6は、新しい接続へのアクセスを許可することにより、TCPポート22、80、および443(それぞれSSH、HTTP、HTTPSのデフォルトポート))を開くために使用されます(既存の接続はすでにINPUTルール2)で許可されています。

ステートレスファイアウォールでは、これらのルールは状態属性なしで表示されます。

4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0

または

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

最後のINPUTルール#7は、INPUTルール1〜7でアクセスを許可されなかったすべてのトラフィックをブロックするルールです。かなり一般的な慣例:許可されていないものはすべて拒否されます。理論的には、デフォルトのPOLICYをREJECTに設定することにより、このルールを省略することができたはずです。

常にチェーン全体を調査します。

4.環境を知る

4.1。ソフトウェアファイアウォールの設定は、ネットワークの他の場所で維持されているセキュリティ設定に影響しません。つまり、iptablesでネットワークサービスを開いても、ルーターやその他の未変更のアクセス制御リストネットワークのファイアウォールはまだトラフィックをブロックする可能性があります...

4.2。待機しているサービスがない場合、ファイアウォールの設定に関係なく、接続して 接続拒否エラー を取得することはできません。したがって:

  • サービスが(正しいネットワークインターフェイス/ IPアドレスで)リッスンしており、[Sudo] netstat -plnutで予期されるポート番号を使用していることを確認するか、ss -tnlpを使用します。
  • サービスがまだ実行されていない場合は、たとえばnetcatを使用してシンプルなリスナーをエミュレートします。TLS/ SSLリスナーが必要な場合は[Sudo] nc -l -p 123またはopenssl s_server -accept 1234 [options](オプションについてはman s_serverを確認してください)。
  • リモートホストから同じことを試す前に、サーバー自体、つまりtelnet <IP of Server> 123またはecho "Hello" | nc <IP of Server> 123、またはTLS/SSLで保護されたサービスopenssl s_client -connect <IP of Server>:1234をテストするときに接続できることを確認してください。

4.3。サービスで使用されるプロトコルを理解します。十分に理解していないサービスを適切に有効/無効にすることはできません。例えば:

  • TCPまたはUDPが使用されていますか、または両方(DNSと同様)ですか?
  • サービスは固定のデフォルトポートを使用していますか(たとえば、TCP Webサーバーのポート80)など)?
  • 代わりに、変化する可能性のある動的ポート番号が選択されていますか(つまり、Portmapに登録する従来のNFSのようなRPCサービス)?
  • 悪名高いFTPは2つのポートも使用します。パッシブモードを使用するように構成されている場合、固定ポート番号と動的ポート番号の両方です...
  • /etc/servicesのサービス、ポート、およびプロトコルの説明は、ポートを使用する実際のサービスと必ずしも一致しません。

4.4。ネットワーク接続を制限する可能性があるのは、カーネルパケットフィルターだけではありません。

  • SELinuxがネットワークサービスを制限している可能性もあります。 getenforceは、SELinuxが実行されているかどうかを確認します。
  • TCP=ラッパーは依然としてネットワークセキュリティを強化する強力なツールです。ldd /path/to/service |grep libwrapおよび/hosts.[allow|deny]制御ファイルを確認してください。

5. INPUTまたはFORWARDチェーン

チェーンの概念はより完全に説明されています here しかし、それの短いものは:

INPUTチェーンは、iptablesコマンドを発行するホスト上で、ローカルで実行されているサービスのネットワークポートを開いたり閉じたりする場所です。

FORWARDチェーンは、カーネルによって他のシステム、実際のシステムだけでなく、Dockerコンテナーおよび仮想ゲストサーバーに転送されるトラフィックをフィルターするルールを適用する場所です。ブリッジ、ルーター、ハイパーバイザーとして、および/またはネットワークアドレス変換とポート転送を行います。

よくある誤解は、DockerコンテナーまたはKVMゲストがローカルで実行されるため、適用されるフィルター規則はINPUTチェーンにあるはずですが、通常はそうではありません。

6.カーネルモジュール

パケットフィルターはLinuxカーネル内で実行されるため、動的モジュール、実際には複数のモジュールとしてコンパイルすることもできます。ほとんどのディストリビューションにはnetfilterがモジュールとして含まれており、必要なnetfilterモジュールは必要に応じてカーネルに読み込まれますが、一部のモジュールではファイアウォール管理者が手動で読み込まれるようにする必要があります。これは主に、insmodでロードできるnf_conntrack_ftpなどの接続追跡モジュールに関係します。

実行中のカーネルに現在ロードされているモジュールは、lsmodで表示できます。

リブート後もモジュールが永続的にロードされるようにする方法は、Linuxディストリビューションによって異なります。

14
HBruijn

さまざまなプロトコルの一般的な問題

DNS: DNSはデフォルトでポート53 UDPを使用しますが、単一のUDPデータグラムに収まらないメッセージは、代わりにTCPを使用して送信されます(通常はゾーン転送など)ポートが必要です53 TCPは、ネームサーバーの実行時にも開かれます。

Email:多くのコンシューマーISPはSMTPトラフィック(または少なくともデフォルトのポートTCP 25)をブロックするため、電子メールを直接送受信することができず、顧客はISPを使用する必要がありますすべての送信メールおよび場合によっては受信メールのSMTPリレー。 §1.1に関連します。

FTP: FTPはtwo接続が使用されるという点で奇妙なプロトコルです。 1つ目は制御接続です。デフォルトでは、FTPサーバーはTCPポート21でリッスンします。制御接続は、認証とコマンドの発行に使用されます。実際のファイル転送や、ディレクトリ一覧の出力などは2番目のTCP接続、DATA接続を経由します。アクティブなFTPでは、DATA接続はFTPサーバーからTCPポート20から開始され、FTPクライアントに接続します。アクティブFTPは、ファイアウォールやNATゲート​​ウェイの背後にいるユーザーとうまく連携しないため、ほとんど使用されていません。ほとんどのFTPサーバーは、代わりにパッシブFTPをサポートしています。パッシブFTPを使用すると、FTPサーバーは2番目のポートでDATA接続のリスナーを開き、そこにFTPクライアントが接続できます。ファイアウォールの問題は、DATAポートが1024〜65536の任意の利用可能な非特権ポートである可能性があることです。

FTPサーバーが割り当てる可能性のあるパッシブポートの数を制限し、それらのポートを明示的に開くことによって通常解決されるステートレスファイアウォール。つまり.

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT

ステートフルファイアウォールでは、DATAポートを明示的に開く必要はありません。netfilterヘルパーモジュールは、割り当てられた動的ポートを認識し、DATA接続をRELATEDとしてマークすることにより、正しいクライアントに対してそのポートを動的に開きます。それは一般的なルールに一致します:

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT

これには、適切なカーネルモジュールが読み込まれている必要があります。FTPの場合は、たとえばinsmod nf_conntrack_ftpを実行して手動で再起動する必要があります。

注:制御接続が暗号化され、nf_conntrack_ftpがPASV応答を読み取ることができなくなるため、FTPがSSLで使用されている場合、FTP接続追跡モジュールは失敗します。

[〜#〜] nfs [〜#〜]および同様のRPCサービス: RPCサービスの問題は、設計上、特定の固定ポートを使用しないことです。利用可能な任意のポートをランダムに選択でき、RPC Portmapデーモンに登録されます。接続しようとするクライアントは、Portmapデーモンにクエリを送信し、正しいポートに直接接続します。これにより、予約済みポートが不足する問題が解決しました...

ファイアウォールの観点からは、TCP/UDPポート111と、RPCサービスが現在使用している実際のポートを開く必要があります。ファイアウォールでこのようなランダムなポートを開く問題は、通常、NFSサーバーなどのRPCサービスを制限済みの固定ポートを使用するように制限することで解決されます。

7
HBruijn

Iptables /ファイアウォール「はじめに」

ファイアウォールは基本的にポリシーベースのネットワークフィルターです。 LinuxファイアウォールはNetfilterを中心に構築されています。カーネルのネットワークパケット処理フレームワークは、特定のタスクを実行するいくつかのカーネルモジュールで構成されています。

  1. FILTERモジュール(常にデフォルトでロードされる)を使用すると、特定の一致基準に基づいてIPパケットを受け入れたりドロップしたりできます。
  2. NATモジュールセットを使用すると、ネットワークアドレス変換(SNAT、DNAT、MASQUERADE)を実行できます。
  3. MANGLEモジュールを使用すると、特定のIPパケットフィールド(TOS、TTL)を変更できます。

ユーザーは、コマンドラインからiptablesを使用して、ファイアウォールのニーズに合わせてNetfilterフレームワークを構成します。 iptablesを使用して、Linuxボックスに到着したとき、通過したとき、またはLinuxボックスから出たときにIPパケットをどうするかをカーネルに指示するルールを定義します。各Netfilterメインプロセスは、iptables lingoのTABLE(FILTER、NAT、MANGLE)で表されます。これらは、ネットワークパケットフローマップ上に特定のフックポイントがいくつかあり、カーネルによって呼び出されて、その役割を果たします。特定の位置にあるTABLE呼び出しの特定のシーケンスは、一般に組み込みチェーンと呼ばれ、PREROUTING、INPUT、FORWARD、OUTPUT、およびPOSTROUTINGの名前を受け取ります。 TABLEを「プロセスのタイプ」に関連付け、CHAINを、それらのプロセスのインスタンスが呼び出されるネットワークパケットフローマップ上の「場所」に関連付けると、簡単に覚えられます。

enter image description here

IPパケットはネットワークインターフェイスで受信されるか、ローカルプロセスによって作成されるため、最終的に配信または破棄されるまで、Netfilterエンジンはネットワークパケットフローマップに含まれるルールを順次テストして適用します。 TABLE @ CHAINペアで識別される各ブロックで、ユーザーは、IPパケットの一致基準と対応する一連のアクションを含むこれらの連続ルールの1つ以上を追加できます。複数のTABLEで実行できるアクション(ACCEPT、DROPなど)と、TABLE固有のその他のアクション(SNAT、DNATなど)があります。

つまり、IPパケットがネットワークインターフェイスから到着すると、最初にPREROUTINGチェーンによって処理され、MANGLEテーブルのユーザー定義ルールがあればそれを呼び出します。現在のパケットに一致するルールがない場合、対応するMANGLE @ PREROUTINGのデフォルトのアクションコースまたは「ポリシー」が適用されます。この時点で、パケットがドロップされなかった場合、プロセスは続行され、NATテーブルのPREROUTINGチェーン(マップを参照)など)のルールが呼び出されます。ルールのレイアウトを容易にするために、ユーザーは独自のカスタムチェーンを作成し、必要に応じてマップのさまざまなポイントからそれらに「ジャンプ」することもできます。

enter image description here

組み込みチェーンはACCEPTまたはDROPパケットのユーザー定義ポリシーを持つことができますが、ユーザー定義チェーンは常にプロセスを続行するために呼び出し側にRETURNの変更不可能なデフォルトポリシーを持っています。

Iptablesコマンド

Iptablesのメインコマンドは、ネットワークパケットフローマップに必要な処理ルールを入力します。

一般的なiptablesルールは次のように書くことができます:

_# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>_

それは次のように読むことができます:

Netfilter (kernel module) please <Add/Insert/Delete> this rule for <table> at <CHAIN> where packets matching <PKT_MATCHING_CRITERIA> have to be <ACTION>ed

_<table>
  -t filter       (the filter table is assumed when omitted)
  -t nat
  -t mangle 

<Add/Insert/Delete>
  -A              (append rule at the end of the chain list)
  -I              (insert rule at the begining of the chain list)
  -D              (Delete rule)

<CHAIN>
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING
  USER_DEFINED_CHAIN

<PKT_MATCHING_CRITERIA>
ISO Level-2 matching:
  -i [!] <if_name>    or --in-interface [!] <if_name>
          (OUTPUT and POSTROUTING chains cannot match on input  interfaces)
  -o [!] <if_name>    or --out-interface [!] <if_name>
          (INPUT  and PREROUTING  chains cannot match on output interfaces) 
    -mac-source [!] <xx-xx-xx-xx-xx-xx>
            (OUTPUT and POSTROUTING chains cannot match on input  interfaces)

ISO Level-3 matching:
  -s [!] <src_ip>     or --src [!] <src_ip>   or --source [!] <src_ip>
  -d [!] <dst_ip>     or --src [!] <dst_ip>   or --destination [!] <dst_ip>

ISO Level-4 matching:
  -p [!] <prot_name>    or --protocol [!] <prot_name>  (udp|tcp|icmp)

  Also available when ICMP protocol is defined
  --icmp-type [!] <icmp_type>

  Also available when UDP protocol is defined
  --source-port [!] <udp_src_port>      or --sport [!] <udp_src_port>
  --destination-port [!] <udp_dst_port> or --dport [!] <udp_dst_port>

  Also available when TCP protocol is defined
  --source-port [!] <tcp_src_port>      or --sport [!] <tcp_src_port>
  --destination-port [!] <tcp_dst_port> or --dport [!] <tcp_dst_port>
  --tcp-flags [!] <tcp_flags>   (SYN|ACK|FIN|RST|URG|PSH|ALL|NONE)
    --syn
  --tcp-option [!] <tcp_option#>

  --state [!] <state>
  -m <match> [options]

    note: [!] = negation operator

<ACTION>                (also called TARGET)
  -j ACCEPT             (process continues with rules of the next table in map)
  -j DROP               (discard current packet)
  -j REJECT             (discard current packet with ICMP notification)
      option:
      --reject-with <reject_type>
  -j USER_DEFINED_CHAIN   (start traversing USER_DEFINED_CHAIN rules)
  -j RETURN               (return from USER_DEFINED_CHAIN)
  -j LOG                  (log to syslog, then process next rule in table)
      options:
      --log-level <level>
      --log-prefix <prefix>
      --log-tcp-sequence
      --log-tcp-options
      --log-ip-options
      --log-uid

nat table specific
  -j SNAT             (rewrite the source IP address of the packet)
      option:
      --to <ip_address>
  -j SAME             (idem SNAT; used when more than one source address)
      options:
      --nodst 
      --to <a1-a2>
  -j MASQUERADE       (idem SNAT; used when the replace IP is dynamic)
  -j DNAT             (rewrite the destination IP address of the packet)
      option:
      --to <ip_address>
  -j REDIRECT         (rewrite dst IP to 127.0.0.1, PREROUTING and OUTPUT only)
      option:
      –-to-port <port#>

mangle table specific
  -j ROUTE            (explicitly route packets, valid at PREROUTING)
      options:
      --iface <iface_name>
      --ifindex <iface_idx>
  -j MARK             (set Netfilter mark values)
      options:
      --set-mark <value>
      --and-mark <value>
      --or-mark <value> 
  -j TOS              (set the IP header Type of Service field) 
      option:
      --set-tos <value>
  -j DSCP             (set the IP header Differentiated Services Field)
      options:
      --set-dscp <value>
      --set-dscp-class <class>
  -j TTL              (set the IP header Time To Live field)
      options:
      --ttl-set <value>
      --ttl-dec <value>
      --ttl-inc <value>
_

Iptables補助コマンドは、シナリオ設定のデフォルト条件、リストルール、フラッシュルールなどを完了します。

_#iptables -t <table> -L             
       (Lists the <table> rules in all chains)
#iptables -t <table> -L <CHAIN>     
       (Lists the <table> rules in <CHAIN>)

#iptables -t <table> -N <CHAIN>     
       (Creates a user-defined <CHAIN> for holding <table> rules)
#iptables -t <table> -E <CHAIN> <NEWCHAIN>  
       (Renames <CHAIN> that holds <table> rules to <NEWCHAIN>)

#iptables -t <table> -X   
       (Deletes all user-defined chains created for holding <table> rules)
#iptables -t <table> -X <CHAIN>
       (Deletes user-defined <CHAIN> created for holding <table> rules)

#iptables -t <table> -P <CHAIN> <ACTION>     where <ACTION> = ACCEPT|DROP
       (Sets the default policy of <table> rules at <CHAIN> to <ACTION>)

#iptables -t <table> -F             
       (Flushes (deletes) all <table> rules in all chains)
#iptables -t <table> -F <CHAIN>
       (Flushes (deletes) all <table> rules in <CHAIN>)

#iptables -t <table> -R <CHAIN> <INDEX> <NEWRULE>
       (Replaces <table> rule at position <INDEX> in <CHAIN> with <NEWRULE>
_

Iptablesは実行時にコマンドをNetfilterエンジンにロードし、Netfilterはロードされたルールと設定を中間的に強制しますが、永続的ではありません。以前にロードされたすべてのNetfilterルールと設定を再起動すると、失われます。このため、現在アクティブなルールセットをファイルに保存し、後で再ロードできるようにするiptablesユーティリティがあります。

_#iptables-save > fileName
      (Save the currently active Netfilter ruleset to fileName)

#iptables-restore < fileName
      (Restore Netfilter ruleset to the one saved in fileName)
_

Iptablesの概要

Netfilterは非常に柔軟で強力なフレームワークですが、その代償があります。 Iptablesは複雑です。ユーザーの観点からすると、TABLE、CHAIN、TARGETなどの特定の用語は、それらが表す概念と実際にはあまり一致せず、最初はあまり意味がありません。トピックは長く、コマンドにはパラメータの無限のリストがあるようです。さらに悪いことに、実際にIptablesをマスターする1冊の本はありません。それらは主に「レシピブック」または「マンページブック」の2つのカテゴリに分類されます。この紹介では、Netfilter/Iptablesの概要と、事前に消化されたマンページに必要な量のスナップショットが得られると思います。 iptablesに慣れていない場合は、これらの段落を数回読んだ後、iptablesの例を読む準備が整います。少し練習すれば、すぐに自分のルールを書いていることに気付くでしょう。

ファイアウォール

ファイアウォールは主に、一連のルールに基づいてネットワークトラフィックを動的に許可または拒否するように設計されています。この時点で、Linux Netfilter/Iptablesフレームワークがファイアウォールの構築に最適である理由を理解するのは簡単です。ネットワークパケットフローマップを見ると、INPUTチェーンとFORWARDチェーンのFILTERテーブルの2つの特に興味深いスポットが見つかります。 IP送信元アドレス、IPプロトコル(UDP/TCP)、宛先ポート(80、21、443など)などに基づいて、特定のIPパケットを受け入れるか、拒否するか、または単にドロップするかを決定できます。これは、ファイアウォールが80%の時間に実行することです。つまり、許可されていないネットワーク要求からWebサーバーを保護します。残りの20%は(NAT、MANGLE)ネットワークパケットの操作です。

ファイアウォールのシナリオ

さまざまなニーズに対応する数百の異なるファイアウォールレイアウトがありますが、そのうちの3つは最も一般的なファイアウォールシナリオと見なすことができます。

  1. インターネットに接続された1つ以上のインターフェースを備えたシンプルなWebサーバー。ポリシーには、制限されたインバウンドアクセス、無制限のアウトバウンドアクセスを許可する基本ルール、およびスプーフィング防止ルールが含まれています。 IP転送はオフです。
  2. このファイアウォールは、インターネットと保護された内部エリアに接続します。ポリシーには、制限されたインバウンドアクセス、無制限のアウトバウンドアクセスを許可する基本ルール、およびスプーフィング防止ルールが含まれています。保護された領域はプライベートIPアドレスを使用するため、ソースNATが必要です。IP転送はオンです。
  3. このファイアウォールは、インターネット、内部保護および非武装地帯に接続します。ポリシーには、制限されたインバウンドアクセスを許可する基本的なルール、無制限のアウトバウンドアクセス、およびスプーフィング防止ルールが含まれています。保護されており、DMZエリアはプライベートIPアドレスを使用するため、ソースと宛先のNATが必要です。IP転送はオンです。 enter image description here

私はこれを以下のために書きました: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html

7
Pat