一般に:
ファイアウォール構成の表示と変更にはroot
、制限されたポート番号範囲でサービスを開くのと同様に、管理者権限()が必要です。つまり、root としてログインするか、rootとしてコマンドを実行するroot
ために使用sudo
する必要があります。そのようなコマンドをオプションのでマークしようとします[sudo]
。
内容:
- 順序が重要かの違い
-I
と-A
- 現在のファイアウォール構成を表示する
- の出力の解釈
iptables -L -v -n
- 環境を知る
- INPUTおよびFORWARDチェーン
- カーネルモジュール
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
ポリシーは、デフォルトのアクションにチェーンが使用する明示的なルールの一致を設定します。INPUT
すべてのトラフィックを受け入れるように設定されているチェーン内。
INPUTチェーンの最初のルールはすぐに興味深いルールであり、TCPポート22(tcp dpt:22
)宛てのすべてのトラフィック(ソース0.0.0.0/0および宛先0.0.0.0/0)をカスタムターゲット(fail2ban-SSH
)にSSHのデフォルトポートに送信します。名前が示すように、このルールはfail2ban(とりわけ、悪用の可能性についてシステムログファイルをスキャンし、悪用者のIPアドレスをブロックするセキュリティ製品)によって維持されます。
この規則はiptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
、iptables-save asの出力に類似した、またはiptables-save asの出力にあるiptablesコマンドラインによって作成されたもの-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
です。多くの場合、これらの表記のいずれかがドキュメントにあります。
カウンターは、このルールが784'000パケットと65メガバイトのデータに一致したことを示しています。
この最初のルールに一致するトラフィックはfail2ban-SSH
、非標準チェーンとしてOUTPUTチェーンの下にリストされるチェーンによって処理されます。
そのチェーンは2つのルールで構成され、1つは(でreject-with icm-port-unreachable
)ブロックされている各悪用者(ソースIPアドレス117.253.221.166または58.218.211.166)に1つです。
-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は、これを接続を追跡するステートフルファイアウォールにすることを目的としています。これにはいくつかの利点があります。新しい接続のパケットのみを完全なルールセットに対してチェックする必要がありますが、一度確立された接続または関連する接続に属する追加のパケットが許可されると、それ以上チェックされません。
入力ルール#2は、開いているすべての関連する接続に一致し、そのルールに一致するパケットをさらに評価する必要はありません。
注:ステートフルファイアウォールの構成におけるルールの変更は、新しい接続にのみ影響し、確立された接続には影響しません。
対照的に、単純なパケットフィルタは、接続状態を追跡することなく、すべてのパケットをルールセット全体に対してテストします。このようなファイアウォールでは、状態キーワードは使用されません。
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でアクセスを許可されなかったすべてのトラフィックをブロックするルールです。かなり一般的な規則:許可されていないものはすべて拒否されます。理論的には、デフォルトのポリシーを拒否に設定することにより、このルールを省略できます。
常にチェーン全体を調査してください。
4.環境を知る
4.1 ソフトウェアファイアウォールの設定は、ネットワークの他の場所で維持されているセキュリティ設定には影響しません。つまりiptables
、ルーター上の変更されていないアクセス制御リストでネットワークサービスを開くか、ネットワーク内の他のファイアウォールがトラフィックをブロックする可能性があります...
4.2 リッスンしているサービスがない場合、ファイアウォールの設定に関係なく、接続して接続拒否エラーを取得することはできません。したがって:
- サービスが(正しいネットワークインターフェイス/ IPアドレスで)リッスンしており、期待するポート番号を使用していること、
[sudo] netstat -plnut
またはを使用していることを確認しますss -tnlp
。
- サービスがまだ実行されていない場合、たとえばnetcat:を使用して単純なリスナーをエミュレートする
[sudo] nc -l -p 123
かopenssl s_server -accept 1234 [options]
、TLS / SSLリスナーが必要な場合(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と同様)?
- サービスは固定のデフォルトポートを使用していますか(たとえば、WebサーバーのTCPポート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
チェーン
ここではチェーンの概念をより詳細に説明しますが、短いのは次のとおりです。
INPUT
あなたがサービスを使用すると、iptablesコマンドを発行するホスト上で、ローカルで実行するためのネットワークポートを開いて、および/または近いところ鎖です。
FORWARD
チェーンは、あなたのLinuxマシンがブリッジとして動作しているときに、他のシステム、実際のシステムだけでなく、ドッカーコンテナおよび仮想ゲストサーバーサーバにカーネルによって転送されますフィルタトラフィック、ルーターにルールを適用する場所で、ハイパーバイザーおよび/またはネットワークアドレスを行います変換およびポート転送。
一般的な誤解は、DockerコンテナまたはKVMゲストがローカルで実行されるため、適用されるフィルタールールはINPUTチェーン内にある必要があるということですが、通常はそうではありません。
6.カーネルモジュール
パケットフィルターはLinuxカーネル内で実行されるため、動的モジュール、実際には複数のモジュールとしてコンパイルすることもできます。ほとんどのディストリビューションにはモジュールとしてnetfilterが含まれており、必要なnetfilterモジュールが必要に応じてカーネルにロードされますが、ファイアウォール管理者は手動でロードされることを確認する必要があります。これは主に、などnf_conntrack_ftp
でロードできる接続追跡モジュールに関係しますinsmod
。
実行中のカーネルに現在ロードされているモジュールは、で表示できますlsmod
。
再起動後もモジュールが永続的にロードされるようにする方法は、Linuxディストリビューションによって異なります。