綺麗に死ぬITエンジニア

CentOS 6でローカルサーバーに接続できないときの対処法

2017-10-20

普通、ローカルで起動しているサーバーへ、ネットワーク経由(ループバックインターフェース)で接続する場合、デフォルトのサーバーの設定ではファイアウォール等の影響を受けないように設定されます。

しかし、これまで色々なサーバーを触ってきましたが、稀にホワイトリスト方式でローカルからのネットワーク接続も拒否するような設定にしているところもあったりします。

私の経験上、そのような設定ではデータベース(MySQL)サーバーで後になってから問題になることがあります。

多くの場合、ローカルのプロセスへの接続には自動的にUNIXドメインソケットを利用するようになっており、ネットワーク経由で接続できずとも直ちに問題になることは少ないです。しかし、導入するアプリケーションやデータベースクライアントによっては、SSHトンネルによるUNIXドメインソケット経由では接続できず、ネットワーク(ローカルループバックインターフェース)経由での接続を強制されることがあるのです。

そんなときどうすればいいか、備忘録として残しておきます。

現象

mysql -u root -p
# Enter password: 
# Welcome to the MySQL monitor.  Commands end with ; or \g.

上記のように、ホスト未指定(UNIXドメインソケット経由)で接続した場合には、接続できます。

mysql -h 127.0.0.1 -u root -p
# Enter password: 
# ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (110)

しかし、上記のように、ホストに127.0.0.1を指定した場合には、接続に失敗します。

iptablesの設定変更

まず、ローカルサーバーへ接続できなくなったら、iptables(CentOS 6で導入される標準のファイアウォール)が影響を与えているかどうかを確認します。

下記のコマンドを実行し、iptablesを停止します。

sudo /etc/init.d/iptables stop

iptablesが停止したら、ローカルサーバーに再度接続してみます。

接続できればiptablesが原因なので、次の手順に進みましょう。それでも接続できなければ、原因は他にあります。Googleに戻って別の対処法を探してください。

再度iptablesを起動します。

sudo /etc/init.d/iptables start

以下のコマンドを実行し、ローカルループバックインターフェースからのパケットを全て許可するルールを先頭に追加します。

sudo iptables -I INPUT -i lo -j ACCEPT

以上で終了です。

なお、このままだと再起動で設定が元に戻ってしまうので、下記のコマンドを実行し、設定を/etc/sysconfig/iptablesへ保存します。

sudo /etc/init.d/iptables save

これで、再起動しても設定が引き継がれます。

まとめ

他の人が構築したサーバーをいじったりする機会があると、結構色々な場面でつまづいたりします。ファイアウォールくらいはよくある落とし穴なので、これを機にファイアウォールの設定について、見直してみてはいかがでしょうか。