Taruh layanan di laptop di balik NAT tingkat operator, arahkan laptop itu ke VPS lewat VPN, dan tak seorang pun di luar bisa mencapainya. Anda menambahkan aturan NAT tujuan di VPS dan mendapat sesuatu yang lebih buruk daripada diam: koneksi terbuka, lalu macet. Balasannya tidak hilang, ia keluar lewat rute default klien itu sendiri, yang berarti server tidak pernah melihatnya. Jalankan kelima pemeriksaan ini berurutan dan berhenti pada yang pertama tidak bertahan.

Pastikan server akan meneruskan sama sekali

Centang kotak ini sebelum menulis satu terjemahan pun. Aturan DNAT untuk paket yang menolak diteruskan oleh kernel diterima oleh parser aturan lalu dijatuhkan oleh jalur penerusan, yang menghasilkan timeout yang tampak seperti masalah firewall.

sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1

Menyetelnya di kernel yang sedang berjalan tidak sama dengan menyetelnya lintas reboot. Tulis net.ipv4.ip_forward=1 ke berkas di bawah /etc/sysctl.d/, jalankan sysctl --system, lalu baca nilainya kembali alih-alih mempercayai berkas itu diambil. Kontainer yang mengelola ruang nama jaringannya sendiri membutuhkan nilai yang sama di dalam ruang itu, bukan hanya di host.

Jika pembacaan ulang masih nol, berhenti di sini. Tidak ada yang di bawah akan bekerja.

Kunci alamat tunnel sebelum aturan mana pun merujuknya

Pool membagikan alamat dalam urutan koneksi, jadi aturan yang ditulis untuk sewa hari ini bisa diam-diam menunjuk klien lain minggu depan. Ikat alamat ke identitas sertifikat, bukan ke urutan kedatangan.

client-config-dir /etc/openvpn/ccd
ifconfig-push 10.77.0.14 10.77.0.13

Pasangan itu adalah ujung klien dan ujung rekan dari tunnel titik-ke-titik, dengan server dikunci pada nama umum sertifikat. Dalam topologi subnet, nilai kedua dibaca sebagai netmask, jadi tulis bentuk yang cocok dengan topologi yang dipakai. Lalu sambungkan ulang klien dan baca alamatnya pada klien itu sendiri, karena pandangan server tentang pool bukan bukti apa yang dikonfigurasi klien.

Jika alamat berubah setelah menyambung ulang, berhenti. Aturan NAT yang mengikuti target bergerak akan gagal berkala dan tidak mengajari Anda apa pun.

Terjemahkan dua arah

Terjemahan tujuan mengirim paket masuk ke klien. Terjemahan sumber adalah yang membuat klien menjawab server alih-alih pengirim asli, dan itulah aturan yang orang lewatkan.

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 29443 -j DNAT --to-destination 10.77.0.14:29443
iptables -t nat -A POSTROUTING -d 10.77.0.14 -p tcp --dport 29443 -j SNAT --to-source 10.77.0.13

Tanpa aturan kedua, klien menjawab lewat uplink ISP-nya, jadi rekan jauh melihat alamat sumber yang tak pernah ia ajak bicara, sementara server tidak menyimpan entri pelacakan untuk balasan. Pengamat luar melihat jabat tangan yang selesai separuh, dan itulah persis gejala yang membuat orang mencari bug firewall yang tidak ada.

Baca kedua aturan kembali dengan iptables -t nat -S dan pastikan nama antarmuka adalah yang membawa alamat publik. Pada host yang sudah memfilter dengan nftables, tulis terjemahan di rantai NAT nftables dari keluarga alamat yang cocok alih-alih mencampur alat.

Biarkan tabel filter lewat

Tabel NAT menulis ulang header; mereka tidak memberi izin. Dengan kebijakan DROP default, aliran yang diteruskan perlu penerimaannya sendiri, plus arah balik yang sudah dicakup sebagian besar kebijakan dengan aturan established,related.

iptables -A FORWARD -i eth0 -o tun0 -p tcp --dport 29443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Periksa kebijakan rantai FORWARD sebelum menambahkan apa pun, karena urutan DROP awal menentukan apakah aturan Anda pernah ditanyakan. Pada host yang filternya tinggal di nftables, tambahkan aturan setara ke hook forward tabel inet dan pastikan rantai dasar benar-benar melihat lalu lintas yang diteruskan, bukan hanya masukan lokal. Jika penghitung paket pada aturan baru tetap nol sementara penghitung NAT naik, paket dijatuhkan sebelum aturan Anda. Itulah sinyal untuk membaca urutan rantai, bukan untuk menambahkan salinan kedua aturan yang sama.

Buktikan dari jaringan luar

Uji dari jaringan yang tidak terkait. Probe dari mesin lain di LAN yang sama bisa melewati dukungan hairpin NAT dan tidak pernah menguji jalur yang dipakai klien jauh, jadi hasil hijau di sana membuktikan hal yang salah.

tcpdump -ni any port 29443
conntrack -L | grep 29443

Jalankan tangkapan di server dan di klien pada saat yang sama. Tangkapan server menunjukkan apakah paket yang diterjemahkan keluar menuju tunnel; tangkapan klien menunjukkan apakah permintaan tiba dan ke mana balasan dialamatkan. Entri terjemahan di conntrack -L membuktikan aturan cocok, dan ketiadaannya membuktikan paket tidak pernah mencapai rantai NAT.

Pemindai port adalah bukti lemah. Mereka melaporkan port tertutup sampai aplikasi terikat dan mendengarkan, jadi gunakan koneksi nyata ke layanan nyata. Saat akhirnya berhasil, pertahankan paparan pada satu port itu: meneruskan SSH atau panel admin karena aturan pertama terasa canggung adalah keputusan yang jauh lebih besar daripada menerbitkan layanan.

Artikel terkait