Saya memiliki PC (kernel 3.2.0-23-generik ) yang telah 192.168.1.2/24
dikonfigurasi untuk eth0
antarmuka dan juga menggunakan 192.168.1.1
dan 192.168.1.2
alamat untuk tun0
antarmuka:
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:~#
Seperti yang terlihat di atas, tun0
secara administratif dinonaktifkan ( ip link set dev tun0 down
). Sekarang ketika saya menerima permintaan ARP 192.168.1.2
, PC tidak membalas permintaan itu:
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:~#
Hanya setelah saya menghapus tun0
antarmuka ( ip link del dev tun0
) PC akan membalas permintaan ARP untuk 192.168.1.2
di eth0
antarmuka.
Tabel perutean tampak persis sama sebelum dan sesudah 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:~#
Entri perutean di bawah sudah dihapus dengan ip link set dev tun0 down
perintah:
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
Namun, sementara tabel routing sama persis sebelum dan sesudah ip link del dev tun0
perintah, keputusan routing sebenarnya yang dibuat kernel tidak:
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:~#
Apakah ini perilaku yang diharapkan? Mengapa kernel mengabaikan tabel routing?
sumber
tun0
antarmuka dinonaktifkan, tetapi ada. Lihat outputip route get
perintah di posting awal saya yang diperbarui. Namun, mengapa kernel bersikap seperti itu?Jawaban:
Tabel perutean Anda tidak diabaikan, tepatnya. Itu ditolak oleh tabel routing dengan prioritas lebih tinggi.
Apa yang sedang terjadi
Tabel perutean yang Anda lihat saat mengetik
ip route show
bukan satu-satunya tabel perutean yang digunakan kernel. Sebenarnya, ada tiga tabel routing secara default, dan mereka dicari dalam urutan yang ditunjukkan olehip rule
perintah:Tabel yang paling Anda kenal adalah
main
, tetapi tabel routing dengan prioritas tertinggilocal
. Tabel ini dikelola oleh kernel untuk melacak rute lokal dan broadcast: dengan kata lain,local
tabel memberitahu kernel bagaimana cara merutekan ke alamat dari interface-nya sendiri. Itu terlihat seperti ini:Lihat referensi garis itu
tun0
. Itulah yang menyebabkan hasil aneh Andaroute get
. Dikatakan 192.168.1.1 adalah alamat lokal, yang berarti jika kita ingin mengirim balasan ARP ke 192.168.1.1, itu mudah; kami kirim ke diri sendiri. Dan karena kami menemukan rute dilocal
tabel, kami berhenti mencari rute, dan tidak perlu repot memeriksamain
ataudefault
tabel.Mengapa banyak tabel?
Minimal, senang bisa mengetik
ip route
dan tidak melihat semua rute "jelas" yang mengacaukan tampilan (coba ketikkanroute print
pada mesin Windows). Itu juga dapat berfungsi sebagai beberapa perlindungan minimal terhadap kesalahan konfigurasi: bahkan jika tabel routing utama telah tercampur, kernel masih tahu bagaimana berbicara dengan dirinya sendiri.(Mengapa mempertahankan rute lokal di tempat pertama? Jadi kernel dapat menggunakan kode pencarian yang sama untuk alamat lokal seperti halnya untuk hal lain. Itu membuat hal-hal menjadi lebih mudah secara internal.)
Ada hal-hal menarik lainnya yang dapat Anda lakukan dengan skema multi-tabel ini. Secara khusus, Anda dapat menambahkan tabel Anda sendiri, dan menentukan aturan ketika mereka dicari. Ini disebut "perutean kebijakan", dan jika Anda ingin merutekan suatu paket berdasarkan alamat sumbernya , ini adalah bagaimana melakukannya di Linux.
Jika Anda melakukan hal-hal yang rumit atau eksperimental, Anda dapat menambah atau menghapus
local
rute sendiri dengan menentukantable local
dalamip route
perintah. Namun, kecuali Anda tahu apa yang Anda lakukan, Anda cenderung membingungkan kernel. Dan tentu saja, kernel masih akan terus menambah dan menghapus rute sendiri, jadi Anda harus menonton untuk memastikan Anda tidak ditimpa.Akhirnya, jika Anda ingin melihat semua tabel routing sekaligus:
Untuk info lebih lanjut, lihat
ip-rule(8)
halaman manual atau dokumen iproute2 . Anda juga dapat mencoba Advanced Routing dan Traffic Control HOWTO untuk beberapa contoh yang dapat Anda lakukan.sumber
ip link set dev tun0 down
itulocal 192.168.1.1 dev tun0 proto kernel scope host src 192.168.1.1
aturan memang masih hadir dalamlocal
Routing-tabel. Setelah saya mengeksekusiip link del dev tun0
aturan yang disebutkan telah dihapus. Namun, satu pertanyaan - apakah saya benar bahwa semua kernel Linux modern (2.6.x, 3.x, 4.x) menggunakan RPDB untuk pencarian rute dan dengan demikian banyak tabel?ip(8)
: "ip
ditulis oleh Alexey N. Kuznetsof dan ditambahkan di Linux 2.2."Konfigurasi pemfilteran jalur balik Anda mungkin adalah masalahnya. RFC3704 - bagian 2.4
Dalam distribusi Enterprise Linux (RHEL, CentOS, Scientific Linux, et al) cara terbaik yang mungkin untuk menyelesaikan ini adalah dengan memodifikasi
/etc/sysctl.conf
denganrp_filter = 2
Ketika RHEL memiliki beberapa IP yang dikonfigurasi, hanya satu yang dapat dijangkau dari jaringan jarak jauh. Atau mengapa RHEL mengabaikan paket ketika rute untuk lalu lintas keluar berbeda dari rute lalu lintas masuk?
sumber
for rp_filter_file in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > "$rp_filter_file"; done
kernel tidak menggunakaneth0
antarmuka untuk paket routing ke 192.168.1.1. Hanya sekali saya menghapustun0
antarmuka denganip link del dev tun0
kernel mulai menggunakaneth0
antarmuka.