Я использую несколько виртуальных машин Ubuntu 16.04 в облаке Azure. Всякий раз, когда я перезагружаю виртуальную машину, я должен вручную установить шлюз по умолчанию.
Шлюз должен быть установлен dhclient. Я активировал отладку и получил следующее:
корень @ backend01: /etc/dhcp/dhclient-exit-hooks.d# cat /tmp/dhclient-script.debug
root@backend01:/etc/dhcp/dhclient-exit-hooks.d# cat /tmp/dhclient-script.debug
Thu Jun 2 17:18:33 UTC 2016: entering /etc/dhcp/dhclient-enter-hooks.d, dumping variables.
reason='PREINIT'
interface='eth0'
--------------------------
Thu Jun 2 17:18:33 UTC 2016: entering /etc/dhcp/dhclient-enter-hooks.d, dumping variables.
reason='REBOOT'
interface='eth0'
new_ip_address='10.10.0.13'
new_network_number='10.10.0.0'
new_subnet_mask='255.255.0.0'
new_broadcast_address='10.10.255.255'
new_routers='10.10.0.1'
new_rfc3442_classless_static_routes='0 10 10 0 1 32 168 63 129 16 10 10 0 1'
new_domain_name='azure-prod'
new_domain_search='azure-prod.'
new_domain_name_servers='10.11.0.250 10.11.0.251'
Значит, опция роутеров выставлена правильно. Даже файл аренды показывает правильное значение:
lease {
interface "eth0";
fixed-address 10.10.0.13;
server-name "RD7CFE90879C98";
option subnet-mask 255.255.0.0;
option dhcp-lease-time 4294967295;
option routers 10.10.0.1;
option dhcp-message-type 5;
option dhcp-server-identifier 168.63.129.16;
option domain-name-servers 10.11.0.250,10.11.0.251;
option domain-search "azure-prod.";
option dhcp-renewal-time 4294967295;
option rfc3442-classless-static-routes 0,10,10,0,1,32,168,63,129,16,10,10,0,1;
option unknown-245 a8:3f:81:10;
option dhcp-rebinding-time 4294967295;
option domain-name "azure-prod";
renew 0 2152/07/09 23:41:47;
rebind 0 2152/07/09 23:41:47;
expire 0 2152/07/09 23:41:47;
}
Вот как выглядит мой /etc/dhcp/dhclient.conf:
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
send host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;
timeout 300;
supersede domain-name "azure-prod";
supersede domain-search "azure-prod";
Почему dhclient не устанавливает мой маршрут по умолчанию?
Я нашел проблему. Поскольку Azure DHCP устанавливает rfc3442-classless-static-routes
опция роутеры игнорируются сценарием dhclient.
Rfc3442 обрабатывается сценарием перехвата выхода в /etc/dhcp/dhclient-exit-hooks.d/rfc3442-classless-routes
Моя проблема заключалась в том, что у меня был другой пользовательский хук выхода, который exit 0
в конце и, следовательно, завершил выполнение dhclient-script, который, в свою очередь, так и не смог выполнить обработчик выхода rfc3442-classless-routes.
Это было глубоко похоронено и стоило мне почти дня работы. Так что я надеюсь, что это убережет кого-то от такой же проблемы в будущем.