マルチホームボックスでは、DHCP用に複数のアップリンクを構成する必要があります。 1つを除くすべてのDHCPアップリンクのデフォルトルートとDNSを無視する必要があります。
ここにも同様の質問があります[ Debianインターフェイスファイル-dhcpからのゲートウェイとDNSエントリを無視します ]が、そこでの答えは私の問題を解決しません:
ifmetric
提案は、DNSではなく、ルートのみを扱います。また、2009年から状況が変わったことを願っています。
私はヘッドレス組み込みシステムについて話していることに注意してください。 NetworkManagerはオプションではありません。
推奨されるソリューションは、/ etc/network/interfaces {.d /}のみです。私はこのようなものを探しています:
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp
ignore-dhcp-option routers domain-name-servers domain-name
補遺:
これらのボックスは、さまざまな環境に数十個インストールされています。ネットワークは私たちの管理下にありません。場合によっては、ボックスは複数のインターフェイスでDHCPを実行する必要があります。デフォルトルートとDNSは通常、事前にわかっていません。たとえあったとしても、予告なしに時間の経過とともに変更される可能性があります。したがって、静的に設定することはできませんが、「メイン」DHCPクライアントを介して構成する必要があります。
(私はまだ/etc/network/interfaces{,.d/}
にのみ触れるソリューションに興味があり、/etc/dhcp/
には触れません。そのようなソリューションがない場合は、これを使用します。)
/etc/dhcp*/dhclient.conf
で、オプションrouters, domain-name-servers, domain-name, domain-search
をグローバルrequest
ステートメントから削除します。次に、これを追加します(eth0
がデフォルトルートとDNSがnot無視されるデバイスであると仮定します):
interface "eth0" {
also request routers, domain-name-servers, domain-name, domain-search;
}
このソリューションは、Debian 7に同梱されているため、少なくともisc-dhcp-clientバージョン4.2.2.dfsg.1-5 + deb70u8で機能します。それ以降のバージョンでも機能すると思います。
編集:
eth0
を引用する必要があり、request
ではなくrequired
にする必要があります)inet dhcp
を使用する代わりに、inet manual
を使用して、カスタムdhclient.conf
ファイルを渡すことができる独自のdhclient
呼び出しを指定できます(-cf <file>
引数に注意してください) )::
iface eth0 inet manual
up /sbin/dhclient -4 -v -pf /run/dhclient.${IFACE}.pid \
-lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
-df /var/lib/dhcp/dhclient6.${IFACE}.leases \
-cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}
down /sbin/dhclient -4 -v -r -pf /run/dhclient.${IFACE}.pid \
-lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
-df /var/lib/dhcp/dhclient6.${IFACE}.leases \
-cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}
カスタムdhclient.conf
(この場合は/etc/dhcp/dhclient_no_routers.conf
)で、必要なDHCPオプションを設定できます。
inet dhcp
メソッドが他に何をするかを確認するには、ソースコードの inet.defn ファイルを参照してください(ここから、上からdhclient
呼び出しの一部を取得しました)。
/etc/dhcp/dhcliet.confに追加することで、同じ問題が解決します。
interface "eth0" {
prepend domain-search "my.domain";
prepend domain-name-servers 127.0.0.1; # for using dnsmasq without -r option
request subnet-mask, broadcast-address, time-offset,
routers, domain-name-servers, domain-name, domain-search, Host-name,
dhcp6.name-servers, dhcp6.domain-search,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers,
dhcp6.fqdn, dhcp6.sntp-servers;
require routers, domain-name-servers, domain-name, domain-search, Host-name;
}
グローバルパラメータrequest
を設定から削除します
(私の以前のコメントを答えに変える)
更新:
以下に提案するようにスクリプトを追加すると、初期状態が機能します。ただし、dhclientがデフォルトルートを喜んで再追加し、スクリプトが実行されないために再度削除されないシナリオ(たとえば、ケーブルを切断してから接続する)があります。その結果、2つのデフォルトルートがあります。
短編小説:このアプローチは(残念ながら)機能しません。
古い答え-これを無視してください
Dhclient.confをいじくり回すと、2つの欠点があります。
したがって、私は/etc/network/if-up.d
のスクリプトを選択しました。
#!/bin/sh
if [ x"$IFACE" = x"enp7s4" ]
then
route del default enp7s4
fi
欠点:これはインターフェイスが実際に起動した後に実行されるため、パケットが間違った方向に進む可能性がある場合、(短い)期間があります。適切に設計されたアプリケーションは、失われたパケットを処理できる必要があるため、問題にはなりません:-)。パケットが間違ったネットワークに漏れないようにする場合は、パケットをブロックするためのファイアウォールルールが必要です。