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

Как создать правило Iptables с использованием доменного имени

Может ли кто-нибудь предложить способ использования доменного имени в правилах iptables.

Если это все возможно, рассмотрите возможность настройки прозрачного прокси-сервера на уровне приложения. С прокси-сервером приложения, вероятно, будет намного проще выполнить этот тип фильтрации.

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

Если кто-то собирался попытаться создать такую ​​вещь, которая действительно использовала бы DNS на основе фильтрации пакетов, это почти наверняка пришлось бы делать через пользовательское пространство. В частности, вы должны использовать что-то вроде libnetfilter_queue. Я никогда этим не пользовался, но Packetbl может быть близок к этому, но, похоже, не очень хорошо поддерживается.

Другой альтернативой может быть настройка Фильтрация уровня 7. Вы можете отфильтровать часть запроса, если DNS-имя преобразуется как часть полезной нагрузки пакета.

Мне нужен был iptables, чтобы разрешить ssh-доступ на основе доменного имени с моего домашнего IP-адреса, но я хотел, чтобы он был закрыт для всех остальных адресов. Поскольку у меня есть динамический IP-адрес, который иногда меняется, я написал сценарий для обновления правил на основе IP-адреса моей динамической записи DNS. Я новичок в этом, поэтому уверен, что есть способ получше. Замените «yourname» своим динамическим именем хоста DNS.

#!/bin/sh

/usr/bin/nslookup yourname.dynalias.org > temp
found=0
address=""
while read LINE
do
 if [[ "$LINE" == Address* ]]; then
        let found++
        if [[ $found == 2 ]]; then
                address=${LINE:8};
                /sbin/iptables-save > /root/rulesdump
                while read LINE2
                do
                        if [[ "$LINE2" == *$address* ]]; then
                                ruleexists=1;
                        fi
                done < /root/rulesdump;
                if [[ "$ruleexists" != 1 ]]; then
                        /sbin/iptables -D INPUT -j LOG_DROP
                        /sbin/iptables -A INPUT -s $address -p tcp -m tcp --dport 22 -j LOG_ACCEPT
                        /sbin/iptables -A INPUT -j LOG_DROP
                fi
        fi
 fi
done < /root/temp;

Поместите указанный выше сценарий в crontab, чтобы он запускался время от времени.

Короткий ответ, если вы уверены, что IP-адрес навсегда статичен:

iptables -A INPUT -s `dig host.your-domain-name.com +short`/32 -p tcp -m tcp --dport 22 -j ACCEPT

То же самое в рубине и короче:

#!/usr/bin/env ruby
require 'resolv'
ip = Resolv.getaddress "mydomain.com"
`iptables -A INPUT -p tcp --dport 22 -s #{ip} -j ACCEPT` if `iptables --list` !~ /#{ip}/