Anda di halaman 1dari 10

Squid Cache, TProxy, dan Mikrotik

(Alternatif Perpaduan Untuk Jaringan


Sederhana)
Aug 8th, 2007
by Tajid Yakub.

Now available in English.

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).
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.

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

Anda mungkin juga menyukai