# Proxies

# SSL bumping ile Ubuntu 22.04 üzerinde Squid Server 5.7

Squid 5.7 yi ubuntu 20.04 üzerine compile ederek kaynaktan kurmak için yapılması gerekenler

## Derlemek için ön gereklilikler

	apt-get install build-essential openssl libssl-dev pkg-config

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667994940187.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667994940187.png)


Bu işlem bitince download ediyoruz
 
 	wget -c http://www.squid-cache.org/Versions/v5/squid-5.7.tar.gz
    
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667994957606.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667994957606.png)


Download edilen kaynak dosyasını açıyoruz.

	tar zxvf squid-5.7.tar.gz 

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667994983167.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667994983167.png)


Çıkardığımız klasöre geçiyoruz

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995001882.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995001882.png)


### Derleme
Aşağıdaki parametreler ile compile başlatıyoruz

    ./configure --prefix=/usr --with-openssl --enable-ssl-crtd --localstatedir=/var --libexecdir=${prefix}/lib/squid --datadir=${prefix}/share/squid --sysconfdir=/etc/squid --with-default-user=proxy --with-logdir=/var/log/squid --with-pidfile=/var/run/squid.pid

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995018288.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995018288.png)


Hiçbir warning yada hata almadan bitmeli. Ardından derleme işlemini aşağıdaki komut ile başlatıyoruz. Bu 15 dakika kadar sürebiliyor.

	make all
    
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995037612.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995037612.png)


Make işlemi sorunsuz şekilde bittikten sonra 


	make install
    
yapıyoruz ve kurulum bitiyor.

Kontrol edelim.

	squid -v

Aşağıdaki gibi görünmeli 

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995061409.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995061409.png)



### Systemd dosyası
Systemd servisi Ubuntu 22.04 versiyon linux kurulumlarının sistem servis yöneticisidir. Bu yöneticiye squid için gerekli detayların eklenmesi gerekir.

Derleyerek kurduğumuz squid 5.7 systemd dosyasyı olmadan gelir, oluşturmak için aşağıdaki şablonu kullana bilirsiniz 

    ## Copyright (C) 1996-2022 The Squid Software Foundation and contributors
    ##
    ## Squid software is distributed under GPLv2+ license and includes
    ## contributions from numerous individuals and organizations.
    ## Please see the COPYING and CONTRIBUTORS files for details.
    ##

    [Unit]
    Description=Squid Web Proxy Server
    Documentation=man:squid(8)
    After=network.target network-online.target nss-lookup.target

    [Service]
    Type=forking
    PIDFile=/var/run/squid.pid
    #ExecStartPre=/usr/sbin/squid -z
    ExecStart=/usr/sbin/squid -f /etc/squid/squid.conf -d1
    ExecStop=/usr/sbin/squid -k shutdown
    ExecReload=/usr/sbin/squid -k reconfigure

    [Install]
    WantedBy=multi-user.target

Bu şablonu kopyalayıp aşağıdaki komutu kullanarak yeni systemd servis dosyasının içine kopyalayalım

	sudo nano /lib/systemd/system/squid.service
    
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995084836.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995084836.png)


kopyaladıktan sonra aşağıdaki gibi görünmelidir.
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995135635.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995135635.png)


ctrl+x, yes, yes yapıp çıkıyoruz

	root@log01:~# systemctl daemon-reload
    
yapıp dameon dosyalarının yeniden yüklendiğine emin oluyoruz

	systemctl status squid.service 

yaptıktan sonra squid servisinin çalıştığını görebilirsiniz.
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995156128.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995156128.png)


## Konfigürasyon

squid konfigürasyon dosyalarının olduğu yere gidiyoruz

	cd /etc/squid/
mevcut konfigürasyonu yedekliyoruz.
	
    root@log01:/etc/squid# mv squid.conf squid.conf.disabled

Yeni konfigürasyonu yapıştıracağımız dosyayı nano kullanarak açıyoruz
	
    root@log01:/etc/squid# nano squid.conf
    
Aşağıdaki şablonu yeni açtığımız dosya içerisine kaydediyoruz.

    # Recommended minimum configuration:
    #
    ##
    # NTLM
    ##
    #auth_param ntlm program /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=BANKA 
    #auth_param ntlm children 10
    #auth_param ntlm keep_alive off
    #icap_send_client_username on
    #acl lan proxy_auth REQUIRED



    # Example rule allowing access from your local networks.
    # Adapt to list your (internal) IP networks from where browsing
    # should be allowed
    acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
    acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
    acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
    acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
    acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
    acl localnet src 192.168.0.0/16		# RFC 1918 local private network (LAN)
    acl localnet src fc00::/7       	# RFC 4193 local private network range
    acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines
    
    acl SSL_ports port 443
    acl Safe_ports port 80		# http
    acl Safe_ports port 21		# ftp
    acl Safe_ports port 443		# https
    acl Safe_ports port 70		# gopher
    acl Safe_ports port 210		# wais
    acl Safe_ports port 1025-65535	# unregistered ports
    acl Safe_ports port 280		# http-mgmt
    acl Safe_ports port 488		# gss-http
    acl Safe_ports port 591		# filemaker
    acl Safe_ports port 777		# multiling http

    #
    # Recommended minimum Access Permission configuration:
    #
    # Deny requests to certain unsafe ports
    http_access deny !Safe_ports

    # Deny CONNECT to other than secure SSL ports
    http_access deny CONNECT !SSL_ports

    # Only allow cachemgr access from localhost
    http_access allow localhost manager
    http_access deny manager

    # We strongly recommend the following be uncommented to protect innocent
    # web applications running on the proxy server who think the only
    # one who can access services on "localhost" is a local user
    #http_access deny to_localhost

    #
    # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
    #

    # Example rule allowing access from your local networks.
    # Adapt localnet in the ACL section to list your (internal) IP networks
    # from where browsing should be allowed


    #http_access allow localnet
    http_access allow localhost
    

    # And finally deny all other access to this proxy
    http_access allow all

    # Squid normally listens to port 3128
    #http_port 3128
    http_port 3128 tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB cert=/etc/squid/bump.crt key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3,NO_SSLv2,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/bump_dhparam.pem

    # Uncomment and adjust the following to add a disk cache directory.
    #cache_dir ufs /var/cache/squid 100 16 256

    # Leave coredumps in the first cache dir
    coredump_dir /var/cache/squid

    #
    # Add any of your own refresh_pattern entries above these.
    #
    refresh_pattern ^ftp:		1440	20%	10080
    refresh_pattern ^gopher:	1440	0%	1440
    refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
    refresh_pattern .		0	20%	4320
    sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 20MB
    sslproxy_cert_error allow all
    ssl_bump stare all


    
### Sertifikalandırma
kullanıcılara gönderilecek sertifikayı generate ediyoruz

	openssl req -new -newkey rsa:2048 -days 720 -nodes -x509 -keyout bump.key -out bump.crt
    
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995188949.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995188949.png)


Otomatik sertifika jenerasyonu için kullanacağımız parametrelere örnek dosyayı oluşturuyoruz.
    
    openssl dhparam -outform PEM -out /etc/squid/ssl_certs/bump_dhparam.pem 2048
  	chmod 400 bump_dhparam.pem 
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995220971.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995220971.png)


Sertifikanını güvenlik ayarlarını yapıyoruz

	chown proxy:proxy /etc/squid/bump*
    chmod 400 /etc/squid/bump*



Ubuntu için çalışacak olan ssl sertifikalarını içeren klasör ve veri tabanını oluşturuyoruz

	mkdir -p /var/lib/squid/ssl_db
    /usr/lib/squid/ssl_crtd -c -s /var/lib/squid/ssl_db
 

### devreye alma
Yukarıdaki adımların tamamını yaptıktan sonra,

	systemctl restart squid.services
    
ve kontrol için 

	systemctl status squid.service
    
    
Bu noktadan sonra ; 
- oluşturduğumuz ssl sertifikasını clientlara gönderip trusted root authorities klasörüne import ediyoruz
- client üzerinde proxy ayarlarını sunucu_ip _adresi:3128  gösterecek şekilde yapıyoruz.


test için 

	curl -kv -x http://172.17.21.7:3128 https://docs.mikronet.tech

# Nginx http load balance ve ldap authentication

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995654766.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995654766.png)



Bu dökümanı takip edebilmek için admin seviyesinde linux tecrübesi gereklidir. Bu seviyede tecrübeniz eksik ise teknik destek ekibimizden yardım alabilirsiniz.

Bir müşterimizde kibana önüne koymak üzere active directory ldap entegrasyonu ile birlikte nginx reverse proxy çalıştırmamız gerekiyordu

Malum ngnix plus içerisinde gerekli modül pre-install şeklinde bulunyor fakat opensource olan versiyonda bu modülü bulamıyoruz.

Ancak, 

	https://github.com/kvspb/nginx-auth-ldap

Adresinden, opensource versiyon ile de kullanılabilen bir modülü indirebiliriz. 
modülü kullanabilmek için bir kaç ön şart var bunlar aşağıdaki gibi ;
- Ubuntu/Debian repolarındaki nginx bu modülü içermiyor bu sebeple source code kullanarak compile etmemiz gerekiyor
- Compile etmeden önce birkaç paket var bunları kurmak gerekiyor.
- kurduktan sonra da nginx.conf ve reverse proxy konfigürasyon içeriğinde bu modülü ve ayarlarını yapmak gerekiyor. 

__Kuruluma devam etmeden önce__ ;

    a. Bu install şekli internete açılacak şekilde kullanılmamalıdır. 
    b. Brute force gibi tekniklere açıktır.
    c. Ldap bind için kullanılan hesabın şifresi cleartext saklanır dolayısı ile bu servisin çalıştığı makina harden edilmelidir
    d. örnekte protokol olarak ldap kullandım işiniz bitince ldaps ve port değişikliğini yapmayı kesinlikle unutmayınız.


Yukarıdaki uyarıları anladığınıza emin olduktan sonra sırasıyla ;

1. Nginx compile edebilmek için gerekli paketleri kuruyoruz

	bu detayda, repositoryleri enable ettikten sonra compile edebilmek için gerekli kütüphaneleri yüklüyoruz
		
        $ sudo -i #<-- sudo yapbilen bir kullanıcının şifresini girelim
        $ sudo add-apt-repository universe
		$ sudo add-apt-repository multiverse
		$ sudo apt update
    	$ sudo apt upgrade
        $ sudo apt install ldap-utils zlib1g build-essential gcc make libldap2-dev libssl-dev libpcre3-dev
   
   kurulumlar bittikten sonra reboot ediyoruz
    
    
2. Git kullanarak modülü indiriyoruz
		
        $ cd ~/Downloads
        $ git clone https://github.com/kvspb/nginx-auth-ldap
		$ cd nginx-auth-ldap
        $ git pull
        
3. Nginx source code indiriyor ve deflate ediyoruz

	Ben bu denemem de nginx-1.21.6 versiyonunu kullandım

		$ cd ~/
        $ wget -c http://nginx.org/download/nginx-1.21.6.tar.gz
        $ tar zxvf nginx-1.21.6.tar.gz
        $ cd nginx-1.21.6
        
3. ./configure, make, sudo make instal
	Bu aşamada nginx i compile edeceğiz bunun için aşağıdaki komutu kullanacağız
    
    	./configure --user=nginx --group=nginx --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-pcre --with-file-aio --with-http_realip_module --add-module=/root/nginx-auth-ldap/ --with-ipv6 --with-debug
        
    Bütün compile işi sorunsuz tamamlandıktan sonra ;
    
    	$ make
        $ sudo make install
        
    
4. systemd değişiklikleri
	
    nginx compile edilerek kurulduğunda, systemd service unit dosyası olmadan kuruluyor bunu maalesef elimizle yapmak zorunda kalıyoruz. Bunun için yukarıdaki compile metoduna göre aşağıdaki unit içeriğini kopyalayabilirsiniz 
    
    	[Unit]
        Description=A high performance web server and a reverse proxy server
        Documentation=man:nginx(8)
        After=network.target nss-lookup.target

        [Service]
        Type=forking
        PIDFile=/var/run/nginx.pid
        ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
        ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
        ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
        ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
        TimeoutStopSec=5
        KillMode=mixed

        [Install]
        WantedBy=multi-user.target
        
 	yukarıdaki içeriği /lib/systemd/system/nginx dosyasına yapıştırıp kaydedip çıkın
 
 		$sudo nano /lib/systemd/system/nginx
        
    
5. Ldap-auth modülünün çalışabilmesi için gerekli nginx.conf değişiklikleri

	Bu adımda ldap-auth modülünü nginx'e eklemek için
    
    	/etc/nginx/nginx.conf 
        
    Dosyasını nano ile açıp aşağıdaki içeriği http protokolüne ekliyoruz 
    
    	http {
        	include /etc/nginx/conf.d/*.conf;
        	auth_ldap_cache_enabled on;
            auth_ldap_cache_expiration_time 1000;
            auth_ldap_cache_size 1000;
            ldap_server adds {
            	url "ldap://172.21.24.34:3268/DC=xxx,DC=work?sAMAccountName?sub?(ObjectClass=user)";
                binddn "XXX\administrator";
                bind_passwd "12qwasZX";
                require_valid_user;
                ssl_check_cert off;
    
    Bu işlem tamamlandıktan sonra default konfig olan ve yine nginx.conf dosyası içindeki server { başlığını comment out ediyoruz 
    
[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1667995681138.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1667995681138.png)


6. Reverse proxy tanımı
	/etc/nginx/conf.d içerisine 
    
    	$sudo nano /etc/nginx/conf.d/kibana.conf


	aşağıdaki detayları kendinize göre değiştirerek yapıştırabilirisiniz
    
		upstream kibana {
        	server kibana_ip_adresi:port_numarası;
            }
        server {
        	listen 80;
            server_name default_server;
            location / {
            		auth_ldap "Enter AD credentials like 'mesut.bayrak@xxx.work'";
                    auth_ldap_servers adds;
                    proxy_set_header Host $host;
                    proxy_pass http://kibana;
                    }
            }
    
    
7. Testler

	Yukarıdaki tanımlar bittikten sonra
    
    	$sudo nginx -t
        
    hata görmezseniz,
    
    	$sudo nginx restart
        
    yazarak ldap authentication modüllü bu çözümü kullanabilirsiniz.
    

Bu konuda mesut[at]netdev.com.tr den, destek alabilirsiniz

# Tengine derleme

## Gerekli paketler

    apt install git build-essential libjemalloc-dev libatomic-ops-dev libpcre3  libpcre3-dev zlib1g zlib1g-dev libssl-dev libgd-dev libgeoip-dev


## extra modüller

    https://github.com/vozlt/nginx-module-vts.git
    https://github.com/FRiCKLE/ngx_cache_purge.git
    https://github.com/yaoweibin/nginx_upstream_check_module.git
    https://github.com/GetPageSpeed/ngx_security_headers.git
    https://github.com/openresty/headers-more-nginx-module.git


## Compile


	#!/bin/bash
    ./configure \
    --with-poll_module \
    --with-threads \
    --with-file-aio \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_image_filter_module \
    --with-jemalloc \
    --with-libatomic \
    --with-http_sub_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-http_stub_status_module \
    --with-mail_ssl_module \
    --with-debug \
    --with-stream \
    --without-http_fastcgi_module \
    --without-http_uwsgi_module \
    --without-http_scgi_module \
    --add-module=/var/nginx-module-vts \
    --add-module=/var/ngx_cache_purge \
    --add-module=/var/nginx_upstream_check_module \
    --add-module=/var/ngx_security_headers \
    --add-module=/var/headers-more-nginx-module \
    --add-module=/var/tengine-2.3.2/modules/ngx_http_upstream_vnswrr_module \
    --add-module=/var/tengine-2.3.2/modules/ngx_http_upstream_session_sticky_module \
    --user=nginx \
    --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --pid-path=/var/run/nginx.pid \
    --http-log-path=/var/log/nginx/access.log \
    --error-log-path=/var/log/nginx/error.log \
    --with-http_image_filter_module=dynamic \
    --with-http_geoip_module=dynamic \
    --with-mail=dynamic \
    --http-client-body-temp-path=/tmp/client-body-temp \
    --http-proxy-temp-path=/tmp/proxy-temp \
        
        
## make && make install

## unit file

    [Unit]
    Description=A high performance web server and a reverse proxy server
    After=network.target
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx  -t -q -g 'daemon on; master_process on;'
    ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
    ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
    ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/nginx.pid
    TimeoutStopSec=5
    KillMode=mixed
    LimitNOFILE=1048576
    LimitNPROC=1048576
    Restart=on-failure
    RestartSec=10s
    [Install]
    WantedBy=multi-user.target[Unit]
    Description=A high performance web server and a reverse proxy server
    After=network.target
    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx  -t -q -g 'daemon on; master_process on;'
    ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
    ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
    ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/nginx.pid
    TimeoutStopSec=5
    KillMode=mixed
    LimitNOFILE=1048576
    LimitNPROC=1048576
    Restart=on-failure
    RestartSec=10s
    [Install]
    WantedBy=multi-user.target
    
    
    
## Tengine Conf
    
    worker_processes 15;
    worker_cpu_affinity auto 1111111111111110;
    worker_rlimit_nofile    1048576;
    user nginx;
    error_log       /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
    worker_connections  1048576;
    use     epoll;
    multi_accept    on;
    accept_mutex    on;
    }
    #don't need stream conf
    worker_shutdown_timeout 300;
    http {
    #access_log on;
    gzip_clear_etag off;
    vhost_traffic_status_zone shared:vhost_traffic_status:128m;
    map_hash_max_size 20480;
    map_hash_bucket_size 20480;
    map $status $loggable {
        ~^[23]  0;
        default 1;
    }
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    client_header_timeout   1m;
    client_body_timeout     1m;
    client_header_buffer_size       2k;
    client_body_buffer_size 512k;
    client_max_body_size    500m;
    large_client_header_buffers     8       16k;
    send_timeout    30;
    keepalive_timeout       60;
    keepalive_requests 100000;
    reset_timedout_connection       on;
    server_tokens   off;
    server_name_in_redirect off;
    server_names_hash_max_size      1024;
    server_names_hash_bucket_size   1024;
    check_shm_size 2000m;
    proxy_buffer_size 16k;
    proxy_buffers 4 16k;
    proxy_busy_buffers_size 16k;
    proxy_next_upstream off;
    more_clear_headers Server;
    more_clear_headers server;
    log_format secops 'default TENGINE  Message 0 0 : "WEBLOG:~'
                      '$time_local~'
                      '$remote_addr~'
                      '$http_x_client_ip~'
                      '$http_True_Client_IP~'
                      '$request_method~'
                      '$upstream_http_X_Proxy_Cache~'
                      '$uri~'
                      '$query_string~'
                      '$bytes_sent~'
                      '$http_user_agent~'
                      '$host~'
                      '$server_port~'
                      '$status~'
                      '$http_referer'
                      '"';
    log_format main 'default TENGINE  Message 0 0 : "WEBLOG:~'
                      '$time_local~'
                      '$remote_addr~'
                      '$http_x_client_ip~'
                      '$http_True_Client_IP~'
                      '$request_method~'
                      '$upstream_http_X_Proxy_Cache~'
                      '$uri~'
                      '$query_string~'
                      '$bytes_sent~'
                      '$http_user_agent~'
                      '$host~'
                      '$server_port~'
                      '$status~'
                      '$http_referer~'
                      '$upstream_addr~'
                      '$upstream_status~'
                      '$upstream_response_time~'
                      '$request~'
                      '$request_time';
    access_log   syslog:server=10.84.82.30:5555 main if=$loggable;
    error_log   syslog:server=10.84.82.30:5556 warn;
    # Mime settings
    include                         mime.types;
    default_type                    application/octet-stream;
    # Compression settings - aggressively cache text file types
    gzip                             off;
    #gzip_comp_level                 1;
    #gzip_min_length                 10240;
    #gzip_vary on;
    #gzip_buffers                    8 64k;
    #gzip_types                      text/plain text/css text/javascript text/js text/xml application/json application/javascript application/x-javascript application/xml application/xml+rss application/x-font-ttf image/svg+xml font/opentype;
    #gzip_proxied                    any;
    #gzip_disable                    "MSIE [1-6]\.";
    # SSL PCI Compliance
    ssl_session_cache               shared:SSL:10m;
    ssl_protocols  TLSv1.2;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_prefer_server_ciphers       on;
    # Error pages
    error_page 403 /403.html;
    #error_page          404          /error/404.html;
    #error_page          502 503 504  /error/50x.html;
    # Cache bypass
    map $http_cookie $no_cache {
    default 0;
    ~SESS 1;
    ~wordpress_logged_in 1;
    }
    # File cache settings
    open_file_cache                  max=200000 inactive=20s;
    open_file_cache_valid            30s;
    open_file_cache_min_uses         2;
    open_file_cache_errors           on;
    # Other settings
    log_subrequest                   on;
    rewrite_log                      on;
    include                          /etc/nginx/sites-enabled/*.conf;
    include                          /etc/nginx/conf.d/*.conf;
    }

# HaProxy sni bazlı trafik dağıtımı

## Routing based on SNI
Aşağıda haproxy için bir ip üzerinden sni özelliği kullanarak forwarding özelliğinin konfig çıktısını bulabilirsiniz.

bu çıktı da ;

- Domainlerimize ait bütün sertifikaların /etc/haproxy/certs/ klasörüne
- cert ve key alt alta aynı dosya içerisinde bulunacak şekilde yüklendikten sonra

http protokolünün sni özelliğini kullanarak farklı endpointlere route etmeyi gösteriyoruz.


    #---------------------------------------------------------------------
    # Global settings
    #---------------------------------------------------------------------
    global
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        #daemon
        debug

    #---------------------------------------------------------------------
    # common defaults that all the 'listen' and 'backend' sections will
    # use if not designated in their block
    #---------------------------------------------------------------------
    defaults
        mode                    http
        option http-server-close
        option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000

    #---------------------------------------------------------------------
    # main frontend which proxys to the backends
    #---------------------------------------------------------------------
    frontend  main 
        bind *:80
        acl docs hdr_dom(host) -i docs.mikronet.tech
        use_backend bk_docs if docs
        http-request redirect scheme https code 301 unless { ssl_fc }
        default_backend     bk_docs


    frontend mains
            bind *:443 ssl crt /etc/haproxy/certs/
            use_backend bk_owncloud  if  { ssl_fc_sni -i storage.mikroservis.net }
            use_backend bk_owncloud  if  { ssl_fc_sni -i storage.mikronet.tech }
            use_backend bk_corelabs  if  { ssl_fc_sni -i users.corelabs.com.tr }    
            use_backend bk_hesk  if  { ssl_fc_sni -i destek.mikronet.tech }
            use_backend bk_docs if { ssl_fc_sni -i docs.mikronet.tech }

    backend bk_owncloud
            balance         roundrobin
            mode http
            server owncloud 172.21.23.222:80 check


    backend bk_corelabs
            balance         roundrobin
            mode http
            server users_corelabs   192.168.17.90:80 check


    backend bk_hesk
            balance         roundrobin
            mode http
            server hesk_server      172.21.23.220:80

    backend bk_docs
            balance         roundrobin
            mode http           
            server docs_server      172.21.23.239:80 check


    #---------------------------------------------------------------------
    # Monitoring stats
    #---------------------------------------------------------------------
    listen stats 
     bind *:81
     stats enable
     stats uri /
     stats hide-version
    /etc/haproxy #

# Namespace kullanarak, glb nin fougue tünel fonksiyonunun operasyon testi

### Amaç  
GLB ve apisix in aynı makina üzerinde çalışması 

### Dizayn
Glb, çalışmak ve second chance işini yaptırabilmek adına gue tüneli ve diğer uçta bu tünelden gelen gue headerlarını okuyabilmek için bir kernel modülü kullanır. Bu sayede gue headerdaki second chance verisini modül okur, offline endpointten cevap alamazsa 2nd chance destinasyona yollar.

### Sonuç
Olmadı, gue headerlarından destinasyon bilgisi ölçen kernel modülü olan, glb_redirect namespace aware bir modül olmadığından, çalışmadı. Bu tunel üzerinden healthcheck ve http requestlerin işlenmemesine ve sonuçta paketlerin drop edilmesine sebep oldu. 


Aşağıda high level örnek planı bulabiliriz. 

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-11/scaled-1680-/image-1668002046511.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-11/image-1668002046511.png)

namespace ler arası link için veth lerin oluşturulması ve default namespace için iplendirme.

    ip link add veth0 type veth peer name veth1
    ip addr add 10.10.10.1/30 dev veth0
    ip link set up dev veth0

apisix'in ve kernel modülünün çalışacağı namepsace in oluşturulması, veth pairin iplendirilmesi ve rotalandırma

    ip netns add apisix
    ip link set veth1 netns apisix
    ip netns exec apisix ifconfig veth1 10.10.10.2 netmask 255.255.255.252 up
    ip netns exec apisix ip r add default via 10.10.10.1

FouGue tünelinin process edilebilmesi için namespace te modüle redirect

	ip netns exec apisix iptables -A INPUT -p udp -m udp --dport 19523 -j GLBREDIRECT 


Default namespace ten  apisix namespace e fougue tüneli kurulumu ve up edilmesi

    modprobe fou 
    ip fou add port 19523 gue
    ip link add name tun1 type ipip remote 10.10.10.2 local 10.10.10.1 ttl 225 encap gue encap-sport auto encap-dport 19523
    ip link set up dev tun1


apisix namespace te  http listener

	ip netns exec apisix nc -l 80 < index.html



[Hızlı bir demo için youtube'dan izleyebilirsiniz](https://youtu.be/pfHLuXAFYUs)

# Temel Nginx konfigürasyonu

Aşağıda temel konfigürasyon dosyası içeriğini bulabilirsiniz.

    server {
                  listen 80 default_server;
                          listen [::]:80 default_server ipv6only=on;
                  root /var/www/default;
                  index index.html index.htm;
                  # Make site accessible from http://localhost/
                  server_name localhost;
                  location / {
                          # First attempt to serve request as file, then
                          # as directory, then fall back to displaying a 404.
                          try_files $uri $uri/ =404;
                          # Uncomment to enable naxsi on this location
                          # include /etc/nginx/naxsi.rules
                          }
          listen 443;
                  server_name somecustomer.com.tr www.somecustomer.com.tr somecustomer.com www.somecustomer.com;
                  root /var/www/default;
                  index index.html index.htm;
                  access_log /var/log/nginx/somecustomer-access.log-ssl-access.log;
                  error_log /var/log/nginx/somecustomer-access.log-ssl-error.log;
                  ssl on;
                  ssl_certificate /etc/keys/somecustomer/www.somecustomer.com.tr.chained.crt;
                  ssl_certificate_key /etc/keys/somecustomer/www.somecustomer.com.tr.key;
                  ssl_session_timeout 5m;
                  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                  ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
                  ssl_prefer_server_ciphers on;
                  if ($http_user_agent ~ "Windows 95|Windows 98|biz360.com|xpymep|TurnitinBot|sindice|Purebot|libwww-perl")  {
                          return 403;
                          break;
                  }
                  location / {
                          proxy_redirect off;
                          proxy_set_header X-Real-IP $remote_addr;
                          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                          proxy_pass http://iis;
                          proxy_set_header Host $http_host;
                          access_log      /var/log/nginx/somecustomer-access.log;
                          error_log       /var/log/nginx/somecustomer-error.log;
                          proxy_set_header   X-Forwarded-Port 443;
                  }
                  location /blog/ {
                          rewrite ^ http://$host$request_uri? permanent;
                  }
  }

# Http sunucu kontrol modülü ile NGINX kurulum ve konfigürasyonu

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-12/scaled-1680-/image-1669992880726.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-12/image-1669992880726.png)

Bu yazıda, nginx i sunuculara aktif health check yollayacak şekilde derleyip kuruyoruz, 
sistem fedora36 rolling.

Config ve binary dosya /usr/local/nginx altında oluşacak dolayısı ile aşağıdaki bütün adımlar dosyların bu klasörde biriktiğini kabul eder.

kurulum sonunda aşağıdaki gibi bir "status page" de elde ederiz 

[![](https://books.netdev.com.tr/uploads/images/gallery/2022-12/scaled-1680-/image-1669992478618.png)](https://books.netdev.com.tr/uploads/images/gallery/2022-12/image-1669992478618.png)

## İşletim sisteminin eksiklerini yükle
eksik olan işletim sistemi paketlerini yüklüyoruz.

    sudo yum install epel-release
    sudo yum install git
    sudo yum  group install "C Development Tools and Libraries" "Development Tools"

## derleme için eksikleri kütüphaneleri yükle
Aşağıdaki kütüphaneler fedora36 da yüklü gelmiyor nginx için yüklü olmaları gerekiyor.

    sudo yum install pcre-devel
    sudo yum install zlib-devel
    sudo yum install  openssl-devel

## Uyumlu nginx ve http_health_chek modülünü klonla
Sadece aşağıdaki sürümü test ettim, daha yeni sürümler için çalışma yapmak gerekir.

    git clone https://github.com/nginx/nginx.git
    git clone https://github.com/zhouchangxun/ngx_healthcheck_module.git
    git checkout branches/stable-1.12


## Derleme
Derleme aşaması burada başlıyor

	git apply ../ngx_healthcheck_module/nginx_healthcheck_for_nginx_1.12+.patch
	./auto/configure --with-stream --add-module=../ngx_healthcheck_module/ --with-http_ssl_module
	sudo make && sudo make install
	cd /usr/local/nginx/

## systemd 
lokasyon olarak kayıt edilecek yer 
	
    /usr/lib/systemd/system/nginx.service
Unit file içeriği ;

    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=syslog.target network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target

    [Service]
    Type=forking
    #PIDFile=/usr/local/nginx//nginx.pid
    GuessMainPID=1
    ExecStartPre=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -s reload
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    User=root

    [Install]
    WantedBy=multi-user.target


## Servisleri başlatalım 

    sudo systemctl daemon-reload
    sudo systemctl status nginx

## Standart nginx conf dosyası

lokasyonu : 
	
    /usr/local/nginx/conf/nginx.conf

içeriği ;

   	user  root root;
   	worker_processes  1;
   	error_log  logs/error.log  info;
   	#pid        logs/nginx.pid;

   	events {
       worker_connections  1024;
   	}

   	http {
       include /usr/local/nginx/conf/conf.d/*.conf;
   	}

   	stream {
       
       
   	}

## Load balance ile ilgili config
Lokasyonu :
	
    /usr/local/nginx/conf/conf.d

Dosyanın içeriği:

    Server {
    location /status {
                healthcheck_status json;
            }
    location / { 
              proxy_pass http://test.com;
            }   
    }
    upstream test.com {
            # simple round-robin
            server 7.20.5.104:8008;
            server 7.20.5.104:8006;

        check interval=3000 rise=2 fall=5 timeout=500 type=http;
        check_http_send "GET /active.html HTTP/1.1\r\nHost: 172.20.5.104\r\nAccept: */* \r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }



## Kaynak

[https://github.com/zhouchangxun/ngx_healthcheck_module#installation](https://github.com/zhouchangxun/ngx_healthcheck_module#installation)

# Debug custom rules using http headers with haproxy

### Step 1: Define a Custom Header
You can use HAProxy’s `http-request set-header` directive to add a custom header to requests passing through HAProxy. This header can contain information like a rule ID or a Lua snippet identifier.

in the end you should have something like this
[![](https://books.netdev.com.tr/uploads/images/gallery/2024-06/scaled-1680-/image-1718168670856.png)](https://books.netdev.com.tr/uploads/images/gallery/2024-06/image-1718168670856.png)

### Step 2: Log the Custom Header
Configure the logging format to include the custom header, so it gets logged.

### Example Configuration

Here's an example configuration that demonstrates how to set a custom header and log it.

#### 1. Define the custom header in the frontend or backend section
```haproxy
frontend http_in
    bind *:80
    mode http

    # Insert custom header with rule ID
    http-request set-header X-Rule-ID %[unique-id]

    default_backend servers

backend servers
    mode http

    server server1 192.168.1.100:80 check
```

In this example, the header `X-Rule-ID` is added to each request with a unique ID (you can customize the value as needed).

#### 2. Customize the log format to include the custom header
```haproxy
global
    log 127.0.0.1 local0

defaults
    log global
    option httplog
    log-format "%ci:%cp [%t] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Tt %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %ST %B %H %{+Q}r %hr %hs %{+Q}r %ht(X-Rule-ID)"

frontend http_in
    bind *:80
    mode http

    # Insert custom header with rule ID
    http-request set-header X-Rule-ID %[unique-id]

    default_backend servers

backend servers
    mode http

    server server1 192.168.1.100:80 check
```

In the log format, `%ht(X-Rule-ID)` is used to log the value of the `X-Rule-ID` header.

### Using Lua to Set Headers

If you need more complex logic for setting the header, you can use a Lua script:

#### 1. Enable Lua support in HAProxy
Ensure your HAProxy is built with Lua support. You can check this by running `haproxy -vv` and looking for `Built with Lua`.

#### 2. Create a Lua script (`/etc/haproxy/lua/add_header.lua`)
```lua
core.register_action("set_rule_id", { "http-req" }, function(txn)
    txn.http:req_set_header("X-Rule-ID", "your_rule_id_or_identifier")
end)
```

#### 3. Update the HAProxy configuration to use the Lua script
```haproxy
global
    lua-load /etc/haproxy/lua/add_header.lua
    log 127.0.0.1 local0

defaults
    log global
    option httplog
    log-format "%ci:%cp [%t] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Tt %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %ST %B %H %{+Q}r %hr %hs %{+Q}r %ht(X-Rule-ID)"

frontend http_in
    bind *:80
    mode http

    # Call Lua script to set the header
    http-request lua.set_rule_id

    default_backend servers

backend servers
    mode http

    server server1 192.168.1.100:80 check
```

In this configuration:
- The Lua script sets the `X-Rule-ID` header.
- The log format includes the custom header.

### Sample access.log output

There are rule identifiers at the end of every line like rule_v2 or rule_v1

    192.168.0.1:54321 [11/Jun/2024:15:23:45.123] http_in backend_a/server1 0/0/2/3/5 200 1234 - - ---- 2/1/0/0/0 0/0 "GET /api/v1/resource HTTP/1.1" 200 1234 - - ---- %{+Q}r %hr %hs %{+Q}r rule_v1
    192.168.0.2:54322 [11/Jun/2024:15:23:46.456] http_in backend_b/server2 0/0/3/4/7 200 2345 - - ---- 2/1/0/0/0 0/0 "GET /api/v2/resource HTTP/1.1" 200 2345 - - ---- %{+Q}r %hr %hs %{+Q}r rule_v2
    192.168.0.3:54323 [11/Jun/2024:15:23:47.789] http_in backend_c/server3 0/0/1/2/3 404 345 - - ---- 2/1/0/0/0 0/0 "GET /other/resource HTTP/1.1" 404 345 - - ---- %{+Q}r %hr %hs %{+Q}r rule_default


### Summary

By configuring HAProxy to set custom headers and customizing the log format to include these headers, you can effectively log custom identifiers, rule IDs, or other information that may be critical for your debugging and monitoring purposes. This setup provides a powerful way to gain insights into how requests are being processed and routed through your HAProxy instance.