Не удается правильно добавить правила брандмауэра iptables в контейнер Docker

Я бы написал:

while IFS= read -r line; do
    for ((i=0; i<${#line}; i++)); do
        char=${line:i:1}
        ((count++))
        ((low <= count && count <= high)) && char=$new_char
        printf '%s' "$char"
    done
    echo
done <"$input"
0
14.05.2021, 02:48
2 ответа

Использование GNU sed в расширенном регулярном выражении -Eмы устанавливаем пространство шаблона новой строки 59, а затем продолжаем смещаться сверху, пока не наткнемся на строку шаблона. В этот момент целевая строка является последней строкой в ​​пространстве шаблона.

sed -Ee ':top
  1,59{
    $q;N;b top
  }
  $!N
  /^[^\n]*two/s/[^\n]*$/MODIFIED/
  P;D
' file

Примечание:

  • Измените смещение с 59 на любое необходимое.
  • Измените шаблон поиска с двух на любой другой, учитывая правила написания регулярных выражений
  • С небольшими изменениями его можно сделать совместимым с POSIX sed.
-121 ---295578 ​​-

Отредактируйте набор правил и замените «ВОЗВРАТ» на «ВПЕРЕД», пока вы определяете политику по умолчанию.

Ссылка:https://www.linuxtopia.org/Linux_Firewall_iptables/x4604.html

0
28.07.2021, 11:32

Таким образом, в основном проблема заключалась в том, что я пропускал-i(--в опции -интерфейса ), чтобы указать имя входного сетевого интерфейса.

Почему я пропустил? Ну, я думаю, потому что:

  • В официальном документе docker упоминается параметр -iс непонятным значением ext_if. В качестве первой причины этой ошибки я не (не мог )понять, что это ext_ifозначает после некоторого поиска в Google и тому подобного.
  • sudo iptables --listничего не показывает об указанных значениях-i(или -или ). Поэтому я подумал, что этот вариант в любом случае не так важен и полностью игнорируется. (вы можете перечислить с опцией -v, например.sudo iptables --list DOCKER-USER -v)

Благодаря комментарию @A.B, я еще раз просмотрел тот же документ полностью, перепробовал все от нуля до последнего и нашел решение.

Итак, наконец, набор команд, которые я выполнил и решил проблему, выглядит следующим образом.

$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nameOfContainer # check the docker container's local ip e.g. 172.17.0.3

# assumes the docker container ip is 172.17.0.3, 
# the "internal" docker container port (e.g. "443" for "0.0.0.0:8122->443/tcp") you want to filter is 443, 
# the network interface (you can check with e.g. `ip addr`) is wlp2s0.

sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -j DROP
sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -s xx.xx.xx.xx -j ACCEPT
sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -s yy.yy.yy.0/24 -j ACCEPT

Таким образом, результат списка будет похож на:

$ sudo iptables --list DOCKER-USER -v
[sudo] password for user: 
Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination
   10   704 ACCEPT     tcp  --  wlp2s0 any     yy.yy.yy.0.static.xtom.com/24  172.17.0.3           tcp dpt:https
   20  1900 ACCEPT     tcp  --  wlp2s0 any     xx-xx-xx-xx.oo.oo.vectant.ne.jp  172.17.0.3           tcp dpt:https
   30  1760 DROP       tcp  --  wlp2s0 any     anywhere             172.17.0.3           tcp dpt:https
 145K   60M RETURN     all  --  any    any     anywhere             anywhere
0
28.07.2021, 11:32

Теги

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