Bahkan laptop di balik NAT operator dapat melayani rekan kerja, asalkan server VPN bertindak sebagai titik pertemuan. Ada dua mekanisme: klien menghubungi keluar dan meminta server memegang porta pendengar, atau server menerbitkan porta dan menerjemahkannya ke dalam terowongan. Keduanya memecahkan masalah keterjangkauan yang sama dan berperilaku berbeda saat gagal, diawasi, dan dicatat. Tiga syarat menentukan mana yang cocok untuk penyiapan Anda.

Dua bentuk, satu titik pertemuan

Pada bentuk pertama klien membuka sesi SSH keluar dan meminta server mendengarkan pada porta terpilih, meneruskan setiap koneksi kembali melalui sesi itu. Tidak ada yang diteruskan di server dan tidak terjadi penerjemahan paket, jadi satu-satunya syarat adalah akun SSH, penerusan yang diizinkan, dan aturan tembok api untuk porta tersebut. Layanan tetap terikat ke loopback di klien, yang biasanya memang diinginkan.

ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]

Pada bentuk kedua server memiliki porta publik dan menulis ulang setiap koneksi menuju alamat terowongan klien. Itu memerlukan penerusan IP yang aktif, penerjemahan tujuan saat masuk, dan penerjemahan sumber saat keluar, dan tetap bekerja ketika tidak ada sesi SSH. Porta itu milik server, bukan milik sesi, dan sifat itulah yang menentukan sebagian besar kasus nyata.

Tidak ada bentuk yang lebih aman secara bawaan. Keduanya akhirnya mengekspos satu porta layanan kepada siapa pun yang dapat mencapai alamat publik server, dan keduanya tetap bergantung pada autentikasi layanan itu sendiri.

Syarat satu: haruskah porta hidup lebih lama daripada sesi

Penerusan terbalik hidup persis selama sesi SSH yang membuatnya. Ketika tautan putus, pendengar menghilang dan rekan melihat koneksi ditolak alih-alih jalur lambat. Mengawasi perintah dengan unit systemd dan kebijakan mulai ulang memperbaikinya, dan ExitOnForwardFailure=yes membuat pengikatan yang gagal langsung terlihat alih-alih meninggalkan sesi yang berjalan tanpa penerusan.

Porta yang diterjemahkan bertahan dari mulai ulang jika aturannya disimpan permanen, tetapi bergantung pada klien mempertahankan alamat terowongan yang sama. Kumpulan dinamis yang memberi laptop alamat lain setelah menyambung ulang diam-diam mengarahkan aturan ke ketiadaan. Pesan alamat terowongan lebih dulu, lalu tulis aturannya, dan perlakukan keduanya sebagai satu perubahan.

Jika layanan harus menjawab pada pukul tiga pagi tanpa ada yang mengawasi, bentuk dengan porta yang diterbitkan server memiliki bagian bergerak lebih sedikit, karena satu-satunya proses yang harus tetap hidup adalah terowongan itu sendiri.

Syarat dua: siapa yang memiliki tembok api dan log

Bentuk terbalik menaruh seluruh kebijakan di dua tempat. sshd memutuskan apakah penerusan jarak jauh diizinkan sama sekali melalui AllowTcpForwarding, dan GatewayPorts memutuskan apakah pendengar terikat ke loopback atau ke semua alamat. Dengan nilai bawaan no rekan di luar server tidak dapat mencapai porta meski penerusan berhasil, dan itu tampak seperti terowongan rusak padahal sebenarnya alamat pengikatan.

sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config

Bentuk terjemahan memerlukan penerusan aktif dan dua aturan, dan aturan kedua adalah tempat sebagian besar resep salah. Membatasi penerjemahan sumber pada keadaan conntrack DNAT berarti hanya koneksi yang dibuat aturan tujuan yang ditulis ulang, bukan setiap paket yang dikirim server ke dalam terowongan.

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8081 -j DNAT --to-destination 10.88.0.6:8080
sudo iptables -t nat -A POSTROUTING -o tun0 -m conntrack --ctstate DNAT -j SNAT --to-source 10.88.0.1

Penulisan ulang itu juga menghancurkan atribusi. Setelahnya klien melihat setiap pemanggil sebagai alamat terowongan server, yang meruntuhkan batas laju per alamat menjadi satu ember dan menyembunyikan siapa mengirim apa. Jika atribusi penting, akhiri koneksi di server atau pertahankan keputusan izin di sana dan teruskan identitas dalam header yang dipercaya layanan. Memilih antara dua perbaikan itu bergantung pada apakah layanan membaca header proksi sama sekali.

Syarat tiga: satu porta atau banyak, dan siapa yang memiliki nama

Satu layanan pada satu porta adalah kasus di mana penerusan terbalik menang dari segi usaha. Anda perlu satu perintah, satu akun, dan satu aturan tembok api, dan pembersihannya adalah mematikan sesi. Beberapa layanan pada alamat publik yang sama mendorong Anda ke bentuk terbitan server, karena setiap penerusan terbalik memerlukan porta server sendiri dan himpunannya tumbuh dengan setiap layanan.

Nama mempersulitnya lebih jauh. Penerusan terbalik dapat berada di belakang proksi TCP yang merutekan berdasarkan SNI, sedangkan porta terjemahan biasanya satu porta per layanan. Jika layanan mengakhiri TLS sendiri dan memerlukan nama host asli, pendekatan proksi mempertahankannya dan pendekatan DNAT hanya mempertahankannya jika layanan menerima nama itu pada porta itu.

Catat syarat mana dari ketiganya yang menentukan bentuk tersebut. Jika tidak, orang berikutnya yang menambahkan layanan kedua akan membuka kembali perbandingan yang sama dengan konteks lebih sedikit.

Putuskan, lalu uji dari luar

Uji jalur dari jaringan yang tidak memiliki rute ke laptop, dan perhatikan penghitung di server selama permintaan berjalan. Menguji dari server ke alamat publiknya sendiri tidak membuktikan apa pun di sini, karena paket dibuat secara lokal dan tidak pernah mencapai kait penerjemahan masuk, sehingga uji bisa lolos sementara jalur sebenarnya rusak.

sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20

Penghitung yang tetap datar berarti paket tidak pernah mencapai aturan, yang menunjuk ke penyedia atau tembok api host. Penghitung yang bergerak sementara layanan menolak menunjuk ke tembok api klien sendiri atau alamat tempat layanan mendengarkan. Terowongan yang membawa paket tetapi tidak mengembalikan apa pun adalah masalah rute atau jalur balik, dan tidak satu pun dari ketiga hasil ini boleh di-debug dengan menyunting adaptor klien. Catat penghitung mana yang bergerak sebelum Anda mengubah apa pun, karena uji berikutnya memerlukan garis dasar itu.

Setelah bentuknya bekerja, catat porta, pemilik, dan metode pengawasan di samping konfigurasi terowongan. Perbaikan keterjangkauan yang hanya ada di riwayat shell seseorang berjarak satu mulai ulang dari insiden berulang.

Artikel terkait