HAProxy ve Nginx x-forwarded-for (Client ip lerin loglanmasını sağlamak)

HAProxy için herbir backend yapılandırmanızda aşağıdaki satır bulunmalıdır.

option forwardfor

Nginx için “/etc/nginx/nginx.conf” yapılandırma dosyasını aşağıdaki gibi yapılandırmalısınız.

log_format main ‘$http_x_forwarded_for ($remote_addr) – $remote_user [$time_local] ‘
‘”$request” $status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent”‘ ;

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;

Ardından servisi yeniden başlatın.

> systemctl restart nginx.service (service nginx restart ya da /etc/init.d/nginx restart)

Daha sonra aşağıdaki komut ile son durumu gözden geçirebilirsiniz.

> tail -f /var/log/nginx/access.log

HAProxy(LoadBalancer) ve Keepalived(Cluster) Kurulum ve Yapılandırması

HAProxy, yüksek erişilebilirliğe(high availability) sahip yük dengeleyici(load balancing) ile TCP ve HTTP tabanlı uygulamalar için proxy sunucusu hizmeti veren açık kaynak kodlu bir yazılımdır.

Keepalived, IP failover(yük devretme) yeteneğini ikiden daha fazla sunucu için sağlayacak yeteneğe sahip açık kaynak kodlu bir yazılımdır. Keepalived kendi arasında Multicast haberleşme tekniğini kullanmaktadır.

Biz yapımızda HAProxy’i load balancer için, Keepalived’i de IP devretmek yani HAProxy yapımızı Cluster hale getirmek için kullanacağız.

Senaryomuzda 3 adet sunucu bulunmaktadır. Bu 3 sunucuya HAProxy kurarak load balancer hale getireceğiz. Ardından Keepalived servisini kurarak sunuculardan biri kapandığında IP failover yaparak kesinti olmadan diğer sunucuya geçerek load balancer servisimizin çalışmasını sağlıyacağız.

Bunun için 4 adet IP kullanacağız(ip ler tamamen atmasyon).

1. Sunucu : 10.10.5.13

2. Sunucu : 10.10.5.14

3. Sunucu : 10.10.5.15

4. Keepalived Virtual Ip : 10.10.5.5

Şimdi her 3 sunucuya HAProxy ve Keepalived servisini aşağıdaki gibi kuralım.

> sudo apt install haproxy -y

> sudo apt install keepalived -y

NoT1 : Sunucularda “net.ipv4.ip_nonlocal_bind=1” olması gerekiyor. Yoksa HAProxy için kullanılacak yapılandırma üzerinde aynı anda aynı ip yi barındıramayacağı için bind hatası verecek ve servis çalışmayacaktır. Bunun için aşağıdaki yolu izlemeniz gerekiyor.

İlk olarak “vi /etc/sysctl.conf” dosyasının için edit edin ve aşağıdaki parametreyi yapıştırıp kaydedip çıkın.

net.ipv4.ip_nonlocal_bind=1

Daha sonra aşağıdaki komutu çalıştırın.

> sysctl -p

Not2: 443 SSL kulanacaksanız “/etc/ssl/private/” dizini içinde “haproxy.pem” adından SSL’lerinizin Bundle(*.crt,*.ca,*.key) hali bulunması gerekiyor.

Şimdi Örnek olarak aşağıda HAPoxy yapılandırmasına bakalım. Yapınızda her HAProxy için aynı yapılandırmayı kullanacaksınız.

Bunun için “/etc/haproxy/haproxy.cfg” dosyasını edit edeceksiniz.

> vi /etc/haproxy/haproxy.cfg

 

#Aşağıda default değerlerin haricinde değerlerde mevcuttur.

global

log /dev/log local0

log /dev/log local1 notice

chroot /var/lib/haproxy

stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners

stats timeout 30s

user haproxy

group haproxy

daemon

maxconn 1000000

# Default SSL material locations

ca-base /etc/ssl/certs

crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabled listening sockets.

# For more information, see ciphers(1SSL). This list is from:

# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/

# An alternative list with additional directives can be obtained from

# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy

ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS

ssl-default-bind-options no-sslv3

nbproc 1

nbthread 8

tune.maxrewrite 16384
tune.bufsize 32768

 

defaults

log global

mode http

option httplog

option httpclose

option dontlognull

maxconn 1000000

timeout connect 3000000

timeout client 6600000

timeout server 6600000

errorfile 400 /etc/haproxy/errors/400.http

errorfile 403 /etc/haproxy/errors/403.http

errorfile 408 /etc/haproxy/errors/408.http

errorfile 500 /etc/haproxy/errors/500.http

errorfile 502 /etc/haproxy/errors/502.http

 

#HAProxy için Dashboard yapılandırma kısmı

listen stats

bind panel.fatlan.com:8989

mode http

stats enable

stats uri /stats

# stats hide-version

stats realm HAProxy\ Statistics

stats auth admin:admin

 

Aşağıdaki yapılandırmada link’in içinde herhangi bir yerde “rest” kelimesi geçerse keypanelfatlan-backend443 bloğu çalışacak, haricinde tüm istekler panelfatlan-backend bloğunda çalışacak.

 

#80 portunu 443 portuna yönlendirme kısmı

frontend SafirFrontend80

bind panel.fatlan.com:80

mode http

redirect scheme https if !{ ssl_fc }

#443 portu ayar kısmı, SSL offloading burda yapılandırılıyor

frontend PanelFatlan443

bind panel.fatlan.com:443 ssl crt /etc/ssl/private/haproxy.pem ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

option httplog

option http-keep-alive

option forwardfor except 127.0.0.0/8

#option http-server-close

reqadd X-Forwarded-Proto:\ https

mode http

#ACL örnek yapilandirilmasi(proxypass) linkte herhangi biryerde rest kelimesi geçerse yönlendir

acl keypanelfatlan443 path_beg /rest

use_backend keypanelfatlan-backend443 if keypanelfatlan443

default_backend panelfatlan-backend

 

#Yönlendirilen kısım, içerde sunucular 80 haberleştirildiği için 80 port yapılandırıldı

backend panelfatlan-backend

mode http

balance roundrobin

stick store-request src

stick-table type ip size 256k expire 30m

option forwardfor

option httplog

option httpchk HEAD /

server frontend_01 10.10.37.12:80 check port 80 inter 1000 rise 2 fall 3

server frontend_02 10.10.37.13:80 check port 80 inter 1000 rise 2 fall 3

 

#ACL gelen, rest yönlendirilen kısım

backend keypanelfatlan-backend443

mode http

balance roundrobin

stick store-request src

stick-table type ip size 256k expire 30m

option forwardfor

option httplog

option httpchk OPTIONS /login HTTP/1.0

http-check expect status 200

reqrep ^([^\ :]*)\ /rest[/]?(.*) \1\ //\2

server restci_01 10.10.37.34:80 check inter 12000 rise 3 fall 3

server restci_02 10.10.37.35:80 check inter 12000 rise 3 fall 3

 

Harici örnekler aşağıdaki gibi de yapılandırılabilir.

#5000 portuna örnek

frontend PanelStone5000

bind panel.fatlan.com:5000

option httplog

option forwardfor except 127.0.0.0/8

#option http-server-close

reqadd X-Forwarded-Proto:\ https

mode http

default_backend panelstone-backend5000

 

#Yönlendirilen kısım

backend panelstone-backend5000

mode http

balance roundrobin

stick store-request src

stick-table type ip size 256k expire 30m

option forwardfor

option httplog

option httpchk HEAD /

server ftstone_01 10.10.37.43:5000 check port 5000 inter 12000 rise 3 fall 3

server ftstone_02 10.10.37.44:5000 check port 5000 inter 12000 rise 3 fall 3

 

#3306 mysql örnek

frontend FatlanMysql

bind panel.fatlan.com:3306

mode tcp

default_backend fatlanmysql-backend3306

 

#Yönlendirilen kısım

backend fatlanmysql-backend3306

mode tcp

server mysql_01 10.10.37.60:3306 check

server mysql_02 10.10.37.61:3306 check backup

server mysql_03 10.10.37.62:3306 check backup

 

Yukarıda örnek HAProxy yapılandırmalarından bahsettim, ben kendi yapılandırmamı yaptım ve 3 sunucuda aynı yapılandırmaları yapıştırdım.

Şimdi Keepalived yapılandrımasını yapalım. Keepalived için 3 sunucuda da kısmi olarak farklı parametrik ayarlar mecvut olacak. Bunun için “/etc/keepalived/keepalived.conf” dosyasını oluşturup, yapılandıracağız. Bu arada “priority” yüksek olan önceliklidir.

1. Sunucu(HAProxy+Keepalived)

vrrp_sync_group haproxy {

group {

VI_01

}

}

vrrp_script haproxy_check_script {

script “kill -0 `cat /var/run/haproxy.pid`”

interval 5 # checking every 5 seconds (default: 5 seconds)

fall 3 # require 3 failures for KO (default: 3)

rise 6 # require 6 successes for OK (default: 6)

}

#Virtual interface

vrrp_instance VI_01 {

state MASTER

interface ens3

virtual_router_id 61

priority 103

authentication {

auth_type PASS

auth_pass 123456

}

# Virtual ip address – floating ip

virtual_ipaddress {

10.10.5.5

}

track_script {

haproxy_check_script

}

}

 

2. Sunucu(HAProxy+Keepalived) #Sadece farkları yazıyorum.

state BACKUP

priority 102

 

3. Sunucu(HAProxy+Keepalived) #Sadece farkları yazıyorum.

state BACKUP

priority 101

 

Yapılandırmalar bu kadar, tüm suncularda HAProxy sorunsuz çalışır vaziyette olmalı aynı zaman keepalived servisi de. Sunucularda yada servislerde herhangi bir kesintide çalışan diğer sunucudan loadbalancer hizmet vermeye devam edecektir.

ÖNEMLİ

HAProxy ve Linux kernel yüksek yükler için ayarlama

1. sudo vi /etc/security/limits.conf

         * soft nofile 1000000

         * hard nofile 1000000

         root soft nofile 1000000

         root hard nofile 1000000

2. sudo vi /etc/default/haproxy

         ulimit 1000000

3. sudo vi /lib/systemd/system/haproxy.service

         LimitNOFILE=1000000

4. sudo vi /etc/sysctl.conf

        net.ipv4.ip_local_port_range=1024 65535

        net.ipv4.tcp_max_syn_backlog = 100000

        net.core.somaxconn = 100000

        net.core.netdev_max_backlog = 100000

5. sudo vi /etc/haproxy/haproxy.cfg

        global

         nbproc 1

         nbthread 8

         tune.maxrewrite 16384

         tune.bufsize 32768

         maxconn 1000000

         tune.ssl.cachesize 1000000

      defaults

        maxconn 1000000

 

Ardından reboot, eğer reboot hemen mümkün değilse

sudo systemctl daemon-reload

sudo systemctl restart haproxy.service

Kaynak : https://medium.com/@pawilon/tuning-your-linux-kernel-and-haproxy-instance-for-high-loads-1a2105ea553e

ZEN LOAD BALANCER SSL SERTİFİKA ve HTTPS(443) REQUEST FARM OLUŞTURMA – BÖLÜM 6

Loadbalancer arkasında birden fazla web sunucusu çalıştığını var sayalım ve bunların https(443) protokolü ile çalışmasını sağlayalım. Bunun için yük dengeleyici sunucumuza web server domainimiz için satın aldığımız sertifikayı yükleyeceğiz ardından https farm’ı oluşturacağız. Zaten önceki yazılarımızda farm oluşturmayı görmüştük, şimdi bir kaç yapılandırma ile https(443) olarak farm’ı yapılandıracağız.

İlk olarak Manage-Certificates sekmesine geliyoruz.

Ardından aşağıdaki gibi upload .pem(pem sertifikanın bundle edilmiş hali, yani o dosya içeriğinde domain sertifika cer’i, orta kök cer’i, kök sertifika cer’i nin belli hiyerarşide bulundurduğu hali) certificate kısmını tıklayıp, sektifikayı load balancer sunucusuna ekliyoruz.

Sertifikayı ekledikten sonra https farm oluşturma kısmına geçiyoruz. Manage-Farm sekmesine geçtikten sonra Add new Farm butonuna tıklıyoruz. Farm’a isim verip Save ve continue’yi tıklayıp devam ediyoruz.

Akabinde burada önemli kısımlar aşağıdaki gibi Farm-Listener HTTPS seçilecek, HTTPS Certificate kısmında yüklediğiniz sertifikayı seçin, Virtual IP kısmında İsteği alacak ip ve dinleyeceği port bilgisini https(443) girin.

Alt kısımda bir önemli bölüm daha olan HTTPS Backends seçeneğini aktif edip, farm oluşturmayı tamamlıyoruz.

ZEN LOAD BALANCER CLUSTER OLUŞTURMA – BÖLÜM 5

Bu bölümde servis kesintisi yaşamamak için kullanılan yöntem olarak istekleri karşılayıp yönlendiren Zen Load Balancer için de High Available yapacağız. Bu işlemi çok basit olarak Cluster yöntemi ile gerçekleştireceğiz.

Bunun için interface yapılandırması önemli. Şöyle ki, iki loadbalancer için yapılandırma yapacağız. Yani iki yük dengeleyici arasında kümeleme yapacağımız için,

Loadbalancer01;

eth0 10.10.10.100

eth0:cl 10.10.5

Loadbalancer02;

eth0 10.10.10.200

eth0:cl 10.10.10.5

Yukarıdaki yapılandırmada 100 ve 200 ip’leri sunuculara yönetim için atanmış olan direk erişim ipleridir, 5 nolu ip ise cluster için kullanılacak olan ip’dir. Bu durumda cluster yapılandırmamız 100’lü sunucuda erişim kesildiği zaman 200 lü sunucuya geçecektir. Bu geçiş 5 li ip tarafından sağlanacaktır. Yani 5 ip’li aktif kullanımda olacağı için 5’li ip 100 ip’li sunucu up ise onun üzerine geçecektir, 100 ip’li sunucu down olursa 5 ip si up olan 200 ip’li sunucuya geçecektir. Bu durumda servis 5 ip’si ile hizmet verdiğinden servis kesintisi yaşanmayacaktır.

Şimdi yapılandırmaya geçelim. Interface’leri yukardaki senaryoya göre yapılandırdıktan sonra,

Settings kısmından Cluster sekmesine geçin,

Aşağıdaki gibi Cluster Virtual IP 10.10.10.5 Local ve Remote Hostname root şifresini(RSA iletişimi için) ve IP bilgileri girip, “cluster type” olarak loadbalancer master and loadbalancer02 backup automatic failback seçip Save deyin, ardından Test Connection ile işlemleri kontrol edebilirsiniz.

 

Detaylı : Zen -> Zevenet

Zen Load Balancer Farm Oluşturma – Bölüm 4

Zen yönetim paneline herhangi bir tarayıcıdan login olduktan sonra Manage-Farms seçeneğini tıklayın.

znfrm1

Farm ismini belirledikten sonra Save & continue tıklayın.

znfrm2

Ardından request alacak interface, ip ve port bilgilerini yazdıktan sonra Save tıklayın.

znfrm3

Ardından aşağıdaki gibi Edit the http Farm seçeneği ile farm yapılandırması başlayacağız.

znfrm4

Farmın özet bilgisi aşağıdaki gibidir.

znfrm5

Hemen altında işte bu kısımda Add Real Server diyerek arka planda gidecek(çalışacak) sunucuların bilgilerini giriyoruz.

znfrm6

Birinci sunucu bilgilerini girip Save Real Server diyerek işlemi kaydediyoruz.

znfrm7

İkinci sunucu bilgilerini de girip Save Real Server diyerek işlemi kaydediyoruz. Ve görüntü aşağıdaki gibidir. Ben arkada çalışacak iki sunucu belirledim. Biri IIS 1 diğeri IIS 2

znfrm8

Zen tarafında işlemleri tamamladık şimdi tarayıcıdan farm için belirlediğimiz ip yazarak işlemleri kontrol edelim. Arka tarafta istekleri IIS gönderiyor mu.? ve hangi IIS yönlendirdiğini görelim.

znfrm9

Zen Load Balancer Interfaces Ayarları – Bölüm 3

Herhangi bir tarayıcı yardımı ile yönetim paneline bağlandıktan sonra Settings-Interfaces kısmından Zenload Balancer için ekli olan interface’ler için ip ayarları görebilir ve yapılandırabiliriz.

znint1

Aşağıda görüldüğü gibi kurulum aşamasında eth0 dış ip olarak yapılandırdım ve bunu ZenLoad Balancer yönetimi için kullanacağım. Şimdi farm için eth0:1 request’leri alacak bir sanal dış ip daha atayacağım, ardından eth1’i iç ip ile gene farm için içerdeki sunuculara ulaşması için yapılandıracağım.

znint2

İlk önce eth1’i aşağıda görüldüğü gibi edit network interface diyerek yapılandırıyorum,

znint3

Gerekli bilgileri girdikten sonra Save & Up! ile işlemleri kaydedip, sonlandırıyorum.

znint4

Şimdi yukarda da bahsettiğim gibi gelen istekleri alabilmesi için eth0 üzerinden sanal interface yapılandıralım eth0:1, add virtual network interface diyerek bu işlemi yapabiliriz.

znint5

Gerekli bilgileri girdikten sonra save virtual interface diyerek işlemleri kaydedip sonlandırabilirsiniz.

znint6

Ve tüm işlemlerin ardından durum aşağıdaki gibidir. İki interface biri iç biri dış, dış interface’de bir de sanal dış interface ve bir tane gateway mevcut. Tablo kafanızı karıştırmasın dış ip’ler aynı subnet’te olduğu için aynı gateway yazılabilir, aynı gateway üzerinden çıkacaktır. Ve üçüde Up durumdadır.

znint7

Zen Load Balancer Open VM Tools Kurulumu – Bölüm 2

Sisteme yetkili kullanıcı ile login olduktan sonra;

Herşeyden evvel sisteme aşağıdaki komut ile update çekin.

> apt-get update

Ardından Sources.list(/etc/apt/sources.list) dosyasına aşağıdaki kaynakların ekleyin.

> deb http://ftp.uk.debian.org/debian/ squeeze main

> deb http://ftp.uk.debian.org/debian/ squeeze main contrib

Daha sonra aşağıdaki komut ile Open Vm Tools kurulumunu yapın.

> apt-get install open-vm-tools

Daha sonra sistemi reboot edin.

> reboot

Zen Load Balancer İnterface(E1000’den VMXNET’ geçiş) Adapter değişimi

VM tools kurulumundan sonra makinayı kapatıp E1000 interface adapter’ı silin ve New diyerek VMXNET olarak yeniden network interface’yi ekleyin, ardından OK deyip çıkın, değişiklikler algılandıktan sonra makinayı çalıştırın ve kaldığınız yerden devam edebilirsiniz.

Zen Load Balancer Kurulumu – Bölüm 1

Load Balancer nedir = Kısaca işi, iki ya da daha fazla bilgisayar, işlemci, sabit disk ya da diğer kaynaklar arasında paylaştırma teknolojisidir. Daha fazla bilgi için linki ziyaret edebilirsiniz.

Zen Load Balancer Debian tabanlı bir uygulamadır. Ayrıntılar için resmi sitesini ziyaret edebilirsiniz. http://www.zenloadbalancer.com/

Ben aşağıdaki screenshot’tan da anlaşılacağı üzere sanal platformda çalıştıracağım için aşağıdaki gibi bir konfigürasyonda makine oluşturdum, iç ve dış interface(E1000 daha sonra VMXNET’e çekeceğim) olmak üzere ve iso’yu mount ettikten sonra kuruluma başlayabiliriz.

znk1

Kuruluma Install ile başlıyorum.

znk2

Dil seçiyorum.

znk3

Lokasyon bilgisini seçiyorum, dil EN lokasyon TR seçerseniz aşağıdaki gibi ikinci bir menü daha karşınıza getirecektir. Dile göre lokasyon bilgisi yok gibisinden, default değerlerden tekrar seçtirecektir.

znk4

znk5

Klavye seçim menüsü ile devam ediyoruz,

znk6

Network değerlerinin girildiği bölüm ile IP bilgisini yazdıktan sonra Continue ile devam ediyoruz.

znk7

Netmask,

znk8

Gateway,

znk9

DNS kısmı,

znk10

Hostname makineye verilecek isim kısmı ile Continue ile devam ediyoruz.

znk11

Varsa Domain name kısmı,

znk12

Root için password bilgisinin girildiği önemli bir menü, belirlediğiniz şifreyi girdikten sonra Continue ile devam ediyoruz.

znk13

Şifreyi tekrar girerek teyit işlemini yapıyoruz,

znk14

Disk yapılandırma menüleri gelecek, ben olduğu gibi default değerlerle ile LVM olarak yapılandırıyorum. Siz istediğiniz gibi partition‘lara bölerek EXT olarakta kurabilirsiniz.

znk15

znk16

znk17

LVM işlemleri diske yazdırmak için Yes ile devam ediyoruz.

znk18

Finish ile disk işlemleri sonlandırıp,

znk19

Yapılan tüm değişiklikleri diske Yes ile yazdırıyoruz.

znk20

Ve kurulum başladı.

znk21

Ardından Continue ile kurulumu tamamlayıp sunucuyu restart ediyoruz.

znk22

Ve konsol login ekranı…

znk23

Daha sonra Zen load Balancer panale bağlanmak için;

https://YönetimIPAdresi:444/

Defaultta gelen KullanıcıAdı=admin Şifre=admin

znk24

Daha sonra Yönetim IP’sinin dışında, Farm için request’leri alacak dış ip ve iç interface’yi yapılandırıp, farm ve cluster mevzularına bakacağız. Vmtool ve İnterface Adapter(VMXNET) olaylarına inceleyeceğiz.

http://www.zenloadbalancer.com/community/documentation/

http://www.zenloadbalancer.com/zlb-administration-guide-v304/#prettyPhoto