【自宅サーバー構築】PCセットアップ:SSH接続編

thumbnail for this post

今回はUbuntu側のSSH等の設定です。さらにSSHポートを外部に公開して「自宅サーバー化」します。
自宅サーバは、gitレポジトリおいたり、コンテナ立ち上げたりして外から楽しくいじるのが目標です。

今回やることは

  • IP address固定化
  • Dynamic DNS(DDNS)設定
  • ssh通常パスワードでのアクセス(mac/windowsから)
  • ssh公開鍵認証でのアクセス(mac/windowsから)
  • Ubuntu上でのgitレポジトリ作成
  • git remote の originとしてUbuntu gitレポジトリ利用
  • Ansibleでgitレポジトリを作成する方法が意外とややこしい件

あたりを書いていきます。

前回の「デュアルブート編」で、ここまでセットアップしました。

デュアルブート

デュアルブート

今回は、こんな感じに接続できるまでやります。
SSH接続

SSH接続

何この図?暗号?


基本構成

基本構成はよくある、インターネットにwifi-router + PCです。

インターネット接続図よくある構成

よくある構成


外部からも、家からもこのUbuntuPCにアクセスできるようにします。


Ubuntu IPアドレス固定

いつも使ってるRedHatとはかなり使い勝手が違うので戸惑いましたが、Desktop環境なのでコマンドウィンドウから

nmtui
を実行して設定しました。
設定内容は
/etc/NetworkManager/system-connections/connection1
に保存されます(接続名にconnection1と名前をつけた場合)

その他のコマンド

nmcli connection down connection1  #リンクダウン
nmcli connection up connection1  #リンクアップ
ip address show  #IP address確認


Dynamic DNS(DDNS)設定 (wifi-router, DDNSプロバイダ)

うちのルータがサポートしてたので「Free Dynamic DNS - No-IP」を利用しました。
無料プランを選んで、ドメイン名を選ぶだけですぐできます。
うちのルータはこのnoip設定の内容を登録するだけで自動的にIPアドレス通知をnoipにしてくれるようになりました。

あとは、これもルータの機能ですが「ポートフォワード」を設定します。
僕はとりあえずSSHのポートだけ空けて、それをUbuntuにフォワードするようにしました。


SSH設定(パスワードアクセス)

Ubuntu側

openssh-serverをインストールするだけです(パスワードアクセスの場合)

sudo apt install openssh-server

Mac側

別にやることありません。

ssh hoge@hoge.noip.org
とかでつながります。

Windows側

僕はPuttyを使っていますが、普通にSSHの設定をすれば繋がります。


SSH設定(公開鍵認証でのアクセス)

パスワード認証だと不安なので、公開鍵を登録したPCだけがアクセスできるようにします。

Ubuntu設定

cd ~
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

Mac設定

ssh-keygen -t ecdsa -b 521
pass phrase #指定しない
~/.ssh/id_ecdsa.pubが出来上がってるので中身をUbuntuの~/.ssh/authorized_keysにコピー。

(sshパスワードアクセスがある場合は簡単にコピーできるけど、パスワードアクセスは後で止めてしまうので、今後はアクセスする端末が増えると面倒)

Windows設定

WindowsではPuttyを使っているのでPuttyでのやり方を。。

  1. puttygenでecdsa 521のキー(private, pub)作製
  2. ubuntu上でopenssh形式にpubキーを変換してauthorized_keysにコピー
    ssh-keygen -i -f xxxx.pub >> ./ssh/authorized_keys

Ubuntu SSHパスワード接続を停止

/etc/ssh/sshd_configの以下の部分

#PasswordAuthentication yes
↓↓↓
PasswordAuthentication no
変更したら、以下のコマンドで反映
sudo service sshd restart

Ubuntu上でgitレポジトリ作成

初期設定

ssh公開鍵でしかログインできないユーザ"git"を作成

sudo adduser --disabled_password git
sudo su git
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

レポジトリ作成

sudo mkdir /my_repo/project1.git
cd /my_repo/project1.git
sudo git init --bare
cd ..
sudo chown -R git.git project1.git/


MacからUbuntu gitレポジトリに接続

初期準備

~/.ssh/id_ecdsa.pubの中身をUbuntuの/home/git/.ssh/authorized_keysにコピー。

remote originとして追加

mkdir project1
cd project1
git init
git add .
git commit -m "initial commit"
git remote add origin git@hoge.noip.org:/my_repo/project1.git
git push origin master

cloneして始める場合

git clone git@hoge.noip.org:/my_repo/project1.git . #最後のドット忘れないように


WindowsからUbuntu gitレポジトリに接続(Putty利用)

実はwindowsのgitコマンドはputtyのセッションを使えます。
これを利用するとputtyで作成した鍵を利用して簡単に接続できます。

  1. puttygenで鍵作成(先程作成済み)

  2. .pubの中身をコンバートして/home/git/.ssh/authorized_keysにコピー

    ssh-keygen -i -f xxxx.pub >> /home/git/ssh/authorized_keys

  3. git向けにputtyセッションを作成(userをgitにして、hoge.noip.org向けに)
    ここでは作ったセッション名を"git_con"として説明します。

  4. Windowsの環境変数GIT_SSHにC:\Program Files\PuTTY/plink.exeを登録

ここまでくればもう接続できます。

git remote add origin git_con:/my_repo/project1.git
git push origin master

念の為確認

git remote -v show


おまけ: Ansibleで.gitレポジトリづくり(やや面倒)

初期設定

python3のvenvの閉じた環境でansibleを動かす

sudo apt install python3-venv
python3 -m venv ansible_work
source ./ansible_work/bin/activate

deactivate #参考deactivateする時

Ansible install by pip

cd ansible_work
pip install ansible
touch .ansible.cfg
vim .ansible.cfg

gitレポジトリ作成playbook

/ansible_work/inventory/home_servers.ini

[ubuntu_main]
localhost
/ansible_work/playbook_make_git_dir.yml
---
- hosts: ubuntu_main
  become: yes
  become_user: root
  vars_prompt:
          - name: repo_name
            prompt: "please enter repo name"
  tasks:
          - name: create git directory
            file:
                    path: /data/{{ repo_name }}.git
                    state: directory
                    owner: git
                    group: git
                    mode: 0755
          - name:  init git repo
            shell: >-
                    cd /data/{{ repo_name }}.git;
                    git init --bare;
                    cd /data/;
                    chown -R git.git {{ repo_name }}.git

実行方法:

ansible-playbook -i inventory/home_servers.ini ./playbook_make_git_dir.yml --ask-become-pass

はまりどころ

  • becomeモジュールで接続後にrootにならないといけない
    理由: rootでsshできないようにしたから
    理由2: gitユーザで/my_repo/配下にディレクトリ作成不可→gitでログインしても作れない
  • –ask-become-passを毎回付けなければいけないのが面倒
  • 自分の公開鍵を自分のauthorized_keysに入れておかないとlocalhost向けタスク失敗する


全体を通して

長い割にわかりにくい!

投げ銭していただける場合は、amazonで15円からできます。宛先はheisakuあっとcomichi.comで。

マイナスは入れられないの?

comments powered by Disqus