Thursday, August 13, 2009

TPROXY: Squid dengan Metode Bridge Untuk Menghemat Bandwidth

Judul yang panjang dan bisa jadi sudah melelahkan untuk dibaca, hanya saja judul di atas merupakan judul yang tepat untuk menggambarkan bagaimana menset-up sebuah Squid Proxy server untuk berjalan di mode bridge dimana semua lalu lintas traffic dari client akan terlihat source IP masing-masing klien. Jadi saat log squid dijalankan akan terlihat satu demi satu IP client yang sedang dan telah request untuk mengakses internet atau tepatnya HTTP request. Jadi selain menghemat bandwidth secara keseluruhan juga kita bisa mengatur bandwidth masing-masing klien berdasarkan IP klien.

Jika menggunakan metode transparent squid proxy biasa, kita hanya mendapatkan keuntungan dalam menghemat bandwidth sedangkan untuk pengaturan bandwidth ke masing-masing klien tidak bisa kita lakukan karena semua telah di NAT oleh squid proxy server sehingga IP yang muncul di gateway adalah IP squid proxy server.

Dalam prakteknya, TPROXY Squid server langsung bisa dikombinasikan dengan servis lain seperti menjadi gateway ke speedy dengan memanfaatkan fasilitas pppoe atau hanya menjadi klien dari modem ADSL. Semua tergantung dengan kondisi di lapangan, hanya saja lebih bagusnya jika modem ADSL Speedy yang menjadi bridge dan dial dilakukan oleh server. Lalu nanti setelah semua berjalan dengan baik, TPROXY Squid server bisa ditambahkan dengan dansguardian untuk memfilter URL dan juga bisa melihat statistic Squid dengan calamaris atau SARG. Silahkan saja disesuaikan dengan kebutuhan. Namun dalam konteks saya, TPROXY akan disandingkan dengan mikrotik PC router. Jadi TPROXY hanya benar-benar menjadi SQUID proxy server dengan mode bridge.

Kalau digambarkan dengan tologi sederhana akan tampil sebagai berikut.

Internet — Modem ADSL (Bridge) — Mikrotik — Squid TProxy (Bridge) — Client

Dimana di mikrotik ada 2 LAN card yang satu mengarah ke Modem ADSL yang telah diset menjadi bridge, lalu 1 LAN card lagi mengarah ke Squid TProxy.
Sedangkan di Squid Tproxy juga menggunakan 2 LAN card yang nantinya akan di set menjadi bridge, 1 LAN card mengarah ke mikrotik server sedangkan 1 LAN card yang lain mengarah ke client.

Jadi kebutuhan Hardware untuk Tproxy Squid server minimal menggunakan 2 LAN card. Hanya saja saat saya menset-up TProxy server, Komputer yang saya gunakan adalah HP Pavilion w1184d dengan spesifikasi sebagai berikut;
- Pentium 4 3.0 Ghz
- HDD Sata 80Gb
- DDR1 RAM 256Mb (upgrade menjadi DDR1 RAM 1Gb)
- 2 LAN card (1 onboard realtek + 1 LAN card 3Com)
Sedangkan spesifikasi yang lain masih mengunakan aslinya. Dan tentu saja OS yang digunakan untuk menset-up Tproxy server adalah Linux.

TPROXY Squid server akan dibangun dengan mgnggunakan CD Netinstall Linux Debian etch. Jika ingin mendapatkan CD Netinstall silahkan merujuk ke juragan ISO di sini atau yang pakai akses speedy bisa langsung ke dl2 untuk download.

Oke lah langsung saja disudahi basa-basinya, Segera kita rubah dekstop PC HP Pavilion menjadi Squid Tproxy Server. Ingat, karena ini akan dijadikan mode bridge maka minimal LAN card yang tersedia di Tproxy server adalah 2 buah.

Kegiatan ngoprek ini akan terbagi menjadi 3 bagian besar yaitu;
1. Setting bridge
2. Compile kernel untuk support Tproxy
3. Patch iptabes dan squid untuk support Tproxy
Kenapa patch harus dilakukan?, karena bawaan dasar iptables dan squid dari debian tidak dienable support tproxynya.

Sudah disiapkan CD netinstall Debian Etch-nya?, kalau sudah segera saja install Debian etch dan pastikan hanya standar system saja yang diinstall sedangkan yang lain bisa ditambahkan belakangan. Jangan lupa arahkan reposiroty list ke mirror lokal baik di indika ataupun di kambing ataupun di dl2.
Lakukan update dan upgrade lalu install paket-paket dibawah.

tproxy#apt-get update
tproxy#apt-get upgrade
tproxy#apt-get install iproute kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
debhelper linuxdoc-tools libselinux1-dev bridge-utils ebtables libssl-dev

Sekarang kita bikin bridgenya, sekedar mengingatkan topologi yang saya gunakan seperti diatas.

tproxy# brctl addbr br0
tproxy# ifconfig eth0 0.0.0.0 promisc up
tproxy# ifconfig eth1 0.0.0.0 promisc up
tproxy# brctl addif br0 eth0
tproxy# brctl addif br0 eth1
tproxy# ip link set br0 up
tproxy# ip addr add 192.168.1.254/24 brd + dev br0
tproxy# route add default gw 192.168.1.1 dev br0

Bagusnya dijadikan script saja semua command diatas sehingga tak perlu lagi di set satu demi satu saat server reboot seperti dibawah ini.

tproxy#nano /etc/init.d/bridge.sh

Isi dari script diatas adalah dibawah ini

#!/bin/sh
# bridge Simple script to activate bridge with 2 LAN card
# Make bridge interface
brctl addbr br0

#Set eth0 and eth1 to promiscuous mode to listen and receive all frame
ifconfig eth0 0.0.0.0 promisc up
ifconfig eth1 0.0.0.0 promisc up

#Activate eth0 and eth1 in br0
brctl addif br0 eth0
brctl addif br0 eth1
ip link set br0 up

# Assign IP to br0 to easy remote to server
ip addr add 192.168.1.254/24 brd + dev br0

# Add route to br0
route add default gw 192.168.1.1 dev br0

Setelah disave lalu jadikan script file diatas menjadi file executable dan juga membuat srcipt agar diload tiap booting.

tproxy#chmod +x /etc/init.d/bridge.sh
tproxy#cd /etc/init.d
tproxy#update-rc.d bridge.sh start 75 2 3 4 5 .

Lalu pastikan di /etc/network/interfaces untuk interface eth0 dirubah nama interfacenya menjadi br0

Selesai sudah fase pertama untuk membuat bridge dengan 2 LAN card. Bridge ini hanya akan melewatkan semua paket yang masuk ke server dan meneruskannya melalui interface yang lain.

Oke kita akan mulai fase yang berat dan melelahkan. Pastikan stamina cukup fit dan tentunya ditemani dengan cemilan yang sehat. Pastikan rokok tidak menjadi teman ngoprek karena lebih baik ditemani segelas kopi semarang dan jajanan pasar :)

Silakan download source kernel terbaru di situs yang terdekat dengan kita, saya ambil versi 2.6.18.8 yang stable.

tproxy#cd /usr/src
tproxy:/usr/src#wget http://kambing.ui.edu/kernel-linux/v2.6/linux-2.6.18.6.tar.bz2
Jika selesai download silakan lakukan dibawah
tproxy:/usr/src# tar jxvf linux-2.6.18.6.tar.bz2
tproxy:/usr/src# ln -s linux-2.6.16 linux

selanjutnya kita extract ctproxy nya

tproxy:/usr/src# tar xzpf cttproxy-2.6.18-2.0.6.tar.gz
tproxy#cd /usr/src/linux
tproxy:/usr/src/linux# for i in /usr/src/cttproxy-2.6.18-2.0.6/patch_tree/0{1,2,3}*.patch; do cat $i |
patch -p1; done

nanti tampilannya akan seperti dibawah sebagai tanda sukses patching.

patching file include/linux/netfilter_ipv4/ip_conntrack.h
patching file include/linux/netfilter_ipv4/ip_nat.h
patching file net/ipv4/netfilter/Kconfig
patching file net/ipv4/netfilter/ip_conntrack_core.c
patching file net/ipv4/netfilter/ip_conntrack_standalone.c
patching file net/ipv4/netfilter/ip_nat_core.c
patching file net/ipv4/netfilter/ip_nat_proto_gre.c
patching file net/ipv4/netfilter/ip_nat_proto_icmp.c
patching file net/ipv4/netfilter/ip_nat_proto_tcp.c
patching file net/ipv4/netfilter/ip_nat_proto_udp.c
patching file include/linux/in.h
patching file include/linux/net.h
patching file include/linux/netfilter/nf_conntrack_common.h
patching file include/linux/netfilter_ipv4/ip_conntrack.h
patching file include/linux/netfilter_ipv4/ip_nat.h
patching file include/linux/netfilter_ipv4/ip_nat_core.h
patching file include/linux/netfilter_ipv4/ip_tproxy.h
patching file include/linux/netfilter_ipv4/ipt_TPROXY.h
patching file include/net/ip.h
patching file net/ipv4/inet_hashtables.c
patching file net/ipv4/inet_timewait_sock.c
patching file net/ipv4/ip_sockglue.c
patching file net/ipv4/netfilter/Kconfig
patching file net/ipv4/netfilter/Makefile
patching file net/ipv4/netfilter/ip_conntrack_core.c
patching file net/ipv4/netfilter/ip_conntrack_standalone.c
patching file net/ipv4/netfilter/ip_nat_core.c
patching file net/ipv4/netfilter/ip_nat_standalone.c
Hunk #1 succeeded at 300 (offset 2 lines).
patching file net/ipv4/netfilter/ipt_TPROXY.c
patching file net/ipv4/netfilter/ipt_tproxy.c
patching file net/ipv4/netfilter/iptable_tproxy.c
patching file net/ipv4/tcp_ipv4.c
patching file net/ipv4/tcp_minisocks.c
patching file net/ipv4/udp.c
Hunk #2 succeeded at 1605 (offset 9 lines).
patching file include/linux/netfilter/nf_conntrack_common.h
patching file include/linux/netfilter_ipv4/ip_conntrack.h
patching file net/ipv4/netfilter/ip_conntrack_core.c
patching file net/ipv4/netfilter/ip_conntrack_proto_tcp.c
patching file net/ipv4/netfilter/ip_conntrack_standalone.c
patching file net/ipv4/netfilter/ip_nat_core.c
patching file net/ipv4/netfilter/iptable_tproxy.c

tproxy:/usr/src/linux# make clean && make mrproper
tproxy# cp /boot/config-`uname -r` ./.config
oke dilanjut dengan make menuconfig, semua file2 pada Netfiler saya kasih tanda * semua serta pada
Mode Bridge nya.

Posisi di menuconfig
-> Networking
—> Networking support
—–> Networking options
——-> Network packet filtering
———-> IP: Netfilter Configuration

tproxy#make menuconfig
tproxy#make-kpkg clean
tproxy#fakeroot make-kpkg -initrd -append-to-version=-tproxy kernel_image kernel_headers

silahkan ditinggal saja karena ini akan makan waktu lama, saya sendiri butuh 1 jam lebih untuk menyelesaikan fase compile kernel. Silahkan maen game dulu atau nambah stok untuk kopi karena masih ada fase lainnya.

Jika sudah selesai segera ke direktori /usr/src

tproxy#cd /usr/src

Pastikan file dibawah ini ada di direktori /usr/src

tproxy:/usr/src# ls

linux-headers-2.6.16-tproxy_2.6.16-tproxy-10.00.Custom_i386.deb
linux-image-2.6.16-tproxy_2.6.16-tproxy-10.00.Custom_i386.deb

Lalu install saja ke-2 paket diatas.

tproxy:/usr/src# dpkg -i linux-headers-2.6.16-tproxy_2.6.16-tproxy-10.00.Custom_i386.deb
tproxy:/usr/src# dkg -i linux-image-2.6.16-tproxy_2.6.16-tproxy-10.00.Custom_i386.deb

done..finish..lalu reboot untuk menggunakan kernel baru yang sudah support Tproxy dan untuk memastikan hasil configure kernel yang barusan direboot itu berhasil atau tidak, silakan lihat file ipt_TPROXY.ko dan ipt_tproxy.ko harus ada di directory dibawah

tproxy# reboot
tproxy:/usr/src/linux/net/ipv4/netfilter# ls -l | grep ipt_tproxy
-rw-r–r– 1 root root 1628 2008-12-20 01:35 ipt_tproxy.c
-rw-r–r– 1 root root 3162 2008-12-20 04:44 ipt_tproxy.ko
-rw-r–r– 1 root root 665 2008-12-20 04:25 ipt_tproxy.mod.c
-rw-r–r– 1 root root 2040 2008-12-20 04:44 ipt_tproxy.mod.o
-rw-r–r– 1 root root 1760 2008-12-20 04:12 ipt_tproxy.o
tproxy:/usr/src/linux/net/ipv4/netfilter# ls -l | grep ipt_TPROXY
-rw-r–r– 1 root root 2211 2008-12-20 01:35 ipt_TPROXY.c
-rw-r–r– 1 root root 3627 2008-12-20 04:43 ipt_TPROXY.ko
-rw-r–r– 1 root root 694 2008-12-20 04:25 ipt_TPROXY.mod.c
-rw-r–r– 1 root root 2104 2008-12-20 04:43 ipt_TPROXY.mod.o
-rw-r–r– 1 root root 2144 2008-12-20 04:12 ipt_TPROXY.o

Well done…sudah terlihat disana file-2 pendukung Tproxy. Ini artinya sudah oke. Sekarang dilanjutkan dengan mengkonfigurasi iptables agar support cttproxy, sekarang download tarball nya iptables lalu extract

tproxy#cd /usr/src
tproxy#apt-get source iptables
tproxy:/usr/src# cd iptables-1.3.6.0debian1/iptables

Kita Pacth sekarang IPTables untuk support tproxy

tproxy:# cat /usr/src/cttproxy-2.6.18-2.0.6/iptables/iptables-1.3-cttproxy.diff | patch -p1
tproxy# chmod +x extensions/.tproxy-test
tproxy#cd extensions/
tproxy# nano Makefile

lalu pada line ke-8 isi paling ujung nya dengan tproxy dan TPROXY

tproxy:~# cd /usr/src/iptables-1.3.6.0debian1/
tproxy:/usr/src/iptables-1.3.6.0debian1# make KERNELDIR=/usr/src/linux

Lalu lanjutkan ambil source tarball dari websitenya netfilter karena default IPtables dari debian selalu akan ditemukan error saat konfigurasi

tproxy#wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.3.6.tar.bz2
tproxy#cd iptables-1.3.6
tproxy#cat /usr/src/cttproxy-2.6.18-2.0.6/iptables/iptables-1.3-cttproxy.diff | patch -p1
tproxy#chmod +x extensions/.tproxy-test
tproxy#cd extensions

Tambahkan lagi TPROXY dan tproxy pada file Makefile seperti diatas. Setelah itu save

tproxy# cd /usr/src/iptables-1.3.6
tproxy# make KERNELDIR=/usr/src/linux
tproxy# make install

Jika udah selesai configure dan instalasi Iptables diatas dilanjutkan dengan pembuatan file *.deb tapi kita harus mengcopy dulu file libipt_Tproxy ke directory source nya si Tproxy bawaan Debian

tproxy#cd /usr/src/iptables-1.3.6/extensions/
tproxy#cp libipt_TPROXY* /usr/src/iptables-1.3.6.0debian1/iptables/extensions/
tproxy#cp libipt_tproxy* /usr/src/iptables-1.3.6.0debian1/iptables/extensions/

tproxy# cd /usr/src/iptables-1.3.6.0debian1/
tproxy# dpkg-buildpackage -b -rfakeroot

done.. finish dan silahkan install file deb berikut.

tproxy#dpkg -i iptables_1.3.6.0debian1-5_i386.deb iptables-dev_1.3.6.0debian1-5_i386.deb

Jika file diatas sudah diinstall, coba cek iptablesnya jika pada --on-port 3128 dan -–dport tidak
ada error berarti IPTables nya dah jalan

tproxy#iptables -t tproxy -A PREROUTING -i eth0 -p tcp --dport 80 -j TPROXY --on-port 3128

coba dicheck

tproxy#iptables -L -t tproxy
/squid-2.6.STABLE14# iptables -L -t tproxy
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
TPROXY tcp — anywhere anywhere tcp dpt:www TPROXY redirect 0.0.0.0:3128
TPROXY tcp — anywhere anywhere tcp dpt:www TPROXY redirect 0.0.0.0:3128
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Oke..IP tables sudah jalan dan sekarang kita lanjutkan dengan instalasi squid. Squid yang saya gunakan versi 2.6 STABLE14

tproxy#wget ftp://squid.cbn.net.id/pub/squid/squid-2/STABLE/squid-2.6.STABLE14.tar.bz2
tproxy#tar jxvf squid-2.6.STABLE14.tar.bz2
tproxy#cd squid-2.6.STABLE14

Sebelum melakukan istalasi Squid ada baiknya kita patch dulu squid karena kalau tidak maka error akan selalu setia menemani.

tproxy#cp /usr/src/linux/include/linux/netfilter_ipv4/ip_tproxy.h /usr/include/linux/netfilter_ipv4
tproxy#cp /usr/include/linux/capability.h /usr/include/sys

Saya menggunakan standar konfigurasi squid dari debian hanya saja dengan menambahkan support untuk meng-enable tproxy.

tproxy#./configure ./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-async-io –with-pthreads –enable-storeio=ufs,aufs,coss,diskd,null –enable-linux-netfilter –enable-arp-acl –enable-epoll –enable-removal-policies=lru,heap –enable-snmp –enable-delay-pools –enable-htcp –enable-cache-digests –enable-underscores –enable-referer-log –enable-useragent-log –enable-auth=basic,digest,ntlm –enable-carp –with-large-files i386-debian-linux build_alias=i386-debian-linux host_alias=i386-debian-linux target_alias=i386-debian-linux –enable-linux-tproxy

tproxy# make && make install

Jika tidak ada error yang terjadi maka squid sudah sukses diinstall, sekarang tinggal utak-atik konfigurasi squid.conf untuk mendapatkan hasil yang optimal.

Oh ya jangan lupa untuk memasukkan script iptables dan ebtables ke /etc/rc.local biar saat reboot maka tproxy squid server ready to server.

tproxy# nano /etc/rc.local

iptables -t tproxy -A PREROUTING -i br0 -p tcp --dport 80 -j TPROXY --on-port 3128
ebtables -t broute -A BROUTING -p IPv4 --ip-protocol 6 --ip-destination-port 80 -j redirect --
redirect-target ACCEPT

echo 0 > /proc/sys/net/ipv4/conf/lo/rp_filter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind

done…tproxy sudah selesai dan siap dijalankan.

Jangan lupa tambahkan line berikut pada squid.conf

http_port 3128 tproxy transparent #setup squid mode tproxy
tcp_outgoing_address 192.168.1.10 #ip proxy

Sumber http://simplyeko.com

Related Posts by Categories