2

У меня есть система брандмауэра, которая обслуживается двумя каналами связи с разными провайдерами. Я использую 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

0