Моя корневая цель состоит в том, чтобы смочь препятствовать тому, чтобы взломщики установили несанкционированные исходящие связи на моем сервере (например, для оболочек подключения назад).
Я могу достигнуть этого путем блокирования всех портов для исходящего трафика с помощью "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.
Затем я понял, что не будет никакого способа знать то, чем исходный целевой IP-адрес был при получении переданного трафика. Именно тогда я нашел https://github.com/mitmproxy/mitmproxy и обнаружил, что он (как прозрачный прокси Python) взаимодействует с интерфейсом iptables для разработки, каков исходный целевой IP-адрес сокета.
У меня нет всего этого просто еще работающего, но я вполне уверен, этот подход должен работать.
Это работает только на одном компьютере, потому что он полагается на возможность прозрачного прокси-сервера взаимодействовать с iptables
и получать исходный IP-адрес назначения исходящего трафика.
Также обратите внимание, что этот метод немного хакерский в том смысле, что для преодоления проблемы с бесконечным циклом (перенаправление на прокси -> перенаправление на прокси -> ...) правила брандмауэра применяются к группе пользователей операционной системы, Это означает, что ни один пользователь, не входящий в группу, не будет получать свой исходящий трафик через прокси.
Шаги:
iptables
. Я использовал mitmproxy
(который основан на Python) и настроил его для работы в качестве корневой службы и прослушивания proxyPort . Добавьте правило в 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 соответствующим образом
iptables
или ufw
, чтобы разрешить исходящий трафик на proxyPort , разрешить проксирование любого порта (например, 80) и запретить все остальные по умолчанию.