Может ли кто-нибудь предложить способ использования доменного имени в правилах 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}/