У меня есть система брандмауэра, которая обслуживается двумя каналами связи с разными провайдерами. Я использую shorewall для управления брандмауэром; он балансирует трафик через оба интерфейса с отслеживанием соединения. Все это прекрасно работает.
Я подготовил несколько сценариев для поднятия / отключения интерфейсов, когда он обнаруживает, что один из них больше не используется. Мне не понравился LSM, который предлагает shorewall (его нет в Ubuntu), и вместо этого я выбрал netplugd для мониторинга интерфейса и скрипт ping в cron для тестирования подключения.
Скрипт ping в основном выполняет один ping -I eth[01] 8.8.8.8
. Если эхо-запрос не выполняется, он пытается снова, а если это не удается, он сообщает shorewall, чтобы отключить интерфейс.
Моя проблема возникает, когда брандмауэр вывел интерфейс из строя, тогда я больше не могу выполнять ping
. Он всегда отвечает: « Destination Host Unreachable
за исключением проверки связи с непосредственным шлюзом.
Есть ли способ проверить реальное подключение к Интернету через интерфейс, не отправляя через него обычный трафик?
Вот сценарии, которые я написал:
check_interfaces: (запускается из 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