Image

База знаний → Ограничение и контроль исходящего трафика в Linux через iptables

[Виртуальные сервера]
Дата публикации: 21.07.2025

Ограничение и контроль исходящего трафика могут быть полезны во многих случаях, например:

Защита от атак - когда службы на сервере генерируют ответы Защита данных - сложнее забрать информацию с сервера Защита от скриптов с закрытым кодом, которые могут собирать и передавать информацию без Вашего ведома

В нашем примере мы создадим виртуальную машину и предположим нам нужно протестировать некий софт на предмет передачи информации. Таким образом мы запретим все, кроме 1 ip с которого мы будем тестировать программное обеспечение.

1. Добавим правила в iptables

# Сброс текущих правил (осторожно, если подключение по SSH)
iptables -F OUTPUT

# Разрешить loopback (localhost)
iptables -A OUTPUT -o lo -j ACCEPT

# Разрешить DNS-запросы (если нужны, необязательно)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Разрешить все исходящие соединения на IP 111.222.111.222
iptables -A OUTPUT -d 111.222.111.222 -j ACCEPT

# Все остальные исходящие соединения — запретить
iptables -A OUTPUT -j REJECT

Где 111.222.111.222 - ip с которого мы будем тестировать, отправлять и получать данные.

2. Проверка правил, проверяем через ssh, с самого сервера

2.1 Проверка ping

ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 79.174.xx.xxx icmp_seq=1 Destination Port Unreachable
ping: sendmsg: Операция не позволена
From 79.174.xx.xxx icmp_seq=2 Destination Port Unreachable
ping: sendmsg: Операция не позволена
From 79.174.xx.xxx icmp_seq=3 Destination Port Unreachable
ping: sendmsg: Операция не позволена

2.1 Проверка telnet

telnet google.com 443
Trying 209.85.233.101...
Connection failed: В соединении отказано
Trying 209.85.233.113...
Connection failed: В соединении отказано
Trying 209.85.233.139...
Connection failed: В соединении отказано
Trying 209.85.233.100...

Как мы видим правила работают и при попытке скриптов, служб - никакие данные в интернет переданы не будут.

3. Мониторинг трафика и попыток соединений

3.1 Данный пример будет обновлять данные по соединениям php каждую секунду

watch -n 1 'lsof -i -nP | grep php'

php-fpm8.  445 www-data   11u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm8.  448 www-data   12u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm8.  449 www-data   14u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm8.  453 www-data   16u  IPv4 2405976614      0t0  TCP 127.0.0.1:9000 (LISTEN)

При наличии попыток соединиться с внешним узлом соединение будет видно, включая порт и ip адрес.

В случае с мониторингом php скриптом есть также дополнительные модули, например xdebug, не оставляйте его включенным в режиме продакшена, только для отладки.

Таким образом можно быстро создать песочницу на виртуальном сервере для необходимых скриптов и отслеживать сетевую активность - не подвергая данные риску.





Нет комментариев