Какая комбинация правил 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
.
sudo ufw default deny outgoing
sudo ufw allow out to 11.22.33.44
sudo ufw default allow outgoing
Вы можете быть более строгими:
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 ... Но я думаю, что это бесполезно ...
Если другой IP-адрес все еще доступен, источником могут быть некоторые остаточные правила. Рекомендуется проверить текущие правила UFW:
sudo ufw status numbered
Возможно, вам придется удалить некоторые правила загрязнения:
sudo ufw delete 3 # Attention:
sudo ufw delete 2 # 2 and 3 are examples
Ваше программное обеспечение может использовать доменное имя вместо цифрового 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)