nftables / iptables управляет для перезаписи исходного IP интерфейсом

Если какая-либо строка, следующая сразу за совпадением, должна быть удалена, тогда ваша программа sed должна будет учитывать последовательные совпадения. Другими словами, если вы удалите строку, следующую за совпадением, которое также совпадает, то, вероятно, вам также следует удалить строку, следующую за ним.

Реализовано достаточно просто - но надо немного оглянуться.

printf %s\\n     0 match 2 match match \
                 5 6 match match match \
                 10 11 12 match 14 15  |
sed -ne'x;/match/!{g;//!p;}'

0
6
11
12
15

Он работает, меняя местами удержание и пробелы шаблона для каждой считанной строки - так что последнюю строку можно каждый раз сравнивать с текущей.Таким образом, когда sed читает строку, он обменивается содержимым своих буферов - и предыдущая строка становится содержимым его буфера редактирования, а текущая строка помещается в удерживаемое пространство.

Итак, sed проверяет предыдущую строку на соответствие match , и если это ! не найдено, выполняются два выражения в { функции } . sed будет g et пространство удержания, перезаписав пространство шаблона - что означает, что текущая строка тогда находится как в пространстве удержания, так и в пространстве шаблона - а затем будет // проверьте его на соответствие его последнему скомпилированному регулярному выражению - match - и если оно не соответствует , это p ритированный.

Это означает, что строка печатается только в том случае, если она не соответствует и непосредственно предыдущая строка не соответствует . Он также исключает любые ненужные перестановки для последовательностей совпадений es.

Если вам нужна версия, которая может отбрасывать произвольное количество строк, возникающих после совпадения , потребуется немного больше работы:

printf %s\\n    1 2 3 4 match  \
                match match 8  \
                9 10 11 12 13  \
                14 match match \
                17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep

... замените 5 на количество строк (включая совпадающую строку) , которую вы хотите удалить ...


1
2
3
4
12
13
14
21
2
15.07.2018, 07:29
2 ответа

Мне удалось добиться этого с помощью следующего nftablesнабора правил (Мне пришлось собирать nftиз исходного кода, поскольку версия 0.5, поставляемая с Ubuntu 16.04, не поддерживает искажение полей пакета):

table ip mytable {
        chain prerouting {
                type filter hook prerouting priority -300; policy accept;
                iifname "eno2.11" ip saddr 192.168.0.222 ip saddr set 192.168.101.222
                iifname "eno2.12" ip saddr 192.168.0.222 ip saddr set 192.168.102.222
                iifname "eno2.13" ip saddr 192.168.0.222 ip saddr set 192.168.103.222
        }

        chain output {
                type filter hook output priority -300; policy accept;
                ip daddr 192.168.101.222 ip daddr set 192.168.0.222
                ip daddr 192.168.102.222 ip daddr set 192.168.0.222
                ip daddr 192.168.103.222 ip daddr set 192.168.0.222
        }
}

и следующие записи в/etc/network/interfaces:

auto eno2 # For switch management interface
iface eno2 inet static
  address 192.168.2.2/24

auto eno2.11
iface eno2.11 inet static
  address 192.168.101.1
  netmask 255.255.255.0

auto eno2.12
iface eno2.12 inet static
  address 192.168.102.1
  netmask 255.255.255.0

auto eno2.13
iface eno2.13 inet static
  address 192.168.103.1
  netmask 255.255.255.0

Это не "распутывает" исходный IP-адрес исходящих пакетов, т.е. гаджеты по-прежнему видят запросы от сервера как исходящие от 192.168.101.1, 192.168.102.1и т. д., а не192.168.0.1-в моем приложении это не имеет значения но это, вероятно, можно решить с помощью дополнительных правил в цепочке output.

1
27.01.2020, 22:09
  1. Да, это разумно.

  2. К сожалению, Linux DNAT («пункт назначения -перезаписывает NAT» )ограничен цепочкой предварительной маршрутизации . В вашем случае это PITA, потому что это означает, что вы либо:

    (а ). сделайте ДНКТ на своем сервере, но тогда вы сможете использовать эти адреса только с вне сервера, а не с самого сервера; или

    (б ). вы искусственно создаете описанную выше ситуацию, создавая сетевое пространство имен, соединяя сетевое пространство имен с основным пространством имен сервера с помощью пары veth -, а затем выполняя DNAT внутри сетевого пространства имен. Это означает, что все ваши интерфейсы VLAN также входят в сетевое пространство имен.

Я понятия не имею, почему сетевики Linux сделали это именно так, но так оно и есть. Общий метод просто переписать пакеты был бы очень удобен...

Google для «сетевого пространства имен» и «iptables DNAT»,этого должно быть достаточно, чтобы вы начали (, если только кто-то другой, у которого больше времени, чем у меня, не напишет пошаговый -за -пошаговый ответ...)

1
27.01.2020, 22:09

Теги

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