Shell script to switch default network route

สมมติว่ามี network ที่มีโครงสร้างตามรูป

์Network diagram

ซึ่งมี router อยู่ 2 ตัวคือของ Fiber ISP กับ LTE router ทีนี้ถ้าเราต้องการสลับการใช้งาน router 2 ตัวนี้ ให้เป็น default route ที่เครื่อง PC (10.10.0.111) โดยที่การสลับ default route ก็ให้เปลี่ยน DNS setting ด้วย จะทำให้อย่างไร จุดมุ่งหมายก็คือให้การสลับ route ทำได้ง่ายๆ แค่การกด shortcut key บนคีย์บอร์ด

ทางออกคือ shell script

Bash / openSUSE Tumbleweed / XFCE desktop

#!/bin/bash

fibregw="10.10.0.1"
piholedns="10.10.0.42,10.10.0.152"

ltegw="10.10.0.199"
ltedns="10.10.0.199"

dns_ip=$(nmcli device show eno1 | grep IP4.DNS | cut -f2 -d':' | tr -d ' ' | sort | tr '\n' ',')
if [ "$dns_ip" == "10.10.0.152,10.10.0.42," ]; then
    echo "Using Fibre WAN"
    echo "Switching to LTE"
    dns=$ltedns
else
    echo "Using LTE WAN"
    echo "Switching to Fibre WAN"
    dns=$piholedns
fi

sudo nmcli con mod 'eno1' ipv4.ignore-auto-dns yes
sudo nmcli con mod 'eno1' ipv4.dns "$dns"
sudo nmcli con down eno1
sudo nmcli con up eno1

if [ "$dns" == "$ltedns" ]; then
    # add route to LTE router
    sudo ip route add default via $ltegw metric 99
fi

echo "flushing DNS"
sudo rcnscd restart

Powershell / Windows 11

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process pwsh.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

$ifidx = 4
# use Get-NetAdapter to see the index of an adapter

$ltedns = ('10.10.0.199')
$lterouter = '10.10.0.199'

$piholedns = ('10.10.0.42','10.10.0.152')
$aisrouter = '10.10.0.1'

$dns_server=(Get-DnsClientServerAddress -InterfaceIndex $ifidx -AddressFamily IPv4 ).ServerAddresses

if ( $dns_server -contains('10.10.0.42') -Or $dns_server -contains('10.10.0.152') ) {
    Write-Host "using AIS fibre wan"
    Write-Host "change DNS server to : $ltedns"
    Set-DnsClientServerAddress -InterfaceIndex $ifidx -ServerAddresses $ltedns
    Remove-NetRoute -DestinationPrefix 0.0.0.0/0 -NextHop $aisrouter -Confirm:$false
    New-NetRoute -DestinationPrefix 0.0.0.0/0 -InterfaceIndex 4 -NextHop $lterouter -PolicyStore ActiveStore
} else {
    Write-Host "using LTE wan"
    Write-Host "change DNS server to : $piholedns"
    Set-DnsClientServerAddress -InterfaceIndex $ifidx -ServerAddresses $piholedns
    Remove-NetRoute -DestinationPrefix 0.0.0.0/0 -NextHop $lterouter -Confirm:$false
    New-NetRoute -DestinationPrefix 0.0.0.0/0 -InterfaceIndex 4 -NextHop $aisrouter -PolicyStore ActiveStore
}

$dns_server=(Get-DnsClientServerAddress -InterfaceIndex $ifidx -AddressFamily IPv4 ).ServerAddresses
Write-Host 'DNS:'
Write-Host $dns_server