OpenVPN tam tüneli SSH oturumunuzu kesiyor: dönüş yolunu düzeltin
Varsayılan rota SSH yanıtlarını tünele gönderir. Peer'i sabitleyin, redirect-gateway'i filtreleyin veya makineyi kaybetmeden önce kaynağa göre yönlendirin.
SSH ile eriştiğiniz bir makinede tam tünelli bir OpenVPN istemcisini açmak oturumu bir saniye içinde kesebilir ve makine yanlış bir şey yapmıyordur. Tünel paketlerin sunucuya nasıl ulaştığını değiştirmez; yanıtların nasıl çıktığını değiştirir. Varsayılan rota tun0 adresini gösterdiği anda, SSH istemcinize giden yanıt sağlayıcının ağına girer, o ağın adresinize geri dönüş rotası yoktur. Bağlantı askıda kalır, sonraki deneme zaman aşımına uğrar ve daemon tüm bu süre boyunca 22 numaralı bağlantı noktasını dinlemeye devam eder.
VPN günlüğünü okumadan önce yönlendirme tablosunu okuyun. Günlük tünelin açıldığını söyleyecek ve haklı. Soru, her yanıtın hangi arayüze teslim edildiğidir ve bu, tünelin az önce yeniden yazdığı tabloda paket başına yapılan bir aramadır.
Yanıt neden yanlış kapıdan çıkıyor
Gelen paketler hâlâ fiziksel arayüze ulaşır, çünkü bir VPN istemcisi internetin sunucunuzun genel adresine nasıl ulaştığını değiştiremez. Yanıtlar ayrı bir karardır: her paket için çekirdek hedefi arar ve --redirect-gateway sonrasında varsayılan giriş tünel der. Sağlayıcının çıkışı hizmet vermediği bir hedef görür ve paketi düşürür.
OpenVPN kendi koruması tam olarak tek bir hedefi kapsar. 2.6 kılavuzu --redirect-gateway seçeneğini bir sıra olarak açıklar: tünelden önce kullanılan ağ geçidi üzerinden VPN peer'i için bir ana makine rotası ekler, böylece şifrelenmiş trafik kendi içine geri dönemez, ardından varsayılan rotayı değiştirir. Bu ana makine rotası yalnızca peer içindir. Sizin SSH istemciniz sadece başka bir internet adresidir ve hiçbir istisna almaz.
Bir önek hatasını erken elemekte yarar var. Uzunluk olmadan ip route add -net 0.0.0.0 gw 10.8.0.1 dev tun0 yalnızca tek adres 0.0.0.0 ile eşleşir, internet ile değil; 0.0.0.0/0 olmalıdır. Ve varsayılanı almak tünelin kendi taşımasını bozuyorsa, uç noktayı fiziksel arayüz üzerinden ana makine rotası olarak ekleyin, sağlayıcının gerçek adresini kullanarak.
Hemen onarmak için SSH istemci adresini sabitleyin
En hızlı onarım, tünel var olmadan önce sunucunun kullandığı ağ geçidi üzerinden istemci adresinize bir ana makine rotasıdır. Kendi tarafınızda sunucunun göreceği adresi bulun, ardından eski ağ geçidini bilmek için sunucunun tablosunu okuyun:
curl -s https://ifconfig.co
ip route
Sunucuda, istemci başlamadan önce istisnayı ekleyin. Buradaki adresler yer tutucudur; önemli olan biçimdir:
sudo ip route add 80.128.240.55 via 192.168.178.1
Bu, bildirilen olayda kullanılan onarımdır ve hemen çalışır. İki öngörülebilir şekilde kırılgandır: rota yeniden başlatmada kaybolur ve ISS'niz size başka bir adres verdiği anda yanlış olur. Bunu acil bir önlem olarak görün ve bilerek kalıcı hale getirin; bir ağ birimi ya da dispatcher kancası aracılığıyla, veya geçici olduğunu kabul edip kurtarma yolunu yazın.
İstemcinin varsayılan rotayı almasını engelleyin
Daha temiz seçenek, tünelin varsayılan rotayı hiç değiştirmemesini sağlamaktır. route-nopull, --client veya --pull ile kullanıldığında, rotalar, block-outside-dns ve DNS sunucuları gibi DHCP tarzı seçenekler dışında itilen seçenekleri kabul eder, böylece yalnızca ihtiyacınız olan önekleri eklersiniz. Daha dar bir araç, bir sorunlu yönergeyi atıp gerisini tutan bir çekme filtresidir:
route-nopull
pull-filter ignore "redirect-gateway"
Birini ya da diğerini kullanın, ikisini birden değil, ve neyin değiştiğini açıkça bilin. Tünel üzerinden varsayılan rota olmadan sunucu artık interneti sağlayıcı üzerinden taramaz; yalnızca açıkça yönlendirdiğiniz yerlere ulaşır. Tam tünel kurulumun bütün amacı idiyse, bu yanlış koldur ve yukarıdaki ana makine rotası doğru olandır.
Dönüş yolunu kaynağa veya bağlantıya göre bölün
Gelen adres kararlı olduğunda, bir kaynak kuralı yanıtları tünelin kendi rotalarına dokunmadan yerel tutar. Fiziksel arayüz adresine LAN öneki ve fiziksel varsayılanı içeren kendi tablosunu verin, ardından o tabloyu oradan gelen trafik için seçin:
ip rule add from 192.168.1.11 table 128
ip route add table 128 to 192.168.1.0/24 dev eth0
ip route add table 128 default via 192.168.1.1
Bu işe yarar çünkü gelen bir SSH bağlantısına verilen yanıtlar istemcinin bağlandığı adresten çıkar. Her gelen hizmetin çalışmaya devam etmesi gereken bildirilen olay tam olarak bu biçimi kullandı. Gelen adres dalgalanıyorsa veya yol dinamikse, bunun yerine bağlantıyı işaretleyin: fiziksel arayüzden gelen ilk pakete bir conntrack işareti koyun, bunu OUTPUT içindeki yanıt paketlerine kopyalayın ve işaretli paketleri fiziksel ağ geçidine işaret eden bir tablo üzerinden yönlendirin.
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default via 192.168.1.1 dev eth0 table 3412
ip rule add fwmark 4321 table 3412
Test sırasında bağlantı işaretini, güvenlik duvarı işaretini ve tablo numarasını ayrı tutun. Bir numarayı iki role yeniden kullanmak doğru görünen ve yanlış paketleri vuran bir kural üretir. Tablonun varsayılan girdisi ayrıca sıradan bir Ethernet bağlantısında LAN ağ geçidiyle via gerektirir; çıplak dev eth0 yalnızca arayüz noktadan noktaya olduğunda veya sonraki atlama başka bir şekilde çözüldüğünde çalışır. Bildirilen Jessie makinesi çıplak biçimin çalıştığı bir bağlantıdaydı ve bu kopyalanacak bir dağıtım kuralı değildir.
Kendinizi dışarı kilitlemeden doğrulayın
Bağlantıyı keserek test etmeyin. İlk oturumu açık tutun, tüneli yukarı kaldırın ve çekirdeğe kendi adresinizin hangi yolu izleyeceğini sorun:
ip route get 80.128.240.55
Yanıt tüneli değil, fiziksel arayüzü ve eski ağ geçidini adlandırmalıdır. Ardından ikinci bir SSH bağlantısı açın; gerçek test budur, çünkü eski oturum yeni bir bağlantının yeniden üretemeyeceği bir durumda hayatta kalabilir. İkincisi askıda kalırken birincisi hâlâ yanıt veriyorsa, kural önemli trafiğe hiç uymamıştır ve işaretler ya da kaynak adres bakılacak yerdir.
Alıştırma boyunca bant dışı bir konsolu elinizin altında tutun. Tek erişim yolu az önce kırdığınız tünel olan bir sunucu o tünel üzerinden onarılamaz ve eklediğiniz tablo numaralarını ve önekleri yazdıysanız geri alma daha kolaydır.