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.