Linux TEQL

25 January, 2010 (15:30) | Loadbalancing, iproute2 | By: alper

Linux outgoing loadbalancing , yazımda anlattığım gibi bir yapı hemen hemen heryerde, ihtyaçlarınızı karşılayabilsede, kullanabileceğiniz tek yöntem bu değildir. Linux TEQL ( True link Equalizer ) kullanabileceğimiz diğer seçeneklerden birisidir. Özellikle LACP ( 802.3ad ) desteklemeyen bir  switch’iniz varsa hatta local network de iki linux server in birbirleri arası haberleşmelerinde ethernet performansını paylaştırabilemek için oldukça uygun bir yöntem olabilir. örnek network yapısı verecek olursak :

şimdi TEQL nasıl çalışır bir göz atalım.

Yandaki resimde görüldüğü üzere 2 adet ethernet interface’imizi TEQL kullanarak birleştirmek mümkündür. Eth1 ve Eth2 interface’lerini kapsayan teql0 adlı yeni bir interface oluşturulur ve yeni bir ip adresi tanımlanır. tanımlanan ip adresi local network den ulaşılabildiği gibi dışarıya erişim içinde kullanılabilir. Her bir bağlantı isteğini eth1 ve eth2 arasında sırasıyla dağıtarak toplam bant genişliğini kullanma imkanı sağlar. TEQL sadece linux kerneline özel bir uygulamadır. Diğer işletim sistemlerinde bulunmaz.TEQL iproute2 paketi ile birlikte gelir.

1. Teql module’ünü yükleyelim. Interface’imizin oluştuğunu doğrulayalım.

root@linux:~# modprobe sch_teql

root@linux:~# ifconfig teql0

teql0     Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

NOARP  MTU:1500  Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@linux:~#

2. Eth1 ve Eth2 Interface’lerini teql’e dahil edelim.

root@linux:~#  tc qdisc add dev eth1 root teql0

root@linux:~#  tc qdisc add dev eth2 root teql0

root@linux:~#

3. Eth1 ve Eth2 Interface’lerinin teql interface’ine dahil olduğundan emin olalım.

root@linux:~# tc qdisc show
qdisc teql0 8001: dev eth1 root
qdisc teql0 8002: dev eth2 root
qdisc pfifo_fast 0: dev eth3 root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
root@linux:~#
4. Teql0'e ip adresimizi atayalım.
root@linux:~# ifconfig teql0 192.168.1.1 netmask 255.255.255.0
root@linux:~#

5. IP Adreslerinin doğru olduğunu kontrol edelim.

root@linux:~# ifconfig -a
eth1      Link encap:Ethernet  HWaddr 08:00:27:1f:0a:b7
inet addr:192.169.1.2  Bcast:192.169.1.255  Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe1f:ab7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)
eth2      Link encap:Ethernet  HWaddr 08:00:27:ad:66:d0
inet addr:192.169.1.3  Bcast:192.169.1.255  Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fead:66d0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B)  TX bytes:238 (238.0 B)
eth3      Link encap:Ethernet  HWaddr 08:00:27:d8:6a:d3
inet addr:10.1.30.86  Bcast:10.1.30.255  Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fed8:6ad3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:710 errors:0 dropped:0 overruns:0 frame:0
TX packets:267 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:84210 (84.2 KB)  TX bytes:34303 (34.3 KB)
lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:16436  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
teql0     Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
root@linux:~#

6. Ağ geçidimiz Local network’de bir makina ise teql0 interface’i için ağ geçidini girelim . ( daha önceden girilmiş ağ geçidi varsa siliniz.

root@linux:~# ip route add default via  192.168.1.254 dev teql0
root@linux:~#

7. “ tc -s qdisc ” komutu ile yapmış olduğumuz işlemi kontrol edebilirsiniz.

Notlar :

  1. İki interface bir birine eşit olmadığı durumlarda gerçekten büyük performans sorunu yaşayabilirsiniz.
  2. Teql’e dahil ettiğiniz interface’lerden birisi fail olursa çok büyük performans sıkıntısı yaşandığı konusunda şikayetler var. Mümkün olduğunca local network içerisinde kullanın.
  3. Başıma gelmedi ama bağlı olduğunuz switchde STP’ile ilgili sorun yaşayabilirsiniz.
  4. eth1 ve eth2 gibi teql’e eklediğiniz interface’ler cevap vermezse aşağıdaki işlemi uygulayınız.
  5. Tek bir socket bağlantısı için TEQL ektra bir performans avantajı sağlayamaz.
root@linux:~# echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
root@linux:~# echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
root@linux:~#
Veya Sysctl ile
sysctl net.ipv4.conf.eth1.rp_filter=0
Açılışta aktif olması için “/etc/sysctl.conf”‘a ekleyiniz.

Ubuntu server konsol ayarlarını değiştirmek.

12 January, 2010 (21:52) | ipucu | By: alper

Kurmuş olduğunuz ubuntu server in konsol ayarlarını ( klavye, font vb ) değiştirmek için ;

root@linux:~# apt-get install console-data

Diyerek console-data yi kuruyoruz. ( root değilseniz sudo kullanmayı unutmayınız )
dpkg size kurulum esnasında soracaktır. daha sonra ayarlara yeniden ulaşmak için.

root@linux:~# dpkg-reconfigure console-data

Index

7 January, 2010 (10:15) | - Index | By: alper

Linux ile outgoing loadbalancing

31 December, 2009 (15:29) | Loadbalancing | By: alper

Linux ile Birden fazla internet çıkışını aynı anda kullanmak için outgoing loadbalancing temel olarak iproute2 ve iptables yardımı ile yapılır. Burada anlattığım yöntem ECMP ( Equel Cost multipath Routing )’ olarakta bilinir.

Şekildeki örnek 5 adet çeşitli modemlerle yapılandırılmış olsada bu bağlantı türleri herhangi bir bağlantı olabilir ( PPPOE , Kablonet , MetroEth , GHDSL vs vs ). Ağ geçitleri istenildiği kadar artırılıp azaltılabilir. Ben burada farklı interface ler üzerinden nasıl yapılacağını anlatıyorum fakat daha önce uyguladığım 2 farklı noktada hem giriş hem çıkış için tek interface’i olan ( sadece eth0 ) linux sorunsuz olarak  çalışıyor.

  • 1. ipforwarding düzgün olarak yapılandırılmalıdır.

sysctl net.ipv4.ip_forward=1

veya

echo “1″ > /proc/sys/net/ipv4/ip_forward

Kalıcı olması için kullanmış olduğunuz linux sürümünde  gerekli ayarları yapmayı unutmayınız örneğin /etc/sysctl.conf içerisinde.

  • 2. rt_tables

Multiple Routing table için gerekli tabloları oluşturalım :

root@linux:~# echo “10 gw1″ >> /etc/iproute2/rt_tables

root@linux:~# echo “20 gw2″ >> /etc/iproute2/rt_tables

root@linux:~# echo “30 gw3″ >> /etc/iproute2/rt_tables

root@linux:~# echo “40 gw4″ >> /etc/iproute2/rt_tables

root@linux:~# echo “50 gw5″ >> /etc/iproute2/rt_tables

Yapmış olduğumuz işlemi kontrol ediyoruz.  ”cat /etc/iproute2/rt_tables”  girmiş olduğumuz bilgiler kalıcıdır her açılışta yeniden eklemenize gerek yoktur. Kaç ağ geçidimiz varsa okadar adet oluşturuyoruz.
  • 3. Konfigurasyon alias’larını oluşturalım
# local interface’imiz
lint=”eth0″
#  Linux’un internete ulaşmak için kullandığı 1. nolu ağ geçidinin ip adresi
gw1ip=”192.168.0.1″
# Linux’un bu ağ geçidine ulaşmak için kullandığı interface
gw1int=”eth1″
# Policie routing için şu an kullanmasakta lazım olabileceği için kullanacağımız
# fwmark değeri istediğiniz rakamı kullanmakta özgürsünüz.
gw1mark=”1″
#  Linux’un 1 nolu ağ geçidine ulaşmak için kullandığı kendine ait eth1 interface’ine ait ip adresi
gw1src=”192.168.0.2″

# Diğer ağ geçitleri için gerekli ayarları tek tek açıklamadan yazıyorum gw1 için

#yaptığımız örneğin hepsi için yeterli açıklamayı yapacağına inanıyorum.

gw2ip=”192.168.1.1″
gw2int=”eth2″
gw2mark=”2″
gw2src=”192.168.1.2″
# 3 Nolu ağ geçidi
gw3ip=”192.168.2.1″
gw3int=”eth3″
gw3mark=”3″
gw3src=”192.168.2.2″
# 4 Nolu ağ geçidi
gw4ip=”192.168.3.1″
gw4int=”eth4″
gw4mark=”4″
gw4src=”192.168.3.2″
# 5 Nolu ağ geçidi
gw5ip=”192.168.4.1″
gw5int=”eth5″
gw5mark=”5″
gw5src=”192.168.4.2″
  • 4. Routing tablolarına ağ geçitlerimizi girelim.
# iproute2 ağ geçidi x.x.x.x dir. ulaşmak için kullandığı interface YY dir. bu kural table ZZ içine yazılacaktır.
ip route add default via $gw1ip dev $gw1int table gw1
ip route add default via $gw2ip dev $gw2int table gw2
ip route add default via $gw3ip dev $gw3int table gw3
ip route add default via $gw4ip dev $gw4int table gw4
ip route add default via $gw5ip dev $gw5int table gw5

Note : 5 Adet ağ geçidini multiple routing table içerisine girdik ama hala sistemin kendine ait defaultgateway yani ağ geçidi yok, buradaki örnekte iproute2 ile roundrobbin yapacağımızdan gerekte olmayacak, roundrobbin devre dışı bıraktığınızda internete çıkamayacağınızı ve internetten de bu makinaya ulaşamayacağınızı unutmayın, olası ihtimal için devamlı ulaşabileceğiniz bir ağ geçidinizi default olarak tanımlamanızı öneririm. DHCP veya Elle yapılandırma yaptığınız interface lere ağ geçidi girmeyin. Virden fazla ağ geçidi ne yaptığınızı bilmiyorsanız size sorun yaratabilir.
örnek olarak 1 nolu internet çıkışımızı default tanımlıyoruz.
ip route add default via $gw1ip dev $gw1int

  • 5. FWMARK ile işaretlenmiş paketleri ilgili tablolara gönderelim.
# gw1 için marklanmış paketler tablo gw1 e gönder.
ip rule add from all fwmark $gw1mark table gw1
# diğer ağ geçitleri için kurallar.
ip rule add from all fwmark $gw2mark table gw2
ip rule add from all fwmark $gw3mark table gw3
ip rule add from all fwmark $gw4mark table gw4
ip rule add from all fwmark $gw5mark table gw5

Basit bir internet paylaşımı için bu basamaklara gerek yoktur. Policie routing için gerekli olacak.
  • 6.  Paketleri ait oldukları routing tablolarına gönderebilmek için gerekli rule’ları girelim.
Bu işlemi doğru olarak yaptğınızda internetten bu ip  adreslerine  ( aynı subnetmask deki ipler için değil )  ulaşabilmeniz gerekiyor.
# gw1 in ip adresine giden paketleri tablo gw1 e gönder.
ip rule add from $gw1src table gw1
# gw1′in ip adresinden gelen pkaetleri tablo gw1′e ata ( buna pek gerek yok ekleme sebebim tamamen piskolojik
# teknik bir sebep içermiyor )

ip rule add to $gw1src table gw1

# diğer ağ geçitleri için kurallar :
ip rule add from $gw2src table gw2
ip rule add to $gw2src table gw2
ip rule add from $gw3src table gw3
ip rule add to $gw3src table gw3
ip rule add from $gw4src table gw4
ip rule add to $gw4src table gw4
ip rule add from $gw5src table gw5
ip rule add to $gw5src table gw5

Kotrolü :

Tüm interface lerden sırasıyla ping atarak kontrol edebilirsiniz.
ping -I gw1int www.google.com.tr # veya aynı subnetmask de olmayan bir ip adresi

  • 7. Routing cache de daha önce kalan girdileri temizleyelim.
ip route flush cache

  • 8. RoundRobbin ile gelen paketleri ağ geçitlerine dağıtalım.


ip route add equalize default scope global \
nexthop via $gw1ip dev $gw1int weight 1 \
nexthop via $gw2ip dev $gw2int weight 1 \
nexthop via $gw3ip dev $gw3int weight 1 \
nexthop via $gw4ip dev $gw4int weight 1 \
nexthop via $gw5ip dev $gw5int weight 1

  • 9 .  NAT ( Masquerade )
İnternet bağlantılarımız için çıkışlarımız NATD istiyorsa isteyen interface ler için iptables a aşağıdaki kuralları girmeliyiz. istemediğniz interface’e girmeyiniz.
iptables -t nat -A POSTROUTING -o $gw1int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw2int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw3int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw4int -j MASQUERADE
iptables -t nat -A POSTROUTING -o $gw5int -j MASQUERADE

  • 10. Policy Routing
a) iptables ile

iptables Matches kullanarak istediğimiz paketi istediğimiz ağ geçidinden gitmesi için işaretleyebiliriz.
örneğin local interfaceimiz ( eth0 ) a gelen https isteklerinin sadece 1 nolu ağ geçidinden gitmesini istiyoruz.

iptables -A PREROUTING -t mangle -i $lint  -p tcp –dport 443 -j MARK –set-mark $gw1mark

b) ip rule ile

Örneğin 1.1.1.1 ip adresinden gelen isteklerin 1 nolu ağ geçidi üzerinden sabit çıkmasını istiyoruz.
ip rule add from 1.1.1.1 to any table gw1

Bu kadar Roundrobbin ile çalışan Outgoing Linux loadbalancer router’imiz oldu :)

FreeBSD ve PF ile outgoing loadbalancing.

21 December, 2009 (19:43) | FreeBSD, Loadbalancing | By: alper

FreeBSD ve PF ile birden çok ağ geçidinin olduğu yerlerde yük dengeleme yaparak tüm ağ geçitlerini kullanmak mümkündür. buna örnek verecek olursak 2 adet veya daha fazla ADSL bağlantısı, 2 veya daha fazla wi-fi bağlantı , 2 veya daha fazla network, ADSL, Wifi arasında yük dağılımı gibi ihtiyaçlar olabilir.

Yukarıdaki örnekde 4 adet router üzerinden internet erişimine sahip bir FreeBSD ile 10.1.1.0/24 local networkü için loadbalance yapacağız. Örnekteki router bağlantıları kablo, wifi ppp  veya herhangi bir bağlantı olabilir. 4  router için vermiş olduğum örneği istediğiniz adet için editleyerek değştirebilirsiniz.

Not : 2 Farklı interface üzerinden aynı gateway’e  PPPOE yapamazsınız. yani iki PPPOE bağlantınızın 2 sininde ağ geçidi 192.168.0.1 gibi tek bir ip olamaz. FreeBSD multiple routing tables  eksikleri tamamlandıktan sonra mümkün olacak.

 Sisteminizde pf firewall ve ipforwarding düzgün olarak yapılandırılmış olmalıdır.

/etc/rc.conf içerisine

gateway_enable=”YES” 

pf_enable=”YES”                 # Enable PF (load module if required)
pf_rules=”/etc/pf.conf”         # rules definition file for pf
pf_flags=”"                     # additional flags for pfctl startup
pflog_enable=”YES”              # start pflogd(8)
pflog_logfile=”/var/log/pflog”  # where pflogd should store the logfile
pflog_flags=”"                  # additional flags for pflogd startup

Satırlarını ekleyin.

# öncelikle dahili network’ümüzü, dışarıya çıktığımız interface leri ve ağ geçitlerimizi belirleyelim

# local network 10.1.1.0/24 network’ü

lan_net = “10.1.1.0/24″

# Local network’ümüzün bağlı olduğu ağ arayüzü
int_if  = “fxp0″

# 1 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü
ext_if1 = “vr0″
# 2 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü

ext_if2 = “vr1″
# 3 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü

ext_if3 = “vr2″
# 4 Nolu internet çıkışımızın bağlı olduğu ağ arayüzü

ext_if4 = “vr3″

# 1 numaralı ağ geçidimizin adresi.

ext_gw1 = “192.168.0.1″
# 2 numaralı ağ geçidimizin adresi.

ext_gw2 = “192.168.1.1″
# 3 numaralı ağ geçidimizin adresi.

ext_gw3 = “192.168.2.1″
# 4 numaralı ağ geçidimizin adresi.

ext_gw4 = “192.168.3.1″
# PPPOE gibi bağlantılarda nat ihtiyacımız varsa yapılandırıyoruz ( internet bağlantı ihtiyacınız yoksa bu kısmı atlayın
# Local den gelen 1 nolu ağ geçidine giden paketler için NAT kuralı
nat on $ext_if1 from $lan_net to any -> ($ext_if1)

# Local den gelen 2 nolu ağ geçidine giden paketler için NAT kuralı

nat on $ext_if2 from $lan_net to any -> ($ext_if2)
# Local den gelen 3 nolu ağ geçidine giden paketler için NAT kuralı

nat on $ext_if3 from $lan_net to any -> ($ext_if3)
# Local den gelen 4 nolu ağ geçidine giden paketler için NAT kuralı

nat on $ext_if4 from $lan_net to any -> ($ext_if4)
#  default deny
pass in  from any to any
pass out from any to any

#local ağ arayüzünden local network e giden paketlere izin veriyoruz.
pass out quick on $int_if from any to $lan_net
#  Local interface e gelen paketlere izin veriyoruz.
pass in quick on $int_if from $lan_net to $int_if
#  Devamlı değişen ip adresinin bankacılık işlemlerinde sorun çıkarmaması için tek ağ ara yüzünden çıkmasını sağlıyoruz

# alternatif olarak sticky connections kullanılabilir, dağılımlarda çok daha fazla düzensizlik yarattığını tesbit ettik.

pass in quick on $int_if route-to ($ext_if1 $ext_gw1) \
proto tcp from $lan_net to port https

# dışarı giden TCP paketlerimizi 4 ağ geçidimiz arasında Round Robbin ile dağıtıyoruz.

pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2), ($ext_if3 $ext_gw3), ($ext_if4 $ext_gw4) } round-robin \
proto tcp from $lan_net to any flags S/SA modulate state

# Dışarı giden UDP ve ICMP  paketlerimizi 4 ağ geçidimiz arasında Round Robbin ile dağıtıyoruz.
# TCP den ayrı belirtmemizin sebebi statefull protokol olmamaları

pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2), ($ext_if3 $ext_gw3), ($ext_if4 $ext_gw4) } round-robin \
proto { udp, icmp } from $lan_net to any keep state

# Tek tek dış ağ arayüzlerinden  çıkan paketlere izin veriyoruz.
pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if1 proto { udp, icmp } from any to any keep state
pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if2 proto { udp, icmp } from any to any keep state
pass out on $ext_if3 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if3 proto { udp, icmp } from any to any keep state
pass out on $ext_if4 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if4 proto { udp, icmp } from any to any keep state

# Dış ağ arayüzlerinin birbirleri arasındaki routingleri düzenliyoruz.

pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
pass out on $ext_if2 route-to ($ext_if3 $ext_gw3) from $ext_if3 to any
pass out on $ext_if2 route-to ($ext_if4 $ext_gw4) from $ext_if4 to any

pass out on $ext_if3 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
pass out on $ext_if3 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if3 route-to ($ext_if4 $ext_gw4) from $ext_if4 to any

pass out on $ext_if4 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
pass out on $ext_if4 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if4 route-to ($ext_if3 $ext_gw3) from $ext_if3 to any

Bu kadar , FreeBSD ve PF kullanarak 4 adet farklı internet bağlantısını birleştirmiş olduk, Bu yapılandırma ile şu an p4 3Ghz bir bilgisayar 3 Adet ADSL (  PPPOE ) 8 Mbit , 1 Adet Kablo net ( 4 Mbit ) olmak üzere 7000 ortalama state ile %10 un altında cpu kullanımı sorunsuz olarak çalıştırmaktadır.

Loadbalancing - Yük dengeleme

21 December, 2009 (11:46) | Loadbalancing | By: alper

Günümüzde Sistem ve network ihtiyaçları gerek maliyet gerekse elde olan imkanların yetmemesi sebebiyle, yapılan işlerin birden çok kaynağa dağıtılmasını zaruri kılar hale gelmiştir. Birçok donanım ve yazılım bu ihtiyaçları karşılasada en esnek yapıyı opensource işletim sistemleri sağlamaktadır. En çok ihtiyaç duyulan loadbalancing ( yük dengeleme ) ihtiyaçları :

  1. Ethernet loadbalancing
  2. Outgoing Internet loadbalancing
  3. Incoming Internet loadbalancing
  4. Harddisk & Storage loadbalancing

1. Ethernet loadbalancing

Ethernet loadbalancing 1 den fazla ethernetin ( veya herhangi bir Ağ arayüzünün ) iş yükünü paylaşması için gereklidir. Günümüzde en çok kullanılan sistem LACP 802.3ad Link Agregation Control Protocol dür.

2. Outgoing loadbalancing

Kısaca ihtiyaç duyulan internet bant genişliğinin download olarak sağlanması için birden fazla internet veya network bağlantısının birleştirilmesi için kullanılmasıdır.

3. Incoming Internet loadbalancing

Internet veya network üzerinden gelen isteklerin , Server sistemleri üzerinde yük dağıtımı veya yetersiz bant genişliğinin telafi edilmesi amacıyla kullanılır.

4. Hardisk & Storage loadbalancing

Yukarıdaki örneklerden farklı olarak harddisk veya storage performanslarının yeterli olmadığı durumlarda bu engeli aşmak için gereklidir.

Tüm bu ihtiyaçları gidermek için farklı yollar kullanılsada genel olarak hepsinin çalışmaları iki temel prensip sayesinde olur.

a) Round Robin

Basit anlatımıyla gelen işlerin kaynaklara sırasıyla dağıtılması için kullanılan bir algoritmadır.CPU scheduling, DNS balancing, Internet loadbalancing gibi bilgisayar kullanımında hemen hemen heryerde önümüze çıkar, Round Robin işlemlerin yükü, önemi gibi parametreleri dikkate almaz her bir iş parçacığını ayrı ayrı sıraya alarak sırasıyla kaynaklara dağıtır. örneğin 1 mbit internet bağlantımız ile 100 mbit bağlantımızı aynı anda round robin ile paylaşıma almak 1 mbit hat için insafsızlık olacaktır :) örnek verecek olursak iki adet internet hattımıza 10 adet bağlantı isteğinin dağılımında ideal paylaşım 5/5 iki hatta dağılımı şeklinde olur. bu durum altında 1. numaralı hatta giden isteklerin her biri download 2 numara için giden isteklerin her biri ise IRC gibi tamamen bant genişliği kullanmayan basit bağlantı olabilir.

b) Policy ( kurala dayalı )

Policy ( Kurala bağlı ) yük dengelemesi ise round robin in aksine belirli kriterlere göre elimizdeki işlerin kaynaklara dağılımına dayanır. Yine çok basit bir örnek verecek olursak . 2 adet internet bağlantımızdan 1. numaralı hattımızın voice 2 numaralı hattımızın ise http için kullanılması 1 nolu hat üzerinden kesintisiz ses görüşmesi yapmamızı sağlar.  elbetteki ses trafiği oluşmadığı durumda 1 nolu hattımız atıl durumda kalacak bu sistemle yeterli bir dengeleme sağlanamayacaktır.

Bu sorunları halletmek için her sistem kendi içerisinde çözümler barındırmaktadır. Uygulama seviyesinde örnekler konunun daha iyi anlaşılması için yeterli olacaktır.

FreeBSD ‘de free benzeri ram görüntülemek.

19 December, 2009 (21:05) | ipucu | By: alper

Özellikle linux’an daha sonra freebsd kullanımına geçenlerin en çok istedikleri kolaylıklardan bir tanesi çok kullanılan boşta olan veya kullanımdaki ram i gösteren “free” komutudur. freebsd bu şekilde bir komut içermesede free benzeri bir çıktı almak oldukça kolaydır.

 cd /usr/ports/sysutils/freecolor/
 make install clean
echo “/usr/local/bin/freecolor -mto” > /usr/local/bin/free
chmod a+x  /usr/local/bin/free
[root@ev ~]# free
                        total       used       free     shared    buffers     cached
Mem:            975         274          700          0          0          0
Swap:           3998          0          3998
Total:           877 =                (     274 (used)          +      603 (free))
[root@ev ~]#

FreeBSD Konsolda Bantgenişliği kullanımını görüntülemek

18 December, 2009 (17:27) | ipucu | By: alper

FreeBSD üzerinde çalışan ineterface’lerin ( ethernet, ppp vb ) anlık bantgenişliği kullanımlarını (  systat -ifstat 1 ) komutu ile görüntüleyebilirsiniz.Aşağıda örnek bir çıktı görünmektedir :

Ornek

Linux Sistemlerin Likewise İle Windows Active Directory Entegrasyonu

14 October, 2009 (08:31) | Linux | By: alper

Günümüzde artan Enterprise yönetilebilirlik ihtiyacı ile beraber hemen hemen her şirkette  LDAP sistemleri yaygın olarak kullanılmaya başlandı, Özellikle Windows 2000 , 2003 , 2008 Active directory sistemlerine sıkça rastlamaktayız. Linux Sistemlerimizi genellikle aşağıdaki sebeplerden dolayı AD ” Active Directory” Domain e dahil etmek zorunda kalıyoruz.

  1. Kullanıcıların geçerli kullanıcı ve şifrelerini kullanabilmeleri.
  2. Network ve Sistem kaynaklarına ulaşabilmek
  3. Linux Server üzerinde bulunan bazı uygulamaların AD entegrasyonu.

Likewise Open bu konuda oldukça kolay bir çözüm üretiyor Samba ve winbind çözümleri kadar seçenekler sunmasada hızlı ve kolay çözüm üretmek için ideal. Linux dağıtımların bir çoğunda paket hazır olarak geliyor paket yöneticinizi kullanarak deponuzdan bu paketi öncelikle kurmanız gerekiyor. ( Suse ve Redhat default olarak LDAP auth desteklemektedirler. Elimde  hazır. bulunan linux dağıtımı Ubuntu olduğu için örnekleri onunla vereceğim.) likewise ile grup gibi bir çok özelliği kullanmak için enterprise sürümümü kullanmalısınız.

  • Likewise-open Kurulumu

alper@linux:~$ sudo apt-get install likewise-open

Kerberos Server için sisteminiz soru soracak enter e basıp geçebilirsiniz.

  • Domain e dahil olma

sudo domainjoin-cli join example.local Administrator

example.local = active directory domain’i Fully Qualified Domain Name (FQDN)

Administrator = Active directory üzerinde bilgisayarı domain e dahil etme yetkisine sahip bir kullanıcı.

not : domain ismini çözmek için dns adresleriniz doğru olduğundan ( AD DNS server adresi ) emin olunuz. IP Adres yapılandırmasını şayet desktop tabanlı bir proğram ile yapıyorsanız değiştirin. network e bağlanmadan LDAP user sorgulaması yapamayacağınızı gözardı etmeyiniz.

NOT  : Ubuntu default “/etc/nsswitch.conf” dosyası hatalı dosyayı açarak “hosts” satırını “hosts:          hosts dns files” şeklinde düzeltmeniz gerekiyor aksi takdirde domain’i bulamayacaktır. ( Selimcan Dalgıç‘a teşekkürler )

Domain’e dahil olduğunuzda likewise-open “SUCCESS” şeklinde bir mesaj dönecektir. Yeniden başlatmadan kullanıcı adı ile Desktop login olamayacaktır.

  • Kontrolü

sudo update-rc.d likewise-open defaults

root@ykubuntu:/home/alper# /etc/init.d/likewise-open start
* Starting the Likewise-open auth daemon                                                                                                             [ OK ]
root@ykubuntu:/home/alper#

“ssh ‘example\user’@localhost”  Komutu nu vererek ( çalışıyorsa ) kendi makinanıza example domaindeki kullanici ismi ile login olmayı deniyoruz ( Kendi kullanici adi ve şifrenizi kullanınız )
( root değilseniz “sudo” unutmayın )

  • Domain’den çıkma

Herhangi bir sebepden dahil ettiğiniz makinanızı domain den çıkarmak için :

sudo domainjoin-cli leave

Komutunu kullanabilirsiniz.

iptables -7- Targets

19 September, 2009 (23:16) | iptables | By: alper

  • Daha önce iptables “targets”i tanımlarken; bir iptables kuralında söz konusu paket için belirli Match şartları mevcutsa ( belirli bir ip den gelen gibi ), o paket ile ne yapacağımızı belirtebilmemiz için kullanılır ve örneğin başka bir “chain”e yönlendirmek veya nat yapmak gibi diye ifade etmiştim. Iptables ile kullanabileceğimiz “target”lere göz atalım.

Jumps

Jumps ( Sıçramalar), kullanım şekli targets ile aynı olmakla beraber aynı tablo içerisinde başka bir “chain”e (zincire) sıçramak amacı ile kullanılır. “Jump”ın kullanılabilmesi için sıçranacak zincirin önceden oluşturulmuş olması zorunludur. Hemen bir jump örneği yapalım.

bash-3.2#iptables -N  tcp_packets
bash-3.2#

tcp_packects isminde yeni bir zincir oluşturduk.

bash-3.2# iptables -A INPUT -p tcp -j tcp_packets
bash-3.2#

Gelen tcp paketlerimizi “tcp_packets” zincirine yönlendirdik, yani jump yaptık. Sıçranan zincir içerisindeki kurallar tamamlanır tamamlanmaz, jump yaptığımız kuraldan sonraki kurala geri dönülür.

chains

Sanırım yukarıdaki resim bu durumu gayet net açıklıyor.

Targets ile bir pakete ne yapılacağını söylemiş oluyoruz.
Iptables, bir çok target yani paketle ne yapılacağı konusunda bir çok seçim sunar. Bunlardan bazıları; örneğin DROP ACCEPT gibi targetler bir pakete uygulandığında, paket o chain için başka hiç bir rule altında işlem görmez. Log gibi “target”ler ise paketin aynı chain içerisinde işlem görmeye devam etmesine mani değildir.

Accept Target

[root@linux ~]# iptables -A INPUT -j ACCEPT
[root@linux ~]#

İlgili paketin iptables üzerinden geçmesine izin verir. Yukarıdaki örnekte gelen tüm paketleri kabul ettik.

Drop Target

[root@linux ~]# iptables -A INPUT -p udp -j DROP
[root@linux ~]#

Paketi basitçe yok etmek için kullanılır. Söz konusu pakete herhangi bir işlem yapılmaz. Söz konusu kurala geldiğinde paket yok olur.
Örneğimizde gelen UDP paketlerini yok ettik ( engelledik , düşürdük )

Reject Target

1- –reject

[root@linux ~]# iptables -A FORWARD -p TCP --dport 22 -j REJECT
[root@linux ~]#

Reject Target, Drop ile aynı görevi yapmakla beraber, bunun yanında istemciye paketin reddedildiğine dair mesaj döndürür.

2 –reject-with

[root@linux ~]#iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
[root@linux ~]#

–reject-with opsiyonu bize hangi sebepten paketin geri çevirildiği konusunda seçim yapma hakkı tanır.
Desteklenen reject tipleri: icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited ve
icmp-host-prohibited.
–rejetct-with opsiyonu belirtilmez ise “port-unreachable to the host” default opsiyon olarak döner.

Classify Target

[root@linux ~]#iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j CLASSIFY --set-class 20:10
[root@linux ~]#

Bu örnek:
tc, qdisc ile kullanıldığında ( Linux QOS ) tc filter yerine iptables ile paketleri sınıflandırarak “class”lara yönlendirmek için kullanılır. –set-class opsiyonu ile birlikte kullanılır.
Örneğin burada, 20 nolu major “class”ı 10 nolu minor “class”a yönlendirdik.
linux altında qos konusuna yabancı olmayan arkadaşlar için son derece anlaşılır olduğunu düşünüyorum.

Clusterip Target

Clusterip target bize, iptables ile basit bir cluster kurmamızı sağlar. Söz konusu cluster son derece basit olup herhangi bir standart cluster opsiyonu sağlamamaktadır.
Bir çok durumda birden fazla server üzerinde yük paylaşımı için kullanılabilir. Clusterip target “ipt_clusterip” modülünü kullanır.
“/proc/net/ipt_CLUSTERIP/
” dizininden ilgili dosyalara ulaşabilirsiniz. Cluster için oluşturulan 1 adet ip adresi ve mac adresi, cluster bilgisayarlar tarafından paylaşılır.
mac adres, multicast mac olmak zorundadır.
01:00:5e: ” ile başlamalıdır.
İlgili hostlar tek bir ip ve mac adresini paylaşarak Round Robbin Hash algoritması ile cevap verirler.

iptabls cluster

Yukarıdaki yapıyı kurmak için :

[root@linux ~]# iptables -A INPUT -i eth0 -p tcp -d 192.168.0.5 --dport 80 -j CLUSTERIP --new --hashmode sourceip --clustermac 01:00:5e:00:00:20 --total-nodes 2 --local-node 1
[root@linux ~]#

1- –new

Yeni bir CLUSTERIP girdisi yaratmak için kullanılır.

2- –hashmode

3 çeşit hashmode destekler.
Bunlar :

  • sourceip
  • sourceip-sourceport
  • sourceip-sourceport-destport

Kısaca sourceip = kaynak ip’den gelen tüm istekler aynı “server”e gider, sourceip-sourceport aynı kaynak ip ve kaynak portundan çıkan paketler aynı “server”a gider,
sourceip-sourceport-destport = kaynak ve hedef portları aynı olanlar aynı “server”e gider.
Clusterip target’i, kullanmak istediğiniz hizmet tipine göre seçilmelidir.

3- –clustermac

Cluster için MAC adresi, tüm cluster bilgisayarları tarafından paylaşılan Multicast MAC adresdir ve “01:00:5e” ile başlamalıdır. Multicast mac kullanılmazsa bağlı olduğunuz switch veya router ile problem yaşamanız olasıdır.

4- –total-nodes

Cluster yapınızda kaç adet host’un olduğunu belirtir. Yukarıdaki örnekte 2 adet server için “2″ girdik.

5- –local-node

Kuralın girildiği Server’in cluster yapısında kaç numaralı server olduğunu belirtmek için kullanılır. gelen bağlantılar Round-Robbin ile dağıtılırken bu sıra göz önüne alınır.

6- –hash-init

Rastgele başlangıç noktasını belirler.

  • Serverlerin bağlı olduğu switch veya router RFC 1812 ile belirtilen standartları karşılamalıdır.

Mark Target

Mark Target, iproute2 paketi ve iptables kuralları ile haberleşmek için kullanılır “4294967296″ adet mark yapılabilir. Sadece mangle table’da kullanımı mümkündür. Dikkat edilecek nokta söz konusu işaretlerin ip header’da herhangi bir değişiklik yapmaması yani, söz konusu işaretlenmiş paketler dışardaki bir host tarafından anlaşılamazlar. söz konusu mark kernel tarafından izlenir.

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2  --set-mark

Mark numarası belirtmek için kullanılır. örneğimizde 22 nolu tcp portuna giden tüm paketleri 2 ile işaretledik. daha sonra iproute2 ile bu paketleri farklı bir routing e yönlendirmek veya, QOS uygulamak mümkündür. ( tc filters ile de yapılabilir tamamen sizin dizaynınızla ilgili bir tercih )

Connmark Target

Connmark target, Mark target ile aynı işi yapmakla beraber bir paketi değil komple bir bağlantıyı işaretlemek için kullanılır. ipconntrack modülünü enable eder ( CPU ve RAM hesaplamalarını göz ardı etmeyiniz )

1- –set-mark , –set-xmark

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j CONNMARK --set-mark 4
[root@linux ~]#

Paketi “4″ olarak işaretledik. Bağlantıyı belirten mark numarası ile işaretlemeye yarar.

2- –save-mark

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j CONNMARK --save-mark
[root@linux ~]#

Paketin içerdiği mark’i connmark’a kayıt eder. yani /proc/net/ip_conntrack içerisine.

3- –restore-mark

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j CONNMARK --restore-mark
[root@linux ~]#

ip_conntrack içerisindeki mark bilgisini pakete işler. Sadece mangle table içerisinde kullanılabilir.

4- –mask

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j CONNMARK --restore-mark --mask 12
[root@linux ~]#

Mark ile işaretlenmiş paketin, ikilik sayı sistemine çevirildiğinde, bit mask belirterek birden çok mark değerini aynı anda göstermek için kullanılır. –restore-mark ve –save-mark ile beraber kullanılabilir. yukarıdaki 12 mask değeri binary 1100 eşit olduğundan “1″ değerlerinin eşit olduğu tüm mark değerlerini kapsar. örneğin :1111,1100,1101 değerlerinin hepsi 1100 mask’ina uymaktadır.

Connsecmark Target

–save

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j CONNSECMARK --save
[root@linux ~]#

SELinux tarafından işaretlenmiş paket bilgilerini conntrack içerisine işler.

–restore

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j CONNSECMARK --restore
[root@linux ~]#

Conntrack girdisinde SELinux için işareti işlemiş fakat paket içeriğinde bulunmuyan güvenlik bilgisini pakete işler.

DNAT target

DNAT Target paketin hedef ip adresini değiştirmek için kullanılır ( Destination Network Address Transilation ) . en basit kullanım örneği localde bulunan 10.1.2.1 ip adresinde çalışan web server’imize internetten gelen http paketlerini yönlendirmek için kullanılabilir.

[root@linux ~]#iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10
[root@linux ~]#

–to-destination paket DNAT yapıldığında hedef ip adresinin ne olarak değiştirileceğini belirtmek için kullanılır. yukarıdaki örnekte olduğu gibi “-” ile ip adres grubu belirterek load balance sağlanabilir.

–random

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10 --random
[root@linux ~]#

–random routing tableda source port un randomize edilmesi için kullanılır. DNAT target sadece nat ve PREROUTING de çalışır.

DSCP Target

DSCP ( RFC 2638 Differentiated Services Code Point ), alanındaki bilgileri değiştirmek için kullanılır.

1- –set-dscp

[root@linux ~]# iptables -t mangle -A FORWARD -p tcp --dport 80 -j DSCP --set-dscp 1
[root@linux ~]#

Decimal veya hexedecimal olarak DSCP değerini atamaya yarar, Hexedecimal olarak atamak için değerin başına “0x” koymalıyız.

2- –set-dscp-class

[root@linux ~]# iptables -t mangle -A FORWARD -p tcp --dport 80 -j DSCP --set-dscp-class EF
[root@linux ~]#

DSCP sınıfını belirtmek için kullanılır. değer olarak tüm DSCP snıfları kullanılabilir ( BE,EF,AFxx,CSx ).

ECN Target

–ecn-tcp-remove

[root@linux ~]# iptables -t mangle -A FORWARD -p tcp --dport 80 -j ECN --ecn-tcp-remove
[root@linux ~]#

Paketlerden ECN bilgilerini çıkarmaya yarar. İnternet üzerinde bazı router’lar ECN field i dolu olan paketleri route etmezler bunun için kullanılır. sadece “-p tcp” ile beraber çalışır.

LOG Target & ULOG Target

LOG ve ULOG target’ler iptables ile log tutmak için kullanılan target’lerdir. düzgün yapılandırılmış bir firewall da log tutmak son derece önemli olduğu ve bu Target’ler oldukça geniş yer tuttuğu için ayrı bir yazımda ayrıntılı olarak işleyeceğim.

Masquerade Target

Temel olarak SNAT ( Source Network Adress Transilation ) ile aynı işi yapar. nat table içerisinde çalışır. inertenet bağlantısının basitçe paylaştırmak için idealdir. ADSl, Kablonet, Dialup gibi bağlantıları Masquerade ile paylaştırabilirsiniz.

[root@linux ~]# iptables -t nat -A POSTROUTING -s 192.168.0.1/24 -o eth0 -j MASQUERADE
[root@linux ~]#

Yukarıdaki örnek 192.168.0.1/24 lokal networkümüzdeki istemcilere eth0 üzerinden sağlanan interneti SNAT yaparak paylaştırır. interface ismi verip ip adresi belirtilmediği için ppp gibi dinamik ( değişken ) ip adreslerine sahip bağlantıları paylaştırmak için uygundur.

–to-port

[root@linux ~]# iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
[root@linux ~]#

TCP ve UDP protokolleri ile beraber kullanıldığında, Masqerade yapılmış paketlerin, giden interface üzerinde kaynak portlarının aralığını belirtmek için kullanılır. port aralığı hariç tek bir port da kullanılması mümkündür.

MIRROR Target

Mirror target gelen bir paketi aynen gönderene geri göndermek için kullanılır ( ayna ). Kesinlikle çok büyük DDOS açıkları veren bir targettir. Özellikle ADSL gibi upload inizin download inizdan düşük olduğu yapılarda kesinlikle kullanmayın çok kolay abuse edilebilir.

NETMAP Target

Netmap target “one to one” maping dediğimiz 1 e 1 NAT Maping olayını gerçekleştir. Basitçe örneklendirecek olursak , 192.168.0.1/255.255.255.0 local ip adreslerimizin hepsine 1 ip adresimiz olacak kadar internet ip adresimiz var. her birini tek tek NAT yapmak yerine Netmap target ile adresleyebiliriz. Sadece nat table içerisinde çalışır.

–to

[root@linux ~]# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j NETMAP --to 10.5.6.0/24
[root@linux ~]#

192.168.1.0/24 networkünden gelen istekleri 10.5.6.0/24 network’üne map yaptık.

NFQUEUE Target

NFQUEUE target, QUEUE target in yerini almıştır. Amacı belirtilen paketlerin SNORT gibi IDS sistemleri veya network yönetim proğramları için paketlerin kuyruklanmasıdır.

–queue-num

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j NFQUEUE --queue-num 30
[root@linux ~]#

–queue-num nfqueue için kuyruk numarası atamamıza yarar bu değer girilmezse default queue numarası 0 dir. queue-num 16 bittir yani 0 dan 65535 e kadar kuyruk atanabilir.

NOTRACK Target

[root@linux ~]# iptables -t raw -A PREROUTING -i eth0 -p tcp --dport 80 -j NOTRACK
[root@linux ~]#

NOTRACK Target, ip conntrack tarafından takip edilmemesini istediğimiz paketleri işaretlemek için kullanılır. Sadece RAW table içerisinde geçerlidir.

Rateest Target

Rateest target tek başına anlaşılması güç olduğu için rateest match ile beraber ayrı bir yazımda anlatacağım.

REDIRECT Target

Redirect target, gelen bir paketin hedef adresini gelen interface’in ip adresine yönlendirir. kaynak adresi host’un kendisi ise 127.0.0.1 e yönlendirilir. örneğin her herhangi bir ip adresinin 80 nolu portuna giden istekler 3128 e yönlendirilerek transparent squid çalıştırılması gibi. Redirect target sadece nat table içerisinde PREROUTING ve OUTPUT zincirlerinde çalışır.

–to-ports

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
[root@linux ~]#

–to-ports hedef port’u belirtmek için kullanılır. örneğimizde 8080

Return Target

Return target, bir paketin herhangi bir chain içerisinde gezinmesini sonlandırmak için kullanılır. örneğin INPUT chain içerisinde paket “-j RETURN” target e rastlarsa başka hiç bir rule’a uğramayarak default policy e gider.

[root@linux ~]# iptables -A FORWARD -p TCP --dport 22 -j RETURN
[root@linux ~]#

Örneğimizde TCP 22 nolu port ‘a giden paketlerimiz INPUT chain içerisinde başka hiç bir kurala uğramaz.

SNAT Target

SNAT Target paketin ip header’inda kaynak ip adresinin değiştirilmesi için kullanılır. ( Source Network Address Transilation ), kısacası interneti paylaştırmak için. Local networklerimizde kullandığımız IANA ( 192.168.0.0,10.0.0.0,172.16.0.0 ) ip adreslerini gerçek ip adresleri ile değiştirerek internete çıkmamızı sağlar. dikkat edilmesi gerekn nokta SNAT target in statik ip ile çalışıyor olması, evimizde bulunan ADSL gibi hatların paylaşımı için MASQUAREDE target kullanılmalıdır.

–to-source

[root@linux ~]#  iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 10.70.20.197:1024-32000
[root@linux ~]#

Örneğimizde “eth0″ interface inden gelen tcp paketlerini “10.70.20.197″ nolu ip adresini alarak kaynak portları “1024-32000″ olacak şekilde çıkmasını sağladık. dikkat edilmesi gereken nokta SNAT paketin gideceği yer konusunda herhangi bir işlem yapmaz sadece gönderen ” kaynak” kısmını değiştirir. birden fazla ip adresi için loadbalance yapmak istersek ip adreslerini “-” ile ayırarak gösterebiliriz örneğin “10.70.20.1-10.70.20.15″ 1 ila 15 arasındaki ipler arasında kaynak adresi belirtmesini sağlar. SNAT sadece nat ve POSTRUTING de çalışır.

Same Target

Same target aynı SNAT target gibi çalışmakla beraber temel farkı birden çok ip grubu belirlendiğinde istemciyi her zaman aynı source ip ile çıkarmaya çalışır. örneğin 192.168.0.1-192.168.0.50 ip grubunu belirttiğimizde 10.70.20.2 nolu ip adresine sahip istemci ilk çıktığında 192.168.0.7 ip adresine denk gelmesi durumunda Same target her seferinde aynı istemciyi 192.168.0.7 adresinden çıkarmaya çalışacaktır.

Dnat Target’in –persistent parametresi Same Target ‘in yerini almıştır.

Secmark Target

Secmark target SELinux için paketleri işaretlemek için kullanılır. Konumuz SELinux olmadığı için ayrıntılılarına girmeyeceğim.

iptables -t mangle -A PREROUTING -p tcp –dport 80 -j SECMARK –selctx httpcontext

TCPMSS Target

TCPMSS Target paketlrin MSS ( Maksimum Segment Size ) değerlerini değiştirmek için kullanılır. Normal şatlar altında bu değer MTU ( Maksimum Transmission Unit ) -40 a eşittir. Bazı internet Servis sağlayıcıları veya sistem yöneticileri ICMP fregmanted paketeri drop ‘laya bilir ler . budurum aldında çok ilginç şartlar meydana gelebilir. örneğin , Mail alış verişinde hiç bir problem olmamasına rağmen çok büyük dosya gönderilen mail lerin gitmemesi, ssh ile sorunsuz bağlantı sağlandığı halde sftp ile büyük dosya transferlerinin yapılamaması gibi. Kısacası herşey in çalıştyığı ama büyük paketlerin iletilemediği bir durum meydana gelir. TCPMSS Target bize bunları engelleyebilme şansı verir.

1- –set-mss

[root@linux ~]# iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --set-mss 1460
[root@linux ~]#

Giden paketlerin MSS değerlerini değiştirmek için kullanılır. örneğimizde eth0 üzerinden giden paketlerin, MSS değerlerini 140 olarak değiştirdik. MSS değeri SYN paketlerinde doğru olarak yapılandırılmalıdırlar.

2- –clamp-mss-to-pmtu

[root@linux ~]# iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu
[root@linux ~]#

Bu paramtre MSS değerini otamatik olarak default değerine set ederki bunun yapılandıılmasına normal şartlar altında gerek yoktur. MSS değeri default olarak PMTU ( Path Maksimum Transmission Unit ) eksi 40 dir. Bir çok uygulama için kabul edilebilir bir değerdir.

TPROXY Target

TPROXY Target transparet proxy uygulamaları için kullanılır. genellikle linux iptables la beraber redirect target kullanılır ama tproxy target in ana farkı ip header’da herhangi bir değişiklik yapmadan bunu yapabilmesidir.http isteklerinde genel olarak redirect ile bir sorun olmasada örneğin UDP için transparent proxy uygulamalarında hedef ip adresi kaybolduğu için redirect target in kullanılması imkansız hale gelmektedir. TPROXY Target in kullanılabimesi için proxy nin bunu desteklemesi gerekmektedir. Squid ile kullanımı için squid web sayfasında ayrıntılı bir döküman mevcutur. TPROXY target aynı zamanda paketn mark deerini değiştirerek advanced routing ile kullanımına imkan sağlar.

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129
[root@linux ~]#

TRACE Target

Trace target kısaca bir paketi ip tables zincirleri içerisinde gezerken takip etmekamacı ile kullanılır. Sadece raw table içerisinde kullanılabilir. Trace target ile işaretlenmiş paket herhangi bir iptables kuralına denk geldiğinde ( hit ) , kernel tarafından log lanır.

[root@linux ~]# iptables -t raw -A PREROUTING -j TRACE
[root@linux ~]#

Örneğimizde tüm paketleri trace ile işaretledik.

TOS Target

TOS nedemek daha önce TC Fifo yazımda değinmiştim. TOS Tagret ile giden paketlerin TOS field lerini ( Değerlerini ) değiştirebiliriz. TOS Target sadece “mangle” table içerisinde kullanılabilir. iptables version 1.2.2 ve daha önceki versionlarında TOS Target sorunludur.

[root@linux ~]# iptables -t mangle -A PREROUTING -p TCP --dport 80 -j TOS --set-tos 0x10
[root@linux ~]#

- –set-tos

TOS değerini belirtmek için kullanılır. yukarıdaki örneğiiz de TOS değerini http 80 nolu port için 0×10 yani Decimal 2 değeri atadık “Maximize reliability Maksimum kararlılık(mr)”

TTL Target

TTL Target ip header içerisinde TTL değerini ( Time TO Live ) değiştirmek için kullanılır. TTL kavramına daha önce Iptables Tables & Chains yazımda değinmiştim .

1- –ttl-set

[root@linux ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
[root@linux ~]#

TTL değerini değiştirmek için kullanılır. Linux default dışarıya giden bağlantılar için TTL değeri 64 dür. Herhangi bir sebepden dolayı bu değerin değiştirilmesi gerekirse –ttl-set parametresi ile yeniden düzenlenebilir.

2- –ttl-dec

[root@linux ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 1
[root@linux ~]#

TTL değerini olan değerden düşürmek için kullanılır. yukarıdaki örnekde TTL değeri 1 düşürülmüştür.

3- –ttl-inc

[root@linux ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
[root@linux ~]#

TTL değerini arttırmak için kullanılır. örneğimizde TTL değeri 1 arttırılmıştır.