VYOS: Monitoring Static Table Routing di vyOS Menggunakan Python

monitoring route ini bisa diset intervalnya sesuai keinginan, contoh ini 10 detik, karena di task-manager vyos terbatas mentok 1 menit itu kelamaan, makanya saya pakai python supaya bisa dibawah 1menit.


monitoring ini saya gunakan untuk mengecek host dari next-hop jika ada down makan akan saya hapus konfigurasinya, jika host sudah UP akan ditambah kembali.


ini saya buat untuk menangani DNS server/ DNSTRUST-NG kominfo di VyOS


1. Script monitoring

buat file /config/scripts/route_monitor.py

import os

import subprocess

import time


NEXT_HOP = "10.10.10.2"

ROUTE_TABLE = "100"

CHECK_COUNT = 3

PING_INTERVAL = 1

CHECK_INTERVAL = 10  # Interval pengecekan dalam detik



def set_env_var(key, value):

    """Set environment variable."""

    os.environ[key] = value



def get_env_var(key, default=None):

    """Get environment variable with a default value."""

    return os.environ.get(key, default)



def is_host_up(host):

    """Periksa apakah host dapat dijangkau dengan ping."""

    try:

        subprocess.run(

            ["ping", "-c", str(CHECK_COUNT), "-i", str(PING_INTERVAL), host],

            stdout=subprocess.PIPE,

            stderr=subprocess.PIPE,

            check=True,

        )

        return True

    except subprocess.CalledProcessError:

        return False



def is_route_exist():

    """Periksa apakah route sudah ada di tabel routing menggunakan vtysh."""

    try:

        command = f"vtysh -c 'show ip route table {ROUTE_TABLE}'"

        result = subprocess.run(

            command,

            shell=True,  # Perlu shell=True untuk menjalankan perintah CLI

            stdout=subprocess.PIPE,

            text=True,

            check=True,

        )

        return NEXT_HOP in result.stdout

    except subprocess.CalledProcessError:

        return False



def add_route():

    """Tambahkan static route ke VyOS."""

    try:

        commands = f"""

        source /opt/vyatta/etc/functions/script-template

        configure

        set protocols static table {ROUTE_TABLE} route 0.0.0.0/0 next-hop {NEXT_HOP}

        commit

        save

        exit

        """

        subprocess.run(["vbash", "-c", commands], check=True, text=True)

    except subprocess.CalledProcessError:

        pass



def remove_route():

    """Hapus static route dari VyOS."""

    try:

        commands = f"""

        source /opt/vyatta/etc/functions/script-template

        configure

        delete protocols static table {ROUTE_TABLE}

        commit

        save

        exit

        """

        subprocess.run(["vbash", "-c", commands], check=True, text=True)

    except subprocess.CalledProcessError:

        pass



def main():

    """Fungsi utama untuk memeriksa dan memperbarui status."""

    last_host_status = get_env_var("LAST_HOST_STATUS", "None")


    current_host_status = is_host_up(NEXT_HOP)

    current_route_status = is_route_exist()


    if str(current_host_status) != last_host_status:

        if current_host_status:

            if not current_route_status:

                add_route()

        else:

            if current_route_status:

                remove_route()


    # Simpan status saat ini di environment

    set_env_var("LAST_HOST_STATUS", str(current_host_status))



if __name__ == "__main__":

    while True:

        main()

        time.sleep(CHECK_INTERVAL)


2. Berikan Hak Eksekusi


chmod +x /config/scripts/route_monitor.py


3. Menggunakan systemd untuk Daemon


Buat file service di /etc/systemd/system/route_monitor.service

[Unit]
Description=Route Monitor Script
After=network.target

[Service]
ExecStart=/usr/bin/python3 /config/scripts/route_monitor.py
Restart=always
User=root

[Install]
WantedBy=multi-user.target

4. Aktifkan


sudo systemctl daemon-reload
sudo systemctl enable route_monitor
sudo systemctl start route_monitor