Bisakah saya mengikat blok alamat (besar) ke antarmuka?

26

Saya tahu bahwa alat ip memungkinkan Anda mengikat banyak alamat ke antarmuka (mis., Http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). Saat ini, saya sedang mencoba untuk membangun sesuatu di atas IPv6, dan akan sangat berguna untuk memiliki seluruh blok alamat (katakanlah, a / 64) yang tersedia, sehingga program dapat memilih alamat mana pun dari jangkauan dan mengikat itu. Tak perlu dikatakan, melampirkan setiap IP dari rentang ini ke antarmuka akan memakan waktu cukup lama.

Apakah Linux mendukung pengikatan seluruh blok alamat ke sebuah antarmuka?

p-statis
sumber
Distro yang berbeda memiliki cara penanganan yang berbeda. Pilih salah satu.
Ignacio Vazquez-Abrams
Ubuntu sekarang, tetapi solusi yang bekerja lintas distro lebih disukai, tentu saja.
p-static
Tutorial ini mengikat satu alamat dalam satu blok (/ 24). / 24 hanya menentukan di mana blok itu masuk. Itu harus bekerja identik untuk IPv6.
BillThor
Cross-distro akan menulis skrip yang menggunakan "ip addr add". Red Hat, Ubuntu dan SuSE memiliki skrip jaringan yang berbeda ...
Sean Reifschneider
1
@ChandraNakka Apakah ini berguna bagi Anda?
kasperd

Jawaban:

31

Linux 2.6.37 dan di atasnya mendukung ini melalui fitur yang disebut AnyIP . Misalnya jika saya lari

ip route add local 2001:db8::/32 dev lo

pada mesin Ubuntu 11.04 ia akan menerima koneksi pada alamat apa pun di jaringan 2001: db8 :: / 32.

Gerald Combs
sumber
1
Apakah ada solusi AnyIP untuk ipv4?
Coaku
Apakah ini berfungsi di Ubuntu 14.04?
Chandra Nakka
Ini tampaknya berfungsi dan saya bisa melakukan ping ke berbagai alamat tetapi ketika saya menjalankan ip route listatau ip -6 route listrute yang ditambahkan tidak terlihat. Bagaimana Anda menghitung blok alamat AnyIP?
Colton
Ini berfungsi untuk alamat secara lokal tetapi saya tidak bisa melakukan ping atau mengakses IP ini dari sumber eksternal. Adakah cara untuk memperbaikinya? (Saya mencoba mengganti lo dengan eth0 tapi kemudian tidak ada yang bisa dijangkau)
BrainStone
@BrainStone Anda harus menginstal ndppd untuk itu, atau mendapatkan awalan yang dialihkan dari penyedia Anda
Arya
6

Ya, Linux mendukung pengikatan blok alamat jaringan ke antarmuka jaringan ... tetapi hanya pada antarmuka loopback. Jadi Anda bisa melakukan ini:

ip addr add 192.168.5.0/24 dev lo

Dan kemudian lakukan ini:

$ nmap -sP -oG - 192.168.5.0/24

# Nmap 5.21 scan initiated Tue Dec  7 11:38:28 2010 as: nmap -sP -oG - 192.168.5.0/24 
Host: 192.168.5.0 ()    Status: Up
Host: 192.168.5.1 ()    Status: Up
Host: 192.168.5.2 ()    Status: Up
[...]
Host: 192.168.5.254 ()  Status: Up
Host: 192.168.5.255 ()  Status: Up
# Nmap done at Tue Dec  7 11:38:46 2010 -- 256 IP addresses (256 hosts up) scanned in 0.11 seconds

Dengan rute yang sesuai di tempat ini akan melakukan apa yang Anda inginkan ... untuk alamat IPv4. Anda telah bertanya tentang IPv6, dan saya tidak punya pengalaman dengan IPv6, tetapi ada kemungkinan bagus itu akan bekerja dengan cara yang sama.

Saya awalnya membaca tentang ini di sini (di bagian bawah artikel). Perhatikan bahwa artikel ini juga membahas cara menetapkan beberapa alamat secara eksplisit ke antarmuka menggunakan fitur CentOS / Red Hat yang sebelumnya tidak saya ketahui.

larsks
sumber
Keren! Saya mencoba ini dengan IPv6 di Ubuntu (Lucid & Hardy) tanpa hasil. Saya pikir ini akan menjadi fitur pembunuh untuk IPv6 - Anda bisa memetakan alamat melakukan objek database atau menggunakan alamat sebagai ID sesi.
Gerald Combs
2
Tidak, Anda tidak harus menambahkan alamat ke lo. Sebaliknya, menambahkan rute: ip -6 route add local <ip> dev lo.
Navin
2

Jadi saya melihat beberapa opsi di sini:

  1. gunakan skrip untuk mengikat semua alamat ke antarmuka satu per satu

  2. rute blok yang Anda inginkan ke alamat tunggal mesin Anda, dan kemudian minta mesin itu menggunakan antarmuka pcap untuk mencegat semua lalu lintas untuk blok tersebut (seolah-olah itu adalah router) dan menanganinya.

  3. Anda dapat memainkan trik dengan aturan NAT untuk kemudian menulis ulang blok Ips yang dialihkan ke satu mesin menjadi IP internal tunggal pada mesin itu ... tetapi Anda masih akan berakhir dengan satu IP internal per IP yang benar-benar ingin Anda bayar perhatian, yang membuat Anda kembali ke solusi 1.

Jika saya jadi Anda, saya hanya akan menulis skrip kecil di opsi 1. Atau gunakan yang dari sini :

#!/bin/sh
if [ "$#" -ne "4" ]; then
        echo Usage:
        echo " $0 interface ip range netmask"
        echo " examples:"
        echo "  1) Assuming you want to bind the IP range 192.168.0.1..192.168.0.254 to eth0 with netmask 255.255.255.0:"
        echo "  $0 eth0 192.168.0. 1..254 255.255.255.0"
        echo "  2) Assuming you want to bind the IPv6 range 2001:41d0:1:5000::1-2001:41d0:1:5000::254 to eth0 with netmask /56"
        echo "  $0 eth0 2001:41d0:1:5000:: 1..254 56"
else
        echo "Attempting to assign the IP range $2($3) to interface $1 with netmask $4"
        for ip in $(eval echo "{$3}"); do ifconfig -v $1 add $2$ip netmask $4; done
fi
pjz
sumber
di mana skrip seperti itu akan dinamai?
Skaperen
2

Seperti yang dikatakan orang lain, Anda dapat menggunakan mekanisme AnyIP untuk merutekan paket yang datang untuk seluruh subnet ke antarmuka localhost, tetapi perlu diingat bahwa Anda juga harus mendapatkan router upstream Anda untuk merutekan semua paket yang diinginkan ke mesin ini di posisi pertama. Ini dapat dilakukan hanya dengan entri tabel routing pada router, atau melalui BGP. ARP tidak benar-benar sesuai mengingat bahwa mesin Anda harus ARP untuk setiap IP secara individual.

Kyle Rose
sumber
1

"Anyip" yang dijelaskan di atas tidak bekerja untuk saya di centos 7. Saya harus membuat skrip untuk secara manual membuat alamat ipv6 saat boot. Untuk melakukannya saya telah menambahkan yang berikut ke / etc / crontab:

@reboot root /path/to/bashscript

Berikut ini skrip bash untuk membuat sekitar 3000 alamat ipv6:

#!/bin/bash
INETP="2a00:xxxx:xxxx:xxxx::"
PRE="64"
INTE="eth0"
IP1=/sbin/ip
echo -n "Adding IPv6 addresses..."
for i in {3..3000}
do
$IP1 -6 addr add ${INETP}$(printf '%x\n' $i)/${PRE} dev ${INTE}
done
echo "Done!"
Nicolas Guérinet
sumber
Metode ini hanya berfungsi sampai Anda mencapai sekitar 4000 alamat. Jika Anda mencoba mengonfigurasi lebih banyak alamat selain itu tidak akan berfungsi. Ada skenario di mana diinginkan untuk menetapkan seluruh / 96 atau / 64 untuk satu host, tidak ada cara metode Anda akan skala sejauh itu.
kasperd
@kasperd di mana Anda dapat membuat mekanisme anyip yang disebut "dijelaskan" oleh Gerald Combs di atas berfungsi pada Centos 7 atau Debian 8?
Nicolas Guérinet
1
Ya, itu berhasil. Tetapi ada beberapa langkah lagi dari yang disebutkan dalam jawaban itu. Lihat jawaban saya untuk pertanyaan serupa.
kasperd