判斷上行介面是否可用

判斷上行介面是否可用

我有一個防火牆系統,由兩個到不同 ISP 的上行鏈路提供服務。我使用 shorewall 來管理防火牆;它透過連接追蹤對兩個介面上的流量進行負載平衡。一切都很好。

我編寫了一些腳本,當檢測到其中一個介面不再可用時,可以啟動/關閉介面。我不喜歡 shorewall 提出的 LSM(Ubuntu 中沒有),而是選擇使用 netplugd 進行介面監控,並選擇 cron 中的 ping 腳本進行連接測試。

ping 腳本基本上執行單一ping -I eth[01] 8.8.8.8.如果 ping 失敗,它會再次嘗試,如果失敗,它會告訴 shorewall 關閉該介面。

當防火牆使介面停止運作時,我的問題發生了,然後我就無法再執行ping.它始終響應,Destination Host Unreachable但 ping 直接網關除外。

有沒有一種方法可以在不透過介面發送常規流量的情況下測試介面上的真實網路連線?

這是我寫的腳本:

檢查介面: (從 cron 和 netplugd 事件運行)

#!/bin/bash
#
# Verify state of interfaces
#
google_ping() {
        if ! ping -I "$1" -n -c1 -w1 -q 8.8.8.8 >/dev/null 2>&1; then
                # Try harder
                ping -I "$1" -n -c2 -w5 -q 8.8.8.8 >/dev/null 2>&1
        fi
}

REFRESH=
for i in eth0 eth1; do
        if google_ping $i; then
                if ! [ -e /tmp/shorewall-$i.up ]; then
                        echo Interface $i came up
                        touch /tmp/shorewall-$i.up
                        REFRESH=true
                fi
        else
                if [ -e /tmp/shorewall-$i.up ]; then
                        echo Interface $i went down
                        rm /tmp/shorewall-$i.up
                        REFRESH=true
                fi
        fi
done
if [ -n "$REFRESH" ]; then
        echo Kicking shorewall...
        /sbin/shorewall refresh >/dev/null
fi

(我知道 shorewall 允許您關閉接口,/var/lib/shorewall/firewall disable eth1但我遇到了一些不穩定的情況,所以我只是使用刷新)

/etc/shorewall/isusable:

# Used by shorewall to check if interface is usable
# This is sourced instead of executed so don't exit but return

# Interface is up
if [ -e "/tmp/shorewall-$1.up" ]; then
        return 0
elif ls /tmp/shorewall-*.up >/dev/null 2>&1; then
        return 1
else
        # No interfaces are up - pretend they're up and hope for the best
        return 0
fi

相關內容