#!/bin/sh
if [ ! -f.md5sum ] || [ -f.md5sum ] && ! md5sum -c.md5sum > /dev/null
then
echo "All conditions have been met to generate a new md5sum for inventory.csv..."
md5sum inventory.csv >.mds5sum
fi
[ ! -f.md5sum ]
[ -f.md5sum ]
Это обычные test
команды, поэтому POSIX -ly [...]
, нет необходимости в двойных скобках.
! md5sum -c.md5sum > /dev/null
Это НЕ команда test
, поэтому БЕЗ квадратных скобок вокруг нее.
Нет необходимости в bash
, sh
подойдет в этом скрипте. Я могу только порекомендовать придерживаться оболочки POSIX(sh
)до тех пор, пока это возможно для целей переносимости.
md5sum
был заменен, т.е. с sha512sum
. Ни один алгоритм хеширования не совершенен, но md5sum
известно, что он не особенно устойчив к коллизиям -. Я могу рекомендовать использовать sha512sum
только в том случае, если вам не нужен очень короткий хэш.
При желании прочтите дополнительную информацию о POSIX .
Хотя это не указано явно, я предполагаю, что цель состоит в том, чтобы разделить трафик таким образом, чтобы:
Как писал OP, для этого нужна маршрутизация на основе политики/источника -.iptables и netfilter редко бывают полезны (по крайней мере сами по себе):
Всякий раз, когда можно избежать iptables для решения проблемы маршрутизации, лучше этого не делать. Иногда этого не избежать (и тогда обычно iptables используется для добавления метки к пакетам и эта метка используется в записи ip rule
).
Я предполагаю, чтоrp_filter=1
установлено на всех интерфейсах, так как это значение по умолчанию для большинства дистрибутивов, чтобы включить Strict Reverse Path Forwarding .
Адрес источника выбирается по правилу, пункт назначения — по таблице маршрутизации. В дополнительных таблицах маршрутизации должно быть достаточно информации для переопределения (без двусмысленности )маршрутов, когда необходимо выбрать только один из нескольких (, тогда только этот добавляется в таблицу ). Часто приходится копировать и дополнительные маршруты из основной таблицы, иначе может случиться что-то плохое.
В своем ответе я не буду отдавать предпочтение той или иной сети :каждая будет иметь свою собственную таблицу маршрутизации. Я забуду таблицу 1 и буду использовать таблицы 10 для LAN 10.0.0.0/24 и 172 для LAN 172.16.0.0/24. Сохраните правила NAT, удалите правила и дополнительные таблицы маршрутизации, а также 192.168.0.1 dev enp4s0f0 scope link
из основного.
Маршруты для 10.0.0.0/24 < --> 10.0.0.6 enp4s0f0 | enp4s0f1 192.168.0.6 < --> 192.168.0.1/по умолчанию:
ip rule add from 10.0.0.0/24 lookup 10
ip route add table 10 10.0.0.0/24 dev enp4s0f1
ip route add table 10 192.168.0.0/24 dev enp4s0f0 src 192.168.0.6
ip route add table 10 default via 192.168.0.1
Выше, без дублированной записи маршрута для 10.0.0.0/24, система не сможет сама получить доступ к этой локальной сети :она решит, что маршрут должен проходить через шлюз по умолчанию, только для Strict Reverse Path Forwarding(Цель SRPF )затрудняет отладку. Это пример плохой вещи, если ее не добавить. Если сомневаетесь, просто продублируйте маршруты.
Другим эквивалентным вариантом могло бы быть вместо дополнительного маршрута изменить правило выше на:
ip rule add from 10.0.0.0/24 iif enp4s0f1 lookup 10
, поэтому он не будет соответствовать локальному (не-маршрутизируемому )трафику, и будет использоваться только основная таблица.
Маршруты для 172.16.0.0/24 < --> 172.16.0.3 enp1s0f0 | enp1s0f1 192.168.0.3 < --> 192.168.0.1/по умолчанию:
ip rule add from 172.16.0.0/24 lookup 172
ip route add table 172 172.16.0.0/24 dev enp1s0f0
ip route add table 172 192.168.0.0/24 dev enp1s0f1 src 192.168.0.3
ip route add table 172 default via 192.168.0.1
Чтобы также изменить маршрут (ссылку )для локально инициированного исходящего трафика при изменении исходящего исходного IP-адреса в системе Linux. Это должно быть необязательным, но следующая часть о потоке ARP делает его обязательным :
. ip rule add from 192.168.0.6 lookup 10
ip rule add from 192.168.0.3 lookup 172
Любой не -особый случай, связанный с переопределенными маршрутами из правил, также должен быть продублирован
Здесь отсутствуют только маршруты между двумя специальными локальными сетями:
в таблице 10 для достижения 172.16.0.0/24
в таблице 172 для достижения 10.0.0.0/24
поскольку каждая дополнительная таблица еще не имеет маршрута для этой другой стороны, она будет использовать маршрут по умолчанию (, но будет снова заблокирована SRPF ), не позволяя каждой из двух специальных сетей взаимодействовать между собой. друг друга. Так что просто дублируйте отсутствующий маршрут для каждой таблицы:
ip route add table 10 172.16.0.0/24 dev enp1s0f0
ip route add table 172 10.0.0.0/24 dev enp4s0f1
В этой модели, если, например, нужно было добавить две другие «обычные» внутренние сети,они могут взаимодействовать между собой (и будут использовать маршрут по умолчанию основной таблицы для выхода за пределы )без дополнительной настройки, но снова потребуют дублирования своих маршрутов в каждой дополнительной таблице маршрутизации для связи с двумя специальными локальными сетями.
С маршрутами все в порядке, но есть еще...
Linux использует модель слабого хоста . Это относится к IP-маршрутизации, а также к тому, как Linux отвечает на запросы ARP :с любого интерфейса для любого IP, но, конечно, с использованием собственного MAC-адреса интерфейса. Поскольку это может произойти на всех интерфейсах одновременно, когда несколько интерфейсов находятся в одной и той же локальной сети, обычно выигрывает самый быстрый. Затем информация ARP кэшируется на удаленной системе и остается там некоторое время. В конце концов срок действия кеша истекает, происходит то же самое, но с возможным другим исходом. Итак, как это вызывает проблему? Вот пример:
Эта асимметричная маршрутизация перехватывается Strict Reverse Path Forwarding (rp_filter
), и трафик не проходит. Может даже показаться, что это работает случайным образом в течение нескольких секунд, а затем снова выходит из строя. В зависимости от общего трафика проблема может даже позже переключиться на другую ссылку (, а затем проблема переключится на другую локальную сеть ).
К счастью, для предотвращения этого в Linux предусмотрен параметр, который можно использовать только вместе с маршрутизацией на основе политик, чтобы ARP следовал тем же правилам, которые определены маршрутизацией:arp_filter
.
arp_filter - BOOLEAN
1 - Allows you to have multiple network interfaces on the same subnet, and have the ARPs for each interface be answered based on whether or not the kernel would route a packet from the ARP'd IP out that interface (therefore you must use source based routing for this to work). In other words it allows control of which cards (usually 1) will respond to an arp request.
sysctl -w net.ipv4.conf.enp4s0f0.arp_filter=1
sysctl -w net.ipv4.conf.enp1s0f1.arp_filter=1
Теперь поведение ARP правильное, если настройки были только что установлены, следует принудительно -сбросить кэш ARP пиров(здесь :модем ), выполнив обнаружение дубликатов адресов с помощьюarping
(из iputils / iputils -arping ), которые будут транслировать одноранговым узлам и заставлять их обновлять свой кэш:
arping -c 5 -I enp4s0f0 -D -s 192.168.0.6 192.168.0.6 &
arping -c 5 -I enp1s0f1 -D -s 192.168.0.3 192.168.0.3
Обратите внимание, что два правила в пункте 3. в предыдущей части теперь являются обязательными, поскольку IP-адреса 192.168.0.3 и 192.168.0.6 должны совпадать в правилах политик маршрутизации для правильного разрешения ARP с arp_filter=1
.
ip route get
очень полезно для проверки маршрутов и фильтрации обратных путей:
новый тестовый пример для пункта 4 выше:
# ip route get from 10.0.0.111 iif enp4s0f0 172.16.0.111
172.16.0.111 from 10.0.0.111 dev enp1s0f0 table 10
cache iif enp4s0f0
# ip route get from 172.16.0.111 iif enp1s0f0 to 10.0.0.111
10.0.0.111 from 172.16.0.111 dev enp4s0f1 table 172
cache iif enp1s0f0
при удалении правил или маршрутов:
# ip route get from 10.0.0.111 iif enp4s0f1 8.8.8.8
8.8.8.8 from 10.0.0.111 via 192.168.0.1 dev enp4s0f0 table 10
cache iif enp4s0f1
# ip rule del from 10.0.0.0/24 lookup 10
# ip route get from 10.0.0.111 iif enp4s0f1 8.8.8.8
8.8.8.8 from 10.0.0.111 via 192.168.0.1 dev enp1s0f1
cache iif enp4s0f1
# ip route get from 192.168.0.1 iif enp4s0f0 192.168.0.6
local 192.168.0.6 from 192.168.0.1 dev lo table local
cache <local> iif enp4s0f0
# ip rule delete from 192.168.0.6 lookup 10
# ip route get from 192.168.0.1 iif enp4s0f0 192.168.0.6
RTNETLINK answers: Invalid cross-device link
Здесь показано, как меняются результаты в зависимости от (отсутствия )правил и дополнительных маршрутов. Последним результатом является сообщение об ошибке, в котором говорится, что проверка переадресации обратного пути не удалась (=> удалить ).
Затем естьip neigh
(наиболее полезные в одноранговых системах )для проверки записей ARP, tcpdump
и т. д.