Implementing Firewall for VMs with IPtables

Jika Anda sudah familiar dengan penggunaan security group saat membuat atau menambahkan VM, Anda mungkin penasaran bagaimana Firewall tersebut dibuat.

Pada panduan ini akan membahas cara menerapkan firewall menggunakan IPtables untuk Virtual Machine (VM).

Prequites

Katakanlah Anda memiliki sebuah VM dengan interface seperti berikut.

# virsh domiflist vm1
 Interface   Type     Source   Model    MAC
-----------------------------------------------------------
 vnet1       bridge   net0     virtio   52:54:00:9c:52:a4

Selanjutnya pastikan Host server sudah terinstall iptables.

Buat Chain

Buat chain baru dengan nama seperti berikut.

iptables -N input-vnet1
iptables -N output-vnet1
iptables -N sg-chain
iptables -N sg-fallback
iptables -N stateful-vnet1

Kemudian tambahkan rule untuk mengarahkan lalu lintas jaringan dari VM interface ke sg-chain

iptables -A FORWARD -m physdev --physdev-in vnet1 --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to sg-chain." -j sg-chain
iptables -A FORWARD -m physdev --physdev-out vnet1 --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to sg-chain." -j sg-chain
iptables -A INPUT -m physdev --physdev-in vnet1 --physdev-is-bridged -m comment --comment "Direct incoming traffic from VM to output-vnet1." -j output-vnet1

Rule sg-chain

Buat rule di sg-chain untuk mengarahkan ke chain input dan output.

iptables -A sg-chain -m physdev --physdev-in vnet1 --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j output-vnet1
iptables -A sg-chain -m physdev --physdev-out vnet1 --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j input-vnet1
iptables -A sg-chain -j ACCEPT

Lalu tambahkan rule pada chain sg-fallback untuk memblokir lalu lintas yang tidak sesuai.

iptables -A sg-fallback -m comment --comment "Default drop rule for unmatched traffic." -j DROP

Rule input-vnet1

Tambahkan rule berikut pada chain input-vnet1.

iptables -A input-vnet1 -p tcp -m tcp --dport 22 -m comment --comment "Allow SSH." -j RETURN
iptables -A input-vnet1 -d 192.168.100.30/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
iptables -A input-vnet1 -d 255.255.255.255/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
iptables -A input-vnet1 -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN
iptables -A input-vnet1 -m conntrack --ctstate INVALID -j DROP
iptables -A input-vnet1 -m comment --comment "Send unmatched traffic to sg-fallback." -j sg-fallback

Pada rule nomor 2, ubah IP sesuai dengan yang akan dipasang ke dalam VM.

Untuk menambahkan rule lain, gunakan perintah berikut agar rule firewall tetap terurut dan berfungsi dengan baik.

iptables -I input-vnet1 [RULE]

Rule output-vnet1

Tambahkan rule berikut pada chain output-vnet1.

iptables -A output-vnet1 -p icmp -m comment --comment "Allow outgoing ICMP." -j RETURN
iptables -A output-vnet1 -p tcp -m comment --comment "Allow outgoing All TCP." -j RETURN
iptables -A output-vnet1 -p udp -m comment --comment "Allow outgoing All UDP." -j RETURN
iptables -A output-vnet1 -s 0.0.0.0/32 -d 255.255.255.255/32 -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN
iptables -A output-vnet1 -j stateful-vnet1
iptables -A output-vnet1 -p udp -m udp --sport 68 --dport 67 -m comment --comment "Allow DHCP client traffic." -j RETURN
iptables -A output-vnet1 -p udp -m udp --sport 67 --dport 68 -m comment --comment "Prevent DHCP Spoofing by VM." -j DROP
iptables -A output-vnet1 -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN
iptables -A output-vnet1 -m conntrack --ctstate INVALID -j DROP
iptables -A output-vnet1 -m comment --comment "Send unmatched traffic to the fallback chain." -j sg-fallback

Untuk menambahkan rule lain, gunakan perintah berikut agar rule firewall tetap terurut dan berfungsi dengan baik.

iptables -I output-vnet1 [RULE]

Rule stateful-vnet1

Tambahkan rule berikut pada chain stateful-vnet1.

iptables -A stateful-vnet1 -s 192.168.100.30/32 -m mac --mac-source 52:54:00:9c:52:a4 -m comment --comment "Allow traffic from defined IP/MAC pairs." -j RETURN
iptables -A stateful-vnet1 -m comment --comment "Drop traffic without an IP/MAC allow rule." -j DROP

Pada rule nomor 1, ubah IP dan MAC sesuai dengan yang akan dipasang ke dalam VM.

Rule ini akan memastikan paket atau lalu lintas sesuai dengan IP dan MAC yang telah ditentukan. Jika tidak sesuai maka paket akan di DROP.