Назад | Перейти на главную страницу

Почему iptables работает с совпадающими строками при использовании -m string «example.com»?

По моей информации, лучше не использовать команду:

iptables -A INPUT -s example.com -j DROP

Так как example.com будет заменен в реальном времени на IP-адрес, который не будет охватывать все возможные IP-адреса.

Но если я использую:

iptables -A INPUT -m string --string "example" --algo kmp -j DROP

Взято из этого ответ и я сам это протестировал, тогда мне больше не нужно беспокоиться о подстановке ip, потому что «example» будет соответствовать «example.com» и заблокирует его.

Так что если iptables работает только с ip адресами, почему во втором случае работает с именами?

Вы не можете искать example.com в URL-адресе, поскольку большинство веб-сайтов теперь работают исключительно через HTTPS.

Да, в вашем примере iptables решит example.com при первом вызове и в случае изменения его IP-адреса это правило больше не будет работать, но вы можете решить его, запустив, например, скрипт cron, который разрешает example.com, и если есть новый IP-адрес, он затем добавляется в ваши правила iptables через -I или -A.

Если вы используете -m string --string example, он будет соответствовать всем IP-пакетам, в которых полезная нагрузка содержит строку example.

Если вы переходите на страницу через HTTP, а страница содержит слово example, страница отображается только частично, потому что ваше правило отбрасывает пакет, содержащий слово example.

Правило также может нарушить работу многих других протоколов, использующих простой текст. Он также может разорвать зашифрованные соединения, если зашифрованная полезная нагрузка будет соответствовать example.

Вы должны использовать фильтрующий прокси для блокировки вашего трафика, он точен и не вызывает нежелательных побочных эффектов.

Если вы не хотите внедрять фильтрующий прокси, то вариант для бедных - блокировать DNS-запросы для вашего целевого домена:

РЕДАКТИРОВАТЬ Удалено .com из-за того, что пакеты DNS содержат не точки, а индикаторы длины.

iptables -I OUTPUT -p udp --dport 53 -m string --string example -j DROP

Это отбросит DNS-запросы для вашего целевого домена, эффективно блокируя доступ к этим доменам. Клиенты будут ждать ответа DNS по тайм-ауту, поэтому блокировка довольно агрессивна.

Потому что это образец для струнных. Да, цель у тебя есть. Но! Если вы попытаетесь найти что-нибудь, кроме "example" на google.com, вы тоже не сможете. Будьте осторожны при использовании этого параметра.

Так как example.com должен присутствовать в заголовок большинства запросов к серверу на example.com:

  • Если вы отправили электронное письмо, вы поставите to: john@example.com в заголовке письма.

  • Если вы сделаете что-нибудь HTTP запрос против example.com, после разрешения DNS минимальный запрос должен содержать целевой хост:

    host example.com
    example.com has address 123.45.78.89
    

    DNS-запрос выполняется на DNS-сервере, не обязательно на example.com. (если не кешируется!)

    nc 123.45.67.89 80 <<eoRequest
    GET /index.html HTTP/1.0
    Host: example.com
    eoRequest
    

Конечно, твой iptable Правило отбрасывает только пакет заголовка, но следующий пакет не будет понят сервером, поэтому он будет отброшен самим сервером. Журналы сервера и окно клиента могут запрашивать что-то вроде 400 Bad Request