Shell script to switch default network route
สมมติว่ามี network ที่มีโครงสร้างตามรูป
ซึ่งมี 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