Router & Bandwidth Control Dengan Raspberry Pi

Akhirnya saya berhasil memanfaatkan RaspberryPi menjadi router dengan kemampuan mengatur kuota bandwidth internet. Saya ikuti beberapa petunjuk dari sumber-sumber berikut ini :

Susunan jaringannya menjadi seperti ini :

20130303-215947.jpg

  • Port Ethernet bawaan RaspberryPi (eth0) menjadi port WAN yang terhubung langsung dengan modem internet.
  • Adapter USB Ethernet (eth1) menjadi port LAN yang terhubung ke switch.
  • WiFi TP-Link tidak lagi dipakai sebagai DHCP server. Port WANnya pun tidak dipakai. Hanya difungsikan sebagai access-point. Client mendapat IP address dari Raspberry. Karena Wi-Fi ini menggunakan DD-WRT sebagai sistem operasinya, saya harus mematikan DHCP server & memilih untuk menggunakan DHCP Forwarder.

Ini adalah konfigurasi IP di RaspberryPi.

root@raspberrypi:~# cat /etc/network/interfaces 
auto lo

iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
    address 192.168.10.1
    netmask 255.255.255.0
    network 192.168.10.0
    broadcast 192.168.10.255
    dns-nameservers 192.168.10.1
root@raspberrypi:~#

Port eth0 diset menggunakan IP dinamis, IPnya didapat dari modem FirstMedia. Sementara port eth1 adalah port LAN sehingga menggunakan IP statis.

Untuk menjadikan Raspberry sebagai DHCP server di jaringan lokal saya perlu paket dnsmasq.

root@raspberrypi:~# apt-get install dnsmasq

Konfigurasi dnsmasq sangat simpel seperti berikut ini :

root@raspberrypi:~# cat /etc/dnsmasq.conf 
interface=eth1
dhcp-range=192.168.10.50,192.168.10.150,255.255.255.0,12h
root@raspberrypi:~# 

Saya hanya perlu mencantumkan di interface mana DHCP server akan beroperasi, tentu ini interface yang terhubung ke LAN. Dan satu lagi opsi yang dhcp-range, opsi ini mendefinisikan alamat IP mana saja yang disediakan oleh DHCP server. Sebenarnya masih banyak opsi yang bisa dipakai oleh dnsmasq, tapi untuk keperluan test ini hanya itu yang saya perlukan.

Proses routing dijalankan oleh perintah iptables. Di website Debian Administrator sudah ada contoh script yang memanfaatkan iptables sebagai router & juga sebagai firewall.

root@raspberrypi:~# cat /etc/network/if-up.d/router 
#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/bin

# Notes : eth0 = WAN port / internet
#         eth1 = LAN port
#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT

# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i eth0 -o eth0 -j REJECT

# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward
root@raspberrypi:~#

Sementara untuk mengatur alokasi bandwidth aplikasi yang dipakai adalah tc. Konsep yang diterapkan untuk mengatur alokasi bandwidth ini adalah HTB (Hierarchical Token Bucket). Pengaturan bandwidth dilakukan dalam sistem hirarki. Saya contoh apa yang dijelaskan di web ini. Ada beberapa modifikasi yang saya tambahkan. Di web tadi hanya kecepatan download yang dibatasi. Ternyata untuk membatasi kecepatan upload, saya perlu tambahkan rule lain di port WANnya (dalam contoh kasus saya di port eth0).

root@raspberrypi:~# cat /etc/network/if-up.d/tcscript 
#!/bin/bash

# DOWNLOAD LIMIT
tc qdisc add dev eth1 root handle 1:0 htb default 10
tc class add dev eth1 parent 1:0 classid 1:10 htb rate 256kbit ceil 256kbit prio 0
tc class add dev eth1 parent 1:1 classid 1:5 htb rate 4864kbit ceil 4864kbit prio 1
tc filter add dev eth1 parent 1:0 prio 1 handle 5 fw flowid 1:5

# UPLOAD LIMIT
tc qdisc add dev eth0 root handle 1:0 htb default 10
tc class add dev eth0 parent 1:0 classid 1:10 htb rate 128kbit ceil 128kbit prio 0
tc class add dev eth0 parent 1:1 classid 1:5 htb rate 4864kbit ceil 4864kbit prio 1
tc filter add dev eth0 parent 1:0 prio 1 handle 5 fw flowid 1:5

iptables -t mangle -N shaper-out
iptables -t mangle -N shaper-in

iptables -t mangle -I POSTROUTING -o eth1 -j shaper-in
iptables -t mangle -I PREROUTING -i eth1 -j shaper-out
iptables -t mangle -I PREROUTING -i eth0 -j shaper-in
iptables -t mangle -I POSTROUTING -o eth0 -j shaper-out

iptables -t mangle -A shaper-out -s 192.168.10.0/24 -j MARK --set-mark 1
iptables -t mangle -A shaper-in -d 192.168.10.0/24 -j MARK --set-mark 1

iptables -t mangle -A shaper-out -s 192.168.10.129 -j MARK --set-mark 5
iptables -t mangle -A shaper-in -d 192.168.10.129 -j MARK --set-mark 5
root@raspberrypi:~#

Di contoh script di atas, saya buat skenario sederhana yaitu hanya IP 192.168.10.129 (IP Macbook) yang diberi akses untuk menggunakan bandwidth sampai maksimum (4-5MB).

20130303-234031.jpg

Sementara semua client lain dalam jaringan 192.168.10.0/24 hanya bisa mendapat kecepatan download 256Kbps & kecepatan upload 128Kbps. Ternyata berhasil, dan ini contohnya hasil testing dengan iPhone :

20130303-233616.jpg

Kira-kira begitu pemanfaatan Raspberry Pi untuk mengontrol pemakaian bandwidth dalam jaringan. Masih banyak yang bisa dibahas dari topik ini. Mungkin nanti saya tuliskan lagi di tulisan-tulisan berikutnya.

Set IP Statik Raspberry Pi

20130215-232649.jpg

Karena Raspberry Pi ini menggunakan OS Raspbian yang notabene adalah Debian Wheezy, cara set IP statiknya pun sama persis seperti Debian (sama juga seperti Ubuntu). Tinggal daftarkan IP statiknya di file /etc/network/interface lalu restart Raspberry-nya.

ttirtawi@raspberrypi:~$ cat /etc/network/interfaces
auto lo

iface lo inet loopback

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

iface eth0 inet static
address 192.168.1.101
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1

ttirtawi@raspberrypi:~$

Setelah direstart Raspberry ini akan langsung menggunakan IP statik tersebut :

ttirtawi@raspberrypi:~$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr b8:27:eb:45:7b:e2  
          inet addr:192.168.1.101  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:610 errors:0 dropped:0 overruns:0 frame:0
          TX packets:303 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:70466 (68.8 KiB)  TX bytes:39427 (38.5 KiB)

ttirtawi@raspberrypi:~$ 

Cara Praktis Scanning IP

Setelah main-main dengan RaspberryPi beberapa hari lalu, saya matikan komputer kecil itu sementara waktu. Sampai malam ini saya coba hidupkan kembali tanpa menggunakan monitor, keyboard, dan mouse. Hanya kabel LAN yang tersambung. Terakhir saya hidupkan RaspberryPi ini saya belum sempat memberinya IP statis. Sedikit agak konyol memang. Raspberry masih menggunakan DHCP; tanpa mouse/keyboard, monitor bagaimana saya bisa tahu alamat IP yang sekarang digunakan oleh si Raspberry?

raspberry headless

Karena malas menyambungkannya ke monitor, saya pilih cara gampang dengan lakukan scanning IP di LAN. Cara sederhana dengan bantuan program nmap.

ttirtawi@macbook-air:~$ sudo nmap -sP 192.168.1.0/24
Password:

Starting Nmap 6.01 ( http://nmap.org ) at 2013-02-15 22:33 WIT
...
...
Nmap scan report for raspberrypi (192.168.1.131)
Host is up (0.0065s latency).
MAC Address: B8:27:EB:45:7B:E2 (Raspberry Pi Foundation)
...
...
Nmap done: 256 IP addresses (9 hosts up) scanned in 2.65 seconds
ttirtawi@macbook-air:~$

nmap (dengan opsi -sP) akan memeriksa semua host yang aktif di jaringan 192.168.1.0/24. Penggunaan sederhana dari perintah nmap bisa membantu saya menemukan IP yang dipakai oleh Raspberry saat ini, ternyata dia menggunakan IP 192.168.1.131. Saatnya memberi IP statis untuk Raspberry Pi ini supaya tidak “hilang” lagi.

UPDATE:

nmap di MacOSX tersedia di MacPorts :

ttirtawi@macbook-air:~$ port search nmap | head
Warning: port definitions are more than two weeks old, consider using selfupdate
nmap @6.01 (net)
Port scanning utility for large networks

p5-nmap-scanner @1.0.0 (perl)
Perform and manipulate nmap scans using perl

p5.8-nmap-scanner @1.0.0 (perl)
Perform and manipulate nmap scans using perl

p5.10-nmap-scanner @1.0.0 (perl)
ttirtawi@macbook-air:~$

Sementara di Ubuntu/Debian, nmap tersedia di main repository :

ttirtawi@x220:~$ apt-cache search nmap | grep ^nmap
nmap - The Network Mapper
nmapsi4 - graphical interface to nmap, the network scanner
ttirtawi@x220:~$ 

Mencoba Raspberry Pi

Raspberry Pi adalah sebuah komputer mungil komplit dengan CPU & memori. Sepintas terlihat seperti sebuah PCB biasa. Karena ukurannya yang kecil, komputer ini dijual dalam kemasan yang mirip kotak kartu nama.

20130211-151332.jpg

Sebagai perbandingan ini foto Raspberry Pi dijajarkan dengan Blackberry 9320. Cukup kecil untuk ukuran sebuah komputer mini. Harga Raspberry Pi ini adalah Rp400.000,-.

20130211-151059.jpg

Untuk sumber dayanya, Raspberry Pi menyediakan konektor micro USB. Konektor ini sama seperti yang lazim dipakai di ponsel. Sayangnya adapter power tidak disertakan dalam paket penjualan Raspberry Pi. Harga adapter USBnya Rp50,000.

20130211-162512.jpg

Berikut tampak atas dari Raspberry PI.

20130211-150612.jpg

Tampak bawah dari Raspberry ini seperti berikut ini :

20130211-150620.jpg

Bagian yang berwarna hitam itu adalah slot untuk memasukkan SD Card. Raspberry PI menggunakan SD Card sebagai pengganti harddisk.

Untuk menghubungkan keyboard & mouse, saya menggunakan 2 konektor USB yang tersedia. Raspberry Pi ini juga menyediakan 1 buah konektor LAN (Ethernet) sehingga saya bisa menyambungkannya ke switch dengan kabel UTP.

20130211-150634.jpg

Karena memiliki konektor HDMI, Raspberry ini bisa juga disambungkan ke LCD TV yang memiliki konektor HDMI.

20130211-150644.jpg

Selain konektor HDMI, Raspberry Pi jug menyediakan konektor video analog/RCA (di bagian yang berwarna kuning). Selain itu juga tersedia sebuah konektor audio 3,5 mm.

Saya juga beli casing untuk Raspberry Pi ini. Casing-nya ada yang berwarna hitam, putih, dan transparan; saya pilih yang transparan.

20130211-151345.jpg

Setelah dipasang ke dalam casing, tampilannya seperti berikut ini :

20130211-150553.jpg

Ada beberapa pilihan sistem operasi yang bisa dipasang pada Raspberry Pi ini. Untuk test awal saya pilih Raspbian. Raspbian ini pada dasarnya adalah Debian Wheezy yang sudah di-compile ulang supaya bisa bekerja dengan prosesor ARM; saya download image Raspbian dari sini.

20130211-150457.jpg

Saya perlu menggunakan perintah dd pada terminal untuk menyalin image Raspbian ke dalam SD Card.

ttirtawi@macbook-air:~$ df -h
Filesystem      Size   Used  Avail Capacity  iused   ifree %iused  Mounted on
/dev/disk0s2   112Gi  101Gi   11Gi    91% 26581510 2830858   90%   /
devfs          185Ki  185Ki    0Bi   100%      639       0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%        0       0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%        0       0  100%   /home
/dev/disk1s1   3.7Gi  800Ki  3.7Gi     1%        0       0  100%   /Volumes/UNTITLED 1
ttirtawi@macbook-air:~$ sudo diskutil unmount /dev/disk1s1 
Password:
Volume UNTITLED 1 on disk1s1 unmounted
ttirtawi@macbook-air:~$ sudo dd bs=1m if=2012-12-16-wheezy-raspbian.img of=/dev/rdisk1
1850+0 records in
1850+0 records out
1939865600 bytes transferred in 220.246458 secs (8807704 bytes/sec)
ttirtawi@macbook-air:~$ ls -tlrh 2012-12-16-wheezy-raspbian.img 
-rw-r--r--@ 1 ttirtawi  staff   1.8G Dec 17 02:52 2012-12-16-wheezy-raspbian.img
ttirtawi@macbook-air:~$

Karena tidak punya tombol ON/OFF, begitu disambungkan dengan charger-nya Raspberry Pi ini langsung booting. Pertama kali booting akan muncul menu seperti ini :

20130211-150447.jpg

Ada beberapa pilihan yang bisa dilakukan seperti mengatur tipe keyboard, mengatur time zone, mengaktifkan SSH server, dsb. Setelah selesai proses booting bisa dilanjutkan sampai muncul tampilan desktop seperti berikut ini :

raspberry

Raspbian menggunakan LXDE sebagai desktop environment-nya. Tidak seperti Debian (atau Ubuntu) yang secara default menggunakan Gnome, Raspberry menggunakan LXDE karena LXDE relatif sangat ringan & bisa bekerja di perangkat yang minimalis. Waktu saya coba desktop-nya relatif lambat, mungkin faktor SD Card yang kurang bagus sehingga proses read/write-nya agak terhambat. Nanti saya perlu coba lagi dengan SD Card yang lebih tinggi kecepatan baca-tulisnya.

Berikut informasi hardware dari Raspberry Pi ini :

pi@raspberrypi ~ $ uname -a
Linux raspberrypi 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l GNU/Linux
pi@raspberrypi ~ $ 
pi@raspberrypi ~ $ sudo lshw 
raspberrypi               
    description: Computer
    width: 32 bits
  *-core
       description: Motherboard
       physical id: 0
     *-memory
          description: System memory
          physical id: 0
          size: 438MiB
     *-cpu
          physical id: 1
          bus info: cpu@0
          size: 700MHz
          capacity: 700MHz
          capabilities: cpufreq
  *-network
       description: Ethernet interface
       physical id: 1
       logical name: eth0
       serial: b8:27:eb:45:7b:e2
       size: 100Mbit/s
       capacity: 100Mbit/s
       capabilities: ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=smsc95xx driverversion=22-Aug-2005 duplex=full firmware=smsc95xx USB 2.0 Ethernet ip=192.168.1.118 link=yes multicast=yes port=MII speed=100Mbit/s
pi@raspberrypi ~ $