iptablesを使用する場合の拒否とドロップ


回答:


79

一般的なルールとして、ポートに到達できないことを相手に知らせるには、REJECTを使用します。他人に見られたくないホストへの接続にはDROPを使用します。

通常、LAN内の接続のすべてのルールはREJECTを使用する必要があります。インターネットの場合、特定のサーバー上のidentを除き、インターネットからの接続は通常破棄されます。

DROPを使用すると、接続は空いているIPアドレスに接続されているように見えます。スキャナーは、使用されていないように見えるアドレスのスキャンを継続しないことを選択できます。NATを使用してファイアウォール上の接続をリダイレクトできることを考えると、既知のサービスの存在は、アドレス上のサーバーの存在を必ずしも示すものではありません。

Identは、SMTPサービスを提供するアドレスで渡されるか拒否される必要があります。ただし、SMTPサーバーによるIdentルックアップの使用は使用されなくなりました。動作中のidentサービスにも依存するチャットプロトコルがあります。

編集:DROPルールを使用する場合:-UDPパケットはドロップされ、動作はサービスのない非ファイアウォールポートへの接続と同じになります。-TCPパケットはACK / RSTを返します。ACK/ RSTは、サービスのない開いているポートが応答するのと同じ応答です。一部のルーターは、ダウンしているサーバーに代わって応答し、ACK / RSTを返します。

REJECTルールを使用する場合、ポートが使用できないことを示すICMPパケットが送信されます。


5
本当じゃない。ルールに「DROP」と記載されている場合でも、システムは、TCP SYN / ACKを使用して、着信パケットに開いているかのように応答します。本当にパケットをドロップするには、システムはTCP RST / ACKで応答する必要があります-ファイアウォールルールはありません。そのため、最適なファイアウォール設定は、選択されたポートのみが転送される設定です。DROPルールはファイアウォールをアドバタイズし、ポートスキャナーは、あなたが何かをファイアウォールで保護していることを知り、ファイアウォールを捕まえることを期待してあなたをhammerり続けます。
ダゲエルフ14年

2
私の要点は、DROPを行ったときと、最初にサービスを実行していないときのTCPスタックの動作が異なるという事実だけで、ファイアウォールを使用しているかどうかを外部から検出できるということです。
ダジェフ14

2
違いを利用して、結果としてポートを監視するボットネットがあるという事実を変えません。
ダジェフ14

1
何をするにしても、一貫性を保ちましょう。攻撃者が未使用のポート番号を選択して接続しようとすると、意図的にブロックしているポート番号を選択した場合と同じ応答が返されます。別の応答を与えると、そこに何かがあることを彼に伝えます。たとえば、異なる応答を与えるpurtnumberを使用して、使用しているデータベースサーバーを決定し、そのサーバーにSQLインジェクションを調整できます。
user313114

5
@Dagelf DROPが応答を送信する情報はどこで入手していますか?それは大きなニュースであり、私が観察し、言われたことすべてに反します。この動作を説明するドキュメントへのリンクはありますか?
Score_Under

27

違いは、REJECTターゲットは拒否応答をソースに送信するのに対し、DROPターゲットは何も送信しないことです。

これは、identサービスなどに役立ちます。REJECTを使用する場合、クライアントはタイムアウトを待つ必要はありません。

これについての詳細:http : //www.linuxtopia.org/Linux_Firewall_iptables/x4550.html


2
DROPターゲットは何も送信しません。受け入れられた答えに対する私のコメントを確認し、詳細に興味がある場合は自分でトピックを調べてください!
ダジェフ14

8

通常、攻撃者から特定のポートへのプローブを無視する必要があります。つまり、「接続拒否」を返送したくないということです。「接続拒否」とは、「ここにサーバーが存在する」ことを意味し、パケットをドロップしてもソフトウェアバージョン、潜在的な脆弱性、またはサーバーがあなたのIPをリッスンしているという事実の手がかりを与えないのに対して、より多くの情報を提供する可能性があります。

上記は、REJECTの代わりにDROPを使用する主な理由の1つです。


6
iptablesルールがない場合、閉じられたポートはデフォルトでREJECTになります。すべてのポートを削除する場合、それは素晴らしい代替手段です(ホストがダウンしているように見えます)が、特定のポートのみを削除する場合、実際にはREJECTよりも多くの情報を提供しています。誰かがnmapのようなブランケットプローブを使用すると、パケットをドロップする特定のポートが「フィルターされた」ように表示されます。つまり、隠れているサービスがあることがわかります。
Raptor007

7

ここには多くの矛盾する答えがありますが、これが適切なキーワードを使用したGoogleでの最初の記事であることを考えると、これが正しい説明です。
簡単です

。DROPはパケットに対して何もしません。ホストに転送されることも、応答されることもありません。IPtablesのマンページには、パケットを床に落とす、つまりパケットに対して何もしないと書かれています。

REJECTはパケットを送り返すという点でDROPとは異なりますが、答えはサーバーがIP上にあるが、リスニング状態のポートがないかのようになります。TCPの場合、またはUDPでICMP宛先ポートに到達できない場合、IPtablesはRST / ACKを送信します。


2
私からの+1ですが、答えは実際にそうではありません。私が見る限り、ダジェルフを除いて、彼らは皆同意します。
MadHatter

さて、あなたのためのちょっとしたトリックがあります:「nmap localhost」を実行してください。ここで、「開いていない」ポートを選択し、「何もしない」ルールを追加します。例:「iptables -I INPUT -p tcp --dport 888 -j DROP」。ここで再び「nmap localhost」。何が見えますか?...
Dagelf

4

マシンの存在を完全に隠そうとしている場合-j DROPは適切です。たとえば、これを使用してブラックリストを実装できます。

ポートが開いているという事実を隠そうとしている場合、ポートが開いていない場合に発生する動作を模倣する必要があります。

  • TCP: -p tcp -j REJECT --reject-with tcp-reset
  • UDP: -p udp -j REJECT --reject-with icmp-port-unreachable

ポートスキャナーが、いくつかのポートがパケットをドロップしているのにほとんどのポートが拒否していることを検出した場合、ドロップされたパケットは開いているが非表示のポートにあると想定できます。


いくつかのポート(つまり、22、25、53、80、443)を開いてから、他のすべてをドロップするとどうなりますか?これで、MySQL、PostgreSQL、SQLite、またはCassandraを実行しているかどうかにかかわらず、スキャナーは認識できません。
アレクシスウィルケ

@AlexisWilkeその場合、ポートスキャナーに提供している唯一の追加情報は、デフォルトのDROPポリシーを使用して何らかの種類のファイアウォールを設定していることです。
Raptor007

0

多くの正解にもかかわらず、ちょうど私の2セント:

以下は、禁止システム(ファイアウォール、IDSなど)のルールに関する件名への短いPoC FW.IDS-DROP-vs-REJECTです。

まもなく:

  • DROP すべてのポートを禁止する場合は、侵入型侵入者に使用できます(したがって、サーバーが侵入者側でダウンしているように見えます)
  • REJECT --reject-with tcp-reset マルチポート禁止の最良の選択です。実際の閉じたポートとして動作するようです
  • いくつかのポートは、(侵入者がホストが生きていることを知っている)答え、されている場合DROPREJECT(なしtcp-reset)ので、それは、必要なデータを提供することを期待して「攻撃」を続けるために彼を刺激する可能性があり(侵入者に何かのブロックがあることを「信号」を与えますある時点で)

-5

はい、DROPの使用は無意味です。REJECTを使用します。

ルールに「DROP」と記載されている場合でも、システムはTCP RST / ACKで着信SYNに応答します。これは、サービスが実行されていないポートのデフォルトの動作です。(tcpdumpなどはこれを記録しません。)

サービスが実行されている場合、SYNはTCP SYN / ACKで満たされます。

DROPは通常どおりTCP SYN / ACKで応答せず、代わりにRST / ACKで応答するため、DROPルールはファイアウォールをアドバタイズし、ポートスキャナーはあなたが何かをファイアウォールしていることを知り、希望を打ち続けますファイアウォールをキャッチします。

これは現在、nmapが「closed」ではなく「filtered」を報告できるようになりました。例:

$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -I INPUT -p tcp --dport 1111 -j DROP
$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http
1111/tcp filtered lmsocialserver

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -D INPUT 1

そのため、唯一の「見えない」ファイアウォール設定は、専用のデバイスがデバイスの間に置かれ、ポートを選択的に転送するだけです。

基本的なスキャナを本当に使いたければ、TCP接続をTARPITすることができます。これにより、TCPウィンドウが0に設定され、接続が開かれた後にデータが転送されなくなります。確認したい場合は、接続タイムアウトが発生します。しかし、攻撃者がこれを検出してタイムアウトを非常に短くするのは簡単です。

すべてを考慮すると、おそらくREJECTを使用するか、サーバーとインターネットの間に専用のポート転送デバイスを配置するのが最善です。

または、ファイアウォールを必要としないインターネットに直接接続されたマシンでサービスを実行するだけです。

一般に、REJECTはWebサーバーに最適です。アクセスしようとしているサービス(おそらくほとんどの場合、おそらくあなた)はすぐに応答を受け取り、ユーザーやその他のサービスはネットワークの停止があるかどうかを気にしません。


5
この答えは間違っています。tcpdumpを使用すると、DROPルールにより、システムが応答を送信しないことが簡単に示されます(予想どおり)。そして、「本当にパケットをドロップするには、システムはTCP RST / ACKで応答する必要があります」という文は意味がありません。パケットを「本当にドロップ」した場合、あなたは答えないだけであり、これは明らかにDROPルールの効果です。
ジュリアンホルツ

3
DROPを発行する疑惑のソースを提供できますSYN/ACKか?私は自分のマシンでこれを見たことはありません。
モトボイ

2
@Dagelfあなたの記事には「ドロップ(別名DENY、BLACKHOLE)パケットの通過を禁止します。応答を送信しません。」と書かれています。
JeanT

通常の応答は送信しませんが、説明どおりに送信します。
ダジャーフ

3
リンクするドキュメントには「DROP ... Send no response」と書かれていますが、私が見る限り、をDROP返すという主張はサポートしていませんSYN/ACK。私も、どのバージョンのでもこの動作を見たことはありませんiptables。自分の主張をサポートするソースがある場合、それを見るのが最も便利です。確かに、私が今やったパケットダンプはあなたの主張をサポートしていません。
マッドハッター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.