İçeriğe geç
NetDevOps
13 dk okuma Ağ Yönetimi

MikroTik Ev Ağında PPPoE, NAT ve Güvenlik Yapılandırması

Operatörün verdiği modem/router kombinasyonunu köprü moduna alıp arkasına MikroTik koyduğunuzda, kullanıcı adı ve şifreyle çevirme (dial) işini artık MikroTik üstlenir. Bu yazıda evde bir MikroTik cihazın PPPoE istemcisi olarak nasıl yapılandırılacağı, LAN tarafının NAT ile internete nasıl çıkarılacağı ve cihazın dış dünyaya karşı nasıl kapatılacağı anlatılıyor. Örnekler RouterOS 7 içindir ama 6.x serisinde de komut yapısı büyük ölçüde aynıdır.

Modem köprü modunda mı, değil mi?

PPPoE istemcisini MikroTik üzerinde çalıştırmadan önce operatör cihazının durumunu netleştirmek gerekir. İki temel senaryo var. İlkinde operatörün ONT'si veya DSL modemi köprü (bridge) modundadır; cihaz sadece sinyali çevirir, kimlik doğrulama yapmaz. Bu durumda MikroTik'in WAN portu doğrudan ONT'nin LAN portuna bağlanır ve PPPoE oturumunu MikroTik kurar. İkinci senaryoda operatör cihazı kendi başına PPPoE oturumu açıyordur; o zaman MikroTik'in PPPoE çalıştırması anlamsızdır, çift NAT oluşur. Önce modemi köprü moduna alın. Bazı operatörler bunu müşteri panelinden, bazıları telefonla yapıyor.

Bir de MAC kilidi meselesi var. Bazı servis sağlayıcılar PPPoE oturumunu ilk bağlanan cihazın MAC adresine kilitler. Eski router'ı söküp MikroTik'i taktığınızda oturum hiç kurulmayabilir. Çözüm iki yollu: ya operatörü arayıp MAC kaydını sıfırlatırsınız, ya da ether1 üzerinde eski cihazın MAC adresini klonlarsınız. MAC klonlama WinBox'ta Interface > ether1 > General sekmesindeki MAC Address alanından yapılır.

PPPoE istemcisinin kurulması

WinBox ile cihaza bağlanın, sol menüden PPP'ye girin, Interface sekmesinde artı (+) butonuna basıp PPPoE Client seçin. General sekmesinde Interface olarak WAN kablosunun takılı olduğu portu (genelde ether1) seçin. Dial Out sekmesine geçin: User alanına operatörün verdiği kullanıcı adını, Password alanına şifreyi yazın. Add Default Route ve Use Peer DNS kutularını işaretleyin. Service Name alanını operatör özellikle belirtmediyse boş bırakın; boş bırakıldığında istemci broadcast domain'deki herhangi bir Access Concentrator'a bağlanır.

CLI tercih edenler için eşdeğeri:

/interface pppoe-client add name=pppoe-out1 interface=ether1 \
    user="kullaniciadi@ttnet" password="sifre" \
    add-default-route=yes use-peer-dns=yes disabled=no

Bağlantı kurulduğunda arayüz listesinde pppoe-out1'in yanında R (running) bayrağı görünür. Durumu detaylı izlemek için /interface pppoe-client monitor pppoe-out1 komutu status, uptime, local-address, remote-address, mtu ve mru gibi değerleri verir. Status alanında connected yazıyorsa oturum kurulmuş demektir. verifying password... aşamasında takılıyorsa kullanıcı adı veya şifre yanlıştır. Hiçbir aşamaya geçemiyorsa ve discovery hatası alıyorsanız kablo, köprü modu veya VLAN sorunu vardır.

PPPoE'nin çalışma mantığını kısaca bilmek hata ayıklamada işe yarar. Oturum iki aşamadan oluşur. Discovery aşamasında istemci PADI paketini broadcast gönderir, Access Concentrator PADO ile cevap verir, istemci PADR gönderir ve sunucu PADS ile benzersiz bir session ID atar. Session aşamasında ise LCP ile bağlantı parametreleri, ardından CHAP/PAP ile kimlik doğrulama ve son olarak IPCP ile IP adresi ataması yapılır. Hangi aşamada takıldığını log ekranından görebilirsiniz: PADT veya timeout hataları fiziksel katmana, authentication hataları kimlik bilgilerine işaret eder.

VLAN gerektiren fiber bağlantılar

Bazı fiber operatörleri PPPoE trafiğini belirli bir VLAN etiketiyle taşır. Bu durumda PPPoE istemcisi doğrudan ether1 üzerinde değil, ether1 üzerinde oluşturulan VLAN arayüzü üzerinde çalıştırılır. Sıralama şöyle: önce Interface menüsünden artı butonuyla VLAN arayüzünü ether1 üzerinde oluşturun, VLAN ID alanına operatörün verdiği numarayı yazın (örnekte 100 kullanılmıştır), sonra PPPoE istemcisini bu VLAN arayüzünü işaret ederek oluşturun:

/interface vlan add name=vlan100-wan vlan-id=100 interface=ether1
/interface pppoe-client add name=pppoe-out1 interface=vlan100-wan \
    user="kullaniciadi@ttnet" password="sifre" \
    add-default-route=yes use-peer-dns=yes disabled=no

VLAN ID'yi operatörden öğrenmeden tahmin etmeye çalışmayın. Yanlış ID ile discovery aşaması hiç başlamaz, logda sadece bekleyen PADI paketlerini görürsünüz.

MTU ve MSS ayarı

PPPoE, Ethernet çerçevesinin içine 8 byte ek yük bindirir: 6 byte PPPoE başlığı, 2 byte PPP protokol alanı. Standart Ethernet MTU'su 1500 byte olduğundan PPPoE üzerinden taşınabilecek IP paketi en fazla 1492 byte olur. RouterOS'ta max-mtu ve max-mru varsayılanı auto'dur ve çoğu durumda doğru değer negotiate edilir. Sorun, yol üzerindeki bir cihazın ICMP Fragmentation Required mesajlarını düşürmesiyle ortaya çıkar: bazı siteler açılır, bazıları açılmaz; ya da sayfalar yarım yüklenir. Klasik belirti budur.

Çözüm TCP MSS clamping'dir. Mangle tablosunda pppoe-out1 üzerinden çıkan SYN paketlerinin MSS değerini düşürürsünüz:

/ip firewall mangle add chain=forward out-interface=pppoe-out1 \
    protocol=tcp tcp-flags=syn action=change-mss new-mss=clamp-to-pmtu \
    comment="MSS clamp PPPoE"

clamp-to-pmtu değeri, arayüzün gerçek MTU'sundan TCP ve IP başlıklarını düşerek otomatik hesaplanır. Çoğu ev kullanıcısı için bu tek kural yeterlidir.

NAT: LAN'ı internete çıkarmak

PPPoE oturumu kurulduğunda artık WAN arayüzünüz ether1 değil, pppoe-out1'dir. Bu nokta kritik: NAT kuralını ether1'e yazan ve internete çıkamayan ev kullanıcısı sayısı az değil. ether1 artık sadece PPPoE çerçeveleri taşıyan bir taşıyıcıdır; üzerinde IP adresi yoktur, routing'e katılmaz. NAT, route ve firewall kurallarının tamamı pppoe-out1'i referans almalıdır.

/ip firewall nat add chain=srcnat out-interface=pppoe-out1 \
    action=masquerade comment="LAN internete cikis"

Masquerade, src-nat'ın dinamik adresler için tasarlanmış özel bir türüdür. PPPoE oturumu her koptuğunda veya IP değiştiğinde router ilgili connection tracking kayıtlarını temizler ve yeni oturumda alınan IP neyse kaynak adres olarak onu kullanır. Statik public IP'niz varsa src-nat ile to-addresses parametresi kullanmak daha verimlidir ama ev abonelerinin neredeyse tamamında adres dinamiktir, dolayısıyla masquerade doğru seçimdir.

NAT'ın sadece bağlantının ilk paketine uygulandığını, sonraki paketlerin connection tracking üzerinden aynı kararla işlendiğini not edelim. Bu yüzden NAT kurallarını değiştirdiğinizde mevcut bağlantılar eski çeviriyle devam eder; kuralın hemen etkisini görmek için /ip firewall connection remove [find] ile tracking tablosunu temizleyebilirsiniz.

Dışarıdan içeriye bir servis açmanız gerekirse, örneğin evdeki bir sunucuya uzaktan erişim, dstnat zincirine port yönlendirme yazılır:

/ip firewall nat add chain=dstnat in-interface=pppoe-out1 \
    protocol=tcp dst-port=2222 action=dst-nat \
    to-addresses=192.168.88.10 to-ports=22 \
    comment="eve SSH yonlendirme"

Bu örnekte dışarıdan 2222 portuna gelen bağlantılar LAN'daki 192.168.88.10'un 22 portuna gider. Yönlendirme yazarken src-address parametresiyle kaynağı kısıtlamak (örneğin sadece kendi iş yerinizin IP'si) saldırı yüzeyini ciddi azaltır. CGNAT arkasındaysanız yani operatör size 100.64.0.0/10 bloğundan adres veriyorsa port yönlendirme çalışmaz; bu durumda WireGuard gibi bir mesh VPN veya operatörden public IP talebi tek çözümdür.

Hairpin NAT notu

Evde bir sunucu çalıştırıyor ve ona dış IP üzerinden hem dışarıdan hem içeriden erişmek istiyorsanız hairpin NAT gerekir. LAN içinden gelip dış IP'ye giden isteklerin kaynağı masquerade edilmezse iç sunucu cevabı doğrudan istemciye gönderir ve TCP oturumu asimetrik olduğu için kopar. Çözüm srcnat zincirine LAN'dan LAN'a giden trafik için ek bir masquerade kuralıdır:

/ip firewall nat add chain=srcnat src-address=192.168.88.0/24 \
    dst-address=192.168.88.10 protocol=tcp dst-port=22 \
    action=masquerade comment="hairpin NAT"

Alternatif olarak DNS'i bölünmüş (split-horizon) kurup içeriden aynı ismin iç IP'ye çözülmesini sağlayabilirsiniz; daha temiz bir yöntemdir ama kurgusu ayrı bir konu.

Güvenlik: cihazı dış dünyaya kapatmak

Evde MikroTik kullanmanın en riskli tarafı, cihazın varsayılan servislerinin her arayüzde dinlemesidir. İnternette MikroTik cihazları hedef alan botnet'ler yıllardır aktif; CVE-2018-14847 gibi uzaktan dosya okuma zafiyetleri bu cihazların taranmasını kalıcı hale getirdi. İnternete bakan bir MikroTik'in ilk işi saldırı yüzeyini kapatmaktır.

Önce varsayılan admin kullanıcısını devre dışı bırakıp yeni bir yönetici hesabı oluşturun. Otomatik tarayıcıların denediği ilk kombinasyon admin kullanıcı adıdır:

/user add name=evadmin group=full password="GucluBirParola!2026"
/user disable admin

Ardından IP servislerini kısıtlayın. Telnet, FTP, API ve www servisleri ev ortamında kapalı olmalı; SSH ve WinBox sadece LAN adreslerinden erişilebilir olmalı:

/ip service set telnet disabled=yes
/ip service set ftp disabled=yes
/ip service set www disabled=yes
/ip service set api disabled=yes
/ip service set api-ssl disabled=yes
/ip service set ssh address=192.168.88.0/24
/ip service set winbox address=192.168.88.0/24
/ip ssh set strong-crypto=yes

MAC tabanlı erişim servisleri (MAC-Telnet, MAC-WinBox, MAC-Ping) katman 2 üzerinden kimlik doğrulamasız erişim sağlar. MikroTik'in resmi güvenlik dokümanı bu servislerin üretim ağlarında kapatılmasını önerir; ev ağı da üretim ağı sayılır:

/tool mac-server set allowed-interface-list=none
/tool mac-server mac-winbox set allowed-interface-list=none
/tool mac-server ping set enabled=no

Neighbor discovery, bandwidth server, proxy, socks, UPnP ve cloud servisleri de kapatılmalı. UPnP özellikle önemli: LAN'daki herhangi bir cihaz (virüslü bir PC, şüpheli bir IoT aleti) router'a kendi port yönlendirmesini yazdırabilir. Evde UPnP'yi açık bırakmak, firewall'unuzu içeriden delik deşik etmeye davettir:

/ip neighbor discovery-settings set discover-interface-list=none
/tool bandwidth-server set enabled=no
/ip proxy set enabled=no
/ip socks set enabled=no
/ip upnp set enabled=no
/ip cloud set ddns-enabled=no update-time=no

Firewall zincirleri: input ve forward

RouterOS firewall'unda üç zincir var: input router'ın kendisine gelen paketleri, forward router üzerinden geçen paketleri, output router'ın ürettiği paketleri işler. En sık yapılan hata forward zincirine odaklanıp input'u açık bırakmaktır. Saldırganın hedefi LAN'daki PC'ler değil, router'ın kendisidir; router düşerse ağ düşer.

Input zinciri için mantık sırası şöyle: önce established ve related bağlantıları kabul et, invalid'leri düşür, ICMP'ye izin ver (path MTU discovery için gerekli), yönetim erişimini LAN ile sınırla, geri kalan her şeyi düşür. Son kuralın açıkça drop olması şart çünkü RouterOS zincirlerinde hiçbir kural eşleşmezse varsayılan davranış accept'tir:

/ip firewall filter
add chain=input connection-state=established,related,untracked action=accept \
    comment="kurulu baglantilar"
add chain=input connection-state=invalid action=drop comment="gecersiz"
add chain=input protocol=icmp action=accept comment="ICMP"
add chain=input in-interface-list=LAN action=accept comment="LAN erisimi"
add chain=input action=drop comment="geri kalan her sey duser"

Bu yapıda WAN'dan gelen hiçbir yeni bağlantı router'a ulaşamaz; LAN'dan gelen her şey serbesttir. WAN tarafında pppoe-out1'in WAN interface listesine üye olduğundan emin olun. Varsayılan konfigürasyonda ether1 WAN listesindedir; PPPoE'ye geçince pppoe-out1'i de bu listeye eklemek gerekir:

/interface list member add interface=pppoe-out1 list=WAN

Forward zincirinde ise dışarıdan başlatılan bağlantıları engelleyen kural devreye girer. dstnat ile açıkça yönlendirilmemiş hiçbir yeni bağlantı içeri giremez:

/ip firewall filter
add chain=forward action=fasttrack-connection connection-state=established,related \
    comment="fasttrack"
add chain=forward connection-state=established,related,untracked action=accept
add chain=forward connection-state=invalid action=drop
add chain=forward connection-state=new connection-nat-state=!dstnat \
    in-interface-list=WAN action=drop comment="WAN kaynakli yeniler duser"

Bu son kuralın güzelliği şu: NAT tablosuna port yönlendirme eklediğinizde firewall otomatik olarak izin verir, yönlendirmeyi sildiğinizde erişim kendiliğinden kapanır. İki tablo arasında senkronizasyon derdi kalmaz.

FastTrack'in bedeli

FastTrack, kurulu bağlantıların paketlerini firewall zincirlerinin büyük kısmını atlayarak işler; düşük güçlü CPU'lu ev cihazlarında (hAP ac2, hEX gibi) NAT performansını birkaç kat artırır. Yukarıdaki forward zincirinde ilk sıraya koyulması bunun içindir. Ama bedeli var: fasttrack'e giren bağlantılar queue'lara, mangle kurallarının çoğuna ve layer-7 eşleştirmeye görünmez olur. Evde bant genişliği sınırlaması (simple queue) veya trafik şekillendirme yapıyorsanız fasttrack kuralını kaldırmanız ya da şekillendirmek istediğiniz trafiği fasttrack öncesinde matcher'larla dışarıda bırakmanız gerekir. 300 Mbps altı hatlarda fasttrack'siz performans genelde yeterlidir.

DNS tarafı

PPPoE istemcisinde use-peer-dns=yes dediyseniz operatörün DNS sunucuları otomatik yazılır. Operatör DNS'ine güvenmiyorsanız bunu kapatıp kendi sunucularınızı tanımlayın:

/ip dns set servers=1.1.1.1,9.9.9.9 allow-remote-requests=yes

allow-remote-requests=yes yapıldığında router LAN'daki cihazlar için DNS önbelleği görevi görür. DHCP sunucu yapılandırmasında gateway olarak router IP'sini (192.168.88.1) verdiyseniz istemciler sorgularını router'a gönderir, router upstream'e iletir ve sonucu önbellekler. Bu arada MikroTik'in DNS önbelleğinin WAN'dan sorgu kabul etmemesi için input zincirindeki kapanma kuralları yeterlidir; UDP 53 dışarıdan zaten drop'a düşer.

Kontrol listesi

Yapılandırma bittiğinde sırayla doğrulayın. /interface pppoe-client print çıktısında R bayrağı var mı. /ip address print çıktısında pppoe-out1 üzerinde dinamik bir adres görünüyor mu. /ip route print çıktısında gateway'i pppoe-out1 olan bir default route var mı. /ping 9.9.9.9 router üzerinden cevap veriyor mu. LAN'daki bir cihazdan internete çıkılabiliyor mu. Dışarıdan (telefonun mobil verisiyle) router'ın public IP'sine SSH veya WinBox denemesi yapın: bağlanamıyor olmalısınız. Son olarak /export ile konfigürasyonun yedeğini alın ve cihaz dışında saklayın.

MikroTik evde ilk kurulduğunda varsayılan konfigürasyonla idare eder gibi görünür ama PPPoE geçişinde NAT arayüzü, firewall listeleri ve servis kısıtlamaları elden geçirilmezse cihaz internete açık kalır. Oturum kurulduktan sonra on dakikalık bir sertleştirme turu, ileride yaşanacak kötü sürprizlerin çoğunu engeller.

Laravel-NDFirewall

Laravel için geliştirilmiş; panelsiz, route tabanlı ve hafif bir WAF (Web Application Firewall) kütüphanesidir. RCE, SQLi, XSS ve SSRF saldırılarını tespit eder; girdileri asla çalıştırmaz ve olası ha…

PHP

ctCertWatch

SSL sertifika yayınlarını gerçek zamanlı takip eden bir izleme servisi. Regex filtreleme, DNS çözümleme ve webhook uyarıları ile phishing domainlerini, marka taklidini ve yetkisiz sertifikaları anında…

Rust

ipReconary

IP aralıkları, alt ağlar ve ASN bilgilerine dayalı olarak host, domain ve servis keşfi yapan bir ağ keşif (recon) aracı. Güvenlik uzmanları ve OSINT araştırmacıları için ağ altyapısını hızlı ve güveni…

Rust

Wireguard-Server-Panel

Web arayüzüne sahip, kendi sunucunuzda barındırılan bir WireGuard VPN servisi. İstemci yönetimi, mobil bağlantı için QR kod desteği, gerçek zamanlı trafik istatistikleri ve bağlantı kayıtları sunar. T…

LoadAlertTracker

Sistem yükünü neredeyse hiç kaynak tüketmeden izleyen, hafif bir servis. Belirlenen eşikler aşıldığında Telegram, Discord ve Mattermost gibi platformlara gerçek zamanlı uyarı gönderir.

Rust

Trustsslroot

Tek komutla eksiksiz bir özel PKI yapısı (Kök CA → Ara CA → sunucu ve istemci sertifikaları) oluşturan araç. Farklı formatlarda (p12/bks/jks) paketler üretir ve kullanıma hazır çıktı klasörleri sunar.

Go

DDNS-FW

Değişken IP adresini DDNS üzerinden gerçek zamanlı takip eden, hafif ve güvenilir bir araç. İzin verilen IP listelerini otomatik güncelleyerek kesintisiz erişim ve güvenlik sağlar. Tek dosyadan çalışı…

Rust

Cloudfiltred

Sunucu üzerinde 80/443 portlarına erişimi yalnızca Cloudflare IP aralıklarıyla sınırlandıran, tek dosyadan çalışan bir Linux servisi. Kendini kurar, sistem servisi olarak çalışır ve IP listelerini düz…

Rust

node_exporter

Linux için geliştirilmiş, hafif ve tek dosyadan çalışan, güvenli erişim kontrollü bir sistem metrikleri servisi.

Rust