IPTABLES: Почему мой сценарий не применяется?

321
Dave Teezo

Я устанавливаю новый новый VPS (с linode.com, если это имеет значение) с Ubuntu 16.04 LTS. Я написал следующий скрипт для iptables:

#!/bin/sh  iptables -F  iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP  iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT  iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT  iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT  iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP iptables -A FORWARD -j DROP 

Этот сценарий должен разрешать только 22, 80 и 443. Он также разрешает исходящий DNS-запрос.

Я создал и назвал этот скрипт iptables.shкак root и вставил его /etc/network/if-pre-up.d. Я также сделал chmod +x.

Теперь после перезагрузки этот скрипт, похоже, не применяется. Я проверил это, выполнив iptables -S, что дает:

-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT 

Как мне прогрессировать отсюда? Я застрял прямо сейчас.

Обновить

Я понятия не имею, почему, но после переименования uptables.shв iptables, я не могу войти в мой сервер больше после перезагрузки. Это заставляет меня думать, что теперь скрипт действительно выполняется (а когда у него нет .shрасширения файла, почему?) Во время загрузки, и в моем скрипте есть ошибка. Я так растерялся.

0
Msgstr "Я не могу войти в свой сервер после перезагрузки". Я думаю, что строка `iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports 22,80,443…` должна использовать `--sports`, потому что в` OUTPUT` вы хотите разрешить ответ * от * порта 22 и т. Д. Обратите внимание, что UDP / 53 имеет соответствующие правила `dport` /` sport`, а не `dport` /` dport` и `sport` /` sport`. Kamil Maciorowski 6 лет назад 0
О Конечно! Я попробую еще раз, СПАСИБО МНОГО за этот совет. Dave Teezo 6 лет назад 0
Это не работает :(. Я обновил скрипт в своем вопросе, поэтому он очищает мою текущую версию. Dave Teezo 6 лет назад 0
Вы уверены, что интерфейс `eth0`? Современная Ubuntu может использовать что-то вроде `enpXsY`. [* Почему мой сетевой интерфейс называется enp0s25 вместо eth0? *] (Https://askubuntu.com/q/704361/693277) Kamil Maciorowski 6 лет назад 0
Это действительно `eth0` в моем случае. Я проверил, запустив `ifconfig`, который выдает` eth0` и `lo`. Dave Teezo 6 лет назад 0
Я нашел это о модуле `state`:" ESTABLISHED "означает, что пакет связан с соединением, которое рассматривало пакеты в обоих направлениях," NEW "означает, что пакет установил новое соединение, или иным образом связан с соединение, которое не увидело пакетов в обоих направлениях ". Это предполагает, что вы должны использовать `NEW, ESTABLISHED` вместо одиночного` ESTABLISHED`. У меня нет практического опыта с этим, хотя, я могу быть очень неправ. Kamil Maciorowski 6 лет назад 0
Я попробую это! Dave Teezo 6 лет назад 0
На мой взгляд, ваш вопрос "почему (не был) сценарий не применяется?" Мои попытки * в комментариях * решить другую проблему (которая проявилась после того, как сценарий был переименован и применен) были из вежливости, потому что нет ни одного вопроса по этому поводу; это отдельная проблема наверняка. Теперь есть «ответ», который пытается исправить ваши команды `iptables`, не обращаясь к явному вопросу; по моему это формально неправильно. Перед тем, как я опущу ответ, пожалуйста, четко укажите, остается ли вопрос «почему сценарий не был применен?» или "как сделать мой брандмауэр вменяемым?" Kamil Maciorowski 6 лет назад 0
Вы абсолютно правы, мой вопрос был в основном о том, чтобы заставить мой сценарий делать ** что-то **. Это было решено. Я должен открыть новые вопросы для вопросов, касающихся фактического содержания / здравомыслия моих правил. Спасибо за вашу помощь! Dave Teezo 6 лет назад 0

1 ответ на вопрос

0
cybernard

НОВОЕ само по себе и СВЯЗАНО, СОЗДАНО, идут вместе. Когда вы подключаетесь через ssh, адрес назначения может быть портом 22, но порт источника является случайным, поэтому правило # 2 в выходных данных работает должным образом.

iptables -I INPUT 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -I OUTPUT 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 

Как только эти правила будут введены, ваш DNS-запрос станет частью СВЯЗАННОГО, УСТАНОВЛЕННОГО трафика, и вы сможете удалить ссылки на порт 53.

Я ценю ваши отзывы. Я не думаю, что это хорошая идея делать такие вещи на всех портах? Кроме того, не должно ли это быть что-то вроде `NEW, ESTABLISHED` для потока` to` и `ESTABLISHED, RELATED` для потока` from`? Dave Teezo 6 лет назад 0
Я также не понимаю ваше замечание относительно 53. Разве исходящий DNS не разрешает `NEW` запрос? Dave Teezo 6 лет назад 0
@DaveTeezo Вы можете разрешить порт OUTBOUND 53, но INPUT 53 обрабатывается RELATED, ESTABLISHED. СВЯЗАННЫЕ, УСТАНОВЛЕННЫЕ на всех портах намного проще, чем пытаться сделать это для каждой службы. Также пакет должен пройти через цепочку OUTPUT, чтобы стать RELATED, ESTABLISHED, поэтому, если вы заблокируете соединение в цепочке OUTPUT, он никогда не станет RELATED или ESTABLISHED. cybernard 6 лет назад 0