У меня довольно простой брандмауэр iptables на сервере, который предоставляет сервисы MySQL, но iptables, похоже, дает мне очень противоречивые результаты.
Политика по умолчанию для сценария выглядит следующим образом:
iptables -P INPUT DROP
Затем я могу сделать MySQL общедоступным по следующему правилу:
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
С этим правилом я могу без проблем подключаться к MySQL с любого исходного IP-адреса на любой целевой IP-адрес на сервере. Однако, когда я пытаюсь ограничить доступ только тремя IP-адресами, заменив приведенную выше строку следующей, я сталкиваюсь с проблемой (xxx = маскированный октет):
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.184 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.196 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.251 -j ACCEPT
Как только вышеприведенные правила вступают в силу, происходит следующее:
Я могу подключиться к серверу MySQL с хостов .184, .196 и .251 очень хорошо, если я подключаюсь к серверу MySQL, используя его IP-адрес по умолчанию или псевдоним IP в той же подсети, что и IP-адрес по умолчанию.
Я не могу подключиться к MySQL, используя псевдонимы IP, которые назначены серверу из другой подсети, чем IP-адрес сервера по умолчанию, когда я иду с хостов .184 или .196, но .251 работает просто отлично. С хостов .184 или .196 попытка телнета просто зависает ...
# telnet 209.xxx.xxx.22 3306 Trying 209.xxx.xxx.22...
Если я удалю строку .251 (сделав последнее добавленное правило .196), хост .196 все равно не сможет подключиться к MySQL с помощью псевдонимов IP (поэтому это не тот порядок правил, который вызывает противоречивое поведение). Я знаю, что этот конкретный тест был глупым, поскольку не должно иметь значения, в каком порядке добавлены эти три правила, но я подумал, что кто-то может спросить.
Если я вернусь к «общедоступному» правилу, все хосты смогут подключаться к серверу MySQL, используя IP-адреса по умолчанию или псевдонимы (в любой подсети):
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
Сервер работает в контейнере CentOS 5.4 OpenVZ / Proxmox (2.6.32-4-pve).
И, на всякий случай, если вы предпочитаете видеть правила проблемы в контексте скрипта iptables, вот оно (xxx = маскированный октет):
# Flush old rules, old custom tables
/sbin/iptables --flush
/sbin/iptables --delete-chain
# Set default policies for all three default chains
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT
# Enable free use of loopback interfaces
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
# All TCP sessions should begin with SYN
/sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# Accept inbound TCP packets (Do this *before* adding the 'blocked' chain)
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow the server's own IP to connect to itself
/sbin/iptables -A INPUT -i eth0 -s 208.xxx.xxx.178 -j ACCEPT
# Add the 'blocked' chain *after* we've accepted established/related connections
# so we remain efficient and only evaluate new/inbound connections
/sbin/iptables -N BLOCKED
/sbin/iptables -A INPUT -j BLOCKED
# Accept inbound ICMP messages
/sbin/iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -p ICMP --icmp-type 11 -j ACCEPT
# ssh (private)
/sbin/iptables -A INPUT -p tcp --dport 22 -m state --state NEW -s xxx.xxx.xxx.xxx -j ACCEPT
# ftp (private)
/sbin/iptables -A INPUT -p tcp --dport 21 -m state --state NEW -s xxx.xxx.xxx.xxx -j ACCEPT
# www (public)
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# smtp (public)
/sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 2525 -j ACCEPT
# pop (public)
/sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# mysql (private)
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.184 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.196 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.251 -j ACCEPT
Есть идеи? Заранее спасибо. :-)
.184 or .196 hosts
Есть ли у хостов клиента дополнительные IP-адреса в другой подсети? Если вы делаетеtcpdump -qn port 3306
и пытаетесь подключиться к одной из этих систем, что вы видите? Вы видите адрес источника, который ожидаете?