akishin999の日記

調べた事などを書いて行きます。

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

これで再起動後も追加した設定が有効になります。

最近は開発環境も仮想機上の Linux を使う事が多いので、iptables で簡単に通信制御できて便利ですね。