별칭이있는 IP에 mysql 연결을 허용하지 않는 iptables?


10

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 

어떤 아이디어? 미리 감사드립니다. :-)


1
할 일 .184 or .196 hosts클라이언트 호스트는 또한 다른 서브넷에 추가 IP 주소가? 당신이하고 tcpdump -qn port 3306그 시스템 중 하나에서 연결을 시도하면 무엇을 보십니까? 원하는 소스 주소가 보입니까?
Zoredache

1
고마워요 그것은 해결했다. .251 호스트에 다른 서브넷에서 할당 된 IP가 없습니다. 다른 두 호스트 (.184 및 .196)는 다른 서브넷의 IP에 연결하면 해당 호스트의 소스 IP가 동일한 서브넷의 IP로 전환됩니다. 나가는 / 소스 IP는 항상 기본으로 할당 될 것이라고 생각했습니다. 그러나 tcpdump는 소스 IP가 동일한 서브넷의 IP에 연결될 때마다 209.xxx.xxx.xxx 서브넷으로 변경됨을 분명히 보여줍니다. 그러나 물리적 Proxmox 호스트에서 tcpdump를 실행해야했습니다. 감사!
커티스

답변:


8

.184 또는 .196 호스트 클라이언트 호스트에도 다른 서브넷에 추가 IP 주소가 있습니까?

당신이하고 tcpdump -qn port 3306그 시스템 중 하나에서 연결을 시도하면 무엇을 볼 수 있습니까? 원하는 소스 주소가 보입니까? 이것은 아마도 간단한 라우팅 문제 일 것입니다.

시스템이 경로를 결정할 때 경로 테이블을 참조합니다. 라우팅 테이블은 항상 특정 순서로 참조되는 목록입니다. 로컬 네트워크의 링크 라우트는 거의 항상 가장 선호되는 라우트이며 게이트웨이 (라우터)를 사용하는 라우트 전에 사용됩니다. 기본 게이트웨이는 항상 다른 경로가 적용되지 않을 때 사용되는 경로입니다. 주어진 경로에 src정의 된 경로가 있으면 해당 경로가 선호 될 때 해당 주소가 선호되며 해당 경로가 사용될 때 가장 많이 사용됩니다.

10.2.13.0/24 dev eth1  proto kernel  scope link  src 10.2.13.1 
10.2.4.0/23 dev eth0  proto kernel  scope link  src 10.2.4.245 
default via 10.2.4.1 dev eth0 

따라서 멀티 홈 시스템에 대한이 예제 라우팅 테이블을 사용하면 대상에서 10.2.13.0/24오는 10.2.13.1것이 며, 대상이 대상에서 10.2.4.0/23오는 것입니다 10.2.4.245.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.