Восстановить правила с помощью iptables-restore, игнорируя ошибки

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

У меня в моих правилах много строк вроде:

-A mychain -s somehost.com -j DROP 

Мои правила исходят из динамических списков, и может случиться так, что если somehost.com временно не работает в автономном режиме, а не маршрутизируется или что-то вроде этого iptables-restore отказывается восстанавливать правила и выдает ошибки, например:

 iptables-restore v1.6.0: host/network 'somehost.com' not found Error occurred at line: 342 Try 'iptables-restore -h' or 'iptables-restore --help' for more information. 

Ну, я бы хотел, чтобы iptables мог просто игнорировать строку somehost.com если хост недоступен.

Можно ли это сделать, добавив некоторые флаги в iptables-restore ?

Можно использовать DNS-имя в правилах iptables, но это не лучшая практика по нескольким причинам. И основная причина – iptables выполняет разборку один раз во время загрузки правил. В будущем DNS-имя может быть изменено, и ваш хост не узнает об этом.

Как вы знаете, для iptables требуется только успешное разрешение имен DNS . Поэтому, если имя DNS не существует, загрузка правил заканчивается ошибками.

Вы можете создать скрипт и проверить его разрешение внутри:

 #!/bin/bash host_check=$( dig -t A somehost.com +short 2>/dev/null | wc -l ) if (( $host_check > 0 )) then sed -i '/.*somehost\.com/s/^#//' file else sed -i 's/.*somehost\.com/#&/' file fi 

этот скрипт проверяет имя. Если имя разрешено (вывод будет одним или несколькими строками), скрипт удаляет комментарии в каждой строке с определенным именем DNS. Если нет – scipt добавляет комментарии к каждой строке с именем DNS.

file – это скрипт iptables-save > file из команды iptables-save > file

После этих проверок вы можете загружать правила с помощью iptables-restore < file


Я настоятельно рекомендую не использовать этот подход. Вам нужно найти способ отказаться от имен DNS в правилах iptables.