Маршрутизация для нескольких восходящих каналов/поставщиков

Я не знаю, понимают ли, что хотеть достигнуть, но возможно это awk программа полезна для Вас:

Содержание script.awk:

{
    ## Number of blocks printed to output.
    block = 0 

    ## Get number of columns searching how many tabs exists in the line.
    ## I substract one because each line has a tab at the end and splits
    ## function count blank space after it like a new column.
    col_nums = split( $0, dummy, /\t+/ )
    --col_nums

    ## Incorrect line if it has not any tab. Omit it.
    if ( col_nums < 1 ) { 
        next
    }   

    ## Get number of chars of each block to output.
    ## 'max_cell_length' is an input argument provided by the user. It means
    ## number of chars to input by line.
    chars = max_cell_length / col_nums

    ## For each column...
    for ( i = 1; i <= NF; i++ ) { 

        ## This is the index where I begin to extract a substring. Zero is
        ## at first char.
        begin_idx = 0 

        ## Get for each column blocks of 'chars' characters. And repeat until
        ## end of column.
        while ( begin_idx < length( $i ) ) { 
            column = substr( $i, begin_idx, chars )

            ## Increment index to extract next block where last one ended.
            begin_idx += chars

            ## Print block to output.
            printf "%s ", column

            ## When have been printed number of columns indicated by the 
            ## user, change to next line.
            if ( ++block % col_nums == 0 ) { 
                printf "\n"
            }   
        }   
    }   
}

{
    ## For each line, print an extra newline for a pretty output.
    printf "\n"
}

Запущение скрипта:

python3 -c 'for i in (1,2,3): print(((str(i)*50)+"\t")*3)' | awk -v max_cell_length=30 -f script.awk -

И результат:

1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 

2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 

3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 

Можно использовать переменную max_cell_length для указания на количество символов на строку вывода (без банков), и я предполагаю, что это будет фактор количества символов в исходных данных. Иначе вывод будет плохо форматирован, я протестировал его с 30, поскольку Вы видите в этом сообщении, и с 50. Оба кажутся корректными, но не со многими другими странными числами.

5
11.04.2013, 18:40
2 ответа

У меня есть немного более сложная конфигурация, которая также включает NAT и динамическую (внутреннюю) маршрутизацию на машине.

Существует несколько частей к нему. Давайте запустимся с правил:

Maginot:~# ip rule ls
0:      from all lookup local 
1000:   from all lookup main 
1500:   from 173.167.51.136/29 lookup comcast 
1501:   from 76.160.165.106/29 lookup cavtel 
1502:   from 151.200.251.90/31 lookup vzdsl 
1502:   from 151.200.251.92/31 lookup vzdsl 
1502:   from 151.200.251.94 lookup vzdsl 
2000:   from all fwmark 0x1 lookup comcast 
2001:   from all fwmark 0x2 lookup cavtel 
2002:   from all fwmark 0x3 lookup vzdsl 
2500:   from all lookup comcast 
2501:   from all lookup cavtel 
2502:   from all lookup vzdsl 
32767:  from all lookup default 

(Таблицы являются именами в /etc/iproute2/rt_tables)

Как Вы видите, у нас есть три ISPs в данный момент и мы пара статических IP-адресов на каждом. Правила 1500-1502 отправляют трафик от тех исходных IP-адресов соответствующий интерфейс. Правила 2000-2002 отправляют трафик с данной меткой брандмауэра (мы доберемся до того), соответствующий интерфейс. Правила 2500-2502 дают предпочтительное распоряжение нашего ISPs для трафика, который уже не был присвоен ISP. Если Вы идете вниз, Вы удаляете правило для него, и следующий в списке используется.

Каждая таблица маршрутизации довольно тривиальна:

Maginot:~# ip route ls table comcast
default via 173.167.51.142 dev comcast 

(Локальный и основной имеют намного больше материала, но это - непосредственно подключенные и внутренние маршруты, соответственно. Значение по умолчанию таблицы пусто).

Затем, его важное, что, после того как соединение присвоено ISP, это остается там (включая входящие соединения). Попытка переместить его невозможна, так как у нас есть различные IP-адреса в каждом интерфейсе, и наши ISPs на самом деле имеют фильтрацию обратного пути. Мы сохраняем их на том же ISP с правилами брандмауэра.

Помните, что SNAT сделан после маршрутизации, таким образом, ip rule политики не помогут. Необходимо ли использовать что-то еще (возможно, это - проблема?)

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan                                       -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast                                   -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl                                    -j MARK --set-mark $MARK_VZDSL

iptables -t mangle -A POSTROUTING -o wan     -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl  -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

Это из сценария оболочки, который настраивает его; $MARK_… переменные соответствуют меткам, которые Вы видите в правилах выше. Довольно простой: восстановите метку соединения (помните, метки на пакет); если существует метка теперь (от метки соединения), мы сделаны. Иначе установите метку на ту на основе включенного интерфейса.

Обратите внимание, что это восстанавливает метку перед маршрутизацией и только сохраняет его впоследствии. И метка установлена на исходящий интерфейс независимо (который является спорным).

Наконец, существуют фактические правила NAT. У нас есть несколько локальные префиксы, этот код выполняется в для цикла с $local набор каждому:

iptables -t nat -A POSTROUTING -s $local -o wan     -j SNAT --to-source 76.160.165.106
iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source 173.167.51.137
iptables -t nat -A POSTROUTING -s $local -o vz-dsl  -j SNAT --to-source 151.200.251.90

(Примечание: существует намного больше правил, включая некоторый DNAT для серверов демилитаризованной зоны, и т.д... Я думаю, что скопировал все соответствующие.)

3
27.01.2020, 20:41
  • 1
    за ответ. Я отредактировал свой вопрос после тестирования Вашей конфигурации. –  slepasteur 11.04.2013, 18:46
  • 2
    @derobert: Я хотел бы когда-нибудь знать так много о сетях Linux и TCP/IP, но в данный момент едва знать, как использовать iproute2 и установить базовый OpenVPN. Что я должен считать для разработки хорошего основного основания в сетях Linux? –  TomRoche 12.03.2015, 05:05
  • 3
    @TomRoche я предложил бы зайти в chat.stackexchange.com/rooms/26/unix-and-linux и спросить. –  derobert 13.03.2015, 00:04

Вы захотите установить вес eth0 устройства, чтобы быть более высоким приоритетом, чем ppp0 устройство.

пример:

ip route append default scope global nexthop via 10.0.0.1 dev eth0 weight 2 nexthop via 10.64.64.65 dev ppp0 weight 3
0
27.01.2020, 20:41
  • 1
    Команда дает мне следующую ошибку: ip: either "to" is duplicate, or "scope" is garbage –  slepasteur 08.04.2013, 15:35

Теги

Похожие вопросы