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

UFW - запретить исходящие сообщения, кроме обновлений apt-get?

Какая комбинация правил UFW будет запрещать все исходящие соединения, кроме тех, которые требуются для установки обновлений безопасности Ubuntu?

Расширяя ответ Халеда кратким примером: ...

Программа Python для вывода списка IP-адресов, связанных с обновлениями программного обеспечения:

#!/usr/bin/env python
import re, subprocess
re1 = re.compile("deb http://(.+?)/")
re2 = re.compile("Address:\s*(\d+\.\d+\.\d+\.\d+)")
IPv4 = {}
with open("/etc/apt/sources.list") as f:
  for line1 in f:
    m1 = re1.match(line1)
    if(m1):
      url = m1.group(1)
      p = subprocess.Popen(["nslookup", url], stdout=subprocess.PIPE)
      out,err = p.communicate()

      # Parse the output of nslookup:
      next_line_is_address = False
      for line2 in out.split("\n"):
        if(line2.startswith("Name:")):
          next_line_is_address = True
        elif(next_line_is_address):
          m2 = re2.match(line2)
          if(m2):
            IPv4[m2.group(1)] = True
          next_line_is_address = False

print "\n".join(sorted(IPv4.keys()))
# or call "ufw allow..." to allow port 80 outbound to these addresses

Пример вывода (по состоянию на январь 2014 г.):

user@pc:~$ ./ubuntu_servers.py 
194.169.254.10
91.189.91.13
91.189.91.14
91.189.91.15
91.189.92.156
91.189.92.190
91.189.92.200
91.189.92.201

whois 91.189.92.201 говорит, что 91.189.91.0/24 принадлежит Canonical, поэтому, если мы настраиваем брандмауэр, это может быть полезным диапазоном адресов, который следует запомнить.

Обычно я не использую ufw. Я использую iptables напрямую.

Ubuntu обычно получает обновления по протоколу http. Итак, вам нужно открыть исходящий HTTP-порт. Если вы хотите ограничить свои правила на определенных хостах, вам необходимо выяснить IP-адреса репозиториев Ubuntu. /etc/apt/sources.list.

Лучшее решение - перенаправить HTTP-трафик на веб-прокси и разрешить только определенные домены / URL-адреса. Это более точно, чем преобразование имен в IP-адреса для их блокировки с помощью брандмауэра.

Мой ответ касается более общего случая, а не только для apt-get.

Запретить все исходящие IP-адреса, кроме одного IP

sudo ufw default deny outgoing
sudo ufw allow out to 11.22.33.44

Чтобы быстро вернуться, снова разрешите все исходящие IP-адреса

sudo ufw default allow outgoing

Запретить все исходящие, кроме HTTP и HTTPS на одном IP

Вы можете быть более строгими:

sudo ufw default deny outgoing
sudo ufw allow out to 11.22.33.44 port http   # TCP 80
sudo ufw allow out to 11.22.33.44 port https  # TCP 443

Два приведенных выше правила разрешают только TCP, вам необходимо указать протокол (tcp или udp). Вы даже можете ввести более строгие ограничения, указав интерфейс как eth0, например, чтобы избежать использования WiFi ... Но я думаю, что это бесполезно ...

Проверьте / очистите свои правила UFW

Если другой IP-адрес все еще доступен, источником могут быть некоторые остаточные правила. Рекомендуется проверить текущие правила UFW:

sudo ufw status numbered

Возможно, вам придется удалить некоторые правила загрязнения:

sudo ufw delete 3   # Attention:
sudo ufw delete 2   # 2 and 3 are examples

Также разрешить DNS

Ваше программное обеспечение может использовать доменное имя вместо цифрового IP-адреса.

Поскольку UFW использует числовой IP-адрес, следующий ручной пример должен быть написан, чтобы его можно было легко выполнить снова при изменении IP-адресов.

Получите свой DNS IP
$ resolvectl status | grep -2 'DNS Server'
      DNSSEC setting: no
    DNSSEC supported: no   Current DNS Server: 22.22.22.20
         DNS Servers: 22.22.22.20
                      22.22.22.21
                      2b01:a00::2
Разрешить DNS (TCP и UDP) только для ваших DNS-серверов
$ sudo ufw allow out to 22.22.22.20 port 53
Rule added
$ sudo ufw allow out to 22.22.22.21 port 53
Rule added
Разрешить DNS (TCP и UDP) только для ваших DNS-серверов
$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 11.22.33.44 443/tcp        ALLOW OUT   Anywhere     (log, out)
[ 3] 22.22.22.20 53             ALLOW OUT   Anywhere     (out)
[ 4] 22.22.22.21 53             ALLOW OUT   Anywhere     (out)