iptables tidak mengizinkan koneksi mysql ke ips alias?

10

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. :-)

Curtis
sumber
1
Apakah .184 or .196 hostshost klien juga memiliki alamat IP tambahan di subnet Anda yang lain? Jika Anda melakukan tcpdump -qn port 3306dan mencoba serta terhubung dari salah satu sistem itu, apa yang Anda lihat? Apakah Anda melihat alamat sumber yang Anda harapkan?
Zoredache
1
Terima kasih, Zordache! Itu menyelesaikannya. Tuan rumah .251 tidak memiliki IP yang ditugaskan dari subnet lainnya. Dua host lain melakukan (.184 dan .196), dan ketika mereka terhubung ke IP di subnet lain, IP sumber pada host tersebut beralih ke IP di subnet yang sama. Saya berpikir bahwa IP keluar / sumber akan selalu menjadi default yang ditetapkan. Tapi, tcpdump dengan jelas menunjukkan bahwa IP sumber berubah ke subnet 209.xxx.xxx.xxx setiap kali terhubung ke IP dalam subnet yang sama. (Namun, harus menjalankan tcpdump dari host Proxmox fisik.) Anda genious. Terima kasih!
Curtis

Jawaban:

8

Apakah host host klien .184 atau .196 juga memiliki alamat IP tambahan di subnet Anda yang lain?

Jika Anda melakukan tcpdump -qn port 3306dan mencoba serta terhubung dari salah satu sistem itu, apa yang Anda lihat? Apakah Anda melihat alamat sumber yang Anda harapkan? Ini mungkin masalah routing yang sederhana.

Ketika suatu sistem membuat keputusan rute, itu berkonsultasi dengan tabel rute. Tabel rute adalah daftar yang selalu dikonsultasikan dalam urutan tertentu. Rute tautan untuk jaringan lokal hampir selalu merupakan rute yang paling disukai, dan akan digunakan sebelum rute yang menggunakan gateway (router). Gateway default selalu merupakan rute yang digunakan saat tidak ada rute lain yang berlaku. Jika rute yang ditentukan memiliki rute tertentu src, maka alamat itu akan lebih disukai dan kemungkinan besar digunakan saat rute itu sedang digunakan.

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 

Jadi dengan diberikan contoh tabel rute ini untuk sistem multi-homed, apa pun yang ditakdirkan untuk 10.2.13.0/24akan datang dari 10.2.13.1, dan apa pun yang ditakdirkan untuk 10.2.4.0/23akan datang dari 10.2.4.245.

Sakit kepala
sumber