IPTablesとDHCPの質問?


8

私の別のスレッドでは、iptablesのポリシーと状態に関するいくつかの興味深いことについて話していましたが、DHCPがどのように機能し、iptablesがそれをどのように理解するかについて詳しく知りたいと思います。

ETH0は、ルーターから動的IPを受信するメインスイッチに接続され、インターネットアクセスだけでなく、外部ネットワークへのアクセスも取得します。

ETH1は、XクライアントがこのサーバーからIPSを受信する内部スイッチに接続されている内部カードです

ETH1ネットワークは192.168.1.0/255.255.255.0で、サーバーIPは192.168.1.254です。

私が理解したところによると、dhcpはbootpプロトコルであるため、ファイアウォールポリシーですべてを削除する場合でも、ネットワークはDHCPを受信します。これは、私が行ったテストではtrueのようです。

tcpdumpから:

root@test:~# tcpdump -i eth1 port 67 or 68
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:34:03.943928 IP 192.168.1.2.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:29:52:8b (oui Unknown), length 303
11:34:03.957647 IP 192.168.1.254.bootps > 192.168.1.2.bootpc: BOOTP/DHCP, Reply, length 300
11:34:06.492153 IP 192.168.1.2.bootpc > 192.168.1.254.bootps: BOOTP/DHCP, Request from 00:0c:29:29:52:8b (oui Unknown), length 303
11:34:06.506593 IP 192.168.1.254.bootps > 192.168.1.2.bootpc: BOOTP/DHCP, Reply, length 300

iptablesが何をするかを確認するために簡単なログルールを作成しました:

root@test:~# tail -f /var/log/syslog
Oct 15 11:30:58 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9527 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:31:43 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9529 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:33:32 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9531 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:34:03 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9533 PROTO=UDP SPT=68 DPT=67 LEN=311

これがその瞬間の私のiptablesルールです:

# deny all traffic
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP

# Use stateful inspection feature to only allow incoming connections
# related to connections I have already established myself
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# allow all traffic on lo interface
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

したがって、デフォルトのポリシーですべてをドロップしても、ネットワークでDHCPを取得できますが、IPの更新などにはかなり時間がかかります。

ファイアウォールに次のルールを追加した場合:

$IPT -I OUTPUT -o $INTIF -p udp --dport 67:68 --sport 67:68 -j ACCEPT

すべてのクライアントdhcpを更新するには、かなり時間がかかります。

上記を考慮:

  1. ブロックされていないのに更新するのに実際に時間がかかるのはなぜですか?
  2. dhcpサーバーをオフにすることなく、それを完全に削除することは可能ですか?
  3. BOOTPを使用してiptables内のdhcpサーバーを受け入れることは可能ですか?それはどのように行われますか?

あなたが良いリンクを知っているなら、私はたくさん取っても構わないと思います:)


tcpdumpとiptablesのログ出力に少し混乱しています。混合モードでネットワークインターフェイスを監視していますか?ファイアウォールサーバーは実際にDHCPを使用してNICを構成していますか?
スティーブン

@Steven上記のファイアウォールを備えたサーバーにはeth0とeth1があり、eth0は外部からクライアントとしてdhcpを受信し、eth1は私が話している内部ネットワーク用の私のdhcpサーバーです。Are you monitoring the network interface in promiscuous mode私がまだ学んでいるとはどういう意味ですか
Guapo

ああ、わかりました。誰かにあなたの質問を理解してもらいたいのなら、あなたは本当にあなたのネットワークとサーバーをよりよく説明する必要があります!
スティーブン

promiscousモードについて:en.wikipedia.org/wiki/Promiscuous_mode
スティーブン

@Stevenは、指摘に感謝します。ネットワークレイアウト以外の何かを指定する必要があると思いますか?
Guapo

回答:


13

私が答えます#2:いいえ。

IPアドレスを取得すると、dhcpデーモンはネットワークインターフェイスへのrawソケットを作成し、UDPプロトコル自体を処理します。したがって、UDPパケットはiptablesを通過しません。

dhcpデーモンがUDPを実装する必要があるのは、インターフェースがIPアドレスを持っている場合、カーネルはUDP(実際にはすべてのTCP / IPスイート)しか処理できないためです。以前は、dhcpデーモンは最初にインターフェイスに0.0.0.0のIPアドレスを与えていましたが、それは機能しなくなりました。


パケットソケット。rawソケット iptablesを通過します。不信心。unix.stackexchange.com/a/447524/29483
sourcejedi

5

追加

$IPT -I INPUT -i $INTIF -p udp --dport 67:68 --sport 67:68 -j ACCEPT

DHCPDの更新を高速化します。:)入力と出力の両方で機能します。iptablesではなくebtablesでdhcpdをDROPできます。IP内ではなく0.0.0.0でリッスンするDHCPD


+1私はそれをINPUTで使用しましたが、ルールで使用しなかった場合と同じ時間かかりました。私がそれを出力にしたとき、それは大きな違いを作りました。ebtablesのおかげで読みます。
Guapo

$ IPT -I INPUT -i $ INTIF -s 0/0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT
Ta Coen

上記を試してみましたが、OUTPUTルールを使用する場合に比べて時間がかかりすぎます。
Guapo

ポリシーはDROPなので、INPUTとOUTPUTの両方を使用する必要があります。
Ta Coen

3

OpenWRT Kamikaze 7.09 = 2.4.34およびbusybox 1.4.2のudhcpcでの私の最近の観察:

私はOUTPUTチェーンとINPUT方向に「ACCEPT」ポリシーを持っていますが、もともとはこのクラシックなキャッチオールルールに依存していました。

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

WANインターフェース上の(私のudhcpcへの)DHCP応答を許可します。つまり、これは私のISPのアップストリームDHCPサーバーがIPアドレスを私に割り当てる場所です。

最初のDHCP交換(検出、提供、要求、確認応答)とDHCPリースの更新(要求、確認応答)の違いに注意してください。

ブート後、udhcpcは完全な初期交換によって開始されます。その交換は成功するでしょう。そして、もう1つまたは2つの更新も成功します-要求と承認だけです。私のISPのDHCPサーバーは通常、約1時間から1.5時間の更新時間を要求するため、DHCPクライアントは30〜45分ごとに更新を要求します(この動作はRFCに基づいています)。

しかし、3回目か4回目のリニューアルで、面白くなっていきます。TCPdumpは約3回ほどの更新試行を示し、その後完全な初期交換が行われます-ほんの数分または数秒の期間内で。udhcpcがそれが戻ってきたのが気に入らなかったかのように:-(そして最終的に完全な交換に満足します。その後、30分での別の更新が成功します...そして物語は再び繰り返されます。

何か問題があるのは、おそらくカーネルの接続追跡にあることがわかりました。conntrackエントリが2時間ほど後に期限切れになり、サーバーからのACKが実際にはソケットをリッスンしているudhcpcに到達しないため、後のDHCP更新が失敗するかのように。tcpdump(libpcap)はrawインターフェースをリッスンし、iptablesの対象になる前に、入ってくるすべてのパケットを確認できることに注意してください。udhcpcが更新をあきらめ、絶望的に、完全な交換(DISCOVERで始まる)を使用して最初からやり直すと、カーネルは新しいconntrackエントリを確立し、しばらくの間関連パケットを理解できます...

案の定、次のようなものを追加したら:

iptables -A INPUT -i $OUT_IF -p udp --sport 67 --dport 68 -j ACCEPT

更新は永久に機能するようです。

次のtcpdumpコマンドライン引数が役立つ場合があります。

tcpdump -vv -s 1500 -i eth0.1 port 67 or port 68

注:は-vv、詳細なディセクタ出力を要求します。eth0.1私のWANポートです(これも「NAT外部」インターフェースです)。

ACKパケットの興味深い属性は、LTです。フィールド=推奨/最大許可リース時間(秒)。DHCP要求はポート68からポート67に送信されます。応答はポート67からポート68に送信されます。


あなたの話は意味がありません。初期または更新に関係なく、DHCP交換は常に、クライアントがポート68からポート67に、特定のIPまたはブロードキャストとして送信することによって開始されます。そして、発信ACCEPTを使用すると、これは常に機能します。発信宛先からの応答は常にESTABLISHEDルールによって着信を通過する必要があります。したがって、更新のたびにconntrack状態が更新または再作成されるため、更新はESTABLISHEDルールだけで永久に機能します。
Mecki

更新はリクエストopenwrt:68 -> dhcpserver:67を送信し、ACKはになりますdhcpserver:67 -> openwrt:68。これはESTABLISHEDとしてカウントされ、合格します。古いconntrack状態が期限切れになった場合は、新しい状態が確立されます。問題がある場合は、最初の交換でのみ可能です0.0.0.0:68 -> 255.255.255.255:67。DISCOVERとOFFERはでありdhcpserver:67 -> new-openwrt:68、ESTABLISHEDとしてはカウントされません。DHCPは通常、Linux上でのパケットのソケットでのiptablesをバイパスするように、これはそうでない場合は、着信ルールは68 UDPポートから67またはUDPポートにパケットを可能にすることを要求され、動作します
Mecki

1
また、いくつかの更新は成功しましたが、成功するすべての更新はconntrackの状態も更新するため、conntrackの状態が2時間後に期限切れになると、更新によってさらに2時間延長されるため、期限が切れることはありません。 。ただし、UDPのデフォルトのconntrackタイムアウトは30秒で2時間ではありません。私はOpenWRTが2時間に変更したので、狂っていると思います。だからあなたの話は完全に私に欠陥があるようです。
Mecki

@Mecki、貴重なフィードバックに感謝します:-)現在、私の返答は4歳です。約1年前、私のASUS WL500G Deluxeは(コンデンサーの交換により、約12年のランタイムの後)薄片状になり始めており、ハードウェアとともにその古いカミカゼをチャックしました。現在、最新のOpenWRTを最新のTP-Link APで実行しています。少し考えた結果、古いファイアウォールスクリプトを再利用していません。OpenWRTには、すぐに使える優れたファイアウォールが備わっているようです...過去の申し立てを確認できないということです。私が知っているのは、追加のiptablesルールが役立つことです。
FRR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.