Mengapa ICMP Redirect Host terjadi?

25

Saya menyiapkan kotak Debian sebagai router untuk 4 subnet. Untuk itu saya telah mendefinisikan 4 antarmuka virtual pada NIC di mana LAN terhubung ( eth1).

eth1      Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.1.1  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::960c:6dff:fe82:d98/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6026521 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35331299 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:673201397 (642.0 MiB)  TX bytes:177276932 (169.0 MiB)
          Interrupt:19 Base address:0x6000 

eth1:0    Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.2.1  Bcast:10.1.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:19 Base address:0x6000 

eth1:1    Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.3.1  Bcast:10.1.3.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:19 Base address:0x6000 

eth1:2    Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.4.1  Bcast:10.1.4.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:19 Base address:0x6000 

eth2      Link encap:Ethernet  HWaddr 6c:f0:49:a4:47:38  
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::6ef0:49ff:fea4:4738/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:199809345 errors:0 dropped:0 overruns:0 frame:0
          TX packets:158362936 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:1000 
          RX bytes:3656983762 (3.4 GiB)  TX bytes:1715848473 (1.5 GiB)
          Interrupt:27 

eth3      Link encap:Ethernet  HWaddr 94:0c:6d:82:c8:72  
          inet addr:192.168.2.5  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::960c:6dff:fe82:c872/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:110814 errors:0 dropped:0 overruns:0 frame:0
          TX packets:73386 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:16044901 (15.3 MiB)  TX bytes:42125647 (40.1 MiB)
          Interrupt:20 Base address:0x2000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:22351 errors:0 dropped:0 overruns:0 frame:0
          TX packets:22351 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2625143 (2.5 MiB)  TX bytes:2625143 (2.5 MiB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:41358924 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23116350 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:3065505744 (2.8 GiB)  TX bytes:1324358330 (1.2 GiB)

Saya memiliki dua komputer lain yang terhubung ke jaringan ini. Satu memiliki IP 10.1.1.12 (subnet mask 255.255.255.0) dan yang lain 10.1.2.20 (subnet mask 255.255.255.0). Saya ingin dapat mencapai 10.1.1.12 dari 10.1.2.20.

Karena penerusan paket diaktifkan di router dan kebijakan rantai FORWARD adalah MENERIMA (dan tidak ada aturan lain), saya memahami bahwa seharusnya tidak ada masalah untuk melakukan ping dari 10.1.2.20 ke 10.1.1.12 melalui router.

Namun, inilah yang saya dapatkan:

$ ping -c15 10.1.1.12
PING 10.1.1.12 (10.1.1.12): 56 data bytes
Request timeout for icmp_seq 0
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 81d4   0 0000  3f  01 e2b3 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 1
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 899b   0 0000  3f  01 daec 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 2
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 78fe   0 0000  3f  01 eb89 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 3
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 14b8   0 0000  3f  01 4fd0 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 4
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 8ef7   0 0000  3f  01 d590 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 5
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 ec9d   0 0000  3f  01 77ea 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 6
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 70e6   0 0000  3f  01 f3a1 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 7
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 b0d2   0 0000  3f  01 b3b5 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 8
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 f8b4   0 0000  3f  01 6bd3 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 9
Request timeout for icmp_seq 10
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 1c95   0 0000  3f  01 47f3 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 11
Request timeout for icmp_seq 12
Request timeout for icmp_seq 13
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 62bc   0 0000  3f  01 01cc 10.1.2.20  10.1.1.12 

Mengapa ini terjadi?

Dari apa yang saya baca Redirect Hostresponnya ada hubungannya dengan fakta bahwa dua host berada di jaringan yang sama dan ada rute yang lebih pendek (atau jadi saya mengerti). Mereka sebenarnya di jaringan fisik yang sama, tetapi mengapa akan ada rute yang lebih baik jika mereka tidak berada di subnet yang sama (mereka tidak dapat saling melihat)?

Apa yang saya lewatkan?

Beberapa info tambahan yang mungkin ingin Anda lihat:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
127.0.0.1       0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth3
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2
10.1.4.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.3.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth2
0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 eth3

# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  -- !10.0.0.0/8           10.0.0.0/8          
MASQUERADE  all  --  10.0.0.0/8          !10.0.0.0/8          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
El Barto
sumber

Jawaban:

22

Pada blush on pertama, sepertinya Debian memperluas batasan untuk mengirim pengalihan ICMP; mengutip RFC 792 (Protokol Internet) .

  The gateway sends a redirect message to a host in the following
  situation.  A gateway, G1, receives an internet datagram from a
  host on a network to which the gateway is attached.  The gateway,
  G1, checks its routing table and obtains the address of the next
  gateway, G2, on the route to the datagram's internet destination
  network, X.  If G2 and the host identified by the internet source
  address of the datagram are on the same network, a redirect
  message is sent to the host.  The redirect message advises the
  host to send its traffic for network X directly to gateway G2 as
  this is a shorter path to the destination.  The gateway forwards
  the original datagram's data to its internet destination.

Dalam hal ini, G1 adalah 10.1.2.1(di eth1:0atas), X adalah 10.1.1.0/24dan G2 adalah 10.1.1.12, dan sumbernya adalah 10.1.2.20(yaitu G2 and the host identified by the internet source address of the datagram are **NOT** on the same network). Mungkin ini telah ditafsirkan secara historis berbeda dalam kasus alias antarmuka (atau alamat sekunder) pada antarmuka yang sama, tetapi sebenarnya saya tidak yakin kita harus melihat Debian mengirim pengalihan itu.

Tergantung pada kebutuhan Anda, Anda mungkin bisa memecahkan masalah ini dengan membuat subnet untuk eth1sesuatu seperti 10.1.0.0/22(alamat host dari 10.1.0.1- 10.1.3.254) daripada menggunakan alias antarmuka bagi individu /24blok ( eth1, eth1:0, eth1:1, eth1:2); jika Anda melakukan ini, Anda harus mengubah netmask dari semua host yang terpasang dan Anda tidak akan dapat menggunakan 10.1.4.x kecuali Anda memperluas ke a /21.

EDIT

Kami mencoba sedikit di luar ruang lingkup pertanyaan asli, tetapi saya akan membantu mengatasi masalah desain / keamanan yang disebutkan dalam komentar Anda.

Jika Anda ingin mengisolasi pengguna di kantor Anda dari satu sama lain, mari kita mundur sejenak dan melihat beberapa masalah keamanan dengan apa yang Anda miliki sekarang:

Saat ini Anda memiliki empat subnet dalam satu domain siaran ethernet. Semua pengguna dalam satu broadcast domain tidak memenuhi persyaratan keamanan Anda diartikulasikan dalam komentar (semua mesin akan melihat siaran dari mesin lain dan spontan bisa mengirimkan lalu lintas ke satu sama lain pada Layer2, terlepas dari mereka makhluk gateway default eth1, eth1:0, eth1:1atau eth1:2). Tidak ada firewall Debian yang dapat Anda lakukan untuk mengubah ini (atau mungkin saya harus mengatakan tidak ada yang harus dilakukan firewall Debian Anda untuk mengubah ini :-).

  • Anda perlu menetapkan pengguna ke Vans, berdasarkan kebijakan keamanan yang dinyatakan dalam komentar. Vlan yang dikonfigurasi dengan benar akan sangat membantu untuk memperbaiki masalah yang disebutkan di atas. Jika switch ethernet Anda tidak mendukung Vans, Anda harus mendapatkannya.
  • Sehubungan dengan beberapa domain keamanan yang mengakses 10.1.1.12, Anda memiliki beberapa opsi:
    • Opsi 1 : Mengingat persyaratan bagi semua pengguna untuk mengakses layanan 10.1.1.12, Anda dapat menempatkan semua pengguna dalam satu subnet IP dan menerapkan kebijakan keamanan dengan Private Vlans (RFC 5517) , dengan anggapan switch ethernet Anda mendukung hal ini. Opsi ini tidak akan memerlukan iptablesaturan untuk membatasi lalu lintas intra-kantor dari melintasi batas keamanan (yang dilakukan dengan Vans pribadi).
    • Opsi 2 : Anda bisa menempatkan pengguna ke subnet yang berbeda (sesuai dengan Vans) dan menerapkan iptablesaturan untuk menerapkan kebijakan keamanan Anda
  • Setelah Anda mengamankan jaringan Anda di tingkat Vlan, atur kebijakan perutean berbasis sumber untuk mengirim pengguna yang berbeda keluar dari banyak uplink Anda.

FYI, jika Anda memiliki router yang mendukung VRF , beberapa di antaranya menjadi lebih mudah; IIRC, Anda memiliki mesin Cisco IOS di tempat. Bergantung pada model dan gambar perangkat lunak yang sudah Anda miliki, Cisco dapat melakukan pekerjaan yang fantastis dengan mengisolasi pengguna Anda satu sama lain dan menerapkan kebijakan perutean berbasis sumber.

Mike Pennington
sumber
Pada dasarnya yang saya butuhkan adalah memiliki 4 subnet untuk area kantor yang berbeda. Beberapa subnet akan keluar ke internet menggunakan satu ISP dan yang lain akan menggunakan yang berbeda. Mesin dari subnet yang berbeda seharusnya tidak dapat melihat atau terhubung satu sama lain. KECUALI untuk host 10.1.1.12 yang menawarkan beberapa layanan yang harus tersedia untuk semua. Saat ini saya belum menyiapkan aturan FORWARD yang sesuai untuk ini. Namun, karena semua penyerang diterima saya pikir saya harus bisa melakukan ping dari 10.1.2.20 ke 10.1.1.12.
El Barto
Hmm ... oke, terima kasih Mike. Saya akan melihat ke dalam VLAN lebih dalam. Saya telah memikirkannya sebelum memulai semua ini, dan berpikir saya tidak akan membutuhkannya. Saklar yang kami miliki mendukung VLAN, meskipun sakelar itu tidak dikelola sehingga, jika saya tidak salah, saya kira saya harus melakukan penandaan pada router Debian, bukan? Isolasi subnet itu sebenarnya bukan masalah kritis di kantor ini, tapi itu sesuatu yang saya pikir akan baik untuk dimiliki jika tidak memerlukan kerja ekstra terlalu banyak. Saya akan memeriksanya dan melihat apa yang bisa saya lakukan :)
El Barto
@ ElBarto, jika sakelar Anda tidak mendukung pemberian tag Vlan (dan itu tidak mungkin jika tidak dikelola), maka hanya memberi tag pada Debian tidak akan membantu. Jika isolasi subnet intra-kantor bukan merupakan masalah kritis, maka letakkan semua orang di dua subnet yang berbeda dan buat semuanya menjadi mudah (dua subnet memastikan Anda bisa membuat kebijakan rute di Debian). Saya akan mengatakan bahwa skema saat ini dengan empat alias antarmuka Debian tidak menawarkan isolasi subnet nyata, dan itu menambah lebih banyak komplikasi.
Mike Pennington
Itu benar, dari apa yang saya mengerti dari manual pengguna switch mendukung "menjaga tag" tetapi tidak "melakukan penandaan yang sebenarnya". Terima kasih atas klarifikasi tentang Debian. Masalahnya adalah bahwa bahkan jika saya menyimpan dua subnet, saya masih membutuhkan mesin dari subnet 10.1.2.0/24 untuk mengakses 10.1.1.12.
El Barto
Mesin-mesin di subnet yang berbeda masih harus dapat diakses 10.1.1.12. Jika Anda memblokir linux dari pengiriman ICMP yang tidak terjangkau iptables, maka Anda masih akan membakar CPU dari pengiriman ICMP, tetapi setidaknya mereka tidak akan diinstal di tabel host Anda. Yang mengatakan, jika Anda menambahkan antarmuka ethernet lain pada Debian (yaitu mendedikasikan satu antarmuka per 'kelas' pengguna), Debian seharusnya tidak mengirim ICMP yang tidak terjangkau lagi; yang akan menyiratkan bahwa Anda memiliki dua switch ethernet yang berbeda: satu untuk setiap 'kelas' pengguna. Teknisi perkabelan Anda tidak akan menyukainya, tetapi pekerjaan itu selesai
Mike Pennington
3

Tidak terlalu jelas apa yang Anda coba lakukan, tetapi saya dapat mengatakan yang berikut.

Subnet ini terhubung ke antarmuka fisik yang sama. Router Linux akan mengembalikan pesan pengalihan ICMP ketika paket yang diterima harus diteruskan melalui antarmuka fisik yang sama.

Khaled
sumber
Saya perlu menangani 4 subnet ini yang semuanya terhubung melalui NIC yang sama. Idenya adalah bahwa host dari subnet yang berbeda seharusnya tidak dapat terhubung satu sama lain, kecuali untuk host 10.1.1.12 yang harus tersedia untuk semua. Saya belum menetapkan aturan penerusan untuk ini, jadi saya pikir setiap host dari subnet mana pun harus dapat mencapai 10.1.1.12. Apakah ada cara untuk menghindari pengalihan ICMP?
El Barto
1
@ ElBarto, salah satu metode adalah menambahkan iptablesaturan yang menjatuhkan pengalihan keluareth1
Mike Pennington
1

Saya setuju dengan komentar Khaled dan juga akan menambahkan akhir kalimatnya:

"Subnet ini terhubung ke antarmuka fisik yang sama. Router Linux akan mengembalikan pesan pengalihan ICMP ketika paket yang diterima harus diteruskan melalui antarmuka fisik yang sama" ke subnet tujuan yang sama kemudian mengarahkan permintaan ke hop berikutnya. Itu terjadi pada saya hari ini menggunakan router linux Mikrotik dan perangkat F5 bigip LTM.

root@(primaryadc)(cfg-sync In Sync)(Standby)(/Common)(tmos)# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 192.168.153.20: icmp_seq=1 Redirect Host(New nexthop: 192.168.153.2)
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=82.8 ms
From 192.168.153.20: icmp_seq=2 Redirect Host(New nexthop: 192.168.153.2)
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=123 ms
**routing table**
0.0.0.0  192.168.153.20  0.0.0.0         UG        0 0          0 external
user352048
sumber