18 March 2012

Squid Cache, TProxy, dan Mikrotik (Alternatif Perpaduan Untuk Jaringan Sederhana)

Berdasarkan pengamatan, ada dua model topologi pada jaringan sederhana yang menggunakan mesin linux tambahan dengan squid untuk melakuka http cache. Tulisan ini bermaksud untuk memberikan alternatif topologi dengan memanfaatkan tproxy (A set of kernel patches reimplementing support for userspace transparent proxies).
Kedua model topologi yang umum digunakan adalah;
  1. Squid sejajar dengan klien dan intersepsi port http dilakukan dengan melakukan dst-nat ataupun /ip proxy parent dengan redirect port (Konfigurasi A).
  2. Squid berada setelah router dan menjadi router kedua yang melakukan intersepsi melalui iptables redirect (Konfigurasi B).
konfigurasi_a_squid.jpg
konfigurasi_b_squid.jpg
Kedua model ini memiliki kelemahan mendasar sebagai berikut (subyektif);
Hanya satu buah IP Address yang keluar dari Squid ketika menuju baik internet maupun router, karena telah dilakukan NAT, sebagai akibatnya;
  1. Bagi jaringan yang mengandalkan Mikrotik Router OS sebagai bandwidth shaper, request ke internet dari Squid sudah tidak dapat lagi di shape, sehingga otomatis akan memakan resource bandwidth yang tersisa (silahkan diteliti lebih lanjut), dan shaping akan dilakukan secara global oleh pihak ISP atau penyedia bandwidth.
  2. Bandwidth yang diberikan pada user (meskipun dijawab oleh proxy) sudah masuk ke dalam shape.
  3. Untuk yang menggunakan multiple gateway (misalnya memadukan koneksi internasional dari ADSL dan wireless), Squid hanya akan mengambil salah satu, bukan merupakan masalah apabila ADSL – Internasional, Wireless – IIX, tapi menjadi masalah apabila ruter melakukan load balancing, baik secara grup klien maupun berdasarkan session.
Cita-cita
Membangun Squid di dalam Linux Bridge (No additional configuration), menjadi sulit dilakukan karena Squid berjalan pada tatanan aplikasi dan otomatis memerlukan routing. Adapun menggunakan tutorial seperti yang terdapat pada http://freshmeat.net/articles/view/1433/ tidak mengatasi kedua kelemahan di atas karena tetap keluar dalam 1 IP Address. Mungkin untuk diterapkan pada jaringan warnet yang menggunakan sedikit subnet, misalnya 192.168.100.0/24, gateway dan shaping 192.168.100.1 (Mikrotik), dan Squid Cache pada 192.168.100.2 (interface bridge). Sementara cita-cita tersebut terpaksa dilupakan :D, silahkan infonya bagi yang telah berhasil melakukan percobaan. Ada satu tutorial lagi yang dapat dijadikan acuan mengenai penggunaan TProxy pada bridge;

Deskripsi Alternatif
Squid diletakkan sebagai gateway transisi antara klien dan ruter (Squid akan menjadi gateway bagi klien), Linux melakukan routing tanpa melakukan NAT, dan dengan menggunakan TProxy (melakukan patch pada Kernel dan IPTables) serta direktif tcp_outgoing_address pada squid, permintaan pada port 80 akan diteruskan ke ruter mikrotik yang melakukan shaping, NAT dan firewall. Dengan demikian, pada router Mikrotik akan ditambahkan static routing yang meneruskan jawaban dari Internet ke Proxy.
konfigurasi_alternatif_squi.jpg
Alur data (http) menjadi.
Klien (172.16.17.4) –> eth1(172.16.17.1) (intersepsi port 80) –> port 3128 (squid) dengan tcp_outgoing_address menggunakan 172.16.17.1 (gateway klien) —-> routing (tanpa NAT) –> Mikrotik (shaping + NAT) –> Router lain –> Internet –> Kembali ke Mikrotik –> Static Routing ke Gateway Squid –> Intersepsi port 80 –> User
Berikut Langkah secara umumnya;
1. Instalasi standar Linux, OS yang digunakan adalah Debian etch, Kernel 2.6.18
2. Melakukan patching kernel cttproxy
3. Melakukan patching userspace iptables TPROXY
4. Instalasi SQUID dari sourcenya, 2.6.STABLE14 dari Source
5. Konfigurasi SQUID
6. Melakukan Routing tanpa NAT dengan bantuan Firehol
7. Static Routing di Mikrotik Router
Disclaimer
  1. Sudah dites dalam network berjalan.
  2. Tulisan ini tidak menerangkan mengenai optimalisasi performa Squid
  3. Belum tentu benar (namanya juga percobaan), meskipun sudah dites.
  4. Yang paling penting, I’m a Linux and Networking N00bs.
Langkah secara lebih mendetil;
1. Instalasi standar Linux, OS yang digunakan adalah Debian etch, Kernel 2.6.18-4
Lakukan instalasi biasa (base), dapatkan ISO Debian Etch-netinstall di mirror-mirror lokal yang banyak terdapat, salah satunya,.Atur skema partisi HDD sesuai
selera anda, berikut skema partisi saya;
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 14G 1.2G 12G 9% /
tmpfs 253M 0 253M 0% /lib/init/rw
udev 10M 48K 10M 1% /dev
tmpfs 253M 0 253M 0% /dev/shm
/dev/sda2 19G 278M 19G 2% /cache1
/dev/sda3 19G 278M 19G 2% /cache2
/dev/sda6 24G 223M 22G 1% /home
2. Melakukan Patching Kernel cttproxy
baca informasi untuk melakukan kompilasi kernel debian di howtoforge, saya menggunakan metoda pertama (Building A Kernel .deb Package) yang kurang lebih langkahnya sebagai berikut (mohon dimaafkan kalau ada kesalahan-kesalahan, karena kompilasi kernel saya lakukan 2 minggu yang lalu, untuk pastinya silahkan baca link di atas);
Instal paket-paket yang diperlukan untuk kompilasi kernel;
apt-get update
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
Download source kernel, dalam hal ini tetap kernel yang sama, karena kompilasi kernel bukan untuk melakukan upgrade kernel;
cd /usr/src/
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.4.tar.gz
tar -xzvf linux-2.6.18.4.tar.gz
ln -s linux-2.6.18.4 linux
Download dan Apply patch dari cttproxy
Keterangan mengenai tata cara melakukan patching ada di dalam paket cttproxy
cd /usr/src/
wget http://www.balabit.com/downloads/files/tproxy/obsolete/linux-2.6/cttproxy-2.6.18-2.0.6.tar.gz
cd /usr/src/linux
for i in <pathtocttproxy>/patch_tree/0{1,2,3}*.diff; do cat $i | patch -p1; done
Lakukan kompilasi kernel, aktifkan conntrack, NAT dan TPROXY support (ada di dalam Netfilter Configuration)
make clean && make mrproper
cp /boot/config-`uname -r` ./.config
Anda akan masuk ke dalam menu kompilasi kernel, pilih Load an Alternate Configuration File dan pilih .config
Posisi di menuconfig
-> Networking
---> Networking support
-----> Networking options
-------> Network packet filtering
----------> IP: Netfilter Configuration
Setelah selesai mengaktifkan, ketika keluar dari menuconfig, jawab Yes terhadap pertanyaan Do you wish to save your new kernel configuration?
Build Kernel
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Tunggu agak lama, (kalau kasus saya sekitar satu jam atau lebih)
Install Kernel baru
cd /usr/src/
ls -l<
akan terlihat kedua file berikut;
linux-headers-2.6.18.4-custom_2.6.18.4-custom-10.00.Custom_i386.deb
linux-image-2.6.18.4-custom_2.6.18.4-custom-10.00.Custom_i386.deb
lakukan instalasi file deb tersebut;
dpkg -i linux-headers-2.6.18.4-custom_2.6.18.4-custom-10.00.Custom_i386.deb
dpkg -i linux-image-2.6.18.4-custom_2.6.18.4-custom-10.00.Custom_i386.deb
konfigurasi GRUB bootloader di /boot/grub/menu.lst telah dimodifikasi secara otomatis, anda tinggal melakukan restart sistem, dan pilihan booting default menjadi kernel yang baru kita modifikasi.
shutdown -r now
3. Melakukan patching userspace iptables TPROXY
Ambil source iptables
cd /usr/src/
apt-get source iptables
patch iptables (informasi lengkap ada di README cttproxy)
cd /usr/src/iptables-1.3.6.0debian1
cat <pathtocttproxy>/iptables/iptables-1.3-cttproxy.diff | patch -p1
chmod +x extensions/.tproxy-test
make KERNELDIR=/usr/src/linux
buat paket debnya dan lakukan instalasi
cd /usr/src/iptables-1.3.6.0debian1
dpkg-buildpackage -b -rfakeroot
cd /usr/src/
dpkg -i iptables_1.3.6.0debian1-5_i386.deb
Masukkan rule TPROXY untuk melakukan intersepsi terhadap request http (port 80)
iptables -t tproxy -A PREROUTING -i eth1 -p tcp --dport 80 -j TPROXY --on-port 3128
Pada debian, letakkan perintah ini di /etc/rc.local agar terload ketika sistem di restart, asumsinya user terhubung melalui eth1 (interface Local).
4. Install Squid dari Source (Ambil binary Squid 2.6.STABLE14)
Paket squid yang digunakan adalah 2.6.STABLE14, ambil langsung source codenya dari situs squid-cache karena paket squid dari debian tidak mendukung tproxy.
http://packages.debian.org/changelogs/pool/main/s/squid/squid_2.6.5-6/changelog
squid (2.6.5-2) unstable; urgency=low
* debian/rules
- Remove mispelled configure option enablig TPROXY support
(TPROXY support is NOT enabled since it needs kernel patches which
are not in the kernel sources distributed by debian)
cd /usr/src/
wget http://www.squid-cache.org/Versions/v2/2.6/squid-2.6.STABLE14.tar.gz
tar -xzvf squid-2.6.STABLE14.tar.gz
kompilasi dilakukan sama dengan kompilasi standard debian dengan tambahan opsi -enable-linux-tproxy, apabila ingin melihat standar kompilasi squid pada
debian silahkan instal terlebih dahulu squid dan jalankan dengan -v.
apt-get install squid
squid -v
Instal squid dari source, Jalankan perintah ./configure dalam satu baris.
cd /usr/src/squid-2.6.STABLE14/
./configure --prefix=/usr --exec_prefix=/usr --bindir=/usr/sbin --sbindir=/usr/sbin --libexecdir=/usr/lib/squid --sysconfdir=/etc/squid --localstatedir=/var/spool/squid --datadir=/usr/share/squid --enable-linux-netfilter --enable-storeio=ufs,aufs,diskd,null --enable-arp-acl --enable-removal-policies=lru,heap --enable-snmp --enable-delay-pools --enable-htcp --enable-poll --enable-cache-digests --enable-underscores --enable-referer-log --enable-useragent-log --enable-auth="basic,digest,ntlm" --enable-carp --enable-large-files --enable-linux-tproxy
make all
make install
cp /usr/src/linux/include/linux/netfilter_ipv4/ip_tproxy.h /usr/include/linux/netfilter_ipv4
cp /usr/include/linux/capability.h /usr/include/sys
5. Konfigurasi SQUID
Pada prinsipnya squid membutuhkan routing untuk meneruskan permintaan ke internet, routing akan tergantung pada aturan routing yang ada di linux anda, pada
contoh ini, apabila kita melihat table routing yang ada;
route
Destination Gateway Genmask Flags Metric Ref Use Iface
10.40.40.0 * 255.255.255.252 U 0 0 0 eth0
172.16.80.0 * 255.255.255.248 U 0 0 0 eth1
default 10.40.40.1 0.0.0.0 UG 0 0 0 eth0
Default gateway nya adalah 10.40.40.1, sehingga secara default semua paket yang diambil oleh squid untuk dilanjutkan ke internet akan menggunakan 10.40.40.1 sebagai routing ke internet. Yang diinginkan adalah agar ketika misalnya ada request dari user dengan IP Address 172.16.80.4 yang gatewaynya ke 172.16.80.1 (IP Address di eth1) ke internet pada port 80 (http), yang kemudian dialihkan ke port 3128 (squid) dengan menggunakan TPROXY iptables, squid akan melakukan binding dengan IP Address 172.16.80.1, yang apabila routingnya sudah diatur (lihat langkah no.6) akan diteruskan ke 10.40.40.1 dengan tetap membawa IP Address user 172.16.80.4 (iptables TPROXY).
Pada squid yang dibutuhkan adalah pengaktifan tproxy, dan memanfaatkan tcp_outgoing address berdasarkan acl src-address, berikut contoh file konfigurasi saya (sebagian). Silahkan eksplorasi lebih lanjut untuk konfigurasi performa squid.
http_port 3128 tproxy transparent
##ACLs###
acl client_3dnet_isplasa src 172.16.17.0/255.255.255.248
acl client_3dnet_alwy src 172.16.17.8/255.255.255.248
acl client_3dnet_anis src 172.16.17.16/255.255.255.248
acl client_3dnet_pkstebet src 172.16.17.24/255.255.255.248
acl client_3dnet_pkstebet2 src 172.16.17.32/255.255.255.248
acl client_sonny src 172.16.35.8/255.255.255.248
acl client_christ src 172.16.35.16/255.255.255.248
acl client_shandy src 172.16.35.24/255.255.255.248
acl client_tono src 172.16.35.32/255.255.255.248

##TCP_Outgoing_Address###
tcp_outgoing_address 172.16.17.1 client_3dnet_isplasa
tcp_outgoing_address 172.16.17.9 client_3dnet_alwy
tcp_outgoing_address 172.16.17.17 client_3dnet_anis
tcp_outgoing_address 172.16.17.25 client_3dnet_pkstebet
tcp_outgoing_address 172.16.17.33 client_3dnet_pkstebet2
tcp_outgoing_address 172.16.35.9 client_sonny
tcp_outgoing_address 172.16.35.17 client_christ
tcp_outgoing_address 172.16.35.25 client_shandy
tcp_outgoing_address 172.16.35.33 client_tono

##Default##
tcp_outgoing_address 10.40.40.2
server_persistent_connections off
Dengan demikian apabila request muncul dari IP Address 172.16.17.4, maka squid akan berjalan pada 172.16.17.1:3128, sehingga request diteruskan dengan tetap membawa IP Address user (172.16.17.4) ke Router Mikrotik yang terletak diatasnya. Pastikan bahwa IP Gateway user merupakan salah satu IP Address yang diassign ke eth1 (local), karena gateway user adalah ke Gateway Linux Squid.
6. Melakukan Routing tanpa NAT dengan bantuan Firehol
Pada umumnya, sebuah gateway akan melakukan NAT sebelumnya melanjutkan request ke internet, namun demikian dengan serangkaian rule iptables (mungkin bisa dengan pendekatan lain, sayangnya saya belum bisa), routing paket bisa diteruskan ke atas (Router Mikrotik), dan NAT akan dilakukan oleh Router Mikrotik.
Untuk melakukan hal ini saya menggunakan firehol yang keterangan dan konfigurasi lengkapnya bisa dilihat di http://firehol.sourceforge.net/, pada contoh ini saya hanya membuat agar firehol melakukan routing terhadap permintaan dari eth1 (local ke user) ke eth0 (public ke mikrotik), apabila dibaca lebih lanjut firehol sangat berguna untuk melakukan konfigurasi firewall apabila tugas firewall ke user ingin dilakukan oleh Linux.
Install Firehol
apt-get install firehol
Agar firehol berjalan ketika sistem di boot
nano /etc/default/firehol
#Rubah NO menjadi YES
START_FIREHOL=YES
#If you want to have firehol wait for an iface to be up add it here
WAIT_FOR_IFACE=”"
Konfigurasi standar
cat /etc/firehol/firehol.conf
version 5
interface eth0 tomt
policy accept
interface eth1 toclient
policy accept
## agar dari eth1 bisa melakukan routing ke eth0 ##
router localpublic inface eth1 outface eth0
route all accept
## agar dari eth0 bisa melakukan routing ke eth1 ##
router publiclocal inface eth0 outface eth1
route all accept
## agar paling tidak sesama user local dapat melakukan ping ##
router locallocal inface eth1 outface eth1
route all accept
Menjalankan firehol
/etc/init.d/firehol start
harap diperhatikan bahwa apabila anda melakukan restart pada service firehol, rule iptables yang ada di luar firehol akan hilang, dalam contoh ini adalah rule iptables TPROXY. Setelah anda selesai melakukan modifikasi konfigurasi firehol dan merestart firehol, jalankan kembali rule iptables di luar konfigurasi firehol.
7. Static Routing di Mikrotik Router
Agar Router mikrotik dapat mengetahui kemana paket permintaan dari user dibelakang squid diteruskan, harus dilakukan static routing ke Squid Gateway yang
berada di interface local mikrotik.
/ip route pr
..
A S 172.16.80.0/24 r 10.40.40.2 local
..
Apabila banyak subnet di belakang squid silahkan diarahkan satu persatu. Contoh di atas adalah saya memiliki beberapa user dengan blok ip address 172.16.80.0/29, 172.16.80.8/29 dst, di belakang Gateway Squid.
Tambahan, agar supaya Linux bisa berfungsi sebagai DNS, silahkan lakukan instalasi bind, dan pastikan di /etc/resolv.conf ada Name Server yang valid.
apt-get install bind
cat /etc/resolv.conf
nameserver 10.40.40.1
Demikian sedikit tulisan ini dibuat, semoga ada gunanya dan mohon ditambahkan, disempurnakan, dicek apabila ada kesalahan special thanks to;
Previous Post
Next Post
Related Posts

0 komentar: