трафик прокси шлюза маршрутизации через другой интерфейс с идентичными восходящими шлюзами

Никогда не встраивайте {} в код оболочки! Это создает уязвимость инъекции команд. Обратите внимание, что для cat "{}" проблема не только в символах ", \, `, $ (рассмотрим, например, файл с именем ./$(перезагрузка)/accept_ra).

(кстати, некоторые реализации находят не позволяют этого сделать, а POSIX оставляет поведение неопределенным , когда {} не является само по себе аргументом для найти)

здесь, вы захотите передать имена файлов в качестве отдельных аргументов в sh (а не в аргументе code), а в строчном скрипте sh (в аргументе code), чтобы ссылаться на них с помощью параметров позиционирования:

find . -name accept_ra -exec sh -c 'echo 0 > "$1"' sh {} \;

Или, чтобы избежать выполнения одного sh в каждом файле:

find . -name accept_ra -exec sh -c 'for file do
  echo 0 > "$file"; done' sh {} +

То же самое относится к xargs -I{} или zsh's zargs -I{}. Не пишите:

 {}'

Что было бы такой же уязвимостью инъекции команд, как и в find выше, но:

 "$file"; done' sh

Что также имеет преимущество, так как позволяет избежать запуска по одному sh на файл и ошибки, когда list.txt не содержит ни одного файла.

С помощью zsh zargs вы, вероятно, захотите использовать функцию, а не вызывать sh -c:

do-it() cmd > $1
zargs ./*.txt -- do-it

Обратите внимание, что во всех вышеприведенных примерах второй sh идет в строчный скрипт $0. Вы должны использовать там что-то соответствующее (например, sh или find-sh), а не такие вещи, как _, -, -- или пустую строку, так как значение в $0 используется для сообщений об ошибках в оболочке оболочки:

$ find . -name accept_ra -exec sh -c 'echo 0 > "$1"' inline-sh {} \;
inline-sh: ./accept_ra: Permission denied

GNU parallel работает по-другому. С ним вы делаете , а не , чтобы использовать sh -c, так как parallel уже запускает оболочку и пытается заменить {} на аргумент, процитированный в правом синтаксисе для оболочки.

 {}'

1
13.04.2017, 15:13
1 ответ

Lo siento, no puedo proporcionar un ejemplo de trabajo, pero lo que necesita debería poder lograrse utilizando el objetivo CONNTRACK de netfilter. Lo que diferencia esto de MARK regular es que CONNTRACK marca todo el tráfico en una conexión, mientras que MARK solo marca paquetes. Entonces, la idea sería:

  • Marque las conexiones entrantes a través de cada interfaz con números diferentes (es decir, "1" para gw1, "2" para gw2)
  • Use "ip rule add fwmark 1 lookup 101" y "ip rule add fwmark 2 lookup 102" para hacer que el tráfico con la marca 1 y la marca 2 vaya a diferentes tablas de rutas
  • Cree una ruta predeterminada diferente para cada tabla :"IP route add default via 192.168.0.1 dev eth1 table 101" for gw1, and "ip route add default via 192.168.0.1 dev eth2 table 102" for gw2

Las conexiones que vienen a través de eth1 serían CONNMARKed con fwmark 1, que se mantendría para todos los paquetes (entrantes y salientes ); lo mismo sucedería con las conexiones que vienen a través de eth2, con fwmark 2. Así, el firewall siempre sabrá qué interfaz usar en las respuestas. Las conexiones iniciadas desde el firewall o los hosts detrás de él pasarían por cualquier interfaz/puerta de enlace que elija como principal.

Tal vez pueda hacer esto más fácilmente usando algún software de firewall preempaquetado, como Shorewall . Tiene soporte multi -ISP, aunque no sé si usa CONNTRACK o simplemente MARK.

0
28.01.2020, 01:48

Теги

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