自宅に高価なパソコンを購入したので、どうせなら外出先でもアクセスしたい。
なので、外部から自宅サーバにsshする方法を調べて設定してみた。
環境
- ソフトバンク光 BBユニット
- Ubuntu 16.04 LTS (サーバもクライアントも)
ssh鍵認証でログインする
第一ステップとして、ローカルネットワーク、つまり自宅内のネットワークでssh接続できることを目指す。パスワード認証ではなくて、ssh鍵認証をする。ハッキングが怖いので。
これは、5年前!に書いた自分の記事が役に立った。整理しつつ、再掲。
サーバ側の設定
サーバ側にssh serverを インストールする。
sudo apt install openssh-server
これでOk.簡単です。次にsshの設定をいじる。 /etc/ssh/sshd_configを管理者権限で編集
sudo nano /etc/ssh/ssh_config
//ルートでのログイン禁止
PermitRootLogin no
//RSA認証の有効化
RSAAuthentication yes
//パスワードによる認証を許可
PasswordAuthentication yes
//空のパスワードは拒否
PermitEmptyPasswords no
//チャレンジレスポンス認証を不許可
ChallengeResponseAuthentication no
設定の反映のために再起動。
systemctl restart sshd
クライアント側の設定
クライアントの設定。といってもsshコマンドはデフォルトで入っている。
// 認証公開鍵の作成
$ ssh-keygen -t rsa
// いくつか質問されるのでEnter連打。
クライアントの公開鍵をサーバに送ります。安全のために、ここではscpコマンドを使うのがよいでしょう。
$ scp ~/.ssh/id_rsa.pub tsu-nera@XXX.XXX.XXX.XXX:
再びサーバ側の設定
scpで送った鍵を保存する。
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_ras.pub
$ chmod 600 .ssh/authorized_keys
再度、sshd_configの設定を編集.
//パスワードによる認証を許可しない
PasswordAuthentication no
再起動して終了。
sudo systemctl restart sshd
ローカルIPアドレスを固定する
ローカルIPアドレス(プライベートIPアドレス)は、DHCP機能によって自動的に振られるので、これを固定IPアドレスにする。
固定の方法なのだけれども、ここでかなりハマった。以下の記事を参考に/etc/network/interfacesを覗いてみたのだけれども・・・
-
[Ubuntu]ローカルIPアドレスを固定にする | 純規の暇人趣味ブログ
$ cat /etc/network/interfaces
interfaces(5) file used by ifup(8) and ifdown(8)
auto lo iface lo inet loopback
あれ、Loopbackのnicしかないyo!!
ということで、ここでハマった。いろいろ調べてみると、15.xからここらへんの仕様変更があったようで、名前が記事とは違うらしい。名前どころか、仕組みも違うみたい。詳しくは調べきれていないのだが、Network Managerというserviceに置き換わろうとしていて、そのフロントエンドが nm-appletというアプリだそうだ。
というわけで、nm-appletをいじる。これは、右上のネットワーク接続を示すアプレットのこと。これで、まずは接続情報というところをチェックする。Ipv4の欄の
- IPアドレス
- ブロードキャストアドレス
- サブネットマスク
- デフォルトゲートウェイ
をチェックしてメモする。そして、接続を編集するを選択して、現在接続中の通信を選択して編集を押す。Ipv4設定を選択し情報を以下のように入力する。
ここでは、192.168.3.5を固定IPアドレスにした。これでIPは固定になるはず(自信ないです。。。)
ssh port を 22から 10022に変更する
ssh は port 22 なのだけれども、これを変更する。ハッカーに攻撃されないようにね。
設定ファイルを開き、下記のように変更する。
$ sudo nano /etc/services
//前
ssh 22/udp # SSH Remote Login Protocol
ssh 22/tcp # SSH Remote Login Protocol
//後
ssh 10022/udp # SSH Remote Login Protocol
ssh 10022/tcp # SSH Remote Login Protocol
グローバルIPアドレスでアクセス
さあ、ローカルネットワークではこれでssh接続できるようになった。次はグローバルだ。まずは、自分のグローバルIPアドレスを以下から調べる。
ソフトバンク光BBユニットの設定からポート開放設定
自分の家のルータの設定を変更して、上で設定した10022番ポートがホストに回してくれるよう設定する。
- https://172.16.255.254/ に接続、user/userでログイン
- 詳細設定を開く -> ポート転送
- 有効/無効 -> 有効
- プロトコル -> tcp
- WAN/LAN側ポート両方 -> 10022-10022
- 転送先IPアドレス -> 自分のローカルipアドレス
ルーターを再起動する。
No-IPを使ってグローバルIPアドレスを DDNSで追跡する
グローバルIPアドレスは気まぐれで変更されてしまう。なので、変更を追跡してくれるサービスを利用する。DDNS(Dynamic DNS)というらしい。No-IPというサービを利用する。
これに登録して、fox10225fox.ddns.netというドメインを取得した。
最後の仕上げ
以下のコマンドで、アクセスできれば目標達成。
ssh -p 10022 tsu-nera@fox10225fox.ddns.net
ちなみにヘアピンNATに注意
同一ネットワーク内からグローバルIPにアクセスしようとすると、アクセスが失敗する。これは、ヘアピンNATと呼ばれているルーターの仕組みの問題。
ヘアピンNAT対応していないルータをつかっていると、どんなに設定をいじってもアクセスが失敗する(これでとても時間をつかった)
/etc/hostsを編集する方法がネットにたくさん散見された。これで試したところ、うまく行った。
$ sudo /etc/hosts
192.168.3.5 fox10225fox.ddns.net