Определите, можно ли использовать интерфейс восходящей линии связи

Определите, можно ли использовать интерфейс восходящей линии связи

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

Связанный контент