Bisakah saya mencegah penambahan rute default saat membuka antarmuka?

12

Saya memiliki sistem dengan dua NIC di atasnya. Mesin ini, dan beberapa perangkat yang menyertainya akan dipindahkan dan dilampirkan ke LAN yang berbeda atau kadang-kadang menggunakan dial-up.

    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

Saya menggunakan ifconfig untuk membawa antarmuka naik atau turun (selain dengan ppp0, yang ditangani oleh KPPP).

Jika saya membuka eth1 terlebih dahulu, ia mendapat alamat dari DHCP-nya dan mendapatkan gateway dan itu ditambahkan ke perutean sehingga tidak ada masalah menjangkau LAN dan internet.

Jika saya membuka eth0 pertama atau kedua, ia mendapatkan alamatnya dan menetapkan gateway default ke dalam ruang alamatnya (dalam kisaran 10.xxx). Jika saya membuka eth0 pertama dan eth1 detik, gateway default masih disimpan dalam kisaran 10.xxx.

Jadi, apa pun yang saya lakukan, eth0 akan menimpa eth1 dan "mengklaim" gateway dalam routing.

Apakah ada cara untuk mencegah eth0 dari mengklaim gateway, atau untuk memastikan eth1 (jika dibesarkan 2nd) menggunakan gateway-nya? Atau bisakah saya memprioritaskan peringkat gateway antarmuka mana yang harus digunakan daripada yang lain?

Saya pada dasarnya ingin memastikan gateway ruang alamat default eth1 digunakan jika itu aktif, dan jika tidak, maka gateway default ppp0 digunakan. Saya ingin mencegah eth0 memiliki gateway default.

Tango
sumber
Aneh bahwa menggunakan ifconfigakan menyebabkan segala jenis interaksi DHCP. Biasanya ifupakan melakukan ini, dengan memulai dhclient. Apakah antarmuka eth * Anda mungkin dimunculkan oleh proses boot sistem, katakanlah /etc/init.d/network, atau oleh NetworkManager?
Mark Plotnick
@MarkPlotnick: Ini setelah saya boot dan menggunakan "ifconfig eth1 up" (atau down atau eth0 ...). Saya kira bentuk paling sederhana dari apa yang ingin saya lakukan adalah memunculkan eth0 tanpa ada rute yang ditambahkan selain ke ruang alamat 10.xxx.
Tango

Jawaban:

5

Konfigurasi server DHCP salah. Ini tidak boleh mengirim opsi gateway default ketika itu tidak dapat memberikan perutean ke seluruh dunia. Jika memang mengirim opsi itu maka klien mana pun dapat berasumsi bahwa ia dapat mengirim paket untuk tujuan off-link ke gateway default yang ditentukan.

Jadi kotak Anda benar dalam menggunakan gateway default dari eth0 jika diberi tahu oleh DHCP. Solusinya adalah menghapus opsi buruk dari server DHCP Anda.

Sander Steffann
sumber
Oke, itu masuk akal. Sayangnya, server DHCP adalah DLink DNS-321, yang tidak memungkinkan banyak opsi kontrol. Tampaknya mengharuskan saya memasukkan gateway. Saya harus melihat apakah saya bisa meretasnya dan mengedit file konfigurasi. Tapi, satu masalah lain: Mengapa selalu mengambil gateway dari server DHCP 10.xxx dan tidak selalu mengambil gateway dari server lain?
Tango
1
Saya tidak yakin bagaimana linux memilih antara rute yang identik. Mungkin didasarkan pada metrik. Bisakah Anda menunjukkan tabel perutean Anda ketika Anda memiliki beberapa rute default?
Sander Steffann
Itu tidak akan mengizinkan banyak rute default. Frustrasinya adalah karena alasan tertentu eth0 selalu mendengarkan DHCP dan memperbarui gateway. Dengan eth1, ia hanya mendengarkan dan menggunakan gateway jika antarmuka pertama dan satu-satunya yang tersedia. Jika gateway eth0 tidak selalu mengesampingkan eth1, maka saya hanya akan menulis skrip sehingga ketika eth0 dibesarkan, eth1 diturunkan, lalu dibesarkan.
Tango
Hampir kedengarannya seperti keanehan kode keras pada klien DHCP. Yang mana yang kamu gunakan? Sebagai alternatif: mungkin lebih mudah untuk hanya menukar eth0 dan eth1;)
Sander Steffann
Ada di D-Link DNS-321. Tetapi saya telah melalui / var / logs / syslog dan saya dapat melihat bahwa DHCP untuk eth1 juga mengirim di gateway setiap waktu. Saya tidak tahu mengapa eth1 selalu mengambil gateway dan menambahkannya ke rute dan eth1 tidak. Saya akan mencoba membatasi rentang untuk menggunakan DHCP eth0 untuk mulai dari 10.0.0.3 dan kemudian membuat eth0 statis, menggunakan 10.0.0.2 dan melihat apakah itu mengarah ke mengabaikan server DHCP kasar itu.
Tango
16

Saya menghadapi masalah serupa pada Raspbian (saya kira solusi di bawah ini akan berlaku untuk Debian juga). Raspberry Pi 3 memiliki 2 NIC terintegrasi: Wi-Fi dan Ethernet. Saya menggunakan keduanya, mereka wlan0 dan eth0, masing-masing. wlan0 terhubung ke jaringan Wi-Fi rumah saya dan akses internet datang melalui antarmuka ini. Ini mendapatkan pengaturannya melalui DHCP dari router rumah saya. eth0 terhubung langsung ke PC windows saya dan memiliki IP statis yang ditetapkan. Tidak ada akses internet via eth0 karena saya tidak mengkonfigurasinya di PC windows saya.

Dalam Raspbian, daemon dhcpcd bertanggung jawab untuk mengkonfigurasi antarmuka jaringan. Untuk mengatur IP statis ke antarmuka eth0, ada baris berikut ditambahkan ke akhir /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

Dengan pengaturan ini, dhcpcd membuat 2 rute default dan rute via eth0 memiliki prioritas lebih tinggi daripada itu melalui 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

Jadi saya tidak punya akses internet, karena sistem mencoba merutekannya melalui eth0 dan tidak punya akses internet, seperti yang saya sebutkan di atas.

Untuk mengatasi masalah tersebut, saya menggunakan nogatewayopsi di /etc/dhcpcd.confantarmuka for eth0. Jadi konfigurasi eth0-specific mulai terlihat seperti itu:

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

Setelah menyimpan konfigurasi ini dan me-reboot, tidak ada rute default via 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

Akses internet muncul, dan masalahnya terpecahkan.

Roman Me
sumber
1
Ini persis situasi saya, dan ini persis solusinya.
PNDA
Terima kasih, nogatewayadalah cara untuk masuk dalam distro debian terbaru
Alessandro Dionisi
Anda tidak dapat membayangkan betapa repotnya menghadapi masalah ini di Raspbian Pi, dan Anda baru saja memberikan solusi yang paling elegan dan benar. Terima kasih kawan
TechNyquist
7

Pada RHEL6 / Fedora 22 berikut ini telah diuji.

Di / etc / sysconfig / network-scripts / ifcfg-eth1 tambahkan baris:

DEFROUTE=no

Ganti eth1 dengan nama antarmuka di mana perutean default tidak diinginkan.

Ini juga dapat dilakukan melalui Network Manager GUI dengan mencentang kotak "Gunakan koneksi ini hanya untuk sumber daya di jaringannya" di bagian bawah tab IPv4.

DEFROUTE = tidak mencegah penambahan rute default (tujuan 0.0.0.0) ke tabel routing ketika antarmuka diaktifkan. yaitu. entri berikut tidak akan ditambahkan.

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
pengguna3489409
sumber
1
Tolong jelaskan mengapa itu memperbaiki masalah. Dan ketika itu berhasil. Ini akan bekerja pada distro berbasis Debian (saya percaya) tetapi tidak pada distro dengan penamaan antarmuka yang berbeda (atau distro menggunakan systemd untuk layanan jaringan).
grochmal
1
Lebih mirip Red Hat daripada sistem berbasis Debian.
ilkkachu
4

ok, jadi yang Anda inginkan adalah agar mesin tidak pernah membuka gateway default saat membuka eth0 dan mendapatkan alamatnya melalui DHCP.

Ini solusinya:

Edit file:

/etc/dhcp/dhclient-up-hooks

dan isi dengan:

#!/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

sebelum:

[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

setelah 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
Ricardo
sumber
Ini menghapus rute dengan gateway setelah dibuat, yang berarti sudah menghapus rute lain dengan gateway default. Atau apakah saya salah paham?
Tango
itu hanya akan menghapus gateway yang dibuat klien DHCP saat menampilkan eth0, itu tidak akan memengaruhi gateway lain yang sudah ada di sistem. Dari uraian Anda, saya akan menganggap masalah Anda adalah bahwa Anda mendapatkan dua gateway default simultan pada suatu waktu (satu di eth0 dan satu di eth1) dan Anda perlu menyingkirkan satu untuk eth0 sebelum bahkan diletakkan di tabel routing. Jika Anda memposting rute Anda -n output pada saat masalah ini, saya mungkin mengubah asumsi saya.
Ricardo
1

Anda dapat mengedit file dhcpclient.conf dan tidak meminta rute default apa pun dari server DHCP jarak jauh.

Contoh kecil dari apa yang telah saya lakukan dan ini bekerja untuk kasus saya

kirim host-name = "random-hostname";

request subnet-mask, broadcast-address, time-offset, interface-mtu, rfc3442-classless-static-route, ntp-server;

Netboy
sumber