Проблема с iptables для рабочего стола Ubuntu-20.04.3
Я хочу проверить некоторые правила iptables, правило состоит в том, чтобы запрещать весь исходящий трафик, кроме DNS.
поэтому я изменил правило OUTPUT по умолчанию для таблицы фильтров на DROP с помощью этой команды.
sudo iptables -t filter -P OUTPUT DROP
затем я добавил это правило к ACCEPT DNS-трафику.
sudo iptables -t filter -A OUTPUT -p udp --dport 53 -o ens33 -j ACCEPT
и я запускаю эту команду, чтобы проверить политику.
nslookup google.com
и перед запуском этой команды я запускаю wireshark на своей виртуальной машине и хосте.
затем команда nslookup потратила некоторое время и выдала мне это сообщение.
время соединения истекло; нет доступа к серверам
а wireshark (на вм и на хосте) не перехватывал никакие пакеты.
поэтому я удалил это правило и добавил другое.
sudo iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
и сделал то же самое, что и раньше.
то же сообщение появляется снова, но wireshark (на виртуальной машине и на хосте) перехватывает пакеты (запрос и ответ).
затем я удалил это правило и добавил следующее правило.
sudo iptables -t filter -A OUTPUT -p udp -j ACCEPT
и сделал то же самое, что и раньше.
на этот раз команда nslookup возвращает результат, и wireshark перехватывает пакеты.
Так почему это происходит?
перед этими тестами я установил snort (на другой виртуальной машине) и попытался сбросить несколько пакетов, но это не сработало.
пакеты регистрируются, но не отбрасываются.
Я не знаю, связаны эти случаи или нет.
1 ответ
Ваш вопрос действительно хороший. Сообщений об ошибках нет, и все выглядит правильно с помощью различных инструментов запроса iptables.
Однако вам необходимо разрешить трафик к/от локального петлевого интерфейса, вот. Так что вам нужно еще одно правило. Кстати, вам не нужно
-t filter
часть. Итак, я изменил сетевой интерфейс моего тестового компьютера, и я использую tcpdump вместо wireshark, и у меня есть два запущенных экземпляра, один на lo и один на моем сетевом адаптере:
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -o br0 -j ACCEPT
sudo iptables -P OUTPUT DROP
nslookup google.com
Server: 127.0.0.53 <<<<<<< NOTE:
Address: 127.0.0.53#53
Non-authoritative answer:
Name: google.com
Address: 142.251.33.78
Name: google.com
Address: 2607:f8b0:400a:806::200e
а также:
doug@s19:~/iptables/tmp$ cat c06.txt
2021-11-21 09:41:07.851723 IP 192.168.111.136.37847 > 192.168.111.1.53: 52661+ [1au] A? google.com. (39)
2021-11-21 09:41:07.879409 IP 192.168.111.1.53 > 192.168.111.136.37847: 52661 1/0/1 A 142.251.33.78 (55)
2021-11-21 09:41:07.884300 IP 192.168.111.136.52279 > 192.168.111.1.53: 58740+ [1au] AAAA? google.com. (39)
2021-11-21 09:41:07.899157 IP 192.168.111.1.53 > 192.168.111.136.52279: 58740 1/0/1 AAAA 2607:f8b0:400a:806::200e (67)
а также:
doug@s19:~/iptables/tmp$ cat l01.txt
2021-11-21 09:41:07.850815 IP 127.0.0.1.51470 > 127.0.0.1.51470: UDP, length 1
2021-11-21 09:41:07.851625 IP 127.0.0.1.46738 > 127.0.0.53.53: 31736+ A? google.com. (28)
2021-11-21 09:41:07.879486 IP 127.0.0.53.53 > 127.0.0.1.46738: 31736 1/0/0 A 142.251.33.78 (44)
2021-11-21 09:41:07.884223 IP 127.0.0.1.35841 > 127.0.0.53.53: 58878+ AAAA? google.com. (28)
2021-11-21 09:41:07.899259 IP 127.0.0.53.53 > 127.0.0.1.35841: 58878 1/0/0 AAAA 2607:f8b0:400a:806::200e (56)
Так почему сервер кажется локальным? По умолчанию Ubuntu запускает локальный резолвер для буферизации DNS-записей и тому подобного:
doug@s19:~$ sudo ss -tulpn | grep ":53"
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=834,fd=12))
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=834,fd=13))
см. также результаты
sudo systemctl status systemd-resolved
и соответствующие справочные страницы .