スポンサーリンク

ubuntuでiptablesを設定したらssh接続が激遅になった時の解決方法

自分で建てていたubuntuのサーバー、色々テストするための用途だし、ローカルネットワークにおいてたので来る通信は全部OK、ACCEPT。なんでも通しちゃう状態だったのですが、そういえばちゃんとiptablesとか設定したことないなって思って、ちゃんと設定してみることにしました。

今回設定するiptablesの設定は「特定のIPからの通信を許可する」です。

sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -s 192.168.100.1 -j ACCEPT
sudo iptables -P INPUT DROP

とりあえず上記の設定を投入したところ、iptablesによるアクセス制限はできたのですが、許可したIPへssh接続しようとするとなんだか激遅い……。昔からサーバー弄ってるとこのあたりの挙動を解決しようとしては途中で挫折して結局iptablesを全部OK、ACCEPT状態に戻してたんですが、今回はやりました。色々調べた結果、いつもうまくいかなかった原因を特定し、ssh接続が激遅になるのを解消したので、そのやり方、試したことを順番に紹介します。

ちなみにubuntuのversionは「20.04.2 LTS」です。

さらにちなみに、このssh接続が激遅の時は、netstat-rとか、iptables -L とかも遅いです。ただし、こっちのコマンドはnのオプションをつけて netstat-rnとか、iptables -nL とかのコマンドにすると、名前解しにいかないのですぐに表示されます。

DNS設定ファイル /etc/resolv.conf の編集

激遅になる特徴として、10秒くらい待ってると、結局ssh接続できるのです、通信自体が遮断されてるわけじゃないので、原因はDNS関係だろうなという想像はついてました。sshで接続しようとした時、DNSで名前解決しようとしてるけど、応答なくて、タイムアウトしてやっとssh接続できる、みたいな流れのはずです。

そう考えれば、LinuxのDNS設定ファイルである /etc/resolv.conf から nameserverの設定を外してしまえばいいはず、ネットにもそう書いてあったし! と意気揚々とコメントアウトしましたが、これしてもダメ……。

次の方法を試します。

SSHD設定ファイル /etc/ssh/sshd_config

ネットで情報探してたら、下記のようなサイトの情報を見つけました。

SSHが10秒ぐらい遅くなる原因を調べた(原因はDNS) – フラミナル
https://blog.framinal.life/entry/2018/08/09/172436

なーるほど、 /etc/ssh/sshd_config の中の設定を下記のようにすれば、DNS問い合わせもいかないのか、と試しました。

#UseDNS yes
↓
UseDNS no

……やっぱりssh接続は激遅のまま……。次の方法を探します。

これで解決! /etc/nsswitch.conf

この/etc/nsswitch.confを弄ってやっと激遅が解決しました! このファイルはDNSリゾルバ関係の設定ファイルみたいで、実は今のubuntuだと /etc/resolv.conf これ使ってないんですかね……?

どうやらDNS Serverに問い合わせに行って遅くなってたって訳じゃなくて、/etc/hosts.confの中身を見にいってて、激遅になってたってのが正しい理解のようです。

/etc/nsswitch.conf の中身を見てみると、

uniasite@LAPTOP-MPCGKQVK:~$ cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files systemd
group:          files systemd
shadow:         files
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

こんな感じになってて、hostsの部分を以下のように修正します。

#hosts:          files dns
hosts:          files

dns ってのを削除して、サーバーを再起動したら無事ssh接続が激遅になるのを解消できました! ネットにはこの激遅になる現象に対して色んな対処法が書いてありましたらが、結局この /etc/nsswitch.conf のファイルが一番悪さしてたってことですかね。もちろんちゃんとDNSサーバーのIPと通信できるネットワークならいいんですが、閉じたネットワーク内であればこの対処法になるかと思います。

この対処をすれば、もちろん netstat -r も iptables -L も遅くなりません!

この情報で激遅なる現象が解決できたら幸いですので是非お試しを!

タイトルとURLをコピーしました