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. :-)
.184 or .196 hosts
má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àmtcpdump -qn port 3306
và 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?