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