У мене досить простий брандмауер 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 просто висить ...
# telnet 209.xxx.xxx.22 3306 Trying 209.xxx.xxx.22...
Якщо я видаляю рядок .251 (робить останнє додане правило .196), хост .196 все ще не може підключитися до MySQL, використовуючи псевдоніми IP (так що це не порядок правил, що викликає непослідовну поведінку). Я знаю, цей тест був дурним, тому що не має значення, в якому порядку додаються ці три правила, але я подумав, що хтось може запитати.
Якщо я переключусь на правило "public", усі хости можуть підключитися до сервера 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
спробу і підключитесь до однієї з цих систем, що ви бачите? Чи бачите ви очікувану адресу джерела?