我有一個防火牆系統,由兩個到不同 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