Sebelumnya saya sempat menuliskan bagaimana cara untuk melakukan konfigurasi LVM di server Linux (Ansible : Konfigurasi Volume LVM). Kali ini saya akan menunjukan atau mencontohkan bagaimana caranya untuk melakukan konfigurasi iptables di server Linux. Iptables ini biasanya digunakan untuk melakukan pemblokiran ataupun pembatasan terhadap traffic incoming dari server lain ke server Linux bersangkutan ataupun traffic outgoing dari server Linux ke server lain.
Pada tulisan ini, saya mengambil contoh kasus terkait dengan email server. Email server yang saya miliki sudah menggunakan server ASAV eksternal sebagai proteksi dari ancaman email-email spam ataupun malware, maka gerbang utama email-email yang masuk adalah server ASAV bukan email server. Email akan tetap dikirimkan ke email server setelah email dilakukan scan oleh server ASAV. Jadi secara prinsip tidak menerima traffic incoming dari email server pengirim, melainkan hanya traffic incoming dari server ASAV.
Excellent sendiri kebetulan juga menyediakan layanan ASAV untuk mencegah kiriman email spam ataupun malware. Bagi rekan-rekan yang berminat untuk membeli menggunakan layanan ASAV dari Excellent bisa langsung kontak & tanya-tanya ke email sales@excellent.co.id ya 🙂 .
Jika demikian, maka kita bisa melakukan blocking traffic incoming port 25 (Port default email), dan hanya allow traffic incoming port 25 dari server-server ASAV saja. Untuk melakukan pembatasan incoming port 25 tersebut atau pembatasan sejenis, rekan-rekan harus tahu IP address yang digunakan oleh server yang hendak di allow, dalam kasus kali ini saya harus tahu IP address yang digunakan oleh server-server ASAV.
Pada simulasi kali ini saya menggunakan 3 server dengan IP address sebagai berikut yang 2 diantaranya merupakan email server (Target 1 & Target 2).
- Server Master Ansible (Centos 7) : 10.10.10.4
- Server Target 1 (Centos 7) : 10.10.10.5
- Server Target 2 (Centos 7) : 10.10.10.6
Selain itu, simulasi ini juga dilengkapi dengan server asav yang akan di allow traffic port 25 menuju kedua mail server yang ada.
- Server ASAV 1 : 50.50.50.25
- Server ASAV 2 : 55.55.55.25
- Server ASAV 3 : 60.60.60.25
- Server ASAV 4 : 66.66.66.25
- Server ASAV 5 : 70.70.70.25
Catatan : Semua IP server yang hendak di allow harus dimasukan ke dalam ansible. Apabila ada 5 server, maka ada 5 IP yang harus dimasukan. Apabila ada 6 server, maka ada 6 IP yang harus dimasukan dan seterusnya.
Berikut adalah langkah-langkah yang dilakukan untuk melakukan konfigurasi iptables.
- Instalasi ansible pada server master dengan perintah berikut (Cukup dilakukan di sisi server master saja, karena Ansible merupakan tools yang agentless atau dalam kata lain tidak membutuhkan agent di sisi server child yang hendak dikonfigurasi)
-
# yum install ansible -y
- Edit file /etc/ansible/hosts lalu tambahkan baris berikut
-
target1 ansible_host=10.10.10.5 target2 ansible_host=10.10.10.6
- Dari server master, pastikan bisa SSH 6e server target 1 & 2 menggunakan user root
- Jika server master belum memiliki SSH key maka rekan-rekan bisa generate dengan perintah berikut. Namun jika SSH key sudah ada, maka langkah ini bisa di skip
-
# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): (enter) Enter passphrase (empty for no passphrase): (enter) Enter same passphrase again: Your identification has been saved in /root/.ssh/key. Your public key has been saved in /root/.ssh/key.pub. The key fingerprint is: SHA256:2sz22XyFny/3ICUsxUEk6P/f4ThJf9w8yUA//SMn6pM root@master.raihan.net The key's randomart image is: ........
- Konfigurasi SSH less pass dari master ke akun root server target 1 & 2 dengan perintah berikut
-
# ssh-copy-id root@10.10.10.5 # ssh-copy-id root@10.10.10.6
- Jalankan perintah berikut untuk memastikan server ansible master bisa SSH ke target 1 & 2 menggunakan user root
-
# ansible all -m ping --user root target1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } target2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
- Membuat dan masuk ke direktori baru khusus ansible dengan perintah berikut. Pada bagian ini sebenarnya bebas mau dilakukan atau tidak, namun saya pribadi biasanya memisahkan file-file ansible ke dalam 1 direktori khusus supaya lebih rapih
-
# mkdir ansible # cd ansible
- Membuat & edit file ansible untuk konfigurasi iptables pada server target. Ekstensi file yang digunakan adalah .yml, disini saya menggunakan nama iptables-25.yml
-
- hosts: all vars: server_asav: - ip: 127.0.0.1 - ip: 50.50.50.25 - ip: 55.55.55.25 - ip: 60.60.60.25 - ip: 66.66.66.25 - ip: 70.70.70.25 tasks: - name: Block Incoming Port 25 iptables: action: append chain: INPUT destination_port: 25 protocol: tcp jump: DROP - name: Allow Incoming Port 25 From ASAV iptables: action: insert chain: INPUT source: "{{ item.ip }}/32" destination_port: 25 protocol: tcp jump: ACCEPT loop: "{{ server_asav }}" - name: Install Package Permanent Iptables package: name: iptables-services state: latest - name: Make Iptables Service Autostart shell: systemctl enable iptables - name: Make Iptables Rules Permanent shell: service iptables save
- Save file iptables-25.yml
- Setelah membuat file konfigurasi ansible tersebut, jalankan perintah ansible berikut untuk melakukan konfigurasi iptables di server target dengan perintah berikut
-
PLAY [all] *********************************************************************** TASK [Gathering Facts] *********************************************************** ok: [target1] ok: [target2] TASK [Block Incoming Port 25] **************************************************** changed: [target2] changed: [target1] TASK [Allow Incoming Port 25 From ASAV] ****************************************** changed: [target1] => (item={u'ip': u'127.0.0.1'}) changed: [target2] => (item={u'ip': u'127.0.0.1'}) changed: [target1] => (item={u'ip': u'50.50.50.25'}) changed: [target2] => (item={u'ip': u'50.50.50.25'}) changed: [target1] => (item={u'ip': u'55.55.55.25'}) changed: [target2] => (item={u'ip': u'55.55.55.25'}) changed: [target1] => (item={u'ip': u'60.60.60.25'}) changed: [target2] => (item={u'ip': u'60.60.60.25'}) changed: [target2] => (item={u'ip': u'66.66.66.25'}) changed: [target1] => (item={u'ip': u'66.66.66.25'}) changed: [target1] => (item={u'ip': u'70.70.70.25'}) changed: [target2] => (item={u'ip': u'70.70.70.25'}) TASK [Install Package Permanent Iptables] **************************************** changed: [target1] changed: [target2] TASK [Make Iptables Service Autostart] ******************************************* changed: [target1] changed: [target2] TASK [Make Iptables Rules Permanent] ********************************************* changed: [target1] changed: [target2] PLAY RECAP *********************************************************************** target1 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 target2 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Setelah itu, jalankan perintah berikut dari salah satu server target untuk validasi iptables di server target
-
[root@target1 ~]# iptables -nL INPUT Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 70.70.70.25 0.0.0.0/0 tcp dpt:25 ACCEPT tcp -- 66.66.66.25 0.0.0.0/0 tcp dpt:25 ACCEPT tcp -- 60.60.60.25 0.0.0.0/0 tcp dpt:25 ACCEPT tcp -- 55.55.55.25 0.0.0.0/0 tcp dpt:25 ACCEPT tcp -- 50.50.50.25 0.0.0.0/0 tcp dpt:25 ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:25 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25