web-dev-qa-db-ja.com

BIND9が本当に準備ができていないため、IppablesサービスはSystemDで失敗します

Iptables-restoreをsystemd.serviceスクリプトで呼び出しようとしています。 DNSルックアップを必要とするいくつかの規則があります。ファイアウォールのUnit = BIND9.Serviceを含めました。ただし、SystemDは、フォークが発生したときにBIND9が起動されていると考えています。ホスト名を解決する前にiptables-restoreからキックオフして失敗します。これがsyslogの関連セクションです。

[。] DeaS 13 21:29:02 FW SystemD [1]:スタートバインドドメインネームサーバー。[。] DECH 13 21:29:02 FW SystemD [1]:ターゲットホストとネットワーク名検索に達しました。 [。] DeaS 13 21:29:02 FW SystemD [1]:ロードイプラブルのルールのルール... [。] Dech 13 21:29:02 FW SystemD [1]:Homebridge Homekit Bridgeを開始。[。 ____ 13 21:29:02 FW SystemD [1]:OpenBSD Secure Shell Server ... [。] Deav 13 21:29:02 FW SH [1841]:Iptables  -  Restore v1.6.0:ホスト/ネットワーク `example.comが見つかりません
 Deav 13 21:29:02 FW SH [1841]:24行目:24 [。] Dec 13 21:29:02 FW Sh [1841] :詳細については、 `iptables-restore -h 'または' iptables  -  restore --help 'を試してください。[。] DeaS [1838]:Bind 9.10.3-P4-Ubuntu < ID:EBD72B3> -F -4 -U BIND [。]。

これがサービスファイルです。

[。] [単位] [。]説明= iptablesのルール[。] = BIND9.Service [。] [。] [インストール] [。] [。] [。] [。]。 user.target [。] [。] [。] [。] [サービス] [。] [。] [。] type = oneshot [。] welwafterexit =はい[。] execstart =/bin/sh -c "/ sbin/iptables  - 復元</etc/iptables.up.rules"[.___)。

Iptables-restoreコマンドを起動時に実行する最善の方法は何ですか。

1
user2102964

ただし、SystemDはフォークが発生したときにBIND9が起動されていると考えています。

Systemdには、名前が付けられたときに「リクエストを提供する準備ができて」されていることを知っています。一般的に受け入れられているプロトコルは、SysVinit日に戻る、デーモンフォークがすべてを設定し、一度準備ができると、その親が終了する可能性があることを(通常はパイプまたは信号を介して)登場します。これはシンプルで、「init」が単なるシェルスクリプトである場合でも機能します。named; echo Ready!

(言い換えれば、SystemDは初期プロセスについてのすべてを気にしませんフォーキングその子、しかし、それがいついつ出口

他に可能なプロトコルもあります。 TYPE = NOTIFYが使用されている場合、デーモンはREADY = 1メッセージを送信すると予想されます。 type = dbusでは、システムバス上の名前を請求する必要があります。 NS。

ただし、名前付きがこのプロトコルを正しく実装していない場合 - その初期プロセスがフォークしてから早く終了した場合 - その後initができることは何もありません。それはそれに嘘をついているデーモンに対処するのはinitの仕事ではありません(無能またはそうでなければ)。

と言ったことは、最初のことがbind9.serviceが実際にどのように機能するかを確認することです。それはまだそれが直接名付けられていないのではなく、init.dスクリプトのレイヤーを通じて実行されないことであり、それは同様の問題を引き起こす傾向があります。 (ログには典型的な "lsb:..."プレフィックスが表示されますが、とにかくチェックする。)

それは bind9.serviceがtype = simpleに変更されました。これはサポートされていませんanyまったく 'Ready'通知の種類!これはまた、メンテナが盲目的に盲目的に拾うと、いくつかのウェブサイトから「戦闘は邪悪であると言う」と頻繁に起こります。

そのため、bind9.serviceが実際にtype = forking(type = simple)とそれが実行されていることを確認し、それが直接指定されていることを実行します(そして必要な "オプションをデーモン化してください)。

それでもうまくいかない場合(すなわち、早すぎると早すぎると早すぎる)、他の唯一のオプションは、DNSの可用性のチェックを保持するサービスをsecondサービスにすることです。

2
user1686