IPTABLES: запретить доступ к домену всем, кроме небольшого списка IP-адресов

IPTABLES: запретить доступ к домену всем, кроме небольшого списка IP-адресов

У меня есть пара публичных веб-серверов и несколько домашних машин с 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-адреса.

Вероятно, я мог бы ответить на этот вопрос, но мне бы хотелось получить совет о наилучшей практике решения этой проблемы.

Связанный контент