[回線別]家庭用回線のポート開放のやり方について

## はじめに
**ポート開放**というキーワードで書かれている記事すごく多いですが、回線環境の違いに言及して記載している記事はすごく少ないように思います。
今回はそういった環境の違いも考慮してポート開放手順を記載しました。

開放手順だけ見たい人は[**こちら**](#3-%E3%83%AB%E3%83%BC%E3%82%BF%E5%81%B4%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E9%96%8B%E6%94%BE%E8%A8%AD%E5%AE%9A)まで飛んでください。


## 1. ポート開放ってどういうもの？
まずは簡単にポート開放がどういうものか説明しておきます。
イメージが付かないと通信できない時に何が問題なのか見当がつかなくなるので。
そういう点でネットワークって可視化しにくいので難しいですよね。

### 1.1 ポートとは
ポートとはサーバやクライアントがお互いに通信するためのデータの通り道で、TCPとUDPという種類があります。それぞれ**1番から65535番**まであります。通常サービス毎にそれぞれ定められたサービスポートがあり、そのポートに対して通信を行います。TCPは信頼性が高い通信(ファイル転送やWeb閲覧等)、UDPは信頼性がそれほど必要ではない通信(音声通話、動画ストリーミング等)に使われます。
サーバ外部との通信はこのポートを通して通信をやり取りします。

:::note warn
ウェルノウンポート番号：**0～1023番**は標準的なサービスを利用するためのポートとして登録されているため、これらのサービスを使わないのであればポート開放はしないようにしましょう。
:::

下記がわかりやすいので、細かい説明は端折ります。

https://www.cman.jp/network/term/port/

### 1.2 基本的に使わないポートは閉じられている
ポートは必要な通信をするための経路として使われますが、攻撃者もこのポート経由で通信し攻撃をします。そのため、一般的なセキュリティでは**外からの通信は遮断する(ポートを閉じる)設定**をルータ側で行っています。
ですが、ブラウザなどで外からの情報を取得しようとしたとき、外からの通信がアプリに反映して表示されます。外からの通信は遮断されるんじゃないの？と疑問に思われるかもしれませんが、この通信というものは基本的に**要求とレスポンスが対**になっています。要求に対する通信(レスポンス)は内側からの働きかけで発生しているため、実際の通信では遮断されずに通過されます。このとき使われているポートは任意の空いているポートが利用されます。

```plantuml
インターネット側->内部ネットワーク側 : 要求×
```

```plantuml
インターネット側<-内部ネットワーク側 : 要求〇
インターネット側->内部ネットワーク側 : レスポンス〇
```

### 1.3 ポート開放とは
もうお分かりかと思いますがポート開放とは、**外側(インターネット側)から内側(サーバ側)への通信要求をサーバ側へ伝えるための道筋(ポート)を解放する手段**になります。
また、外部からサーバへのアクセスをするためのポート開放をするためには、通常**2箇所のポート開放**が必要になります。
* サーバ側のポート開放設定
* ルータ側のポート開放設定

また、ルータとサーバ間のポートのマッピングが必要になります。
必要に応じてフィルタリング設定も必要になってきます。

前置きが長くなってしまいましたが、次章からはそのポート開放の実際のやり方をかいつまんで説明します。

## 2. サーバ側のポート開放設定
サーバ側のポート開放設定はOSが持つファイアウォールの設定になります。Windows、LinuxどちらのOSも最新のものであれば大体備えているため、この設定が必要になります。
※これ以外にもアンチウィルスソフトに付属するファイアウォールなどがありますが、こちらは今回の内容では考慮しません。必要に応じて対応してください。考え方はほぼ同じです。

サーバ側のポート開放は以下のQiita記事が詳しく書いてあるので、そちらに説明は譲ります。

https://qiita.com/infinite1oop/items/f20b61cbbc0d093ee814

https://qiita.com/kawasukeeee/items/bcffcc018919f89942c1

## 3. ルータ側のポート開放設定
前置きが長くなりましたが、ここからが今回の記事の本旨です。
多くの人が分からずよく躓く場所です。以下で現在利用している回線の確認手順、ポート開放手順を説明します。ここからはWiondowsでの手順として記載しますが、他のOSの場合読み替えてください。

### 3.1 通信方式の確認
まずは利用している回線がIPv6での通信ができるのか、それともIPv4だけしか利用できないのか、自分の回線情報を確認しましょう。以下のサイトは現在利用している回線の情報を確認するためのサイトです。確認方法はアクセスするだけで自動的に調べてくれます。

https://www.test-ipv6.com/

通信方式としては主に下記があります。
* IPv4 PPPoE
* IPv6 PPPoE
* IPv6 IPoE(MAP-E方式)
* IPv6 IPoE(DS-Lite方式)

下記が通信方式について比較的詳しく記載していると思います。

https://wifi-manual.net/whats-ipv4-over-ipv6/

ここで覚えておいてほしいのは、IPv4とIPv6は全く互換性のない通信方式(通り道)であるため、それぞれのルートでポート開放を考えないと接続ができない、またセキュリティリスクが発生するということです。つまりIPv4でのポート開放とIPv6でのポート開放の2つがあり、分けて考える必要があるということになります。
基本的なポート開放の考え方は同じですが、IPv6環境では利用できるポートに制限が発生する場合もあります。

### 3.2 IPv4のポート開放
ほとんどの方が知りたいのはこちらになるかと思います。まだまだIPv4基準での通信が多いですし、IPv6へ通信ができない(IPv6のIPアドレスが割り当てられていない)ケースがあるため、IPv4基準でポート開放が必要になります。
IPv4のみの回線や、**IPv6プラス**や**IPv4 over IPv6**というサービスでIPv4アドレスが割り当てられているものも対象です。以下でその対応方法を記載します。

#### 3.2.1 グローバルIPアドレスが利用可能かを確認
まずは利用している回線がポート開放可能な回線かどうかを確認します。
プロバイダより**グローバルIPアドレスが割り当てされていない回線はユーザ側でポート開放することができません**。
具体的な例を挙げると以下のような環境です。プロバイダによってはグローバルIPアドレスを割り当てるサービスなども提供されている場合がありますので、サービス事業者へご確認ください。
* アパートやマンションに備え付けの無料ネットワークや共用インターネット環境
* CATV(ケーブルテレビ)のインターネット回線

プロバイダから提供されている情報を手元にご準備いただくと確実かと思います。

グローバルIPアドレスが割り当てされているかどうかの確認は、ルータのWAN側IPアドレスを確認することで確認ができます。確認手順として、まず回線の窓口となるルータへログインします。ルータのIPアドレスをブラウザのアドレスバーへ入力しアクセスして下さい。ルータのIPアドレスがわからない場合は、お使いのPCのコマンドプロンプト上で**ipconfig**コマンドを実行して、デフォルトゲートウェイのIPアドレスを入力してください。以下の場合[**192.168.30.1**]です。
※ローカルネットワークの環境によってはルータのIPアドレスとデフォルトゲートウェイは一致しない場合があります。

```
C:\Users\ユーザ名>ipconfig

イーサネット アダプター イーサネット:

   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: 192.168.30.13
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: 192.168.30.1
```

ログイン可能なルータがない、もしくはユーザのアクセス権がない場合(プロバイダから提供されていない場合)は、ポート開放はできません。諦めてください。
ログイン後、WAN側のIPアドレスを確認して、下記以外であることを確認します。
|アドレスクラス|IPアドレス範囲|
|:-:|:-:|
|クラスA |10.0.0.0	～	10.255.255.255|
|クラスB|172.16.0.0	～	172.31.255.255|
|クラスC|192.168.0.0	～	192.168.255.255|

上記範囲に入る場合はプライベートIPアドレスなのでポート開放できません。頭の数字が「10 or 172 or 192」ではないものとして確認できれば良いです。

#### 3.2.2 ポートの開放を行う
グローバルIPアドレスが確認できれば、あとはルータとPC間の通り道を通してあげれば終わりです。
まずは端末に対して固定IPアドレス(プライベートIPアドレス)を付与してください。Windowsであれば下記記事が分かりやすいと思います。他にもDCHPで割り当てる方法もありますが、ルーター側で対応していないものがほとんどなので省略します。

https://qiita.com/mmake/items/8bdf04699ec651902b8b

固定IPアドレスが割り当てできたら、ようやくポート開放(ポートマッピング)を行います。大きく分けて3つ方法があります。

1. NAPT(IPマスカレード)
2. DMZを使用する
3. ツールを使ってポート開放する(UPnPルータの場合)

##### 3.2.2.1 NAPTを使ったポート開放
NAPTとはルーターのポートに到達したパケットを目的のIPアドレスのポートへの通信として変換する機能です。

https://e-words.jp/w/NAPT.html

ルーターの管理者機能でNAPTまたはIPマスカレードという名称で機能があります。以下はフレッツ光のホームゲートウェイ(IPv6プラス)での設定を例に説明します。

http://192.168.1.1:8888/t/
または
http://ntt.setup:8888/t/

でアクセスする。
IPアドレスでアクセスする場合は、ご自身の環境に合わせて変更ください。

![v6plus-hgw-top-1024x363.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388610/37aba16f-0d47-16d5-c238-ccbb60d7a1f3.png)

IPv6プラスでは**MAP-E方式でのIPv4 over IPv6通信**となります。
MAP-E方式は一つのIPアドレスを複数人で利用する方式のため、使用できるポート数や使えるポート数に制限があります。どうしても特定のポートが使いたい場合はPPPoE接続に切り替えるか、固定IPアドレスを付与してもらうかのどちらかになると思います。

利用可能なポートは下記でも確認できます。

https://isecj.jp/tools/portcheck-map-e/

今回はサーバに固定したIPアドレス「192.168.1.100」に対して「ポート番号44249」をNAPTで転送する通信を例とします。まずはルーター側でパケットが破棄されないようにWAN側から特定のポートに対してきたパケットを通過するように定義を**5番目**に入れています。ここのポート番号はサーバ側で開けるポート番号と必ずしも一致する必要はないですが、同じにしておいたほうが分かりやすいです。
セキュリティ上攻撃対象となりやすいウェルノウンポートに関連するサービスを利用する場合は、攻撃されないように敢えて他のポート番号を指定する場合があります。

![v6plus-hgw-filter-1024x430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388610/f1881d53-9867-cdce-80d8-79bb2a32b10b.png)

次にNAPTの設定を行います。
ルータ側の公開ポート(外へ公開するポート)とサーバ側のリッスンポート(サーバへの宛先ポート)をマッピングします。ポートは違っていてもそれらを紐づけるだけなので問題ないですが、ユーザ側から見る開放ポートは公開対象ポートとなります。

![hgw-napt-1024x360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388610/af3b918b-e3d8-626b-1703-98b5c526b8ba.png)

以上でポート開放が完了となります。

##### 3.2.2.2 DMZを使ったポート開放
次にDMZを用いたポート開放手順を記載します。
ルータにDMZの機能があればそれを有効化するだけで基本的にはOKです。
前述のポートマッピングも不要です。

基本的に家庭用ルータではDMZの運用は細かく設定できず、どの機器をDMZ上で管理するか程度になります。

以下は一例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388610/8c518dda-3a21-46c4-c148-e9c5e1fc690f.png)

DMZをONにしてDMZホストのIPアドレスに公開したいサーバの情報を入れます。

ここで注意したいのは、ルータに届いたリプライパケット以外のIPv4のインバウンドパケットはすべてこの機器に流れます。
つまり攻撃されればもろに受けてしまいます。なので、必要最低限のポートのみを通すようにIPフィルタも設定しておく必要があります。

以下は一例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388610/093b5a96-3807-26f4-f9a1-acd0e5d3861d.png)

ここではウェルノウンポートとレジスタードポートを指定しています。
この範囲のポートを利用する場合は個別でIPフィルタで許可しましょう。
例えばTCPポート番号20000を使いたい場合は下記のように追加してください。
優先順位は先ほどの破棄するフィルタより前(小さい数字)にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388610/0321f2ee-14ab-ebb2-fa60-add2f61ffceb.png)

以上でポート開放完了です。

## 3.3 IPv6のポート開放
IPv6がそのまま利用できる環境ではポートは解放されている状態になりますので、ポート開放手続きは不要になります。
ただし、以下の点を注意する必要があります。

### 3.3.1 グローバルIPアドレスは複数存在する
例えばipconfigでIPアドレス情報を確認すると下記のようにIPv6アドレスが表示されます。
公開するIPアドレスをどうしたらよいかですが、IPv6アドレスと一時IPv6アドレスのどちらかを公開すればPCへアクセスするためのアドレスになります。
```
イーサネット アダプター イーサネット:

   接続固有の DNS サフィックス . . . . .:
   IPv6 アドレス . . . . . . . . . . . .: 2001:db8:3c4d:15:a00:20ff:feb9:4c54
   一時 IPv6 アドレス. . . . . . . . . .: 2001:db8:3c4d:15:7c37:e7d1:fc9c:d2cb
   リンクローカル IPv6 アドレス. . . . .: fe80::5ce2:a9f7:36fb:4d51%10
   IPv4 アドレス . . . . . . . . . . . .: 192.168.1.26
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: fe80::1%10
                                          192.168.1.1
```

ではなぜ複数存在するかというと、ざっくりIPv6アドレスは一生変わらないアドレス、一時IPv6アドレスは再起動や時間などで変更されるアドレスと覚えておくとよいと思います。

### 3.3.2 セキュリティ上IPv6アドレスは公開しない
前述のとおりIPv6アドレスは変更がきかないIPアドレスです。そのため、攻撃者からターゲットにされた場合、セキュリティ上に問題が生じます。そのため、一時IPv6アドレスが存在します。ただ、一時IPv6アドレスを公開する場合、アドレスが定期的に変わってしまうため、サーバ公開する場合のIPアドレスとしては不適です。

## 3.3.3 ダイナミックDNSを用いてIPアドレスを直接公開しない
IPアドレスを直接公開する場合の欠点がいくつか存在します。
* IPアドレスが変更になった場合、毎回通知する必要がある
* IPアドレスが直接見えてしまう
* 数字の羅列でわかりにくい(特にIPv6は覚えられない)
など

## 4 ダイナミックDNSを使おう
これを解決する手段の一つとしてダイナミックDNSというものがあります。
これはIPアドレスに名前を付けてその名前でアクセスさせる手段です。
例えば"www.google.com"や"www.yahoo.co.jp"など

詳しくは下記参照

https://atmarkit.itmedia.co.jp/aig/06network/fqdn.html

要するに、IPアドレスが変わっても同じ名前でアクセスできればこれらの問題は解決できるわけです。無料かつ使いやすいダイナミックDNSとして下記のサービスがあります。

https://ddns.kuku.lu/

このサービスの利点として下記があります。
* 完全無料かつ安定的である
* IPv4だけではなくIPv6も利用ができる
* 同じFQDNにIPv4,IPv6どちらのIPアドレスも指定できる
* **自動的にIPアドレスを更新するツールがある**←ここ重要

ポート開放とは直接関係ないためここでは設定の仕方などは説明を省略しますが、サイト内のマニュアルやFAQを確認すれば難しいことはほぼないと思います。
分からなければ他の説明されているサイトをご自分で参照してください。

## おわりに
いかがでしたでしょうか。
ポート開放は通信の仕方を理解していないと、どのような経路を取って通信をしてあげればよいか非常に分かりにくいものです。プロバイダ毎の対応はもちろん詳しく見ないとわからないですし、使っているルーターの種類によってもやり方が違ってきます。少しでもポート開放に困っている方の助けとなれば幸いです☺️