iptables không cho phép kết nối mysql với ips bí danh?


10

Tôi có một tường lửa iptables khá đơn giản trên một máy chủ cung cấp dịch vụ MySQL, nhưng iptables dường như mang lại cho tôi kết quả rất không nhất quán.

Chính sách mặc định trên tập lệnh như sau:

iptables -P INPUT DROP

Sau đó tôi có thể công khai MySQL với quy tắc sau:

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

Với quy tắc này, tôi có thể kết nối với MySQL từ bất kỳ IP nguồn nào đến bất kỳ IP đích nào trên máy chủ mà không gặp vấn đề gì. Tuy nhiên, khi tôi cố gắng hạn chế quyền truy cập chỉ ba IP bằng cách thay thế dòng trên bằng dòng sau, tôi gặp rắc rối (xxx = octect mặt nạ):

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 

Khi các quy tắc trên được đưa ra, các điều sau đây sẽ xảy ra:

  • Tôi có thể kết nối với máy chủ MySQL từ các máy chủ .184, .196 và .251 miễn là kết nối với máy chủ MySQL bằng địa chỉ IP mặc định của nó hoặc bí danh IP trong cùng mạng con làm địa chỉ IP mặc định.

  • Tôi không thể kết nối với MySQL bằng các bí danh IP được gán cho máy chủ từ một mạng con khác với IP mặc định của máy chủ khi tôi đến từ các máy chủ .184 hoặc .196, nhưng .251 hoạt động tốt. Từ các máy chủ .184 hoặc .196, một nỗ lực telnet chỉ bị treo ...

    # telnet 209.xxx.xxx.22 3306
    Trying 209.xxx.xxx.22...
    
  • Nếu tôi xóa dòng 0,251 (tạo ra .196 quy tắc cuối cùng được thêm vào), máy chủ .196 vẫn không thể kết nối với MySQL bằng các bí danh IP (vì vậy đó không phải là thứ tự của các quy tắc gây ra hành vi không nhất quán). Tôi biết, bài kiểm tra cụ thể này thật ngớ ngẩn vì nó không quan trọng theo thứ tự ba quy tắc này được thêm vào, nhưng tôi đoán rằng ai đó có thể hỏi.

  • Nếu tôi chuyển về quy tắc "công khai", tất cả các máy chủ có thể kết nối với máy chủ MySQL bằng cách sử dụng IP mặc định hoặc bí danh (trong cả mạng con):

    iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
    

Máy chủ đang chạy trong bộ chứa CentOS 5.4 OpenVZ / Proxmox (2.6.32-4-pve).

Và, chỉ trong trường hợp bạn muốn xem các quy tắc vấn đề trong ngữ cảnh của tập lệnh iptables, thì đây là (xxx = mặt nạ 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 

Có ý kiến ​​gì không? Cảm ơn trước. :-)


1
Các .184 or .196 hostsmáy khách cũng có thêm địa chỉ IP trong mạng con khác của bạn không? Nếu bạn làm tcpdump -qn port 3306và thử và kết nối từ một trong những hệ thống đó, bạn thấy gì? Bạn có thấy địa chỉ nguồn bạn mong đợi không?
Zoredache

1
Cảm ơn, Zordache! Điều đó đã giải quyết nó. Máy chủ .251 không có bất kỳ IP nào được gán từ mạng con khác. Hai máy chủ khác thực hiện (.184 và .196) và do đó, khi chúng kết nối với một IP trên mạng con khác, IP nguồn trên các máy chủ đó chuyển sang một IP trong cùng một mạng con. Tôi đã nghĩ rằng IP nguồn / đi sẽ luôn là IP mặc định được gán. Nhưng, tcpdump cho thấy rõ ràng IP nguồn thay đổi thành mạng con 209.xxx.xxx.xxx bất cứ khi nào nó kết nối với một IP trong cùng mạng con đó. (Tuy nhiên, phải chạy tcpdump từ máy chủ Proxmox vật lý.) Bạn là một người tài giỏi. Cảm ơn!
Curtis

Câu trả lời:


8

Do các máy chủ máy khách .184 hoặc .196 cũng có thêm địa chỉ IP trong mạng con khác của bạn không?

Nếu bạn làm tcpdump -qn port 3306và thử và kết nối từ một trong những hệ thống đó, bạn thấy gì? Bạn có thấy địa chỉ nguồn bạn mong đợi không? Đây có lẽ là một vấn đề định tuyến đơn giản.

Khi một hệ thống đưa ra quyết định tuyến đường, nó sẽ hỏi bảng tuyến. Bảng lộ trình là một danh sách luôn được tư vấn theo một thứ tự cụ thể. Các tuyến liên kết cho các mạng cục bộ hầu như luôn là các tuyến được ưa thích nhất và sẽ được sử dụng trước một tuyến sử dụng cổng (bộ định tuyến). Cổng mặc định luôn là tuyến được sử dụng khi không có tuyến nào khác được áp dụng. Nếu một tuyến đường mà một tuyến đã cho có một tuyến srcxác định, thì địa chỉ đó sẽ được ưu tiên và rất có thể được sử dụng khi tuyến đó đang được sử dụng.

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 

Vì vậy, được đưa ra bảng ví dụ tuyến đường này cho một hệ thống nhiều homed, mọi thứ được định sẵn 10.2.13.0/24sẽ đến từ 10.2.13.1và bất cứ thứ gì được định sẵn 10.2.4.0/23sẽ đến từ 10.2.4.245.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.