Intereting Posts
Я пытаюсь добавить пароли в менеджер паролей «pass». Но мои попытки терпят неудачу с ошибками GPG «без публичного ключа». Зачем? Debian – Как изменить цвета фона терминала Удалил папку Windows.old, и теперь, когда я запускаю свой компьютер, GRUB больше не видит окна Sendmail прекратил отправлять письма, «не выдавал MAIL / EXPN / VRFY / ETRN во время подключения к MTA» Установка Linux на ноутбук Acer Как получить репозиторий yum для работы в контейнере Docker? который показывает (неизвестный) пользователь вошел в систему: что происходит? Экран GNU: не может возобновить экран с разбитого удаленного сеанса Расширение корневого раздела Кали logrotate custom "rotate" эквивалент действия для выскочки? Добавить соответствующий столбец из индексного файла в CSV Fedora 16 не загружается Лучший сценарий NFS для чтения и записи в определенное время? Whonix & TorBrowser: Возможные причины нарушения соединения с Arch WLAN?

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

У меня есть физическая сеть с сервером Linux (Ubuntu 16.04, kernel ​​4.13) и несколькими гаджетами на нем. Каждый гаджет имеет одинаковый неизменяемый статический IP-адрес, например 192.168.0.222/24. Я хотел бы общаться со всеми этими гаджетами через произвольный протокол IP (например, ICMP-пинг или пользовательский протокол UDP)

К счастью, у меня есть управляемый сетевой коммутатор, соединяющий сервер и гаджеты. Я настроил коммутатор так, чтобы он имел магистральный порт для сервера и порты доступа для каждого гаджета, каждый в отдельной VLAN (VID 11, 12 и т. Д.).

Я добавил 8021q в / etc / modules и настроил записи VLAN в / etc / network / interfaces:

 auto eno2 # For switch management interface iface eno2 inet static address 192.168.2.2/24 auto eno2.11 # Gadget 1 (only) iface eno2 inet static address 192.168.0.1/24 #auto eno2.12 # Gadget 2 - disabled #iface eno2 inet static # address 192.168.0.1/24 

С записями, как показано выше, я могу общаться с гаджетом 1 (например, ping 192.168.0.222 ) и не вижу трафика от гаджета 2.

Но я хотел бы иметь возможность общаться со всеми гаджетами одновременно и уметь отличать одно от другого. Им не нужно разговаривать друг с другом. Я думал, что для каждого гаджета я могу создать уникальный IP-адрес хоста и подсеть, например:

 Host IP & subnet "Fake" gadget IP Actual gadget IP VLAN Interface 192.168.101.1/24 192.168.101.222 192.168.0.222 eno2.11 192.168.102.1/24 192.168.102.222 192.168.0.222 eno2.12 

Я бы использовал iptables или nftables для обработки перевода в каждом направлении. Затем я мог бы ping 192.168.101.222 чтобы получить доступ к гаджету 1, и ping 192.168.102.222 чтобы получить доступ к гаджету 2. С точки зрения каждого гаджета его собственный IP-адрес все равно будет 192.168.0.222, и он будет видеть эхо-запросы ICMP, поступающие из 192.168. 0,1.

Это похоже на несколько необычный вариант на NAT. Обратите внимание, что трафик с «поддельными» IP-адресами не должен (и не должен) покидать сервер – мы не пересылаем что-то еще в сети.

  1. Это разумный подход к проблеме?
  2. Как мне настроить / etc / network / interfaces и iptables или nftables для достижения этой цели?

  1. Да, это разумно.

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

    (А). сделать DNAT на вашем сервере, но тогда вы можете использовать эти адреса только снаружи сервера, а не от самого сервера; или же

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

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

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

Я смог добиться этого с помощью следующего набора правил nftables (мне пришлось собрать nft из исходного кода как v0.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 .