Я использую IPTables на сервере API, чтобы заблокировать весь входящий трафик, кроме SSH, HTTP и HTTPS. Мне нужно иметь полный доступ к интерфейсу обратной связи для запуска beanstalkd среди прочего, и мне нужен исходящий доступ по http, https и SSH для вызовов API к другим сервисам, а также для извлечения из github.

Я создал правила следующим образом:

iptables -F

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport https -j ACCEPT
iptables -A INPUT -j DROP

iptables -L выводит:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Несмотря на это, git pull не может найти сервер, pinging google не работает и mailgun не отправляет. Запуск iptables -F решает эти проблемы, и я не могу позволить себе иметь брандмауэр, который только мешает моему приложению работать полностью ...

Как я могу достичь того, что я пытаюсь выше?

1 ответ1

2

Это совершенно очевидно, когда вы думаете об этом:

  • Проверка связи с Google не работает, поскольку у вас нет правила, разрешающего входящие ответы ICMP.

  • Вещи не могут "найти сервер", потому что у вас нет правила, разрешающего ответы DNS.

  • Mailgun не может говорить по SMTP, потому что у вас нет правила, разрешающего SMTP-пакеты - TCP SYN отключается, но соответствующий SYN/ACK сбрасывается.

Общее решение здесь состоит в том, чтобы использовать отслеживание соединений netfilter, также называемое "conntrack", чтобы создать правило, которое разрешает все пакеты, которые соответствуют активным соединениям:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

(Более старая документация может иметь -m state ; это устарело.)


И, конечно же,

-A INPUT -4 -p icmp -j ACCEPT
-A INPUT -6 -p icmp6 -j ACCEPT

потому что зачем ты это блокируешь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .