İstek her zaman aynı cümlenin bir varyantıdır: VPN'i tarama için tut, ama SSH veya bir yedekleme işinin normal bağlantıyı kullanmasına izin ver. Bu konuda dolaşan tavsiye, bağlantı noktasını iptables NAT kurallarıyla iletmek, bunu yapmaz. Bir NAT kuralı bir akış içindeki adresleri ve bağlantı noktalarını yeniden yazar; paketin hangi arayüzden çıktığını asla seçmez. Bu karar yönlendirme aramasına aittir ve yönlendirme aramasının bir bağlantı noktasını görmek için yardıma ihtiyacı vardır.

Düz bir rota bir bağlantı noktasıyla neden eşleşemez

Linux, aday tabloları ilke kurallarıyla süzdükten sonra hedef adresi bir tabloda arayarak rota seçer. Bu kurallar bir güvenlik duvarı işareti, kaynak adres, gelen arayüz veya UID ile eşleşebilir. Rota girdisinin kendisinde bağlantı noktası alanı yoktur, çünkü rota taşıma başlığı önem kazanmadan önce seçilir.

Güncel iproute2 ve çekirdekler kural seçiciyi genişletir: ipproto, sport ve dport kabul edilir, yani ip rule add ipproto tcp dport 22 table 100 niyeti tek satırda ifade eder. Gerçek ana bilgisayarda ip rule add help çalıştırın ve derlemenizin dport listeleyip listelemediğini görün. Listeliyorsa tek komutla bittiniz; listelemiyorsa aşağıdaki işaret yolu eşdeğerdir.

Her iki durumda da kural yalnızca bir işaretçidir. Tablo 100'ün hâlâ bir rotaya ihtiyacı var ve insanların unuttuğu kısım budur.

Üç parça veya bir

Modern biçim, yukarıdaki tek kural artı alternatif tablodaki bir rotadır. Klasik biçim araya netfilter ekler: paketi işaretleyin, sonra bir kuralda işareti eşleştirin. İkisi de aynı aramada biter; bağlantı noktasının okunduğu yer bakımından farklıdırlar.

İşaret yaklaşımı, netfilter'ın taşıma başlığını görmesi ve yönlendirme kodunun tarihsel olarak görmemesi nedeniyle vardır. Bütün mekanizma budur ve yedek yolun neden tek akıllı komut değil de birlikte çalışan üç parça olduğunu açıklar.

Üç parça sırayla

Önce, yönlendirmek istediğiniz akışları işaretleyin; işaretin rota kararından önce var olması için yeterince erken çalışan bir zincirde:

nft add table inet vpnexempt
nft 'add chain inet vpnexempt out { type route hook output priority mangle; }'
nft add rule inet vpnexempt out tcp dport 22 meta mark set 0x1

İkinci olarak, işaretli paketleri ayrı bir tabloya gönderin:

ip rule add fwmark 0x1/0x1 table 100

Üçüncü olarak, o tabloya fiziksel bağlantı üzerinden varsayılan bir rota verin. Adresler örnektir; kendinizinkilerle değiştirin:

ip route add default via 192.168.1.1 dev wlan0 table 100

Üçüncü adımı atlarsanız işaretli paket tablo 100'de rota bulamaz, dolayısıyla başarısız olur. Belirti, kural ağı bozmuş gibi görünür; oysa gerçekte paketin kalan tek yolunu kaldırmıştır.

İlk paketten sonra çalışmasını ne sağlar

İşaretler giden paketlere uygulanır. Yanıt, bağlantının atadığı adresle fiziksel arayüze gelir ve ana tablo o hedef için hâlâ tüneli tercih edebilir. İki mekanizma yanıt yolunu tutarlı tutar: bağlantı adresi için kaynak tabanlı bir kural ve akışın tüm ömrü boyunca kararı koruyan connection tracking. İşareti conntrack'e kaydedip yanıtta geri yüklemek, durum bilgili bir istisnayı kararlı kılmanın olağan yoludur.

Ters yol filtrelemesi diğer sessiz katildir. Çekirdek dönüş yolunu sıkı doğrularsa ve yanıt ana tablonun seçmeyeceği bir arayüze gelirse, paket mesaj olmadan düşürülür. rp_filter varsayılanlar dağıtıma ve arayüzün iletilip iletilmediğine göre değişir, bu yüzden kapalı olduğunu varsaymak yerine etkin değeri okuyun.

Tünelin kendi taşımasını işaretlemeyin. Bir WireGuard veya UDP OpenVPN tüneli TCP 22 değildir, bu yüzden yukarıdaki tarif güvenlidir, ancak tünel hedefi dışındaki her şey olarak yazılan bir istisna şifreli paketleri yakalayabilir ve tüneli yönlendirme döngüsü gibi görünen bir şekilde bozabilir.

Varsaymak yerine doğrulayın

Çekirdeğe hangi yolu seçeceğini sorun, hedef için ve bağlantı noktası için, sonra gerçek aktarımı çalıştırın:

ip route get 203.0.113.10
ip rule show
nft list ruleset

İşaret varsa ama sayaçlar hiç hareket etmiyorsa kural eşleşmiyordur. Sayaçlar, yazdığınız yapılandırma ile çekirdeğin uyguladığı ilke arasındaki farktır.

Bunun yanlış araç olduğu durumlar

Bağlantı noktasına dayalı istisnalar doğası gereği kırılgandır. Hizmetler bağlantı noktalarını taşır, HTTP/3 UDP 443 olarak gelir ve bir uygulama farklı türlerde birkaç akış açabilir. Gerçek gereksinim bu programın normal bağlantıyı kullanmasıysa, yönlendirme katmanı yanlış yerdir; bir ağ ad alanı veya uygulama başına vekil daha uygundur.

Gereksinim bu alt ağın normal bağlantıyı kullanmasıysa, işaretleri tamamen atlayın ve daha belirgin bir rota ekleyin. Daha basittir, tek bir tabloda görünür ve bir sonraki kişi bir kural kümesi okumadan denetleyebilir.

Güvenlik duvarına dokunmadan önce üç gereksinimden hangisine gerçekten sahip olduğunuzu yazın. Yukarıdaki mekanizma kesindir ve yanlış katmana uygulanan kesinlik yalnızca daha uzun bir kesintidir.

İlgili makaleler