Какое правильное правило iptables разрешает apt-get загружать программы?

12

Когда я набираю что-то вроде sudo apt-get install firefox, все работает, пока не спросит меня:

After this operation, 77 MB of additional disk space will be used.
Do you want to continue [Y/n]? Y

Затем отображаются сообщения об ошибках: Failed to fetch: <URL>

Мои правила iptables следующие:

-P INPUT DROP
-P OUTPUT DROP
-P FORWARD DROP

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

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

Что я должен добавить, чтобы apt-get мог загружать обновления? Благодарность

anthony01
источник

Ответы:

17

apt-get почти всегда загружает по HTTP, но может также использовать FTP, поэтому, возможно, короткий ответ - разрешить исходящие HTTP-соединения ... и, конечно, DNS.

Ваша конфигурация теперь запрещает весь исходящий сетевой трафик ( ESTABLISHEDправило, которое вы используете в OUTPUTцепочке, не действует, так как никакие сеансы никогда не будут установлены). Вам нужно разрешить ТОЛЬКО обновления apt-get, при этом запретив все остальное? iptablesВероятно, это неправильный инструмент для этой работы, поскольку он не собирается интерпретировать URL-адреса и разрешать HTTP-передачу выборочно. Вы хотели бы использовать прокси-сервер HTTP для этой работы.

Вы можете использовать более простую настройку, которая разрешит загрузку apt-get, но помните, что это также разрешает все другие исходящие соединения DNS и HTTP, которые могут не соответствовать вашим требованиям.

iptables -F OUTPUT  # remove your existing OUTPUT rule which becomes redundant
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT

Если ваши источники APT включают источники HTTPS или FTP или источники HTTP на портах, отличных от 80, вам придется добавить эти порты также.

Далее вам нужно будет разрешить обратный трафик. Вы можете сделать это с помощью этого единственного правила, которое разрешает любое установленное соединение:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

(При использовании отслеживания соединений безопасно разрешать все входящие установленные соединения, поскольку только те соединения, которые вы разрешили в противном случае, перейдут в состояние ESTABLISHED.)

Celada
источник
Привет, спасибо за твой ответ. Это сработало, но как вы думаете, могут ли быть какие-то проблемы с безопасностью при открытии этих портов OUTPUT? Спасибо
anthony01
1
Большинство брандмауэров, включая практически все блоки в стиле SOHO, разрешают неограниченные исходящие соединения. У людей обычно нет требования ограничивать исходящий трафик. Но это зависит от ваших требований. Ваша существующая настройка запрещает пользователям на рабочей станции просматривать Интернет. Если это то, что вам нужно сделать, то вы не можете использовать это решение на основе iptables, потому что оно приводит к разрешению просмотра веб-страниц.
Селада
И если цель состоит в том, чтобы заблокировать просмотр веб-страниц, это в любом случае неправильный инструмент. Использование NetFilter / IPTables для блокировки всех исходящих подключений с целью предотвращения просмотра веб-страниц сотрудниками аналогично использованию базуки для открытия грецкого ореха. Вам нужен прозрачный веб-прокси, который будет регистрировать несоответствующее использование, в то же время позволяя просматривать связанные с работой авторизованные пользователи.
Магеллан
После нескольких часов поиска этот ответ, наконец, помог мне решить проблемы с моим собственным локальным сервером. Что бы я ни делал, весь исходящий трафик блокировался до тех пор, пока я явно не разрешил DNS-подключения через порт 53. Это имеет смысл, поскольку мой менеджер пакетов жаловался на то, что он не может разрешить хосты.
Лук