Filter massive ip address di Linux
Traffic policy merupakan hal yang umum di jaringan, salah satu praktiknya untuk menerapkan policy yang berbeda antara yang berasal dari network A dan network B. Pada router berbasis Linux, biasanya menggunakan Iptables untuk filtering.
Problemnya adalah ketika ip address atau network prefix yang difilter sangat banyak, dalam kasus ini prefix mendekati 100 ribu network prefix. Dengan Iptables tidak akan bisa karena pertama, performance degradation dan yang kedua akan muncul pesan error memory allocation failed karena terlalu banyak rule. Karena itu, ipset yang digunakan bersamaan dengan iptables.
Hardware yang kami gunakan sebagai router adalah hardware server dengan 8 core prosesor Intel Xeon. Sistem operasi router menggunakan Vyatta, router ini menjalankan dynamic routing protocol BGP full prefix dari beberapa network provider dan OSPF untuk interior gateway protocol.
Sedikit tentang Vyatta, Vyatta adalah sistem operasi router yang berbasis Debian dan mempunyai command line interface yang mirip dengan Juniper JunOS. Vyatta awalnya merupakan project Open Source, tapi pada tahun 2012 Vyatta diakuisisi oleh Brocade dan tidak lagi Open. Pada tahun 2013, para developer komunitas Vyatta membuat project sistem operasi Open Source berbasis Vyatta dengan nama VyOS.
Karena Vyatta merupakan OS berbasis Debian, maka repository pun menggunakan bisa menggunakan Debian. Instalasi ipset cukup dengan apt-get
apt-get install ipset
Setelah ipset terinstall, langkah selanjutnya adalah membuat nama ipset dan memasukkan ip address ke set tersebut. Disini set menggunakan nama NETLIST. Ada beberapa mode hash yang harus dipilih dalam membuat set, untuk list ip address bisa menggunakan hash ip, untuk network prefix menggunakan hash net. Kemudian, secara default maximum list dalam set adalah 64 ribu, jadi kalau list melebihi 64 ribu harus di set secara eksplisit.
ipset create NETLIST hash:net maxelem 100000
NETLIST
: Nama ip set.hash:net
: Set ipset menggunakan network prefix.maxelem 100000
: Set maksimum list entry sebanyak 100 ribu.
Setelah itu input network prefix ke set
ipset -A NETLIST 192.168.1.0/24
ipset -A NETLIST 172.16.3.0/24
...
Untuk list yang banyak sekali, lebih gampang menggunakan script.
Setelah NETLIST
terisi dengan prefix atau ip address, tinggal matching iptables. Misalnya untuk set dscp traffic yang berasal dari ip address yang ada di NETLIST
.
iptables -t mangle -A PREROUTING -m set --match-set NETLIST src -j DSCP --set-dscp-class AF11
-t mangle -A PREROUTING
: Tambahkan rule di table mangle chain PREROUTING.-m set
: Match ipset--match-set NETLIST src
: Match source address dari ipset NETLIST.-j DSCP
: Jump ke target DSCP.--set-dscp-class AF11
: Set dscp 0x0a.
Dengan ipset yang berisi hampir 100 ribu prefix, hasil tes dengan hardware spesifikasi diatas tidak ada degradasi performance, hanya penambahan delay sekitar 1 mili detik.
Terakhir, seperti halnya iptables, ipset hanya tersimpan di volatile memory dan hilang setelah reboot. Cara untuk membuat rule persistent tidak dibahas di artikel ini.