iptables で他のサーバとの通信を禁止する
作業ミスの予防として手元の開発環境から本番環境の MySQL への接続を禁止したくなったのですが、他で使っていたりするのでサーバ側でポートを閉じたりは出来そうにありません。
ということで、取りあえずクライアント側で iptables を使って本番サーバの特定ポートとの通信を禁止してみました。
root ユーザになり以下のコマンドを実行します。
# iptables -A OUTPUT -p tcp -d 192.0.2.0 --dport 3306 -j REJECT
対象サーバ 192.0.2.0 のポート 3306 に対して送信する tcp パケットを破棄するチェインを追加しています。
DROP にしてしまうとエラーが返って来ずにクライアントが待たされるので、即時エラーにするため REJECT にしています。
ちゃんとチェインが追加されたか確認してみます。
# iptables -L -nv ・ ・ ・ Chain OUTPUT (policy ACCEPT 359 packets, 47588 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT tcp -- * * 0.0.0.0/0 192.0.2.0 tcp dpt:3306 reject-with icmp-port-unreachable
大丈夫そうですね。
試しに接続を試みてみると以下のように期待通りエラーになってくれました。
# mysql -uroot -p -h192.0.2.0 Enter password: ERROR 2003 (HY000): Can't connect to MySQL server on '192.0.2.0' (111)
これで仮にローカルでうっかり 「RAILS_ENV=production bundle exec rake db:drop」 とかしてしまってもエラーになるだけなので安心です。
まぁ Rails に関してだけ言えばそもそも本番環境の設定入れとくなよ、という話なんですが。
再度接続したくなった場合は以下のようにしてチェインを削除すれば OK。
# iptables -D OUTPUT -p tcp -d 192.0.2.0 --dport 3306 -j REJECT
問題がないことが確認できたら、追加したチェインを永続的に保存するため以下を実行します。
# service iptables save
これで再起動後も追加した設定が有効になります。