Port yönlendirme (port eşleme olarak da adlandırılır), uzak cihazların özel yerel alan ağınız (LAN) içindeki belirli bir hizmete bağlanmasına izin veren bir yöntemdir. Adından da anlaşılacağı gibi, bu işlem belirli bir port için gelen isteklerin başka bir porta veya ağa yönlendirilmesini içerir. Paket hareket halindeyken hedefini değiştirir ve bir ağ adresi çevirisi (NAT) işlemi olarak kabul edilir.
Port yönlendirmenin etkinleştirilmesi, dahili ağa bağlı olmayan cihazların veya ana bilgisayarların birbirine erişmesine olanak tanır; aksi takdirde devre dışı bırakıldığında bu erişim kısıtlanır. Hedef web sitelerini engellemek, güvenliği artırmak ve istediğiniz zaman NAT güvenlik duvarının etrafından dolaşmak için port yönlendirmenin avantajlarından yararlanabilirsiniz.
In this tutorial, Linux'ta iptables ile port yönlendirme adımlarında size rehberlik edeceğiz.
Gereksinimler
Bu öğreticiyi takip etmek için şunlara ihtiyacınız olacak:
- Sisteminizde Ubuntu kurulu olmalıdır.
- Aynı veri merkezinde özel ağ iletişimi etkinleştirilmiş iki adet Ubuntu 20.04 ana bilgisayarı..
- Her makinede sudo yetkilerine sahip root olmayan bir kullanıcı hesabı kurulmuş olmalıdır.
Ana Bilgisayar Detayları
İlk olarak, çalışan sunucuların arayüz ve adres detaylarını bilmemiz gerekiyor. Sistemimizin ağ arayüzlerini kontrol edelim:
|
1 |
ip -4 addr show scope global |
Şu çıktıyı göreceksiniz:
|
1 2 3 4 5 6 7 8 9 |
Örnek Çıktı 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
Burada, vurgulanan çıktı iki arayüz göstermektedir; birincisi eth0 şu adrese atanmış olan: 192.51.100.45, ve ikincisi eth1 şu adrese atanmış olan: 192.168.1.5. Bu iki arayüzden biri genel, diğeri ise özeldir. İkisini birbirinden ayırt etmek ve varsayılan ağ geçidinize bağlı olan genel arayüzü bulmak için bir komut çalıştıracağız. Ayırt etmek için şunu yazın:
|
1 |
ip route show | grep default= |
Şu çıktıyı göreceksiniz:
|
1 2 3 |
Çıktı: ip route show | grep default |
Öğretici için Örnek Veriler
Bu öğretici boyunca örnek adresler ve arayüz atamaları kullanacağız. Bu verileri kullanmakta veya kendi isteğinize göre değiştirmekte serbestsiniz.
Web sunucusu ağ detayları:
-
Genel IP Adresi: 203.0.113.2
-
Özel IP Adresi: 192.0.2.2
-
Genel Arayüz: eth0
-
Özel Arayüz: eth1
Güvenlik duvarı ağ detayları:
-
Genel IP Adresi: 203.0.113.15
-
Özel IP Adresi: 192.0.2.15
-
Genel Arayüz: eth0
-
Özel Arayüz: eth1
Web Sunucusu Kurulumu
Web sunucusu ana bilgisayarımızla başlayalım. İlk olarak, sudo kullanıcınızla giriş yapın.
Nginx Kurulumu
İlk olarak, web sunucusu ana bilgisayarımıza Nginx kuracağız ve yalnızca kendi özel arayüzünü dinleyecek şekilde kilitleyeceğiz. Bu, web sunucumuzun yalnızca port yönlendirmeyi doğru bir şekilde ayarladığımızda kullanılabilir olmasını sağlayacaktır.
Ardından, yerel paket önbelleğini güncelleyin ve Nginx'i indirip kurmak için apt kullanın:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Kısıtlamalar Ekleme
Web sunucusu ana bilgisayarımıza Nginx'i kurduktan sonra, yalnızca özel arayüzlerden gelen girişleri kabul etmesini ve başka hiçbir yerden kabul etmemesini sağlamak için kilitleyeceğiz. Ayrıca bu, web sunucularımızın yalnızca port yönlendirme kurulumu doğruysa aktif olmasını sağlayacaktır.
Kısıtlamalar eklemek için varsayılan sunucu bloğu yapılandırma dosyasını açın: /etc/nginx/sites-enabled/default tercih ettiğiniz herhangi bir metin düzenleyicide (burada nano metin düzenleyiciyi kullanıyoruz) açın ve şunu yazın:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
Çıktıda, listen yönergesinin iki kez göründüğünü göreceksiniz:

Bu öğreticide, IPv4 yönlendirmesini göstermek için ilk yönergeyi kullanıyoruz. IPv6 için yapılandırılmış olan ikincisi kaldırılabilir. Nginx'e yalnızca özel arayüzden gelen girdileri almasını bildirmek için web sunucunuzun özel IP adresini 80'in hemen önüne iki nokta üst üste ile ekleyin. Ardından, yönergeyi düzenleyin:

İşlem tamamlandığında dosyayı kaydedip kapatın. Devam etmeden önce herhangi bir sözdizimi hatası olmadığından emin olun. Dosyayı test edelim:
|
1 |
sudo nginx -t |

Herhangi bir hata görüntülenmezse, Nginx'i yeniden başlatıp yeni yapılandırmayı etkinleştirebilirsiniz:
|
1 |
sudo service nginx restart |
Ağ Kısıtlamasının Doğrulanması
Web sunucumuza olan erişim düzeyimizi doğrulayalım. Özel arayüzü kullanarak web sunucusuna erişmeyi deneyin. Bunun için curl komutunu kullanın:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Şu çıktıyı göreceksiniz:

Genel arayüzü kullanmaya çalışırsak, bağlantı kuramayız:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
Bu tam olarak beklediğimiz şeydir.
Güvenlik Duvarını Port 80'i Yönlendirecek Şekilde Yapılandırın
Güvenlik duvarı makinemizde port yönlendirmeyi uygulayarak çalışmamıza devam edelim.
Çekirdekte Yönlendirmeyi Etkinleştirin
Varsayılan olarak, çoğu sistemde port yönlendirme KAPALI durumdadır. Birkaç düzenleme yaparak port yönlendirmeyi AÇIK duruma getireceğiz. Ayrıca, sonraki adımlarda gösterildiği gibi sudo yetkilerini kullanarak port yönlendirmeyi kalıcı olarak AÇIK duruma getirme seçeneği de vardır.
Çekirdek düzeyinde trafik yönlendirmeyi AÇIK duruma getirmek için şunu yazın:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Port yönlendirmeyi kalıcı olarak AÇIK duruma getirmek için /etc/sysctl.conf dosyasını düzenleyin. Dosyayı sudo yetkileriyle açın ve şunu yazın:
|
1 |
sudo nano /etc/sysctl.conf |
İçerisinde, şu şekilde görünen satırı bulun ve başındaki yorum işaretini kaldırın:
|
1 |
net.ipv4.ip_forward=1 |
İşlem tamamlandığında dosyayı kaydedip kapatın. Ardından, sysctl komutlarını kullanarak ayarlardaki değişiklikleri uygulayın:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Temel Güvenlik Duvarı Kurulumu
İlk olarak, temel bir güvenlik duvarının nasıl kurulacağına ilişkin kılavuzu inceleyin. Tamamladığınızda şunlara sahip olacaksınız:
- Şunu yüklemiş olacaksınız: iptables-persistent
- Varsayılan kural kümesini şuraya kaydetmiş olacaksınız: /etc/iptables/rules.v4
- Şu komutu kullanarak kural ekleme ve değiştirme konusunda kapsamlı bilgi: iptables komutu
Ayrıca, şuna da göz atabilirsiniz: iptables Güvenlik Duvarı kurallarını listeleme ve silme.
Yönlendirme Kurallarını Ekleme
Güvenlik duvarımızı, genel arayüzümüze ( eth0 ) gelen trafiğin, port 80 üzerinden özel arayüzümüze ( eth1) yönlendirilmesini sağlayacak şekilde yapılandıracağız. Varsayılan olarak, temel güvenlik duvarımızda FORWARD zinciri, trafiği DROP edecek şekilde ayarlanmıştır. Güvenlik duvarı kuralları eklemek, web sunucumuza giden bağlantıların yönlendirilmesine izin verecektir. Güvenlik eklemek için, yönlendirme isteklerine izin verecek şekilde güvenlik duvarı kurallarını kilitleyeceğiz.
Şu zincirde: FORWARD genel arayüzümüzden gelen ve özel arayüzümüze giden, port 80 hedefli yeni bağlantıları kabul edeceğiz. Yeni bağlantıları conntrack uzantısı yardımıyla tanımlayacağız ve bunları bir TCP SYN paketi ile temsil edeceğiz:
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
Gelen bağlantıdan kaynaklanan her iki yöndeki sonraki tüm trafiğe izin vermeniz gerekir. Genel ve özel arayüzlerimiz arasında ESTABLISHED ve RELATED trafiğine izin vermek için aşağıdaki komutları yazın:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
zincirindeki politikamızın FORWARD olarak ayarlandığını doğrulayalım: DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Şu ana kadar, genel ve özel arayüzlerimiz arasındaki trafiğin güvenlik duvarımızdan geçmesine izin veren birkaç kural ekledik. Ancak, iptables trafiği yönlendirmek için henüz bilgilendirilmedi çünkü güvenlik duvarı kuralları yapılandırması henüz tamamlanmadı. Sonraki adımlarda, trafiği yönlendirmek için NAT kurallarını ekleyeceğiz ve kalıcı kural kümesini ayarlayacağız.
Paketleri Yönlendirmek için NAT Kurallarını Ekleme
aracının iptables paketleri doğru şekilde değiştirmesi ve istemciler ile web sunucusu arasındaki iletişimi kolaylaştırması için iki ayrı işlem gerçekleştireceğiz.
DNAT, PREROUTING zincirini başlatan ve nat tablosunda yer alan ilk işlemdir. Bu işlem, paketin hedef adresini değiştirir ve ağlar arasında geçerken doğru şekilde yönlendirilmesini sağlar. Ancak, genel ağdaki istemciler güvenlik duvarı sunucumuza bağlanacak ve özel ağ topolojimiz hakkında hiçbir bilgiye sahip olmayacaklardır. Özel ağ ile bilgi aktarmak için, hedef web sunucumuza doğru şekilde ulaşmasını sağlamak üzere her paketin hedef adresini değiştirin.
Bağlantı noktası yönlendirmeyi (port forwarding) yapılandırmaya odaklandığımızı belirtmek önemlidir. Güvenlik duvarına ulaşan her pakette NAT işlemi gerçekleştirmek bu kılavuzun bir parçası değildir. numaralı bağlantı noktasındaki paketleri 80 web sunucumuzun özel IP adresiyle eşleştireceğiz:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
Paket, istemcinin orijinal adresini kaynak adres olarak içerecek şekilde web sunucumuza doğru bir şekilde yönlendirilecektir. Sunucunun yanıtı doğrudan bu adrese gönderme girişimlerine rağmen, meşru bir TCP bağlantısı kurma olasılığı olmayacaktır.
Doğru yönlendirmeyi yapılandırmak için paketin kaynak adresini değiştireceğiz. Kaynak adresi, güvenlik duvarı sunucumuzun özel IP adresiyle değiştirelim. Değişiklikten sonra yanıt, güvenlik duvarına geri gönderilecek ve o da bunu istemciye iletecektir.
Bu işlevi etkinleştirmek için, paketler ağa gönderilmeden hemen önce değerlendirilen POSTROUTING zincirine ve nat tablosuna bir kural ekleyin. Ardından, web sunucumuz için belirlenen paketleri IP adresi ve bağlantı noktasına göre eşleştirin:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
Bu kural yürürlüğe girdiğinde, web tarayıcımızı güvenlik duvarı makinemizin genel adresine yönlendirerek web sunucumuza erişilebilir olmalıdır:
|
1 |
curl 203.0.113.15 |
Şu çıktıyı göreceksiniz:

Bağlantı noktası yönlendirme kurulumumuz tamamlandı.
Kalıcı Kural Kümesini Ayarlama
Bağlantı noktası yönlendirme kurulumunu tamamladıktan sonra, bunu kalıcı kural kümemize kaydedeceğiz. Mevcut kural kümesindeki yorumları korumak istiyorsanız, kurallarınızı kaydetmek için iptables-persistent servisini kullanın:
|
1 |
sudo service iptables-persistent save |
Dosyanızdaki yorumları korumak için dosyayı açıp manuel olarak da düzenleyebilirsiniz:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Ardından, sırasıyla filter tablosunu ve nat tablosunu yapılandırarak FORWARD zinciri kurallarını ve ROUTING kurallarını ekleyin. nat tablosunu ayarlamak, PREROUTING ve POSTROUTING kurallarını aşağıdaki örnekte gösterildiği gibi eklememize olanak tanıyacaktır:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/rules.v4 *filter # Varsayılan olarak tüm giden paketlere izin ver, ancak gelen ve yönlendirilen paketleri düşür :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Protokol bazlı özel zincirler :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Kabul edilebilir UDP trafiği # Kabul edilebilir TCP trafiği -A TCP -p tcp --dport 22 -j ACCEPT # Kabul edilebilir ICMP trafiği # Standart kabul politikası -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Geçersiz paketleri düşür -A INPUT -m conntrack --ctstate INVALID -j DROP # Trafiği protokole özel zincirlere aktar ## Yalnızca yeni bağlantılara izin ver (kurulmuş ve ilişkili olanlar zaten işlenmiş olmalıdır) ## TCP için ek olarak yalnızca yeni SYN paketlerine izin ver, çünkü bu yeni bir TCP bağlantısı kurmak için ## geçerli olan tek yöntemdir -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Bu noktaya kadar ulaşan her şeyi reddet ## Reddetme mesajıyla protokole özel olmaya çalışın -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # 80 numaralı bağlantı noktasını web sunucumuza yönlendirme kuralları # Web sunucusu ağ detayları: # * Genel IP Adresi: 203.0.113.2 # * Özel IP Adresi: 192.0.2.2 # * Genel Arayüz: eth0 # * Özel Arayüz: eth1 # # Güvenlik duvarı ağ detayları: # # * Genel IP Adresi: 203.0.113.15 # * Özel IP Adresi: 192.0.2.15 # * Genel Arayüz: eth0 # * Özel Arayüz: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Yönlendirme filtreleme kurallarının sonu # Değişiklikleri kaydet COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Genel arayüzün 80 numaralı bağlantı noktasına gelen istekleri çevirme kuralları # böylece özel arayüzü kullanarak web sunucusuna doğru şekilde # yönlendirebiliriz. # Web sunucusu ağ detayları: # * Genel IP Adresi: 203.0.113.2 # * Özel IP Adresi: 192.0.2.2 # * Genel Arayüz: eth0 # * Özel Arayüz: eth1 # # Güvenlik duvarı ağ detayları: # # * Genel IP Adresi: 203.0.113.15 # * Özel IP Adresi: 192.0.2.15 # * Genel Arayüz: eth0 # * Özel Arayüz: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Web sunucusu trafiği için NAT çevirilerinin sonu COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
Yukarıdaki değerleri ekledikten sonra dosyayı kaydedip kapatın. Ardından, kurallarınızın sözdizimini test etmek için aşağıdaki komutu yazın:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Herhangi bir hata görmüyorsanız, kural kümesini yükleyin:
|
1 |
sudo service iptables-persistent reload |
Web sunucumuzun güvenlik duvarınızın genel IP adresi üzerinden hala erişilebilir olduğunu doğrulayalım:
|
1 |
curl 203.0.113.15 |
Sonuç
Bu eğitimin sonunda, iptables ile bir Linux sunucusunda bağlantı noktası yönlendirme konusunda kendinizi rahat hissediyor olmalısınız. Ağ geçidi güvenlik duvarı makineniz üzerinden hizmet trafiğinin serbestçe akmasını sağlarken, özel ağınızın topolojisini gizlemek için bağlantı noktası yönlendirme özelliklerinden yararlanabilirsiniz.
Bu işlem doğrudan ağ güvenliğinize ve kullanılan bağlantı noktalarına bağlı olduğundan güvenlidir. Ağınızda bir güvenlik duvarı veya VPN güvenliği yoksa bir risk olasılığı olabilir. Bu nedenle, güvenlik duvarını bu eğitimde açıklandığı gibi yapılandırmanız önerilir. Bu kılavuzun, özel ağınızı kullanırken internette güvende kalmanıza yardımcı olacağını umuyoruz.
Sisteminizde uygulayabileceğiniz daha fazla güvenlik duvarı çözümünü keşfetmek için şu kaynaklara göz atın: blogumuz:
- Ubuntu 18.04 üzerinde UFW ile Güvenlik Duvarı Yapılandırma
- CentOS 7 üzerinde FirewallD ile Güvenlik Duvarı Kurulumu
- UFW'nin Temelleri: Temel Güvenlik Duvarı Komutlarını Öğrenmek
Keyifli Bilişimler!
Yorumlar
Henüz yorum yapılmamış. İlk siz olun.