UFW/IPTABLES は DHCP UDP ポート 67 をブロックしていませんか?

UFW/IPTABLES は DHCP UDP ポート 67 をブロックしていませんか?

Ubuntu 16.04 を実行しています。ufw をインストールして有効にしています。isc-dhcp-server もインストールしています。UDP ポート 67 を開いていないのに、DHCP クライアントはサーバーから DHCP リースを取得できるようです。なぜでしょうか? ufw が作成する IPTABLES を確認したところ、DHCP クライアント用に UDP ポート 68 は開いていますが、UDP ポート 67 は開いていません (私の理解では)。また、ufw が IPTABLES を設定してブロードキャスト トラフィックを受け入れるようには見えません。ufw はブロードキャスト トラフィックを許可するのでしょうか、それともブロックするのでしょうか?

IPTABLES には、UDP ポート 67 トラフィックに対して何らかの特別な例外がありますか?

DHCP クライアントは、最初に UDP ポート 67 のブロードキャストから応答が得られなかった場合、UDP ポート 68 のブロードキャストにフォールバックしますか? そうであれば、DHCP 要求がサーバーに送られていると考えるのが妥当でしょう。なぜなら、その場合、送信 DHCP クライアント要求を許可する UFW ルールによって、受信 DHCP クライアント要求が許可されるからです。

の状態ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere                  

答え1

新しい DHCP サーバーのテストを始める前に、ファイアウォールの適切なポートを開くにはあまりにも下手だったので、まだ動作しないはずだと気づくまでに少し時間がかかりました。サーバーのファイアウォールでポート 67 を開いたことがなかったのです。

...

答えは簡単で、DHCPは確かに特別だということです。見知らぬ人が引用した言葉を引用すると、

isc.org の Mark Andrews 氏によると:

「DHCP はパケット フィルターを使用し、これらはファイアウォールの前の IP スタックに結合されます。」

http://thr3ads.net/netfilter-buglog/2011/07/1961358-Bug-730-新しいDHCPリクエストとその他のトラフィックのバイパス-iptables-netfilter

--https://www.centos.org/forums/viewtopic.php?t=8728


これは、DHCP サーバーが raw ソケットを使用するためだとよく言われます。この言い回しは非常に紛らわしいと思います。DHCP サーバーに関する一部の公式 ISC ドキュメントでは、「raw ソケット」を広い意味で使用しています。これは、DHCP サーバーがさまざまなプラットフォームで実行され、さまざまなインターフェイスを使用する必要があるためです。Linux では、raw ソケットと呼ばれるタイプが複数あります。 Linux iptables の影響を受けるものもあれば、影響を受けないものもある

Linux の TCP/IP スタックは、PF_INET+SOCK_RAW でパケットを送信するときに、いくつかの制限を課すと確信しています。私の漠然とした記憶では、Linux 上の DHCP は必ずしもそのタイプのソケットで動作するとは限らず、代わりに「パケット ソケット」を使用する必要があるかもしれません。パケット ソケットはより低いレベルで動作します。パケット ソケットは iptables の影響を受けないと確信しています。

PF_PACKET ソケットは TCP/IP スタックをバイパスします。

PF_INET/SOCK_RAW ソケットは引き続き TCP/IP スタックを通過します。

--https://lists.netfilter.org/pipermail/netfilter-devel/2003-March/010845.html

この引用はパケットの受信という文脈で書かれています。予想どおり、これはパケットの送信にも当てはまるという証拠もあります。


iptables は、PF_INET+SOCK_RAW での送信を含む TCP/IP スタックに適用される制限の 1 つであるようです。

ユーザー空間に IP データグラムがあり、それを send() システム コールを使用して socket(PF_INET, SOCK_RAW, IPPROTO_RAW) で作成された raw ソケット経由で送信する場合、このパケットは netfilter チェーンを通過しますか?

...

良いニュースのようです:

ipt_hook: happy cracking.
ipt_hook: happy cracking.
ipt_hook: happy cracking.
ipt_tcpmss_target: bad length (10 bytes)

したがって、パケットは iptables を通過することになります。

https://lists.netfilter.org/pipermail/netfilter-devel/2003-March/010829.html

受信方向の証拠:

生のソケットを使用すると、NAT後のパケットが得られるため、IPアドレスはプライベート範囲(私の例では10.xxx)に戻ります。これは常識かもしれませんが、文書化されているものを見つけるのに苦労しました。libpcap/tcpdumpを使用すると、NAT前のパケットが得られます。

[NATはiptablesによって実行されます]

--https://lists.gt.net/iptables/user/62529#62529


ボーナス不満:私は考える最初に引用した「パケット フィルタ」という用語は、長年使われてきたとはいえ、まったくの誤用です。Berkeley Packet Filter は、raw ソケットにフィルタをインストールするために使用するメカニズムです。たとえば、DHCP ポートでのみパケットを受信するようにするなどです。ISC は、「Linux Packet Filter」を raw ソケットの一種であるかのように言及することがあると思います。そうではありません。BPF は、実際には通常の UDP または TCP ソケットで使用できます。

関連情報