Bu bölümde, önceki bölümlerde öğrendiklerimizi uygulamak için; bir
bilgisayarın (sunucu) internetini, bu bilgisayara bağlı alt ağa
paylaştıracağız. Bilgisayarımızın; internete bağlı olan arayüzünün eth0
ve IP adresinin 192.168.1.2, alt ağa bağlı olan arayüzünün eth1 ve IP
adresinin 10.0.0.1 olduğu varsayımını yaparak örneğimizi
gerçekleştirelim.
Alt ağımızdaki bilgisayarların birbiri arasında iletişim kurması için, kural tanımlamalarını FORWARD zincirinde yapacağız:
# iptables -P FORWARD DROP
# iptables -A FORWARD -i eth1 -j ACCEPT
# iptables -A FORWARD -o eth1 -j ACCEPT
kuralını tanımlıyoruz. İlk kural ile FORWARD zincirimiz için
varsayılan politikayı ayarladık. İkinci kural ile, eth1'e gelen FORWARD
zincirindeki paketleri, üçüncü kural ile eth1'den giden FORWARD
zincirindeki paketleri kabul ettik. Böylelikle, eth1 arayüzüne bağlı,
alt ağdaki bir bilgisayar bir başka bilgisayara gönderdiği paketlere
izin veriyoruz.
Yukarıdaki kuralların çalışabilmesi için, ayrıca çekirdeğimizde IP
Forward özelliğinin açık olması gerekiyor. Bu özelliği açmak için;
komutunu çalıştıralım. Yaptığımız bu ayar, bilgisayarı yeniden
başlattığımızda kaybolacak. Eğer bu özelliğin sistemde kalıcı olmasını
istiyorsak, aşağıdaki satırı /etc/sysctl.conf dosyasına girmemiz gerekiyor:
net.ipv4.ip_forward=1
Alt ağ internete çıkarken, bazı portları kullanmamasını istiyorsak,
bu işlemi de FORWARD zincirinde yapacağız. Örneğin, alt ağdakilere MSN
Messenger'ın kullandığı portu kapatmak istiyorsak:
# iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 1863 -j DROP
kuralını tanımlayalım. Dikkat! Yukarıdaki kuralın iş görebilmesi için, bu kuralı, "-A FORWARD -i eth1 -j ACCEPT" kuralından önce tanımlamalısınız. Aksi halde paketler yukarıdaki kuralla eşleşmeden önce, "-A FORWARD -i eth1 -j ACCEPT" kuralı ile eşleşmiş olacak, ve bu paketlere izin verilecek.
Yukarıdaki örnekteki gibi başka portları da kapatmak istiyorsak, --dport parametresinde belirttiğimiz port numarasını değiştirerek, aynı şekilde yeni kurallar eklemeliyiz.
Alt ağımızın birbirleri arasında iletişimine izin verdikten sonra; alt ağımızın bu sunucu üzerinden internete çıkmasına izin verelim. Bunun için, alt ağdaki bilgisayarlardan gelen paketlerin, internete gönderilmeden hemen öncesinde kaynak IP adresini değiştireceğiz:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Masquerading, bizim yerimize otomatik olarak eth0'dan çıkan
paketlerin, kaynak IP adreslerini, -o parametresi ile belirtilen eth0
arayüzünün IP adresi olarak değiştirecek. MASQUERADE yerine SNAT
hedefini kullandığımız zaman, kaynak IP adresini elle girmemiz
gerekirdi. Yani eth0 arayüzünün IP adresi 192.168.1.2 ise, yukarıdaki
kural yerine aynı anlama gelen aşağıdaki kuralı da kullanabilirdik:
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.1.2
Bu işlemden sonra alt ağdaki bilgisayarlar ağ geçitleri ve IP adresleri
düzgün bir şekilde ayarlanmış ise, internete çıkabilirler (Sunucu
üzerine DHCP sunucusu kurarak, alt ağdaki bilgisayarların otomatik IP
adresi almalarını sağlayabilirsiniz).
İnterneti paylaştırmanın dışında, biraz daha ayar yapalım. Örneğin,
alt ağımızdan 80 numaralı portlara giden paketlerini Squid proxy
sunucusuna yönlendirelim:
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2:3128
Daha sonra kullanabilmek için tanımladığımız bu kuralları düzenleyip bir betik dosyası haline getirelim:
#!/bin/sh
sysctl -w net.ipv4.ip_forward=1
iptables -P FORWARD DROP
iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 1863 -j DROP
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2:3128
Bu betiği, her sistem açılışında çalıştırmak için /etc/rc.local dosyasına aşağıdaki satırı ekleyin (betiğin /usr/local/bin dizininde iptables.sh isminde olduğu varsayılmıştır. Siz betiğin yolunu kendinize uygun bir biçimde değiştirin):
sh /usr/local/bin/iptables.sh