ubuntu自宅サーバにsshで外部からアクセス

自宅サーバを構築したいと思います.
まず最初のステップとして,sshで外部からアクセスできるようにします.

以前さくらVPSを借りてsshでログインできるようにした記事を参考に行います.
今回は自宅サーバで固定IPを取得しないのでDDNSというサービスを使っていきます.

サーバ

まずは,ssh-serverを導入します.端末を起動させて,以下でインストールします.

sudo apt install openssh-server

次にsshの設定ファイルをいじってパスワード認証を許可にしておきます..

sudo nano /etc/ssh/ssh_config

//パスワードによる認証を許可
PasswordAuthentication yes

設定を反映させるためにsshを再起動させます.

service sshd restart

次にクライアント側で鍵を生成していきますが,そのときに公開鍵を送れるようにサーバのIPアドレスを調べておきます.

hostname -I

で設定されているローカルIPアドレスがわかります.

クライアント側

公開鍵と秘密鍵のペアを生成します.

ssh-keygen -t rsa

途中で以下の文章が出てくるので,どのサーバの鍵かわかるように名前を付けます(今回はubuntuという名前を以下でつけました).

Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa):~/.ssh/ubuntu

その後,秘密鍵に設定するパスフレーズの入力が求められますが、特に設定しなくてもいいので何も入力せずリターン2回押してスキップします.
ちなみにrsaとは2つの桁数が多い素数をかけ合わせた数の素因数分解が困難であることを利用した暗号化方式です.

次にサーバに公開鍵を送ります.
今回作成した公開鍵(.pubファイル)をUSBでもメールでもscpコマンドでも何でもいいのでサーバに送ります.
下記はscpで送るときの例.Xに先程調べたIPアドレスを入力.

scp ~/.ssh/ubuntu.pub  ホスト名@XXX.XXX.XXX.XXX:

サーバ側

公開鍵(.pubファイル)を~/.sshフォルダにauthorized_keysに名前を変えて(.pubも消す)移動させます.
そしてパーミッションを適切なものに設定します.

cat ubuntu.pub >> .ssh/authorized_keys
rm id_ras.pub
chmod 700 .ssh
chmod 600 .ssh/authorized_keys


次にsshの設定ファイルをいじってパスワード認証を不許可にしておきます.
加えてPortを10022など標準の22から変えてセキュリティを上げておきます.

sudo nano /etc/ssh/ssh_config

PasswordAuthentication no
Port 10022

設定を反映させるためにsshを再起動させます.

service sshd restart

ローカルIPアドレスを固定

今後の手順でポート開放する必要がありますが,開放したローカルIPアドレスが勝手に切り替わってしまうといけないので,
以下のサイトを参考にローカルIPアドレスと固定化します.

Ubuntu 18.04 LTSで固定IPアドレスを設定する方法【デスクトップ編】 | Linux Fan

ポート開放

私はWimaxだったので,以下でルータに接続して,グローバルIPを取得しました.
http://192.168.179.1

ネットワーク設定→プロファイル設定のプロファイルリストでnosetupを選び,以下情報を入力して新規にプロファイルを作成します.
プロファイル名(任意): Global
APN(接続先情報): wx2.uqwimax.jp
ユーザ名: global@wx2.uqwimax.jp
パスワード: 0000 (ゼロ4つ)
認証タイプ: CHAP
IPタイプ: IPv4

その後,ネットワーク設定→接続設定で新たにつくったプロファイルを選びます.

次にポート開放するために,詳細設定→ポートマッピング設定で追加をし,
LAN側IP:先ほど固定したローカルIP
ポート: 10022など22から変えた数字
優先度:1~50の任意の数字

以上入力したら保存を押します.

グローバルIPアドレスの設定

グローバルIPアドレスを調べます.
www.cman.jp

MyDNSというサイトでドメインを取得します.右上のjoin usから登録し,IDとPassがメールで送られてくるのでログインします.
Free Dynamic DNS (DDNS) for Home Server and VPS etc | MyDNS.JP
そしてDMAIN INFOからドメインを取得します.取得したドメインに対し,IP ADDR DIRECTから先程調べたグローバルIPアドレスIPv4のところに入力して,ドメイングローバルIPを紐づけます.

グローバルIPの自動更新

グローバルIPは固定IPでないと自動更新されてしまうのでDDNSで取得したドメインとの紐付けをやり直さないといけません.

それを今回はcronで自動的にやります.

# crontab -e

(以下の1行を追加して保存)
*/10 * * * * wget -q -O /dev/null http://(mydns.jp のマスターID):(mydns.jp のパスワード)@www.mydns.jp/login.html

これで10分おきにMyDNSに対してHTTPリクエストを発行するようになります.

ヘアピンNAT回避

同一のネットワーク内からグローバルIPにアクセスしようとするとルータが対応していないと拒否されてしまいます.
以下で設定しておけば,拒否されなくなるので登録しておきます.

sudo nano /etc/hosts

(以下の1行を追加して保存)
固定したサーバのローカルIP MyDNSで取得したドメイン名

自宅サーバへのSSH

以下で自宅サーバへつながれば完了です.

ssh -p 10022 ドメイン名