Paman Tao
⏳3,7 menit (1,5 ribu kata)
🕸️
Pada postingan kali ini saya akan berbagi pengalaman percobaan saya tentang cara setting jaringan IPv6-only di Linux menggunakan Jool.
Berikut adalah topologi klasik jaringan rumah. Semua host dapat mengakses Internet melalui satu router. Router memiliki tumpukan ganda v4/v6. Dan semua host LAN memiliki satu awalan /64 IPv6.
Internet
|
+---+----+ 10.0.0.1/32
| Router | 2001:db8::/64
+---+----+
|
+-------+-------------------+
|2001:db8:1::/64 | 2001:db8:2::/64
+-----+-----+ +-----+-----+
| Host 1 | | Host 2 |
+-----+-----+ +-----+-----+
Ada dua masalah yang perlu kita perbaiki. Pertama, biarkan host LAN mengakses Internet IPv4 tanpa saling campur tangan. Kedua, mendukung pemetaan port IPv4-ke-IPv6 sehingga host khusus IPv4 di Internet dapat menjangkau layanan yang dihosting di host LAN khusus IPv6.
Kedua tugas yang disebutkan di atas dapat dicapai melalui Jool.
Selain Jool, Anda mungkin menemukan TAYGA. TAYGA adalah out-of-kernel tanpa kewarganegaraan Implementasi NAT64 untuk Linux yang menggunakan pengemudi TUN untuk bertukar paket IPv4 dan IPv6 dengan kernel.
TAYGA bukan pilihan yang tepat karena hanya mendukung NAT64 tanpa kewarganegaraan, yang berarti Anda memerlukan beberapa alamat IPv4 publik untuk melakukan pemetaan IPv4-ke-IPv6. Kelemahan lain dari TAYGA adalah ia menggunakan perangkat TUN, yang mungkin mempunyai masalah kinerja.
Terlebih lagi, rilis terbaru TAYGA diterbitkan pada tahun 2011, yang berarti ada lebih dari 15 tahun tanpa perkembangan baru.
Sebaliknya, Jool adalah Penerjemah Ipv4/IPv6 Sumber Terbuka lainnya dengan pengembangan aktif. Jool mendukung NAT64 stateless dan stateful.
Jool berisi dua bagian, jool-dkms untuk modul kernel, dan jool-tools untuk alat ruang pengguna.
Pengguna Debian/Ubuntu dapat menginstal Jool dengan apt
apt install jool-dkms jool-tools
Pengguna OpenWrt dapat menginstal jool-tools-netfilter
kemasan. Ini akan menginstal kmod-jool-netfilter
dan ketergantungan lainnya.
Saya menggunakan Arch Linux. Jadi saya harus membangun Jool dari sumber.
Instal alat yang digunakan dengan kompilasi
pacman -S base-devel linux-headers dkms tar
Dapatkan kode sumbernya
wget
tar -xzf jool-4.1.13.tar.gz
Mengkompilasi modul kernel
dkms install jool-4.1.13/
Kompilasi dan instal aplikasi ruang pengguna
cd jool-4.1.13/
./configure
make
make install
Kita perlu menambahkan /etc/modules-load.d/jool.conf
agar Arch Linux memuat modul jool secara otomatis setelah booting.
echo jool > /etc/modules-load.d/jool.conf
Sekarang kita dapat mengaktifkan stateful-nat64.
NAT64 menggunakan awalan tetap 64:ff9b::/96
. Semua alamat IPv4 harus dimasukkan ke dalam awalan ini dan diperlakukan sebagai alamat IPv6 normal di host LAN.
Di sisi router, jalankan perintah berikut untuk membuat instance NAT64 yang diberi nama z64
.
jool instance add "z64" --netfilter --pool6 64:ff9b::/96
Nama contohnya adalah z64. Dan kumpulan alamat IPv6 adalah 64:ff9b::/96
. Semua paket dengan alamat tujuan awalan 64:ff9b::/96
akan diterjemahkan ke dalam paket IPv4 dengan alamat default outing NIC. Jool akan mendeteksi kartu jaringan keluar secara otomatis.
Maka Anda perlu mengaktifkan opsi penerusan ip dari kernel.
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv6.conf.default.forwarding=1
sysctl -w net.ipv4.ip_forward=1
dan jalankan perintah di bawah ini untuk memuatnya
Sekarang router siap melakukan terjemahan NAT64.
Di host LAN Anda, Anda dapat melakukan ping 1.1.1.1 dengan perintah berikut
ping -c1 64:ff9b::1.1.1.1
PING 64:ff9b::1.1.1.1 (64:ff9b::101:101) 56 data bytes
64 bytes from 64:ff9b::101:101: icmp_seq=1 ttl=56 time=1.42 ms
--- 64:ff9b::1.1.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.419/1.419/1.419/0.000 ms
Alamat semu dari 64:ff9b::1.1.1.1
telah diterjemahkan ke dalam 64:ff9b::101:101
. Dan paket gema ICMP dengan alamat tujuan 64:ff9b::101:101
akan diubah menjadi 1.1.1.1 oleh Jool.
Ini bekerja dengan sangat menawan.
Dengan bantuan Jool, kita dapat melakukan ping ke alamat pseudo ipv4. Namun, kita perlu mengakses layanan IPv4 dengan nama DNS. Akan sangat mudah jika DNS dapat mengubah alamat IPv4 (catatan A) menjadi alamat IPv6 semu. Kita dapat menggunakan layanan DNS64 untuk melakukan pekerjaan ini.
Jika salah satu penyelesai DNS mendukung DNS64, ia akan mencoba menanyakan catatan AAAA nama domain. Jika hanya ada catatan A (alamat IPv4), penyelesai akan mengembalikan alamat IPv6 semu dengan 64:ff9b::/96
awalan sebagai catatan AAAA.
DNS Publik Google dan Cloudflare mendukung layanan DNS64.
# google
2001:4860:4860::64
2001:4860:4860::6464
# cloudflare
2606:4700:4700::64
2606:4700:4700::6400
Saya menyarankan Anda untuk memasukkan kedua penyelesai ke dalam file /etc/resolv.conf Anda untuk mendapatkan ketersediaan tinggi.
⛔Peringatan
Jangan atur penyelesai DNS64 ke /etc/resolv.conf dari host Jool.
Karena Jool hanya menghubungkan dirinya ke PRE_ROUTING. Itu tidak melekat pada LOCAL_OUT. Ini berarti hanya dapat menerjemahkan lalu lintas yang masuk dari beberapa antarmuka (fisik atau lainnya). Itu tidak mencegat paket yang bersumber dari namespace jaringannya sendiri.
Dan sekarang Anda dapat melakukan ping ke github.com yang hanya IPv4 hingga tahun 2024,
ping -c1 github.com
PING github.com (64:ff9b::8c52:7403) 56 data bytes
64 bytes from 64:ff9b::8c52:7403: icmp_seq=1 ttl=52 time=23.6 ms
--- github.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 23.624/23.624/23.624/0.000 ms
Jika Anda hanya ingin membiarkan host LAN mengakses Internet IPv4, Anda dapat menyelesaikannya di sini. Namun jika Anda ingin menjalankan layanan pada host LAN Anda dan perlu membiarkan host IPv4 keluar untuk mengakses layanan Anda, Anda perlu melanjutkan membaca bagian berikutnya.
Misalkan Anda menjalankan server web pada port 3000 di Host 1. Dan Anda harus membiarkan klien mengakses server web Anda melalui jaringan IPv4. Anda harus mengatur pemetaan port IPv4-ke-IPv6 untuk layanan Anda.
Oleh Jool, Anda dapat menggunakan perintah bib untuk melakukan pekerjaan ini:
jool -i z64 bib add 2001:db8::1#3000 10.0.0.1#3000 --tcp
Ini akan menambahkan satu pemetaan port untuk lalu lintas tcp. Semua trafik dengan tujuan 10.0.0.1 dan port 3000 akan diterjemahkan ke 2001:db8::1 dan port 3000 dan diteruskan ke Host 1.
Namun, jika Anda mencoba menjalankan perintah di atas, Anda akan menemui kesalahan berikut:
Error: The kernel module returned error 22: Transport address '10.0.0.1#3000'
does not belong to pool4.
Please add it there first.
Seperti yang terbaca, port 10.0.0.1#3000 bukan milik pool4. Jadi apa yang ada di pool4 saat ini? Anda dapat menggunakan subperintah pool4 untuk memeriksanya.
Anda tidak akan melihat apa pun. Kolam4 kosong.
Setiap terjemahan IPv6-ke-IPv4 memerlukan kumpulan alamat v4 dan v6. Kami hanya menyiapkan pool6 di bagian sebelumnya. Jika pool4 kosong, bagaimana Jool dapat menyelesaikan terjemahan lalu lintas?
Menurut dokumen pool4, pool4 yang kosong berperilaku berbeda dari pool4 yang dihuni. Pool4 kosong secara default untuk menggunakan port 61001-65535 dari alamat IPv4 cakupan semesta apa pun yang dimiliki antarmuka node.
Kemudian Jool berperilaku seolah-olah pool4 dikonfigurasi sebagai berikut:
+------------+-------+--------------------+-----------------+-------------+
| Mark | Proto | Max iterations | Address | Ports |
+------------+-------+--------------------+-----------------+-------------+
| 0 | TCP | 1024 ( auto) | 10.0.0.1 | 61001-65535 |
+------------+-------+--------------------+-----------------+-------------+
| 0 | UDP | 1024 ( auto) | 10.0.0.1 | 61001-65535 |
+------------+-------+--------------------+-----------------+-------------+
| 0 | ICMP | 1024 ( auto) | 10.0.0.1 | 61001-65535 |
+------------+-------+--------------------+-----------------+-------------+
Anda hanya dapat memetakan port ke kisaran 61001-655535. Mari sesuaikan perintah bib kita:
jool -i z64 bib add 2001:db8:1::#3000 10.0.0.1#63000 --tcp
Sekarang Anda dapat mengakses layanan web di Host 1 melalui tujuan 10.0.0.1:63000.
⛔Peringatan
Kisaran port pool4 tidak boleh tumpang tindih dengan rentang port sementara.
Rentang port sementara default adalah 32768-61000, inilah alasan Jool memilih 61001-65535 sebagai rentang pemetaan defaultnya.
Jika Anda perlu mendukung lebih dari 4534 koneksi simultan, Anda harus menyesuaikan rentang port pool4 dan kernel rentang port sementara.
sysctl -w net.ipv4.ip_local_port_range="32768 40000"
jool pool4 add 10.0.0.1 40001-61000 --tcp
jool pool4 add 10.0.0.1 40001-61000 --udp
jool pool4 add 10.0.0.1 40001-61000 --icmp
Semua konfigurasi di atas akan diatur ulang setelah reboot. Jika Anda perlu mempertahankan fungsi-fungsi ini, Anda perlu menambahkan beberapa file konfigurasi.
Pertama, muat modul jool secara otomatis.
echo jool > /etc/modules-load.d/jool.conf
Kemudian aktifkan penerusan untuk IPv6 dan IPv4:
cat < > /etc/sysctl.d/99-ipv6.conf
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
net.ipv4.ip_forward=1
EOF
Ketiga, atur layanan systemd untuk Jool.
cat < > /etc/systemd/system/jool.service
(Unit)
Description=Jool NAT64/SIIT Daemon
After=network-online.target
Wants=network-online.target
(Service)
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/jool file handle /etc/jool/jool.conf
(Install)
WantedBy=multi-user.target
EOF
Tipe unit ini adalah oneshot yang artinya akan terpicu satu kali. Di bagian ExecStart, kami menggunakan jool file handle
untuk memuat /etc/jool/jool.conf.
{
"instance": "z64",
"framework": "netfilter",
"global": {
"pool6": "64:ff9b::/96"
},
"pool4": (
{
"protocol": "TCP",
"prefix": "10.0.0.1/32",
"port range": "50001-65535"
},
{
"protocol": "UDP",
"prefix": "10.0.0.1/32",
"port range": "50001-65535"
},
{
"protocol": "ICMP",
"prefix": "10.0.0.1/32",
"port range": "50001-65535"
}
),
"bib": (
{
"protocol": "TCP",
"ipv4 address": "10.0.0.1#53000",
"ipv6 address": "2001:db8:1::#3000"
}
)
}
Terakhir, aktifkan unit layanan:
systemctl enable --now jool
Kemudian Anda dapat me-reboot sistem. Dan semua NAT64 akan bekerja sesuai rencana.
Oke, postingan ini akan berakhir sampai di sini. Dengan Jool, kita dapat mengatur jaringan IPv6 murni untuk lalu lintas keluar dan masuk. Jika Anda memiliki masalah, semua saran, silakan tinggalkan pesan kepada saya.