Saya memiliki firewall iptables yang cukup sederhana di server yang menyediakan layanan MySQL, tetapi iptables tampaknya memberi saya hasil yang sangat tidak konsisten.
Kebijakan default pada skrip adalah sebagai berikut:
iptables -P INPUT DROP
Saya kemudian dapat membuat MySQL publik dengan aturan berikut:
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
Dengan aturan ini, saya dapat terhubung ke MySQL dari IP sumber apa pun ke IP tujuan apa pun di server tanpa masalah. Namun, ketika saya mencoba membatasi akses ke hanya tiga IP dengan mengganti baris di atas dengan yang berikut, saya mengalami masalah (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
Setelah aturan di atas diberlakukan, hal berikut terjadi:
Saya dapat terhubung ke server MySQL dari host .184, .196, dan .251 baik-baik saja selama saya terhubung ke server MySQL menggunakan alamat IP default atau alias IP dalam subnet yang sama dengan alamat IP default.
Saya tidak dapat terhubung ke MySQL menggunakan alias IP yang ditugaskan ke server dari subnet yang berbeda dari IP default server ketika saya datang dari host .184 atau .196, tetapi .251 berfungsi dengan baik. Dari host .184 atau .196, upaya telnet hanya hang ...
# telnet 209.xxx.xxx.22 3306 Trying 209.xxx.xxx.22...
Jika saya menghapus baris .251 (membuat .196 aturan terakhir ditambahkan), host .196 masih tidak dapat terhubung ke MySQL menggunakan alias IP (jadi bukan urutan aturan yang menyebabkan perilaku tidak konsisten). Saya tahu, tes khusus ini konyol karena seharusnya tidak peduli urutan apa yang ditambahkan ketiga aturan ini, tetapi saya pikir seseorang mungkin bertanya.
Jika saya beralih kembali ke aturan "publik", semua host dapat terhubung ke server MySQL menggunakan IP default atau alias (di salah satu subnet):
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
Server berjalan dalam wadah CentOS 5.4 OpenVZ / Proxmox (2.6.32-4-pve).
Dan, kalau-kalau Anda lebih suka melihat aturan masalah dalam konteks skrip iptables, ini dia (xxx = oktaf bertopeng):
# 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
Ada ide? Terima kasih sebelumnya. :-)
.184 or .196 hosts
host klien juga memiliki alamat IP tambahan di subnet Anda yang lain? Jika Anda melakukantcpdump -qn port 3306
dan mencoba serta terhubung dari salah satu sistem itu, apa yang Anda lihat? Apakah Anda melihat alamat sumber yang Anda harapkan?