Поэтому Ваша оболочка усекает файл, когда Вы перенаправляете к нему. Это происходит, прежде чем глава получает шанс считать его.
Можно или использовать временный файл:
head -n1 hosts > hosts.tmp && mv hosts.tmp hosts
Или используйте sponge
от moreutils packate:
head -n1 hosts | sponge hosts
Если вы отбрасываете трафик с помощью разрешения имен с правилами iptables, имена будут разрешены во время создания этого правила. Если что-то изменится, ваше правило больше не будет действовать. Это могло бы быть решением (не красивым ...):
# iptables -I FORWARD -p udp --dport 53 -m string --hex-string "|03|www|08|facebook|03|com" --algo bm -j DROP
С другого хоста в локальной сети:
# host www.facebook.com
www.facebook.com A record not found, try again
По сути, вы говорите каждому пакету DNS ( udp / 53
), у которого есть следует отбросить шестнадцатеричную строку от www.facebook.com до
. Обратите внимание, что это снизит разрешение имен, а не сам HTTP-трафик.
Шестнадцатеричные числа, разделенные вертикальной чертой ( | 03 | www | 08 | facebook | 03 | com
), представляют собой точку .
символ по днс запросам. В нем будет указано, сколько из следующих символов будет представлять каждую часть FQDN (хост, домен, домен верхнего уровня). Пример:
хост: mail.google.com
шестнадцатеричное представление: 04 6d 61 69 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d
«визуальное» представление: 04mail06google03com
Получение пакета с помощью tcpdump:
# tcpdump -i eth0 -X dst port 53
15:50:11.643672 IP xxx.xxx.xxx.xxx:xxx > ns4.google.com.domain: 16530 A? mail.google.com. (33)
0x0000: 4500 003d 779a 4000 4011 b390 c949 4742 E..=w.@.@....IGB
0x0010: d8ef 260a 8424 0035 0029 0fc0 4092 0000 ..&..$.5.)..@...
0x0020: 0001 0000 0000 0000 046d 6169 6c06 676f .........mail.go
0x0030: 6f67 6c65 0363 6f6d 0000 0100 01 ogle.com.....
Но помните:
При запуске привязки локального кэширования9 это часто реализуется с помощью фиктивного блока
zone "facebook.com" { type master; file "dummy-block"; };
и файла фиктивного блока
:
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
* IN A 127.0.0.1
См. Также:
Запуск BIND9 и ISC -DHCP на примере facebook.com
.
Может быть, ответ на ваш вопрос Слишком поздно, но недавно мне нужно было решить подобную проблему, и Google приносит мне здесь
После неудачных поисков я написал небольшую утилиту в C, которая перехватывает DNS-ответы, сравнивает доменное имя в нем против заданного Regex и списков сопоставленных IP-адресов Отказ Вот оно: https://github.com/vmxdev/sidmat/
Вам не нужно настраивать свой собственный DNS-сервер, утилита может начать ответы DNS с любого сервера
См. IP-адреса Facebook.com (и поддомены) IP-адреса, которые решаются прямо сейчас, вы можете запустить
# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...
, где ETH0 - это сетевой интерфейс на маршрутизаторе (или где пропуск ответов DNS)
Вы можете легко интегрировать его с IPTables (или iPtables с ipset )
Но:
Для внесения в черный список проще всего использовать dnsmasq
Install dnsmasq
$ sudo apt-get install dnsmasq
и добавить эту строку в /etc/dnsmasq.conf
address=/facebook.com/127.0.0.1
Это заблокирует facebook.com и все его поддомены.
Примечание: Для ubuntu смотрите этот пост.