Linux初心者向けのネットワーク入門

# はじめに

この記事はLinux初心者に向けてLinuxとネットワークの簡単な知識を説明する記事です。

そのため中級、上級者の方からはすこし気になる表現をしてる場合がありますが、わかりやすくざっくりと解説することを目的としているためどうかご了承ください。

説明が不足している場合や意味がわからなかった場合などは気軽に[@yosuke_yamakawa](https://twitter.com/yosuke_yamakawa)まで

# OSとは
まずVPNを実行する環境から理解を深めていきましょう。
世の中にはいろいろなOSがあります。
皆さんがよく知っているOSといえば、Windows,Mac OS,iOS,Androidなどでしょうか。少し詳しい人であれば、Unix,Linuxとかも知っているかもしれません。
OSとは、

> パソコンさんをパソコンさんたらしめている最重要ソフトであり人間に例えれば「心」や「人格」に相当するソフトが「オペレーティングシステム」です。
>
>[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word179.html)

あまりここで難しく考える必要はありませんよ。OSはパソコンの人格という認識でとりあえずは問題ないでしょう。

# Linuxとは

そんなOSのひとつにLinuxがあります。
Linuxはサーバー向けOSとしても有名なOSです。今回はサーバー用途で利用しますが、無料で利用できる上に好きに改造して配布できることなど利点は色々あります。

## パッケージマネージャー

Linuxの特徴的な機能のひとつにパッケージマネージャーという機能があります。
Windowsを利用している人が普段ソフトウェアをインストールするときは、

1. ソフトウェア配布サイトにブラウザからアクセスしダウンロードする
2. ダウンロードしたファイルを実行しインストールする

といったような手順が必要になります。ですがパッケージマネージャーを利用することで

1. コマンドを実行する

だけでインストールすることが出来ます。

### パッケージマネージャーの種類

有名なパッケージマネージャーは

- yum(dnf)
- apt
- pacman

などがあります。OSによって採用されているパッケージマネージャーが違うため、どのパッケージマネージャーが採用されているかでOSの区別をすることも出来ます。

### パッケージマネージャーの基本的な使い方

ここでは例としてUbuntuというLinuxのひとつで採用されいるaptというパッケージマネージャーの構文を見てみます。

```
apt install vim
```

これはvimというソフトウェアをaptを使ってインストールするコマンドです。
最初に使いたいコマンドを書いて(apt)、次にaptにしてほしいことを記述します(install)
その後にインストールしたいソフトウェアを書きます。(vim)
英語ですが、よく読んでみると簡単ですし、この業界で使われるような英単語は決まってきます。怖がらずにまずは読んでみましょう。

## コンソール
![コンソールのイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/4c1fbb97-0cf6-ee29-c821-8ca3a7dcb179.png)

このような黒い画面がコンソールです。ただ人によってはターミナルだとかシェルだとか端末だとか、色々な呼ばれ方があります。
おおよそ意味は一緒なので、コマンドを入力するための画面のことなんだなー、くらいの認識で大丈夫です。

## CUIとGUI

CUIというのは先程のコンソールのような画面に文字をカタカタ打って操作する方式のことです。
対してGUIというのは、みなさんが一般的にイメージするように↓のような画面で操作する方式のことです。

![GUIのイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/43e22d5e-b852-ae43-3299-0c1e98e29f10.png)

GUIでは直感的に操作できますが、カーソルの位置がずれて押し間違いが発生する場合やそもそもGUIを描画するためにマシンのリソースを消費することがあります。
CUIではテキストのみの表示のため動作が軽量であり、慣れるとこちらで操作するほうが操作性が高い場合もあります。

## SSHとVNC

サーバーにアクセスするというと、こんなの↓に対してカタカタ操作することをイメージするかもしれません。

![サーバーのイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/a1f3c645-9039-4d9a-8f02-b8cb90954d9f.jpeg)

ところがサーバーのソフトウェアを設定するたびにわざわざ現地まで出向いて設定することは非効率的ですし、東京のサーバーを沖縄から設定したい、というような需要が発生するわけです。
そんな需要に答えてくれるソフトウェアに、SSHとVNCというものがあります。

SSHはSecure Shellの略であり、直訳するとセキュア(安全)なシェル(コンソール)ということです。
CUIなコンソールを遠隔操作するための方法という認識で大丈夫です。

VNCはGUIを遠隔操作するための方法です。GUIで動作するソフトウェアを利用する時などに利用します。
ですが、一般的なサーバー用途では多くの場合にSSHのみで事足りるでしょう。

## linuxコマンドの構文

先程の[パッケージマネージャーの基本的な使い方](#パッケージマネージャーの基本的な使い方)で解説したような構文が主な使い方ですが、用語を解説します。

![linuxコマンド構文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/53bc976e-492f-7487-7c0e-55d0d0a7fcf3.png)

①　コマンド
　実行したいコマンドを入力します。ここではaptコマンドを実行します。

②、③、④をコマンドの引数(ひきすう)と呼びます。左側から順番に第一引数、第二引数、第n引数...という風に続いていきます。

②ではaptのオプションを指定しています。この例ではinstallですが、他にもupdate、showなどが用意されています。

③もオプションですが、②に関連します。-yオプションではinstallの際の確認をスキップします(all yes)

④では②のinstall対象のパッケージを記述します。
インストールするソフトウェアの事をここではパッケージと言いますが、両者に深い違いはありません。
ここではvimというテキストエディタとcurlというデータをやりとりするためのソフトウェアを指定しています。

### man

apt cd ls mkdirなどのコマンドの使い方が分からなくなるときがあります。
そんなときは

```sh
man apt
```
のような構文でmanコマンドを実行してみましょう。manというのはManual(マニュアル)の略です
以下はmanコマンドの実行例です。ここではaptのmanページをみています。

![manコマンド実行例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/5214e572-77e0-9f66-ded2-0d31fcbc6048.png)

ただmanコマンドは基本的に英語です。日本語化することも出来ますが全てには対応していないため、Google等で`man apt`と検索するのもおすすめです。


## ファイル操作

Linuxマシンを利用する場合はGUIではなくCUIで操作することも多くあります。
ですがCUIではGUIのようなファイルエクスプローラーはありません。
そこで、Linuxでファイル操作を行う場合は以下のコマンドをよく利用します。

### ディレクトリ

ディレクトリはファイルや別のディレクトリを入れるための入れ物、箱のようなものです。
意味合い的にはフォルダとほぼ同じです。

### ルートディレクトリ

枝分かれ構造というものがあります。この枝分かれ構造の根っこ、一番上のディレクトリのことをルートディレクトリと呼びます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/b28ad885-bee4-9d7c-68c6-4d98c8260803.png" width="300">

### カレントディレクトリ

カレント、というのは「今・現在の」という意味です。現在(選択されている)[ディレクトリ](#ディレクトリ)というそのままの意味ですね。

### パス

パスとは、その[ディレクトリ](#ディレクトリ)が置いてある場所を表す情報です。
そのファイルやディレクトリを表す住所のようなものです。

### ls

lsコマンドは`list segments`の略で、ファイルやディレクトリの情報を表示します。

![lsコマンドの例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/5f4f100c-c7a2-23e1-0132-da126138a284.png)

この画面はLinuxのルートディレクトリでlsコマンドを実行したところです。
ディレクトリを表すときは↓のような表記になります。

```
/home/ubuntu/
```

これは/ (ルートディレクトリ)の中のhomeというディレクトリの中のubuntuというディレクトリを表しています。

ディレクトリには階層という概念があります。
もし、自分が今見ているディレクトリ(カレントディレクトリ)が`/home/ubuntu/`ならば、ここからひとつ上の階層は`/home`です。
また、以下のようにubuntuの中にいくつかのディレクトリがる場合に例としてhogeディレクトリ移動します。
するとパスは

![lsコマンドの例2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/d9009d46-b74e-699b-28de-d532fa1f0789.png)

のような形になります。

なお、よく使うオプションとしてls -lというオプションがあります。これはlsコマンドの情報を長いフォーマットで表示します。

![lsコマンドの例3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/e02f20ce-434a-c772-31fe-2666d8b220ee.png)

### cd

cdコマンドとは[カレントディレクトリ](#カレントディレクトリ)を変更するコマンドです。

言い換えると、自分の今いる[ディレクトリ](#ディレクトリ)を変更するときに使うコマンドということです。

使い方としては、

```
cd 移動先のパス
```

といった感じです。

### pwd

pwdコマンドとは[カレントディレクトリ](#カレントディレクトリ)を確認するコマンドです。
cdコマンドやlsコマンドを実行するときなどに一緒に使う事が多いです。
pwdはprint working directoryの略です。
実行するときは単にpwdとだけ実行します。

### mkdir

mkdirコマンドとは指定した[ディレクトリ](#ディレクトリ)に新しいディレクトリ(フォルダ)を作成するコマンドです。

実行するときは

```
mkdir hoge
```

といった感じです。この例では[カレントディレクトリ](#カレントディレクトリ)にhogeというディレクトリを作成します。

### mv

mvコマンドとは指定したファイルや[ディレクトリ](#ディレクトリ)を移動する場合や名前を変更するときに利用するコマンドです。

```
mv 対象のファイルorディレクトリ 変更後の名前orディレクトリ
```

## ファイルの解凍・圧縮

Linuxではwindowsなどでよく利用するようなzip形式ではなく、tar系のファイルが用いられることが多いです。
これについて解説していきます。

### アーカイブ
複数のファイルを1つのファイルにまとめたいときがあります。
例えばAさんがBさんに授業課題のレポートを送信したいとします。
ただこのレポートには、レポート本体のテキストファイルだけでなく付属する画像ファイルや音声ファイルがあるので1つずつ送信しているときりがありません。
そこで、これらのファイルを一つにまとめると便利ですね。この一つにまとめる技術の1つがアーカイブです。

### tar
tarというのはファイルをアーカイブする技術の1つです。
tarという形式でアーカイブするとhoge.tarのようなファイルが生成されます。

### tar.gz
tar.gzはtarでまとめたファイルをgzipコマンドで圧縮したファイルやその方法です。
tarというのはファイルをまとめることは出来ますが圧縮してくれません。
ファイルの数は少なくなりますが、ファイルの大きさ(ファイルサイズ)は変わらないのです。
そこでgzipコマンドを利用して圧縮することでファイルサイズも小さくなります。
なお、類似のファイルに`tar.bz2`や`tar.xz`があります。

## パーミッション

パーミッションとはアクセス権のことです。
Linuxは複数人で利用することを想定して作られています。
一般的なPCというと1人で使うものですが、学校で使うPCやスパコンなどの大規模なコンピューターだと複数人で利用することになります。
複数人で利用するシステムの場合は、ファイルやフォルダに対してアクセス権を適切に設定する必要があります。
自分の作成したファイルが機密情報だった場合に他の人が皆アクセスできると色々まずいですよね。
そこでパーミッション(アクセス権)が出てきます。

### chmod

chmodコマンドはパーミッションを設定するコマンドです。
Linuxでのパーミッションは、読み取り、書き込み、実行の3つの権限があります。
また、この権限を設定できる対象は、自分、グループ、その他が用意されています。

## systemd

Linuxではデーモンといって[OS](#OS)が起動している間常に待機(常住)してほしいソフトウェア(プロセス)があります。
これを管理するための仕組みがsystemdです。コマンドとして実行するときは

```
systemctl status dnsmasq.service 
```
のような形で実行します。実行例↓
![systemdのイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/2a35c20a-299a-1ff5-3d0b-30ec84b40181.png)

# ネットワーク

ここからはDNSというシステムの解説をします。
DNSというのはネットワークの仕組みのひとつです。
これを理解するために
まず、IPアドレスとドメイン名(ホスト名,FQDNともいう)について解説します。

## IPアドレス
IP

## ドメイン名

## DNS

### 名前解決

[名前解決 (name resolution)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word154.html)

### Mydns

[自宅サーバーやVPSに使える無料のダイナミックDNS (Dynamic DNS)](https://www.mydns.jp/#about)

# VPNとは

[VPNとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1110.html)

## Softether

[SoftEther VPN の概要・特徴 - SoftEther VPN プロジェクト](https://ja.softether.org/SoftEther_VPN_Features)

# おわりに
コマンド実行編へ