3.22.2010

Load Balancing Dual-WAN dengan DD-WRT

Topologi (dengan ascii art :) )
________
                                          +------------+        /
                                          |            |       |
                            +-------------+ Provider 1 +-------
        __                  |             |   (WAN 1)  |     /
    ___/  \_         +------+-------+     +------------+    |
  _/        \__      |     if1      |                      /
 /             \     |if0           |                      |
| Local network -----+    DD-WRT    |                      |     Internet
 \_           __/    |              |                      |
   \__     __/       |     if2      |                      \
      \___/          +------+-------+     +------------+    |
                            |             |            |     \
                            +-------------+ Provider 2 +-------
                                          |   (WAN 2)  |       |
                                          +------------+        \________
Source: http://lartc.org/lartc.html#LARTC.RPDB.MULTIPLE-LINKS


Penulis mengambil bahan referensi dari link di bawah ini:
  1. Materi Workshop ddwrt oleh Dani Firman Syah
  2. Dual WAN with one as standby backup.
  3. Dual WAN with failover.
  4. Routing for multiple uplinks/providers.
Penulis menggunakan wireless router WRT54GL 1.1 yang sudah diflash ke dd-wrt. Jika pembaca memiliki linksys yang belum diflash ke dd-wrt dan ingin mengetahui apakah linksysnya bisa diflash, silahkan cek di situs ini Router Database | www.dd-wrt.com. Setelah itu pelajari cara flash WRT54G di WRT54G v4 Installation Tutorial.
Then let’s rock ‘n roll :) .

Topologi Network
LAN
Network LAN : 192.168.1.0/24
IP IF0      : 192.168.1.254
IP Client (DHCP): 192.168.1.100 - 192.168.1.120

WAN 1
IP IF1   : 121.101.x.170
Gateway  : 121.101.x.254

WAN 2
IP IF2   : 121.101.y.170
Gateway  : 121.101.y.254

Setup DD-WRT
Jika telah selesai melakukan konfigurasi di atas maka klik tombol Save.

Menambah WAN port DD-WRT
Untuk mengkonfigurasikan IP address dari WAN 2, perlu di buat terlebih dahulu VLAN baru sebutlah namanya vlan1. Caranya dari web interface DD-WRT, klik menu VLANs dan konfigurasikan Port 4 sebagai VLAN baru.

Setup VLAN DD-WRT
Jangan lupa tekan tombol Save dan Apply untuk menyimpan konfigurasi yang sudah di buat.

Script Startup
Langkah selanjutnya adalah menulis script langsung di interface web dd-wrt. Penulis tidak mengikuti langkah sebagaimana yang ditulis Dani Firmansyah dan manual dd-wrt dari link di atas:
Selanjutnya masuk ke console dengan menggunakan telnet/ssh ke IP address lan (IF0) dan jalankan
command berikut ini:
 nvram set vlan0ports="1 2 3 5*"
 nvram set vlan1ports="4 5"
 nvram set vlan1hwname=et1
 nvram commit
 reboot

Dari menu web dd-wrt, masuk ke Administration > Commands. Isikan source code (edit seperlunya sesuai dengan topologi network anda) di bawah ini dan masukkan di kotak dialog Commands:
001# File Startup
002#
003# Descriptions:
004#   1. setup interface name for wan2
005#   2. setup routing table wan and wan2
006#   3. create load balancing
007#   4. write script cekkoneksi for dead gateway detection which will be run by cron.
008#
009# Created by Arief Yudhawarman (2009)
010# Email: awarmanff at yahoo.com
011#
012 
013# setup interface name for wan2
014#
015WAN2_IFNAME=vlan2
016WAN2_IPADDR=121.101.y.170
017WAN2_GATEWAY=121.101.y.254
018WAN2_NETMASK=255.255.255.0
019if [ "$(nvram get wan2_ipaddr)" != "$WAN2_IPADDR" ]; then
020   nvram set wan2_ifname=$WAN2_IFNAME
021   nvram set wan2_ipaddr=$WAN2_IPADDR
022   nvram set wan2_gateway=$WAN2_GATEWAY
023   nvram set wan2_netmask=$WAN2_NETMASK
024   nvram commit
025fi
026ifconfig $(nvram get wan2_ifname) up $(nvram get wan2_ipaddr) netmask $(nvram get wan2_netmask)
027#
028# setup routing table wan and wan2
029#
030ip rule flush
031ip rule add lookup main prio 32766
032ip rule add lookup default prio 32767
033ip rule add from $(nvram get wan_ipaddr) table 100 prio 100
034ip rule add fwmark 0x100 table 100 prio 101
035ip rule add from $(nvram get wan2_ipaddr) table 200 prio 200
036ip rule add fwmark 0x200 table 200 prio 201
037ip route flush table 100
038ip route flush table 200
039for TABLE in 100 200
040do
041   ip route | grep link | while read ROUTE
042   do
043      ip route add table $TABLE to $ROUTE
044   done
045done
046ip route add table 100 default via $(nvram get wan_gateway)
047ip route add table 200 default via $(nvram get wan2_gateway)
048#
049# load balancing
050#
051route del default
052ip route add default scope global nexthop via $(nvram get wan_gateway) dev $(nvram get wan_ifname) weight 1 \
053       nexthop via $(nvram get wan2_gateway) dev $(nvram get wan2_ifname) weight 1
054ip route flush cache
055#
056# write script cekkoneksi for dead gateway detection which will be run by cron.
057#
058echo '#!/bin/sh
059 
060# PARAM
061TIMEOUT=1
062ATTEMPT=5
063IPROUTE=/usr/sbin/ip
064ROUTE=/sbin/route
065SLEEP=/bin/sleep
066RM=/bin/rm
067NUM=0; WAN1=""; WAN2=""; SCORE=0
068 
069# SCORING
070#  0: All off
071#  2: WAN1 on
072#  4: WAN2 on
073#  6: WAN1 WAN2 on
074 
075# if not found /tmp/SCORE then created
076if [ ! -e /tmp/SCORE ]
077then
078  echo 6 > /tmp/SCORE
079fi
080 
081read OLDSCORE < /tmp/SCORE
082 
083# Fungsi
084PingGW() {
085i=1
086while [ $i -le $ATTEMPT ]
087do
088  if (/bin/ping -s 16 -W $TIMEOUT -c 1 $Gateway > /dev/null 2>&1)
089  then
090    touch -f /tmp/WAN${ID}-GOOD
091    break 1
092  fi
093  i=$(($i+1))
094done
095}
096 
097# cek koneksi WAN 1
098ID=1
099Gateway=$(nvram get wan_gateway)
100PingGW
101if [ -e /tmp/WAN1-GOOD ]
102then
103  LOGS="WAN 1 is ON...."
104  WAN1="nexthop via $(nvram get wan_gateway) dev $(nvram get wan_ifname) weight 1 "
105  NUM=`expr $NUM + 1`
106  SCORE=`expr $SCORE + 2`
107  $RM -f /tmp/WAN1-GOOD
108else
109  LOGS="WAN 1 is OFF..."
110fi
111 
112# cek koneksi modem WAN 2
113ID=2
114Gateway=$(nvram get wan2_gateway)
115PingGW
116if [ -e /tmp/WAN2-GOOD ]
117then
118  LOGS="${LOGS}WAN 2 is ON...."
119  WAN2="nexthop via $(nvram get wan2_gateway) dev $(nvram get wan2_ifname) weight 1 "
120  NUM=`expr $NUM + 1`
121  SCORE=`expr $SCORE + 4`
122  $RM -f /tmp/WAN2-GOOD
123else
124  LOGS="${LOGS}WAN 2 is OFF..."
125fi
126 
127echo $SCORE > /tmp/SCORE
128 
129if [ ! $SCORE -eq $OLDSCORE ]
130then
131  ##echo -e $LOGS >> /tmp/koneksi.log
132  # eksekusi loadbalancing baru
133  if [ $NUM -ge 1 ]
134  then
135    $ROUTE del default
136    $IPROUTE route add default scope global $WAN1 $WAN2
137    $SLEEP 1
138    $IPROUTE ro fl cache
139  else
140    $ROUTE del default
141    $SLEEP 1
142    $IPROUTE ro fl cache
143  fi
144fi' > /tmp/cekkoneksi
145chmod 755 /tmp/cekkoneksi
Keterangan:
  1. Baris 015-026: Setup interface untuk wan 2.
  2. Baris 030-047: Setup routing table wan (wan 1) and wan2.
  3. Baris 051-054: Buat load balancing.
  4. Baris 058-144: Buat script cekkoneksi untuk dead gateway detection dan tulis ke /tmp/cekkoneksi.
  5. Baris 145: chmod 755 /tmp/cekkoneksi agar bisa dieksekusi.
Setelah selesai klik tombol Save Startup.

Script Firewall
Sekarang buat firewall untuk NAT dual-wan dan melindungi router dd-wrt dari trafik yang tidak diinginkan. Script firewall ini akan diletakkan di baris teratas firewall yang telah diciptakan oleh dd-wrt (default).
01#
02# Use Firewall rule already provided by dd-wrt and make a new one
03#
04#
05# DENY_PORTS
06#
07iptables -N DENY_PORTS
08iptables -F DENY_PORTS
09iptables -A DENY_PORTS -p tcp --dport 137:139 -j DROP
10iptables -A DENY_PORTS -p tcp --sport 137:139 -j DROP
11iptables -A DENY_PORTS -p tcp --dport 445 -j DROP
12iptables -A DENY_PORTS -p tcp --sport 445 -j DROP
13iptables -A DENY_PORTS -p tcp --dport 1433 -j DROP
14iptables -A DENY_PORTS -p tcp --sport 1433 -j DROP
15iptables -A DENY_PORTS -p tcp --dport 2049 -j DROP
16iptables -A DENY_PORTS -p tcp --sport 2049 -j DROP
17iptables -A DENY_PORTS -p tcp --dport 5432 -j DROP
18iptables -A DENY_PORTS -p tcp --sport 5432 -j DROP
19iptables -A DENY_PORTS -p tcp --dport 5999:6063 -j DROP
20iptables -A DENY_PORTS -p tcp --sport 5999:6063 -j DROP
21iptables -A DENY_PORTS -p tcp --dport 5900:5910 -j ACCEPT
22iptables -A DENY_PORTS -p tcp --sport 5900:5910 -j ACCEPT
23iptables -A DENY_PORTS -p tcp --dport 9704 -j DROP
24iptables -A DENY_PORTS -p tcp --sport 9704 -j DROP
25iptables -A DENY_PORTS -p tcp --dport 20034 -j DROP
26iptables -A DENY_PORTS -p tcp --dport 12345:12346 -j DROP
27iptables -A DENY_PORTS -p tcp --sport 27665 -j DROP
28iptables -A DENY_PORTS -p tcp --dport 27665 -j DROP
29iptables -A DENY_PORTS -p udp --sport 27444 -j DROP
30iptables -A DENY_PORTS -p udp --dport 27444 -j DROP
31iptables -A DENY_PORTS -p udp --sport 31335 -j DROP
32iptables -A DENY_PORTS -p udp --dport 31335 -j DROP
33iptables -A DENY_PORTS -p tcp --dport 31337 -j DROP
34iptables -A DENY_PORTS -p udp --dport 31337 -j DROP
35iptables -A DENY_PORTS -p tcp --sport 31337 -j DROP
36iptables -A DENY_PORTS -p udp --sport 31337 -j DROP
37#
38# DST_EGRESS
39#
40iptables -N DST_EGRESS
41iptables -F DST_EGRESS
42## Class A Reserved
43iptables -A DST_EGRESS -d 10.0.0.0/8 -j DROP
44## Class B Reserved
45iptables -A DST_EGRESS -d 172.16.0.0/12 -j DROP
46## Class C Reserved
47iptables -A DST_EGRESS -d 192.168.0.0/16 -j DROP
48## Class D Reserved
49iptables -A DST_EGRESS -d 224.0.0.0/4 -j DROP
50## Class E Reserved
51iptables -A DST_EGRESS -d 240.0.0.0/5 -j DROP
52#
53iptables -I FORWARD 1 -p tcp -j DENY_PORTS
54iptables -I FORWARD 1 -p udp -j DENY_PORTS
55iptables -I FORWARD 1 -p all -j DST_EGRESS        
56 
57#
58# SNAT
59#
60iptables -t nat -D POSTROUTING 1
61iptables -t nat -D POSTROUTING 1
62iptables -t nat -D POSTROUTING 1
63iptables -t nat -A POSTROUTING -o $(nvram get wan_ifname) -j SNAT --to-source $(nvram get wan_ipaddr)
64iptables -t nat -A POSTROUTING -o $(nvram get wan2_ifname) -j SNAT --to-source $(nvram get wan2_ipaddr)
Setelah selesai klik tombol Save Firewall.

Hasilnya seperti gambar di bawah:
Administration Commands DDWRT

Cron/Schedule untuk cek koneksi
Scrip cekkoneksi telah dibuat pada langkah di atas, selanjutnya buat schedule atau cron job yang akan eksekusi script tersebut setiap menit. Caranya masuk ke menu Administration > Managemenet dan isikan di kotak dialog Additional Cron Jobs:
* * * * * root /tmp/cekkoneksi

Administration Cronjob DD-WRT
Klik tombol Save dan selanjutnya langkah terakhir klik Apply Settings.
Jangan lupa membakup konfigurasi yang telah dibuat: Administration > Backup
Tambahan, untuk tes apakah script cekkoneksi berjalan sesuai yang diharapkan, cabut 1 koneksi wan (wan 1 atau wan 2). Tes koneksi dengan ping atau browsing setelah 1 menit apakah masih ada gangguan atau tidak.

Tidak ada komentar: