MySQLサービスを提供するサーバー上にかなりシンプルなiptablesファイアウォールがありますが、iptablesは非常に一貫性のない結果を与えているようです。
スクリプトのデフォルトポリシーは次のとおりです。
iptables -P INPUT DROP
その後、次のルールでMySQLを公開できます。
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
このルールを設定すると、サーバー上の任意のソースIPから任意の宛先IPに問題なくMySQLに接続できます。しかし、上記の行を次のように置き換えることでアクセスを3つのIPのみに制限しようとすると、問題が発生します(xxx =マスクされたオクテット)。
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エイリアスを。
私はできない私が0.184または0.196ホストから来ているときに、サーバのデフォルトIPとは異なるサブネットからサーバーに割り当てられているIPエイリアスを使用してMySQLに接続するが、0.251はうまく動作します。.184または.196ホストから、Telnetの試行がハングするだけです...
# telnet 209.xxx.xxx.22 3306 Trying 209.xxx.xxx.22...
.251行を削除すると(.196が最後のルールが追加されます)、. 196ホストはIPエイリアスを使用してMySQLに接続できません(そのため、一貫性のない動作を引き起こしているルールの順序ではありません)。確かに、この3つのルールを追加する順序は関係ないので、この特定のテストは愚かでしたが、誰かが尋ねるかもしれません。
「パブリック」ルールに戻すと、すべてのホストがデフォルトまたはエイリアスIP(いずれかのサブネット内)を使用してMySQLサーバーに接続できます。
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
サーバーはCentOS 5.4 OpenVZ / Proxmoxコンテナー(2.6.32-4-pve)で実行されています。
そして、iptablesスクリプトのコンテキストで問題のルールを確認したい場合に備えて、これは(xxx =マスクされたオクテット)です。
# 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
何か案は?前もって感謝します。:-)
.184 or .196 hosts
クライアントホストはまたあなたの他のサブネット内の追加のIPアドレスを持っていますか?あなたが行う場合はtcpdump -qn port 3306
、あなたが何を参照するか、それらのシステムのいずれかからしようと接続?期待する送信元アドレスがわかりますか?