MySQL 서비스를 제공하는 서버에 상당히 간단한 iptables 방화벽이 있지만 iptables는 매우 일관성없는 결과를 제공하는 것 같습니다.
스크립트의 기본 정책은 다음과 같습니다.
iptables -P INPUT DROP
그런 다음 다음 규칙을 사용하여 MySQL을 공개 할 수 있습니다.
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
이 규칙을 적용하면 문제없이 모든 소스 IP에서 서버의 대상 IP로 MySQL에 연결할 수 있습니다. 그러나 위의 줄을 다음과 같이 바꾸어 3 개의 IP에 대한 액세스를 제한하려고하면 문제가 발생합니다 (xxx = masked octect).
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
위의 규칙이 적용되면 다음이 발생합니다.
내가 할 수 그것의 기본 IP 주소를 사용하여 잘만큼 MySQL 서버에 연결하고있는 0.184, 0.196과 0.251 호스트에서 MySQL 서버에 접속 또는 기본 IP 주소와 동일한 서브넷에있는 IP 별칭을.
나는 없는 잘 IP의 I는 0.184 또는 0.196 호스트에서 오는있을 때 서버의 기본 IP가 아닌 다른 서브넷에서 서버에 할당 된 별칭 만 0.251 작품을 사용하여 MySQL을 연결합니다. .184 또는 .196 호스트에서 텔넷 시도가 중단됩니다 ...
# telnet 209.xxx.xxx.22 3306 Trying 209.xxx.xxx.22...
.251 행을 제거하면 (.196을 마지막 규칙 추가) .196 호스트는 여전히 IP 별명을 사용하여 MySQL에 연결할 수 없습니다 (따라서 일관성이없는 동작을 일으키는 규칙의 순서가 아님). 이 세 가지 규칙이 어떤 순서로 추가되는지는 중요하지 않기 때문에이 특정 테스트는 어리석은 것으로 알고 있지만 누군가가 요청할 수 있다고 생각했습니다.
"공용"규칙으로 다시 전환하면 모든 호스트가 기본 또는 별칭 IP (서브넷 중 하나)를 사용하여 MySQL 서버에 연결할 수 있습니다.
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
서버가 CentOS 5.4 OpenVZ / Proxmox 컨테이너 (2.6.32-4-pve)에서 실행 중입니다.
그리고 iptables 스크립트의 맥락에서 문제 규칙을보고 싶을 경우 (xxx = masked octect)입니다.
# 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
그 시스템 중 하나에서 연결을 시도하면 무엇을 보십니까? 원하는 소스 주소가 보입니까?