Port nedir ve Linux servisleri nasıl dinler?
Port kavramını ve Linux üzerinde ss komutu ile dinlenen servislerin nasıl tespit edileceğini öğrenin. TCP ve UDP protokolleri arasındaki farkları inceleyin.
Bir portun gerçekte ne olduğu
Port, bir sunucunun trafiği birbirine karışmadan aynı anda birçok servisi çalıştırmasına olanak tanıyan bir numaradır. VPS cihazınızın tek bir IP adresi vardır, ancak aynı anda bir web sunucusu, bir SSH sunucusu ve bir veritabanı çalıştırabilir. Bir paket geldiğinde, işletim sisteminin bu paketin hangi servise ait olduğunu bilmesi gerekir. Port numarası bu sorunun cevabıdır. Web trafiği port 443'e, SSH ise port 22'ye gider. IP adresi paketi sunucunuza ulaştırır; port ise paketi sunucu üzerindeki doğru programa iletir.
Port, 16-bitlik bir sayıdır: 16 bit 0 ile 65535 arasında değer verir; 0 sayısı rezerve edilmiştir, bu nedenle pratikte portlar 1 ile 65535 arasında çalışır. 1024'ün altındaki portlar "well-known" (tanınmış) portlardır ve açılmaları için root yetkisi gerekir; standart servisler bu yüzden burada bulunur: SSH için 22, HTTP için 80, HTTPS için 443, DNS için 53. 1024'ün üzerindeki her şey sıradan programlar için kullanılabilir.
İki tür port vardır: TCP ve UDP. Bir protokoldeki port numarası, diğer protokoldeki aynı numaradan ayrıdır. TCP, SSH, HTTP ve veritabanları gibi çoğu servisin kullandığı bağlantı tabanlı protokoldür. UDP ise bağlantısızdır; DNS ve bazı VPN'ler gibi yapılar için kullanılır. Bir firewall (güvenlik duvarı) açarken genellikle hangi protokolün kullanılacağını belirtmeniz gerekir, örneğin 22/tcp.
Listening, bir programın bir portu beklediği anlamına gelir
Bağlantı almak isteyen bir program, çekirdekten (kernel) bir port üzerinde "listen" (dinleme) yapmasını ister. Bu andan itibaren port makinede açılır ve program, firewall izin verdiği sürece oraya gelen her şeye yanıt verir. Hiçbir programın dinlemediği bir port, bağlantıları reddeder. Bu nedenle herhangi bir güvenlik kontrolündeki ilk soru şudur: ne, nerede dinleme yapıyor?
Buna cevap veren komut ss'dir:
sudo ss -tlnpFlag'lerin anlamları şunlardır: TCP (t), sadece dinleme yapan soketler (l), sayısal portlar (n, böylece 22 yerine ssh görürsünüz) ve sahibi olan işlem (p). Tipik bir sonuç:
State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:80 nginxProcess sütunu, her bir portun hangi programa ait olduğunu gösterir; bu, yanlışlıkla çalışmaya bırakılan bir işlemi takip etmenizi sağlar.
Local Address sütunu önemli olan kısımdır
Her portun önündeki adresi dikkatlice okuyun, çünkü servise kimin ulaşabileceğini bu adres belirler. Sürekli karşılaşacağınız üç durum vardır.
0.0.0.0:22, "bu makinenin sahip olduğu tüm IPv4 adreslerinde dinle" anlamına gelir, kamuya açık (public) adresi de dahil eder. Servis, firewall izin verirse, IPv4 üzerinden internetten erişilebilir durumdadır.
[::]:80, IPv6 için aynı anlama gelir: tüm IPv6 adreslerinde, kamuya açık olanlar dahil, dinleme yap. Birçok program varsayılan olarak buraya bağlanır (bind) ve Linux üzerinde bir :: soketi genellikle IPv4'ü de kabul eder.
127.0.0.1:5432, "sadece loopback üzerinde dinle" anlamına gelir. 127.0.0.1, bir makinenin kendisiyle konuşmak için kullandığı adrestir ve başka hiçbir yerden yönlendirilemez (routable). Buraya bağlanmış bir servise sadece aynı sunucu üzerinden erişilebilir; firewall ne derse desin, internetten asla erişilemez. Yukarıdaki Postgres satırı yapısal olarak güvenlidir.
Pratik kural şudur: Sadece kendi uygulamalarınızın kullandığı bir veritabanı, önbellek (cache) veya admin paneli, 0.0.0.0 yerine 127.0.0.1 adresine bağlanmalıdır. Eğer bir servis hiçbir zaman kamuya açık bir adreste dinleme yapmazsa, bir saldırganın ulaşabileceği bir şey yoktur.
Listening, erişilebilir olmakla aynı şey değildir
Bir ayrım daha birçok karmaşayı önler. Bir portun makinede açık olması (yani bir programın dinleme yapıyor olması), o portun dışarıdan erişilebilir olması (yani firewall'un buna izin vermesi) ile aynı şey değildir. Uzak bir istemcinin bağlanabilmesi için her iki durumun da doğru olması gerekir.
Bu nedenle iki kontrol katmanı vardır. Her servisin bind adresini ayarlayarak neyin dinleme yapacağına siz karar verirsiniz. Dış dünyanın neye ulaşabileceğine ise bir firewall ile karar verirsiniz. İyi yönetilen bir sunucu her ikisini de kullanır: servisler sadece ihtiyaç duydukları yere bağlanır ve firewall, açıkça izin vermediğiniz her şeyi reddeder. ss ile neyin dinlendiğini okumak birinci adımdır; firewall'un neye izin vereceğine karar vermek ise ikinci adımdır ve bu konu firewalls 101 with UFW içinde ele alınmaktadır.
Burada insanları yanıltan ince bir nokta vardır. IPv4 ve IPv6 ayrıdır; sadece IPv4'ü kapsayan bir firewall, IPv6 üzerindeki [::] servislerini açık bırakır. Bu spesifik tuzak için ayrı bir yazı mevcuttur: the IPv6 firewall trap.
FAQ
Linux sunucumda hangi portların açık olduğunu nasıl görürüm?
TCP için sudo ss -tlnp, UDP için sudo ss -ulnp komutunu çalıştırın. Bu komut; her dinleme yapan soketi, portu, bağlı olduğu yerel adresi ve ona sahip olan işlemi listeler. Local Address sütununu okuyun: 0.0.0.0 veya [::] servisin ağa açık olduğu, 127.0.0.1 ise servisin sadece makinenin kendisinde dinleme yaptığı anlamına gelir.
0.0.0.0 ile 127.0.0.1 arasındaki fark nedir?
0.0.0.0, kamuya açık adres dahil "tüm IPv4 adreslerinde dinle" anlamına gelir, böylece servise ağ üzerinden erişilebilir. 127.0.0.1 loopback adresidir; makinenin kendisiyle konuşmak için kullandığı adrestir ve başka hiçbir yerden yönlendirilemez, bu nedenle buraya bağlanmış bir servise sadece yerel olarak erişilebilir. Dahili servisları, asla dışarıya açılmamaları için 127.0.0.1 adresine bağlayın.
Bir servisin çalışması için firewall üzerinden port açmam gerekiyor mu?
Sadece diğer makinelerden ulaşılması gereken servisler için. 127.0.0.1 adresine bağlı bir servisin firewall kuralına ihtiyacı yoktur çünkü zaten dışarıdan hiçbir şey ona ulaşamaz. 0.0.0.0 veya [::] üzerindeki bir servisin trafiğe izin vermek için bir firewall kuralına ihtiyacı vardır ve bir kural ekleyene kadar varsayılan olarak reddedilmelidir.
TCP portu ile UDP portu arasındaki fark nedir?
TCP bağlantı tabanlıdır ve SSH, web sunucuları ve veritabanları gibi çoğu servis tarafından kullanılır. UDP bağlantısızdır; DNS ve bazı VPN'ler tarafından kullanılır. TCP ve UDP'deki aynı numara ayrı portlardır, bu nedenle 53/tcp ve 53/udp farklıdır. Firewall kuralları yazarken protokolü belirtmeniz gerekir, örneğin 22/tcp.