WireGuard ile Docker ağları çakışıyor; routing'i nasıl stabilize ederim?
Soru
Ubuntu VPS'imde dışa kapalı bir veritabanı kümesi var; ana arayüz `ens192`. Güvenli erişim için bir WireGuard tüneli kurdum. VPN ayağa kalkınca yerel Docker ağları (`docker0`) ile WireGuard alt ağları arasında IP çakışması ve routing hataları çıkıyor. Sunucu düzeyinde network izolasyonunu ve routing tablosunu kalıcı olarak nasıl stabilize ederim?
Cevap
Kısa cevap: Kök neden çakışan RFC1918 aralıkları. Çözüm runtime hilesi değil, deterministik bir adresleme planı: Docker’ın havuzunu sabitle, WireGuard’ın AllowedIPs’ini daralt, rotaları kalıcı yap.
Kısa cevap
Bu bir “rota bug’ı” değil, bir planlama sorunu: WireGuard ayağa kalkınca aynı 172.x/10.x aralığına oturan iki ağ var ve çekirdek hangisini routing yapacağını şaşırıyor. Docker’ın ağ katmanını kendi başına nasıl kurduğunu Docker kurulum ve kullanım yazısında anlatmıştım; çakışma da tam oradan, otomatik atanan köprü ağından çıkıyor.
Neden
-
Docker havuzu rastgele seçtikçe çakışma kaçınılmaz. Otomatik ağ atama bir aralığı sizin adınıza seçer; WireGuard subnet’iniz o aralığa denk geldiği gün çakışma kendiliğinden oluşur.
-
Geniş
AllowedIPsdefault rotayı ele geçirir.0.0.0.0/0verirseniz WireGuard host’un tüm trafiğini tünele çeker (route hijack) ve sorun “çakışma”dan “her şey tünelden akıyor”a döner.
Ne yapmalı
-
Docker’ın havuzunu sabitle.
daemon.jsoniçindedefault-address-poolsile Docker’ın otomatik ağ atadığı bloğu, WireGuard subnet’iyle asla çakışamayacak bir aralığa pinle. -
WireGuard’a dar
AllowedIPsver.AllowedIPsyalnızca DB subnet’i olsun. Daraltınca çekirdek sadece DB trafiğiniwg0’a yollar. -
Rotaları kalıcı yap.
ip route addad-hoc komutları reboot’ta uçar. Rotalarısystemd-networkd/netplan ile tanımla ki yeniden başlatmada otomatik gelsin. -
DB kutusunu sadece
wg0üzerinden inbound tut. Veritabanını dünyaya NAT’lama; yalnızca tünelden gelen bağlantıyı kabul etsin. -
Doğrula.
ip route get <db-ip>ile paketin gerçektenwg0’dan çıktığını,wg showile handshake’in canlı olduğunu gör. Tahminle değil, bu iki komutla teyit et.
Sonuç: Çakışmaları runtime’da kovalamayı bırak; bu bir planlama problemi. Ben olsam her arayüz için (ens192 / docker0 / wg0) belgelenmiş, çakışmayan bir subnet planı yazardım. Docker havuzunu pinle, AllowedIPs’i daralt, rotaları systemd ile kalıcı kıl, DB’ye sadece tünelden eriş. Adresleme planı netse routing kendiliğinden stabil olur.
İlgili Yazılar
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.