İstenen IP adresi başka (devre dışı) bir arayüzle ilişkilendirilmişse, Linux ARP istek mesajlarına cevap vermez


9

Arabirim için yapılandırılmış bir PC (çekirdek 3.2.0-23-jenerik ) var ve ayrıca arabirim için kullanır ve adresleri :192.168.1.2/24eth0192.168.1.1192.168.1.2tun0

root@T42:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:41:54:01:93 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 scope global eth0
    inet6 fe80::216:41ff:fe54:193/64 scope link
       valid_lft forever preferred_lft forever
3: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
4: irda0: <NOARP> mtu 2048 qdisc noop state DOWN qlen 8
    link/irda 00:00:00:00 brd ff:ff:ff:ff
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:13:ce:8b:99:3e brd ff:ff:ff:ff:ff:ff
    inet 10.30.51.53/24 brd 10.30.51.255 scope global eth1
    inet6 fe80::213:ceff:fe8b:993e/64 scope link
       valid_lft forever preferred_lft forever
6: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc pfifo_fast state DOWN qlen 100
    link/none
    inet 192.168.1.1 peer 192.168.1.2/32 scope global tun0
root@T42:~# ip route show dev eth0
192.168.1.0/24  proto kernel  scope link  src 192.168.1.2 
root@T42:~# 

Yukarıda görüldüğü gibi, tun0idari olarak devre dışıdır ( ip link set dev tun0 down). Şimdi ARP istekleri aldığımda 192.168.1.2, PC bu isteklere cevap vermiyor:

root@T42:~# tcpdump -nei eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:30:34.875427 00:1a:e2:ae:cb:b7 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.1.2 tell 192.168.1.1, length 46
15:30:36.875268 00:1a:e2:ae:cb:b7 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.1.2 tell 192.168.1.1, length 46
15:30:39.138651 00:1a:e2:ae:cb:b7 > 00:1a:e2:ae:cb:b7, ethertype Loopback (0x9000), length 60:
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
root@T42:~#

Yalnızca tun0arabirimi ( ip link del dev tun0) sildikten sonra bilgisayar 192.168.1.2, eth0arabirimdeki ARP isteğine yanıt verecektir .

Yönlendirme tablosu, önce ve sonra tam olarak benzer görünüyor ip link del dev tun0:

root@T42:~# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.30.51.254    0.0.0.0         UG        0 0          0 eth1
10.30.51.0      0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.1.0     192.168.1.2     255.255.255.0   UG        0 0          0 eth0
root@T42:~# ip link del dev tun0
root@T42:~# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.30.51.254    0.0.0.0         UG        0 0          0 eth1
10.30.51.0      0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.1.0     192.168.1.2     255.255.255.0   UG        0 0          0 eth0
root@T42:~# 

Aşağıdaki yönlendirme girişi ip link set dev tun0 downkomutla zaten kaldırıldı :

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.2     0.0.0.0         255.255.255.255 UH        0 0          0 tun0

Bununla birlikte, yönlendirme tabloları ip link del dev tun0komuttan önce ve sonra tam olarak aynı olsa da , çekirdeğin vereceği gerçek yönlendirme kararları:

T42:~# ip route get 192.168.1.1
local 192.168.1.1 dev lo  src 192.168.1.1 
    cache <local> 
T42:~# ip link del dev tun0
T42:~# ip route get 192.168.1.1
192.168.1.1 dev eth0  src 192.168.1.2 
    cache  ipid 0x8390
T42:~# 

Bu beklenen bir davranış mı? Çekirdek neden yönlendirme tablosunu yok sayıyor?


Her iki durumda da netstat -rn çıktısını yapıştırabilir misiniz? Yönlendirme tablosu genellikle bu tür hataları arayan ilk yerdir.
Clarus

@Claris İlk yazımı güncelledim.
Martin

İki arabirimde aynı IP'ye sahip olmak sorun yaratabilir ve en iyi şekilde önlenerek, sorunu izleyebilmeniz gerektiği söylenir. Bir sonraki adım arp önbelleğine bakmak, arp -a yararlı bir şey gösteriyor mu?
Clarus

@Claris Kök neden, tun0arabirim devre dışı bırakıldığında ancak mevcut olduğunda çekirdeğin yönlendirme tablosunu yok saydığı anlaşılıyor . ip route getGüncellenmiş ilk yazımdaki komutların çıktısına bakın . Ancak, çekirdek neden böyle davranıyor?
Martin

Yanıtlar:


17

Yönlendirme tablonuz tam olarak yok sayılmıyor. Yüksek öncelikli bir yönlendirme tablosu tarafından reddediliyor.

Neler oluyor

Yazarken gördüğünüz ip route showyönlendirme tablosu, çekirdeğin kullandığı tek yönlendirme tablosu değildir. Aslında, varsayılan olarak üç yönlendirme tablosu vardır ve bunlar ip rulekomut tarafından gösterilen sırayla aranır :

# ip rule show
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

En iyi bildiğiniz tablo şudur main, ancak en yüksek öncelikli yönlendirme tablosu şöyledir local. Bu tablo yerel ve yayın yollarını izlemek için çekirdek tarafından yönetilir: başka bir deyişle, localtablo çekirdeğe kendi arabirimlerinin adreslerine nasıl yönlendirileceğini söyler. Şuna benziyor:

# ip route show table local
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
broadcast 192.168.1.0 dev eth0  proto kernel  scope link  src 192.168.1.2
local 192.168.1.1 dev tun0  proto kernel  scope host  src 192.168.1.1
local 192.168.1.2 dev eth0  proto kernel  scope host  src 192.168.1.2
broadcast 192.168.1.255 dev eth0  proto kernel  scope link  src 192.168.1.2

Bu satır referanslarına göz atın tun0. Bu garip sonuçlara neden oluyor route get. 192.168.1.1 yerel bir adres olduğunu söylüyor, yani 192.168.1.1'e bir ARP yanıtı göndermek istiyorsak, bu kolay; kendimize gönderiyoruz. localTabloda bir rota bulduğumuz için, bir rota aramayı bırakıyoruz ve mainveya defaulttabloları kontrol etmekten rahatsız olmuyoruz .

Neden birden fazla tablo?

En azından, ip routeekranı tıkayan tüm bu "açık" rotaları yazabilmek ve görmemek güzel ( route printbir Windows makinesinde yazmayı deneyin ). Ayrıca, yanlış konfigürasyona karşı asgari bir koruma görevi görebilir: ana yönlendirme tablosu karışmış olsa bile, çekirdek hala kendisiyle nasıl konuşulacağını bilir.

(Neden yerel rotaları ilk etapta saklıyorsunuz? Böylece çekirdek yerel adresler için diğer her şeyle aynı arama kodunu kullanabilir.

Bu çok masalı şema ile yapabileceğiniz başka ilginç şeyler var. Özellikle, kendi tablolarınızı ekleyebilir ve arandıkları zaman için kurallar belirleyebilirsiniz. Buna "politika yönlendirme" denir ve bir paketi kaynak adresine göre yönlendirmek isterseniz , Linux'ta bunu nasıl yapacağınız açıklanmaktadır.

Özellikle zor veya deneysel şeyler yapıyorsanız , komutta localbelirterek kendiniz rota ekleyebilir veya kaldırabilirsiniz . Ne yaptığınızı bilmiyorsanız, çekirdeği karıştırmanız muhtemeldir. Ve elbette, çekirdek hala kendi yollarını eklemeye ve kaldırmaya devam edecek, bu yüzden sizinkinin üzerine yazılmadığından emin olmak için izlemelisiniz.table localip route

Son olarak, tüm yönlendirme tablolarını aynı anda görmek istiyorsanız:

# ip route show table all

Daha fazla bilgi ip-rule(8)için kılavuz sayfasına veya iproute2 belgelerine göz atın . Yapabileceklerinizle ilgili bazı örnekler için Gelişmiş Yönlendirme ve Trafik Kontrolü NASIL belgesini de deneyebilirsiniz .


Teşekkürler! Sonra kural hala gerçekten mevcuttu yönlendirme tablosunun. Bir kez idam söz konusu kural kaldırıldı. Yine de, bir soru - tüm modern Linux çekirdeklerinin (2.6.x, 3.x, 4.x) rota aramaları ve dolayısıyla çoklu tablolar için RPDB kullandığını düzeltir miyim? ip link set dev tun0 downlocal 192.168.1.1 dev tun0 proto kernel scope host src 192.168.1.1localip link del dev tun0
Martin

2
Evet, haklısın ve daha fazlası. RPDB şaşırtıcı derecede eski! "RPDB'nin kendisi, Linux çekirdeği 2.2'deki ağ yığınının yeniden yazılmasının ayrılmaz bir parçasıydı." Ve from ip(8): " ipAlexey N. Kuznetsof tarafından yazıldı ve Linux 2.2'de eklendi."
Jander

Bu, gördüğüm çoklu çekirdek yönlendirme tablolarının en iyi açıklamalarından biridir. Teşekkürler!
djluko

1

Sizin ters yol filtreleme yapılandırma muhtemelen sorundur. RFC3704 - bölüm 2.4

Kurumsal Linux dağıtımlarında (RHEL, CentOS, Scientific Linux ve diğerleri) bunu çözmenin olası en iyi yolu /etc/sysctl.conf,rp_filter = 2

RHEL'in yapılandırılmış birden fazla IP'si varsa, uzaktaki bir ağdan yalnızca birine erişilebilir. Veya RHEL, giden trafiğin rotası gelen trafiğin rotasından farklı olduğunda neden paketleri yok sayar?


Gevşek RPF kontrolü (2) kullanırsam veya RPF kontrolünü (0) for rp_filter_file in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > "$rp_filter_file"; doneçekirdek ile birlikte devre dışı bırakırsam , eth0paketleri 192.168.1.1'e yönlendirmek için arabirimi kullanmaz . Yalnızca çekirdek tun0ile arabirimi sildiğimde arabirimi ip link del dev tun0kullanmaya başlar eth0.
Martin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.