
У меня есть пара публичных веб-серверов и несколько домашних машин с Ubuntu. Я поддерживаю пару доменов специально для мониторинга таких вещей, как MySQL и Memcache. В идеале я мог бы подключаться к MySQL, Memcache и т. д. с моих домашних машин, запрещая всем остальным доступ.
Итак, мои iptables на данный момент такие:
ACCEPT tcp -- home ip 0.0.0.0/0 tcp dpt:3306
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT all -- server 1 ip 0.0.0.0/0
ACCEPT all -- server 2 ip 0.0.0.0/0
ACCEPT all -- server 3 ip 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Я хотел бы расширить свои iptables так, чтобы иметь доступ ко всему из дома. Я думаю, что, вероятно, будет хорошей практикой добавить строку для моего домашнего IP для каждого порта, который мне нужен, вместо того, чтобы давать моему домашнему IP доступ ко всем портам. Но, возможно, это не имеет значения. Кроме того, я хочу запускать такие вещи, как phpMemcachedAdmin, не требуя пароля.
Итак, я провел несколько поисков в Google о том, как запретить доступ к домену для всего мира. Я полагаю, что я ввел строку, разрешающую мой IP на порту 80, прямо над строкой, запрещающей доступ к домену для всего мира, и (скрестив пальцы) я должен заблокировать всех, кроме себя.
В сообщениях, которые я видел в своих поисках в Google, говорилось, что можно заблокировать домен через -m string "Host: domain.com"
или через --string "domain.com"
. Ни один из них не работает. Вот что я пробовал:
sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP
Первые две выдают ошибку с неверным аргументом «Host:...», а последняя выдает ошибку с неизвестной опцией «--string».
Чтобы немного усложнить ситуацию, мой домашний IP-адрес динамический, а не статический. Поэтому было бы неплохо иметь (но не обязательно) возможность разрешать мой домашний IP-адрес через домен DynDNS, который я настроил. У меня есть скрипт для остановки и запуска iptables, так что если мне понадобится, я всегда могу остановить и перезапустить его, чтобы принудительно обновить IP-адрес. (Я читал в нескольких местах, что iptables проверяет IP-адрес только для домена при запуске.)
Я также приветствую любые советы по безопасности использования iptables для вашего стандартного веб-сервера.
Спасибо
17.03.14 Дополнения: Я нашел синтаксическую ошибку в строке iptables - должно -m string
быть -m string --string
. Теперь, похоже, iptables распознает домен, в который я хочу не пускать людей. Однако затем проблема стала в порядке правил iptables.
Мои новые iptables стали такими:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_for_matching" ALGO name bm TO 65535
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Идея заключается в том, чтобы поймать мой IP до DROP, который соответствует строке. Если DROP — это первая строка, то он ловит его, и я получаю ошибку 502. Однако, если iptables такие, как я перечислил, то запросы проходят — мой домашний IP пока не в таблице правил.
Тот, который работает, выглядит так:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- Server 1 IP 0.0.0.0/0
ACCEPT all -- Server 2 IP 0.0.0.0/0
ACCEPT all -- Server 3 IP 0.0.0.0/0
ACCEPT all -- My Home IP 0.0.0.0/0
ACCEPT all -- My Laptop IP 0.0.0.0/0
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "str_to_match" ALGO name bm TO 65535
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 198.245.49.225 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:222
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Мне удалось включить свои динамические IP-адреса, просто указав их доменное имя DynDNS вместо IP-адреса.
Вероятно, я мог бы ответить на этот вопрос, но мне бы хотелось получить совет о наилучшей практике решения этой проблемы.