我が家では、Linuxサーバを稼働させているのですが、外部(インターネット)からsshログインしたいことがたまにあります。今回は、ホームルーターでポートフォーワーディングの設定を行って、外部からおうちのLinuxサーバにsshログインを可能にするまでの設定を紹介します。
普通は、インターネットからおうちの中のサーバにはアクセスできない
インターネットの接続契約をすると、おうちのPCからインターネット上のサービスにアクセスするこはできますが、インターネットからおうちの中のPC等へは、アクセスができないのが普通です。
それは、ホームルーターが、おうちの中からインターネットへのアクセスを許可しているのに対して、インターネットからおうらの中のPC等へのアクセスは許可していないからです。
以下の図では、例えば、インターネット上のホストhostRがあり、hostRはsshのアクセスを許可しているものとします。おうちの中にあるLinuxサーバ base0 から、hostRのIPアドレスを指定してsshログインすることができます。

一方で、インターネット上のホストhostRから、おうちの中にあるLinuxサーバ base0 にsshログインすることはできません。
何故ならば、base0のIPアドレス(192.168.1.200)はプライベートなアドレスなので、インターネットからアクセスすることはできないですし、また、ホームルーターのファイヤーウォールがインターネットからの不要なアクセスを遮断しているからです。
ホームルーターのポートフォーワーディングの機能を使うとおうちの中のサーバにアクセスができるよ
ホームルーターにポートフォーワーディングの機能があれば、インターネットからおうちの中のサーバにアクセスをすることができます。

ホームルーターは、インターネットの各機器と通信をするために、グローバルのIPアドレスを持っています(具体的に示すとセキュリティホールとなるので、ここでは xx.xxx.xxx.xxx と記載しています)。
ホームルーターは、通常の設定では、インターネットからのアクセスに対してportを閉じていますが、特定のportに対するパケットを、おうちの中の特定のサーバの特定のportに転送することができます。これが、ポートフォーワーディングの機能です。
この例では、ホームルーター(IPアドレスは xx.xxx.xxx.xxx)のport 10022にアクセスしてきたパケットを、おうちの中のホスト base0(IPアドレスは 192.168.1.200)のport 22(すなわち ssh)に転送をしています。
ZTE製 F660A におけるポートフォーワーディングの設定方法
うちはNuro光と契約していますが、契約時に送られてきた光回線機器(ホームルーター)は、ZTE製の F660A という機器でした。
F660Aの管理画面には、https://192.168.1.1 でアクセスすることができます。
管理画面にログインしたら、以下の手順で、ポートフォーワーディングの設定を行います
アプリケーションリストを追加する
アプリケーションと言っても何かのソフトウェアを指している訳ではありません。ポートフォーワーディングするルールをアプリケーションと呼んでいるようです。
「アプリケーション」の「アプリケーションリスト」を選択します。初期状態は以下のようになっています。

ここで「アプリケーションを追加するには、ここをクリックしてください。」をクリックします。
アプリケーションの名前は「App+数字」にするようです。今回は「App1」という名前にしました。
WANポートの開始と終了を「10022」に設定し、マッピングポートの開始と終了を「22」に設定して、「追加」をクリックします。

追加すると、リストの一覧に表示されます。

ポートフォーワーディング(アプリケーションリスト)を追加する
次に、「アプリケーション」の「ポートフォーワーディング(アプリケーションリスト)」を選択します。初期状態は以下のようになっています。

さっき、アプリケーション「App1」を登録したので、アプリケーションのプルダウンメニューには「App1」が表示されています。
ここで、ポートフォーワーディングの転送先である「内部ホストのIPアドレス」に、base0のIPアドレス「192.168.1.200」を指定して「追加」をクリックします。

追加すると、リストの一覧に表示されます。

ポートフォーワーディングの一覧に表示される
以上の操作を行ったら、「アプリケーション」の「ポートフォーワーディング」を選択して、リストに追加されているかどうかを確認しましょう。

名前は「pm_1」という名前が自動的に付与されています。「有効にする」のところにチェックが入っていることを確認しましょう。
この画面では、何か設定が必要という訳ではありません。
但し、ポートフォーワーディング(アプリケーションリスト)を追加してから、実際にポートフォーワーディングが有効になるまでは、少し時間がかかったように思いました。
ホームルーター内の設定反映に時間がかかるのかもしれません。
インターネットからおうちのLinuxサーバにsshログインしてみる
さっそくテストしてみましょう。
以下は、インターネット上のホストから、自分のおうちのbase0にsshログインしたときの例です。
(IPアドレスはセキュリティのためにマスクしています、ごめんなさい)

sshコマンドの引数「guest01@xx.xxx.xxx.xxx」のguest01はbase0上のアカウント名、xx.xxx.xxx.xxxはホームルーターのグローバル側のIPアドレスです。「-p 10022」を指定して、port 10022でssh接続をしています。
その他の引数オプションは、ssh実行時に ~/.ssh/known_hosts のチェック及び登録をしないようにするためです(理由は、いろいろと面倒だから..)。
これで無事に、インターネットからおうちのLinuxサーバにsshログインできるようになりました。
セキュリティ強化のためにやっておくべきこと..
今回の設定変更で、ホームルーターにはsshログインのためのport (10022)が開いた、ということです。これはすなわち、インターネットからの攻撃もあるということです。
従って、ホストbase0においては、以下の対処をしてセキュリティを強化しておくべきです。
rootのsshログインを許可しない
/etc/ssh/sshd_configで以下の設定を定義して、rootによるsshログインを許可しないようにしましょう。
PermitRootLogin no
また、よく使用されるユーザ名(例えば、admin) が、OSアカウントとして登録されいる場合は、削除しておいたほうが良いでしょう。
パスワード認証ではなく鍵認証のみ許可する
パスワード認証は、辞書攻撃や総当たり攻撃に対して弱いので無効化し、鍵認証でのみsshログインを許可するようにしたほうが良いでしょう。
パスワード認証を無効化するには、/etc/ssh/sshd_configで以下の設定を定義します。
PasswordAuthentication no
鍵認証を有効にするには、以下の設定を定義します。
PubkeyAuthentication yes
sshd_configを修正したらsshdを再起動
以下のコマンドでsshdを再起動して、設定を有効にします。
# systemctl restart sshd
広告主へのリンク
おうちでLinuxやるなら、ミニPCがちょうど良いです(私はこの3台を使っています)。



コメント