LINUX.ORG.RU

Избранные сообщения MindLess

Маршрутизация через iptables/iproute2

Форум — Admin

Добрый день.

Что то сегодня все из рук валится, подскажите, ткните носом в ошибку, уже запарился ловить ее.

Есть.
Подсеть белых IP x.x.x.56/29 GW x.x.x.57

Весь трафик ходит исключительно через шлюз
Внешний интерфейс vl999 c IP x.x.x.60/29

Внутренний интерфейс vl120 без IP
в этом интерфейсе живет комп с белым IP x.x.x.62/29 GW x.x.x.57

Необходимо организовать маршрутизацию для компа x.x.x.62/29 во внешний мир и обратно.

Делаю

ip link add link eth0 name vl999 type vlan id 999
ip addr add x.x.x.60/29 dev vl999
ip link set vl999 up
ip route add default via x.x.x.57

ip link add link eth0 name vl120 type vlan id 120
ip link set vl120 up

echo "120 ip" >> /etc/iproute2/rt_tables

ip route add x.x.x.62 dev vl120 table ip
ip route add x.x.x.60 dev vl999 table ip
ip route add x.x.x.57 dev vl999 table ip
ip route add default via x.x.x.57 table ip

ip rule add to x.x.x.62 table ip
ip rule add from x.x.x.62 table ip

echo 1 > /proc/sys/net/ipv4/conf/vl999/forwarding
echo 1 > /proc/sys/net/ipv4/conf/vl120/forwarding

echo 1 > /proc/sys/net/ipv4/conf/vl999/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/vl120/proxy_arp

echo 0 > /proc/sys/net/ipv4/conf/vl999/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/vl120/rp_filter

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
И после этого трафик из vl120 ходит только во внешний мир, а вот обратно в vl120 не возвращается.

Тестировал так: запускал ping 8.8.8.8 на машине во vl120 (IP x.x.x.62/29 GW x.x.x.57)

При этом пакеты до 8.8.8.8 доходят корректно, возвращается корректный ответ, но шлюз его не пропускает.

Самое удивительное, что пакет не видно даже с цепочке PREROUTING!!! Хотя на интерфейс он попадает

tcpdump -i vl999 icmp and src host 8.8.8.8 -n -nn[br]
16:33:01.018313 IP 8.8.8.8 > x.x.x.62: ICMP echo reply, id 512, seq 7683, length 40
А в iptables уже счетчик не тикает
iptables -A PREROUTING -t mangle -s 8.8.8.8 -j ACCEPT
Что удивительно машина, которая стоит во vl999 с ip из той же подсети (IP x.x.x.58) нормально пингуется!

Подскажите как такое может быть??? Где я накосячил???

StereoRu
()

Переключение между двумя провайдерами

Форум — Admin

Привет! Появился второй провайдер. Потребности в балансировке трафика нет, но зафейловерить линк во внешний канал не помешает. Основной провайдер предоставляет прямой линк (30 мегабит), резервный дает PPPoE (5 мегабит). Шлюзом выступает Debian 7.

Для выполенения задачи было решено держать оба линка поднятыми и в случае падения первого - переключать default gateway, подгружать альтернативный конфиг iptables и удаленно замеменять конфигурацию squid через SSH на прокси-сервере. Другой конфиг сквида разрешает доступ в интернет только тем пользователям, которым внешняя сеть критична для работы (Это около 15% всех пользоватлей). Учитывая специфику предприятия и то, что ширина резервного канала довольно мала, мне показалось это оптимальным решением.

Для автоматизации процесса я написал скрипт, который запускается по крону каждые пять минут. В моей ситуации это приемлемое время недоступности внешнего канала.

Проблема вот в чем. Мне нужно проверять доступность обоих каналов независимо от того, какой сейчас используется. Для этого я выбрал самый простой способ - ping -I $iface. Правильно ли? Есть что-то лучше?

Когда активный основной линк, я могу пинговать с обоих интерфейсов, -I eth6 и -I ppp0 работают и отвечают. Когда шлюз по умолчанию меняется на резервный, -I ppp0 работает, а вот -I eth6 перестает, - «destination host unreachable». В итоге, после переключения на резервный канал, обратно я уже не возвращаюсь, потому что проверка основного канала заканчивается провалом независимо от его состояния. Почему так?

# основной
# ip r
default via 85.1.1.45 dev eth6
10.0.0.0/21 dev eth1  proto kernel  scope link  src 10.0.0.2
90.2.66.97 dev ppp0  proto kernel  scope link  src 90.2.2.2
85.1.1.44/30 dev eth6  proto kernel  scope link  src 85.1.1.46
# резервный
# ip r
default dev ppp0 scope link
10.0.0.0/21 dev eth1  proto kernel  scope link  src 10.0.0.2
90.2.66.97 dev ppp0  proto kernel  scope link  src 90.2.2.2
85.1.1.44/30 dev eth6  proto kernel  scope link  src 85.1.1.46
Как заставить это работать? Что можно улучшить/упростить? AS, BGP не предлагать :]

Любую информацию предоставлю. Скрипт прикладываю. Баш только изучаю, если есть замечания, ошибки, предложения - пожалуйста, расскажите :)

#!/bin/bash
LOG="/var/log/isp-connect.log"
exec &>>$LOG
CURRENT_IF=$(ip r | grep "default" | awk '{print $5}')
PINGHOST1="8.8.8.8"
PINGHOST2="8.8.4.4"
WAN1_IF="eth6"
WAN1_IP="85.1.1.46"
WAN1_GW="85.1.1.45"
WAN2_IF="ppp0"
WAN2_IP="90.2.2.2"
DATE=$(date "+%m/%d/%y %H:%M:%S")
SENDEMAIL="sendemail -f gw01@domain.ru -t log@domain.ru -u \"WAN STATUS\" -s mail01.my.domain.ru"
#
CHECK_WAN1() { ping -q -c 5 -I $WAN1_IF $PINGHOST1 > /dev/null || ping -q -c 5 -I $WAN1_IF $PINGHOST2 > /dev/null; }
CHECK_WAN2() { ping -q -c 5 -I $WAN2_IF $PINGHOST1 > /dev/null || ping -q -c 5 -I $WAN2_IF $PINGHOST2 > /dev/null; }
ROUTE_WAN1() { route del default; route add default gw $WAN1_GW $WAN1_IF; sleep 5; }
ROUTE_WAN2() { route del default; route add default dev $WAN2_IF; sleep 5; }
#
if [ "$CURRENT_IF" == $WAN1_IF ]; then
        CHECK_WAN1
        if [ $? -ne 0 ]; then
                echo "[FAIL] $DATE WAN1 link is DOWN."
                echo "[INFO] $DATE Checking WAN2."
                CHECK_WAN2
                if [ $? -ne 0 ]; then
                        echo "[FAIL] $DATE ISP-SWITCH failed. Cannot connect to WAN2."
                        $SENDEMAIL -m "[FAIL] $DATE WAN1 and WAN2 are down. Switching is not possible."
                        exit
                else
                        ROUTE_WAN2
                        echo "[OK] $DATE WAN2 connection established."
                        bash /etc/iptables/wan2.ipt
                        # ssh to squid-server placeholder
                        # echo "[OK] $DATE squid configuration changed to EMERGENCY."
                        $SENDEMAIL -m "[WARN] WAN1 is down. Switched to WAN2."
                        exit
                fi
        else
                echo "[INFO] $DATE WAN1 link is UP. There is nothing to do."
                exit
        fi
#
elif [ "$CURRENT_IF" == $WAN2_IF ]; then
        CHECK_WAN1
        if [ $? -ne 0 ]; then
                echo "[INFO] $DATE WAN1 link is still DOWN."
                exit
        else
                echo "[INFO] $DATE WAN1 link looks like UP."
                echo "[INFO] $DATE Trying WAN1."
                ROUTE_WAN1
                CHECK_WAN1
                        if [ $? -ne 0 ]; then
                                echo "[FAIL] $DATE Cannot verify WAN1 connection."
                                echo "[INFO] $DATE ISP-SWITCH was canceled."
                                ROUTE_WAN2
                                exit
                        else
                                echo "[OK] $DATE WAN1 connection established."
                                echo "[OK] $DATE Changing squid3 configuration to MAIN."
                                $SENDEMAIL -m "[OK] WAN1 is back. Switched to WAN1."
                                bash /etc/iptables/wan1.ipt
                                # ssh to squid-server placeholder
                                exit
                        fi
        fi
fi

Помоги ЛОР там, где не смог помочь гугл :(

 ,

strnd
()

2 провайдера...

Форум — Admin

Прощу помощи в настройке 2 провайдеров с динамическими IP.

1. Киевстар: eth0-dhcp 2. Фрегат: eth2-ppp0-dhcp

Гугл дает ответ только на статические IP. У Киевстара шлюз может меняться хоть каждую неделю...

Sys: CentOS 6.4 P.S. где правильно задать параметры получения данных через dhclient. Упорно не хочет понимать prepend <name-server>

goliaf1982
()