Чи можу я запобігти доданню маршруту за замовчуванням під час створення інтерфейсу?


12

У мене є система з двома NIC на ній. Ця машина та кілька супровідних пристроїв будуть переміщені та приєднані до різних локальних мереж або іноді для цього буде використовуватися комутований комутатор.

    eth0:
    - 10.x.x.x address space
    - no internet gateway
    - only a few devices

eth1 (when used):
- 172.16.x.x or 192.168.x.x or other address spaces
- access to the gateway from LAN to internet

ppp0 (when used):
- internet access through dialup using KPPP

Я використовую ifconfig для підведення інтерфейсів вгору або вниз (крім, ніж з ppp0, яким керує KPPP).

Якщо я спочатку підберу eth1, він отримує адресу від свого DHCP і отримує шлюз, і це додається до маршрутизації, щоб не виникало проблем з доступом до локальної мережі та Інтернету.

Якщо я виведу eth0 першим або другим, він отримує свою адресу і встановлює шлюз за замовчуванням в межах свого адресного простору (в діапазоні 10.xxx). Якщо я виведу eth0 першим і eth1 другим, шлюз за замовчуванням все ще зберігається в межах 10.xxx.

Отже, незалежно від того, що я роблю, eth0 замінить eth1 і "вимагатиме" шлюз у маршрутизації.

Чи є якийсь спосіб або не допустити, щоб eth0 вимагала шлюзу, або переконатися, що eth1 (якщо вона виведена 2-й) використовує свій шлюз? Або я можу якось розставити пріоритет у рейтингу, який шлюз інтерфейсу слід використовувати над іншими?

Я в основному хочу переконатися, що використовується шлюз адресного простору за замовчуванням eth1, якщо він активний, а якщо ні, то використовується шлюз за замовчуванням ppp0. Я хотів би мати можливість не допустити, щоб eth0 коли-небудь мав шлюз за замовчуванням.


Дивно, що використання ifconfigвикликає будь-яку взаємодію DHCP. Зазвичай це ifupбуде робити, починаючи dhclient. Можливо, ваш інтерфейс eth * підводиться під час завантаження системи, скажімо /etc/init.d/network, або NetworkManager?
Марк Плотнік

@MarkPlotnick: Це після завантаження і використання "ifconfig eth1 up" (або вниз, або eth0 ...). Я думаю, найпростішою формою того, що я хочу зробити, було б створити eth0 без додавання будь-яких маршрутів, крім адресного простору 10.xxx.
Танго

Відповіді:


5

Конфігурація сервера DHCP неправильна. Він не повинен надсилати параметр шлюзу за замовчуванням, коли він не може забезпечити маршрутизацію до решти світу. Якщо він все-таки надсилає цю опцію, то будь-який клієнт може припустити, що він може надсилати пакети для будь-якого місця відключення до вказаного шлюзу за замовчуванням.

Таким чином, ваше поле вірно використовує шлюз за замовчуванням від eth0, якщо це сказано DHCP. Рішення полягає в тому, щоб видалити поганий варіант зі свого сервера DHCP.


Гаразд, це має багато сенсу. На жаль, DHCP-сервер - це DLink DNS-321, який не дозволяє використовувати багато варіантів керування. Здається, я вимагаю включити шлюз. Мені доведеться перевірити, чи зможу я його якось зламати і відредагувати конфігураційний файл. Але, ще одне питання: чому він завжди бере шлюз з 10.xxx DHCP-сервера і не завжди приймає шлюз з іншого сервера?
Танго

1
Я не впевнений, як Linux вибирає між однаковими маршрутами. Це, мабуть, засноване на метриці. Чи можете ви показати свою таблицю маршрутизації, коли у вас є кілька маршрутів за замовчуванням?
Сандер Стеффан

Це не дозволить кілька маршрутів за замовчуванням. Розчарування в тому, що чомусь eth0 завжди слухає DHCP і оновлює шлюз. З eth1 він слухає та використовує шлюз лише у тому випадку, коли це перший та єдиний інтерфейс, що працює. Якщо шлюз eth0 не завжди переосмислював et1, тоді я просто напишу сценарій, щоб, коли eth0 виводили, eth1 знімали, а потім виховували.
Танго

Це майже звучить як сильно закодовані дивацтва у клієнта DHCP. Який ви використовуєте? Як альтернатива: можливо, буде простіше просто поміняти eth0 і eth1;)
Sander Steffann

Це на D-Link DNS-321. Але я пройшов / var / logs / syslog, і я бачу, що DHCP для eth1 також щоразу надсилається в шлюз. Я просто не можу зрозуміти, чому eth1 завжди бере шлюз і додає його до маршруту, а eth1 - ні. Я спробую обмежити діапазон для використання DHCP eth0, починаючи з 10.0.0.3, а потім зробити eth0 статичним, використовуючи 10.0.0.2, і побачу, чи це призводить до того, що він ігнорує грубі DHCP-сервери.
Танго

16

Я зіткнувся з подібною проблемою на Raspbian (я вважаю, що рішення нижче буде застосовно і до Debian). Raspberry Pi 3 має 2 інтегровані NIC: Wi-Fi та Ethernet. Я використовую обоє, вони є wlan0 та eth0 відповідно. wlan0 підключений до моєї домашньої мережі Wi-Fi і через цей інтерфейс надходить доступ до Інтернету. Він отримує свої налаштування через DHCP від ​​мого домашнього маршрутизатора. eth0 підключений безпосередньо до мого ПК з Windows і має призначений статичний IP. Доступ до Інтернету через eth0 не був доступний, оскільки я не конфігурував його на своєму ПК з Windows.

У Raspbian демон dhcpcd відповідає за налаштування мережевих інтерфейсів. Щоб встановити статичний IP на інтерфейс eth0, до кінця додано наступні рядки /etc/dhcpcd.conf:

interface eth0

static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1

За допомогою цих параметрів dhcpcd створив 2 маршрути за замовчуванням, і маршрут через eth0 мав вищий пріоритет, ніж цей через wlan0:

pi@raspberrypi:~ $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.2.1     0.0.0.0         UG    202    0        0 eth0
default         192.168.1.254   0.0.0.0         UG    303    0        0 wlan0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     202    0        0 eth0

Тож у мене не було доступу до Інтернету, оскільки система намагалася прокласти його через eth0 і не мала доступу до Інтернету, як я вже згадував вище.

Для вирішення проблеми я використав nogatewayваріант в /etc/dhcpcd.confінтерфейсі for eth0. Отже, конфігурація, орієнтована на eth0, стала таким чином:

interface eth0

static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
nogateway

Після збереження цієї конфігурації та перезавантаження не було маршруту за замовчуванням через eth0:

pi@raspberrypi:~ $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.254   0.0.0.0         UG    303    0        0 wlan0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     202    0        0 eth0

З’явився доступ в Інтернет, і проблема була вирішена.


1
Це була саме моя ситуація, і саме це було рішенням.
ПНДА

Дякую, nogatewayце шлях до останніх дистрибутивів Debian
Алессандро Діонісі

Ви не можете собі уявити, що за клопот зіткнутися з цією проблемою в Raspbian Pi, і ви просто дали найелегантніше і правильне рішення. Спасибі, чоловіче.
TechNyquist

7

На RHEL6 / Fedora 22 було протестовано наступне.

У / etc / sysconfig / network-skripts / ifcfg-eth1 додайте рядок:

DEFROUTE=no

Замініть eth1 на ім'я інтерфейсу, коли маршрутизація за замовчуванням не потрібна.

Це також можна зробити через GUI Network Manager, встановивши прапорець "Використовувати це з'єднання лише для ресурсів у його мережі" внизу вкладки IPv4.

DEFROUTE = no не перешкоджає доданню маршруту за замовчуванням (призначення 0,0.0.0) до таблиці маршрутизації, коли інтерфейс увімкнено. тобто. наступний запис не буде додано.

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         172.16.x.x      0.0.0.0         UG        0 0          0 eth1

1
Поясніть, будь ласка, чому це вирішує проблему. І коли це працює. Він буде працювати на дистрибутивах, заснованих на Debian (я вважаю), але не на дистрибутивах з різними назвами інтерфейсів (або дистрибутивом, використовуючи systemd для мережевих служб).
grochmal

1
Більше схожий на Red Hat, ніж на базі систем Debian.
ilkkachu

4

Гаразд, так що ви хочете, щоб машина ніколи не створювала шлюз за замовчуванням, коли він відкриває eth0 і отримує свою адресу через DHCP.

Ось рішення:

Редагувати файл:

/etc/dhcp/dhclient-up-hooks

і заповнити:

#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us

case ${interface} in
  eth0)
     printf "executing ip route delete default via $new_routers\n" 
     ip route delete default via $new_routers
  ;;
     *)
  ;;
esac

перед:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.4.1     0.0.0.0         UG    20     0        0 eth0
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

після ifdown eth0, ifup eth0:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Це видаляє маршрут із шлюзом після його встановлення, а це означає, що він уже видалив будь-який інший маршрут із шлюзом за замовчуванням. Або я неправильно розумію?
Танго

він видалить лише шлюз, створений клієнтом DHCP, коли він вивів eth0, це не вплине на будь-який інший шлюз, який вже є в системі. З вашого опису я припускаю, що ваша проблема полягає в тому, що ви отримуєте два одночасних шлюзи за замовчуванням (один на eth0 і один на eth1), і вам потрібно позбутися одного для eth0, перш ніж його навіть помістити в таблицю маршрутизації. Якщо ви розмістите свій маршрут -n на момент випуску, я можу змінити своє припущення.
Рікардо

1

Ви можете редагувати файл dhcpclient.conf і не вимагати маршруту за замовчуванням з віддаленого сервера DHCP.

Невеликий зразок того, що я зробив, і це працює для моєї справи

надіслати ім'я хоста = "ім'я випадкового хоста";

запит підмережі-маски, широкомовної адреси, зсуву часу, інтерфейсу-mtu, rfc3442-безкласових-статичних маршрутів, ntp-серверів;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.