Назад | Перейти на главную страницу

Как настроить iptables для использования apt-get на сервере?

Я начинаю использовать iptables (новичок) для защиты Linux-сервера (в частности, Debian 5.0). Прежде чем настраивать параметры iptables, я могу без проблем использовать apt-get. Но после того, как я настроил iptables, apt-get перестает работать. Например, я использую этот скрипт в iptables:

#!/bin/sh
IPT=/sbin/iptables

## FLUSH
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X

$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

$IPT -A INPUT -p tcp --dport 22 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 22 -j ACCEPT

$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 80 -j ACCEPT
$IPT -A INPUT -p tcp --dport 443 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 443 -j ACCEPT

# Allow FTP connections @ port 21
$IPT -A INPUT  -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

# Allow Active FTP Connections
$IPT -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT 

# Allow Passive FTP Connections
$IPT -A INPUT -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED,RELATED -j ACCEPT 

#DNS
$IPT -A OUTPUT -p udp --dport 53 --sport 1024:65535 -j ACCEPT

$IPT -A INPUT -p tcp --dport 1:1024
$IPT -A INPUT -p udp --dport 1:1024

$IPT -A INPUT -p tcp --dport 3306 -j DROP
$IPT -A INPUT -p tcp --dport 10000 -j DROP
$IPT -A INPUT -p udp --dport 10000 -j DROP

затем, когда я запускаю apt-get, я получаю:

core:~# apt-get update
0% [Connecting to ftp.us.debian.org] [Connecting to security.debian.org] [Conne

и он глохнет. Какие правила мне нужно настроить, чтобы он работал.

Спасибо

Дополнение:

После некоторых попыток я обнаружил, что проблема заключается в политике INPUT, а не в политике OUTPUT. Если изменить $ IPT -P OUTPUT на $ IPT -P OUTPUT ACCEPT, проблема останется. Но если я изменю $ IPT -P INPUT на $ IPT -P INPUT ACCEPT, тогда он начнет работать.

Вам нужно разрешить первому пакету открыть HTTP-соединение OUT, а затем разрешить ответы обратно.

Пытаться:

$IPT -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
$IPT -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Чтобы решить эту проблему, вам необходимо добавить следующие правила в свой IPT:

# Apt-Get without problem
$IPT -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Возможно Apt не может разрешить имена хостов с помощью DNS. Попробуйте добавить эту строку в раздел DNS своего набора правил:

$IPT -A INPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT

Для установки Debian по умолчанию для получения обновлений необходимы два порта:

  • HTTP (TCP-порт 80)
  • DNS (порт UDP 53)

Решение с -m состоянием:

$IPT -A OUTPUT -p tcp --dport 80 --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp --sport 80 --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p udp --dport 53 --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p udp --sport 53 --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT

или с -m conntrack:

$IPT -A OUTPUT -p tcp --dport 80 --sport 32768:61000 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp --sport 80 --dport 32768:61000 -m conntrack --ctstate ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p udp --dport 53 --sport 32768:61000 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p udp --sport 53 --dport 32768:61000 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Apt обычно использует старый добрый порт 80, но вы должны проверить apt.conf, чтобы увидеть, как он установлен, поскольку он может использовать любой из нескольких. Также проверьте /etc/apt/sources.list

Я считаю, что вам понадобятся правила вывода, где разрешены высокие порты источника. Когда apt подключается к http, Linux предоставит ему случайный порт с высоким исходным кодом (выше, чем то, что находится в /proc/sys/net/ipv4/ip_local_port_range). (Может быть, не случайно, не помню). ftp также имеет пассивный и активный режимы, в этом случае я бы порекомендовал http-источники в вашем sources.list.

Итак, если вы измените свои источники на http и установите правило вывода для всех ваших эфемерных портов. У вас будет все готово. Если вы используете ftp, вам нужно выяснить, активен он или пассивен, а затем добавить правила соответственно. Видеть эта ссылка для объяснения активных / пассивных режимов. Я вижу, что у вас есть те, которые сейчас перечислены, но они кажутся с точки зрения того, что коробка является сервером, а не клиентом. С apt вы являетесь клиентом.

Итак, для исходных портов http:

$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   61000
$IPT -A OUTPUT -p tcp --dport 80 --sport 32768:61000 -j ACCEPT

Наконец, вы можете регистрировать потерянные пакеты в качестве общего инструмента устранения неполадок iptables. Видеть эта ссылка.

Использование DROP в качестве политики по умолчанию для цепочки OUTPUT кажется мне несколько чрезмерным.

Я бы рекомендовал изменить политику OUTPUT по умолчанию на ACCEPT, а затем отслеживать трафик и при необходимости фильтровать определенные порты. В противном случае будет слишком сложно отслеживать все исходящие соединения и пропускать каждое из них через ваш брандмауэр.

В конце концов, фокус в том, чтобы никого не впускать, не мешать им выйти.

Я знаю, что это, вероятно, немного поздно, но эта тема продолжала появляться в моих поисках в Google, поэтому я публикую то, что сработало для меня:

iptables -A OUTPUT -p tcp --dport 80 --sport 32786:61000 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 --sport 32786:61000 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 32786:61000 --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 32786:61000 --sport 80 -j ACCEPT

У меня проблема. Я использую CSF и настроил ключ cc_allow_filter со значением BR, думая, что это для SSH, и после чтения документов я обнаружил, что это для всех подключений на сервере. Мой блокирует, потому что зеркала, которые я использую для apt-get, из другой страны, и CSF блокировал. После удаления страны блокировки все звезды снова работают нормально.

Думаю решил проблему.

$ IPT -A INPUT --sport 80 -j ACCEPT и apt работают правильно