GRE (Generic Routing Encapsulation) merupakan protokol tunnel yang dikembangkan oleh Cisco Systems untuk encapsulate berbagai macam network layer di dalam virtual point-to-point links atau point-to-multipoint links melalui jaringan internet.
GRE tunnel berguna dalam situasi tertentu, seperti memberikan perlindungan server dari serangan DDOS menggunakan server yang support DDOS Protection.
Prerequisites
Sebelum memulai, setidaknya Anda harus memiliki dua server dengan akses root
. Pada panduan ini akan menggunakan Server A dan Server B dengan pengalamatan seperti berikut.
Server A - server tempat semua klient akan terhubung.
- IP: 192.168.160.35
- GRE tunnel internal IP: 10.0.0.1
Server B - server yang menjalankan aplikasi.
- IP: 192.168.160.36
- GRE tunnel internal IP: 10.0.0.2
Module loading
Untuk setting GRE tunnel di linux, Anda perlu memastikan modul ip_gre
sudah dimuat di kernel. Eksekusi perintah berikut pada Server A dan Server B.
modprobe ip_gre
lsmod | grep -i gre
Apabila kernel server support GRE maka akan menampilkan output seperti berikut.
# lsmod | grep -i gre
ip_gre 32768 0
ip_tunnel 28672 1 ip_gre
gre 16384 1 ip_gre
Agar modul aktif setelah server reboot.
echo ip_gre > /etc/modules-load.d/ip_gre.conf
Untuk meneruskan lalu lintas masuk dan keluar melalui GRE tunnel akan membutuhkan iptables
dan iproute
yang seharusnya sudah terinstall di linux.
Jika belum diinstall, gunakan perintah berikut.
yum -y install iproute iptables
Setup GRE tunnels
Aktfikan ip forwarding pada Server A
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/ip_forwarding.conf
sysctl -p /etc/sysctl.d/ip_forwarding.conf
Selanjutnya buat interface baru menggunakan GRE tunnel.
ip tunnel add gre1 local 192.168.160.35 remote 192.168.160.36 ttl 255
ip addr add 10.0.0.1/30 dev gre1
ip link set gre1 up
Eksekusi perintah yang sama di Server B dengan menyesuaikan IP.
ip tunnel add gre1 local 192.168.160.36 remote 192.168.160.35 ttl 255
ip addr add 10.0.0.2/30 dev gre1
ip link set gre1 up
Ping test
Lakukan test ping untuk memastikan GRE tunnel berhasil terhubung.
Server A
ping 10.0.0.1
Server B
ping 10.0.0.2
New routes implementation
Setting route untuk memastikan data yang masuk melalui GRE tunnel dapat ditangani dengan benar.
Eksekusi perintah berikut di Server B
echo '100 GRE' >> /etc/iproute2/rt_tables
ip rule add from 10.0.0.0/30 table GRE
ip route add default via 10.0.0.1 table GRE
NAT configuration
NAT digunakan untuk meneruskan trafik melalui GRE tunnel.
Pada Server A eksekusi
iptables -t nat -A POSTROUTING -s 10.0.0.0/30 ! -o gre+ -j SNAT --to-source 192.168.160.35
Lakukan test koneksi keluar pada Server B.
Test pertama dengan perintah curl
curl http://www.cpanel.net/showip.cgi --interface 10.0.0.2
Jika yang tampil IP public server A berarti GRE tunnel sudah berfungsi.
Test kedua dengan perintah ping
# ping -c5 8.8.8.8 -I gre1
PING 8.8.8.8 (8.8.8.8) from 10.0.0.2 gre1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=112 time=26.0 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=112 time=26.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=112 time=25.9 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=112 time=26.1 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=112 time=25.9 ms
Port forwarding
Di Server A jalankan perintah berikut untuk mengizinkan semua trafik masuk dan keluar dari Server B.
iptables -A FORWARD -d 10.0.0.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.0.0.2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Sebagai contoh, untuk forward semua trafik ke Webserver (Port TCP 80) yang ada di Server B. Maka tambahkan aturan firewall NAT berikut di Server A
iptables -t nat -A PREROUTING -d 192.168.160.35 -p TCP -m TCP --dport 80 -j DNAT --to-destination 10.0.0.2
Install nginx di Server B
yum -y install nginx
Kemudian test akses IP Server A melalui browser Anda.