Ограничьте исходящий сетевой трафик доменным именем (Linux)

Моя корневая цель состоит в том, чтобы смочь препятствовать тому, чтобы взломщики установили несанкционированные исходящие связи на моем сервере (например, для оболочек подключения назад).

Я могу достигнуть этого путем блокирования всех портов для исходящего трафика с помощью "ufw", за исключением тех, которыми сервер должен управлять (т.е. DNS, HTTP, SSH и SMTP).

ufw позволяет мне только позволять исходящие соединения DNS со статическим IP-адресом (таким образом, я настрою сервер для использования Google DNS), и он позволяет мне ограничивать выход SSH, предназначенный для 127.0.0.1 (мой сценарий автоматического развертывания требует этого с Мерзавцем).

Как я узнал, ufw действительно не позволяет исходящие ограничения на основе доменных имен, который имеет смысл (с точки зрения производительности). Я должен смочь сделать это для ограничения исходящих соединений SMTP с доменом моего почтового сервера (в настоящее время просто использующий Gmail для тестирования) и на HTTP-соединения с серверами Ubuntu (для системных обновлений).

Я знаю, что iptables позволяет Вам указывать правила на основе доменов, но они переводятся на запуске и не работали каждый раз (т.е. обратный DNS). Я знаю, что это дизайном по причинам производительности.

Таким образом, что решение состоит в том, чтобы ограничить исходящий сетевой трафик доменным именем (т.е. каждое исходящее соединение должен иметь, это - целевой DNS'd реверса IP-адреса и подобранный против белого списка доменных имен)?

Я думаю, что, если я не могу получить основанную на домене половину исходящей работы ограничений, нет большого количества точки к ограничению DNS и SSH IP с помощью ufw.

  • Отредактируйте 1*, Таким образом, я разработал, как использовать iptables непосредственно для "передавания" выхода, предназначенного для определенного порта (например, 80) к другому порту.

Затем я понял, что не будет никакого способа знать то, чем исходный целевой IP-адрес был при получении переданного трафика. Именно тогда я нашел https://github.com/mitmproxy/mitmproxy и обнаружил, что он (как прозрачный прокси Python) взаимодействует с интерфейсом iptables для разработки, каков исходный целевой IP-адрес сокета.

У меня нет всего этого просто еще работающего, но я вполне уверен, этот подход должен работать.

1
задан 25 January 2015 в 04:22
1 ответ

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

Также обратите внимание, что этот метод немного хакерский в том смысле, что для преодоления проблемы с бесконечным циклом (перенаправление на прокси -> перенаправление на прокси -> ...) правила брандмауэра применяются к группе пользователей операционной системы, Это означает, что ни один пользователь, не входящий в группу, не будет получать свой исходящий трафик через прокси.

Шаги:

  1. Создайте новую группу пользователей операционной системы под названием прокси.
  2. Добавьте каждого пользователя операционной системы ( кроме рута!)в эту новую группу
  3. Получите id группы прокси и запомните его на будущее.
  4. Настройте какой-либо прозрачный прокси-сервер, который может принимать протокол (s ) вы хотите использовать прокси и можете взаимодействовать с iptables . Я использовал mitmproxy (который основан на Python) и настроил его для работы в качестве корневой службы и прослушивания proxyPort .
  5. Добавьте правило в iptables для перенаправления всего исходящего трафика, предназначенного для определенного порта (например, http), на 127.0.0.1:[1141709 visibleproxyPort, например:

    iptables -t nat -A OUTPUT -m owner --gid-owner proxyGID - p tcp --dport 80 -j DNAT --to 127.0.0.1:proxyPort, заменяя proxyGID и proxyPort соответствующим образом

  6. Настройте iptables или ufw , чтобы разрешить исходящий трафик на proxyPort , разрешить проксирование любого порта (например, 80) и запретить все остальные по умолчанию.
  7. Настройте свой прозрачный прокси для отбрасывания запросов, как вам нравится. Чтобы ответить на этот вопрос, вы должны настроить прокси-сервер для выполнения обратного DNS на исходном IP-адресе назначения и проверить, что полученный домен находится в предварительно настроенном белом списке, в противном случае трафик должен быть отброшен.
1
ответ дан 4 December 2019 в 00:13

Теги

Похожие вопросы