Conoha VPSで任意のポートを開放する方法

方法
-----

3つあります。

- A. [conoha-netコマンド](https://github.com/hironobu-s/conoha-net)を使う
    - ポート開放できればそれでいい人向け
    - ネットワーク機能に絞っているのでサブコマンド名が短い
- B. [openstackコマンド](https://docs.openstack.org/python-openstackclient/latest/cli/man/openstack.html)を使う
    - ポート開放以外にもCLIで積極的にConohaを操作してみたい人向け
    - サブコマンド名が長い
- C. 「接続許可ポート」で「全て許可」を選択してfirewalld/iptables等で開ける
    - 勉強したくない人向け


手順
----


### A/B. conoha-net/openstackコマンドを使う

- 全体の流れ
  クライアントを導入
-> セキュリティグループ作成
-> セキュリティグループにルールを追加 
-> セキュリティグループをサーバーにアタッチ


1. コントロールパネル https://manage.conoha.jp/API/ からAPIユーザを作成

1. コントロールパネルを見ながら認証に必要な情報をファイルに書き出す
    ~~~
    $ cat conoharc
    export OS_TENANT_ID=1234567890abcdef1234567890abcdef #テナントID
    export OS_USERNAME=gncu12345678 #ユーザー名
    export OS_PASSWORD=tsuyotsuyoPasuw@-do #パスワード
    export OS_AUTH_URL=https://identity.[リージョン].conoha.io/v2.0 #Identity ServiceのエンドポイントURL
    ~~~

1. クライアントのインストール

    - conoha-net
        - https://github.com/hironobu-s/conoha-net をみてね
    - openstack
        - `sudo dnf install python3-openstackclient`
          または `sudo yum install python-openstackclient` (python2系はこっち)
          または `pip install python-openstackclient`

1. 認証テスト

    - conoha-net
        ~~~
        $ source conoharc
        $ ./conoha-net list
        NameTag     IPv4     IPv6     SecurityGroups      #この1行が見えればok
        ~~~
    - openstack
        ~~~
        $ source conoharc
        $ openstack security group list
        +--------------------------------------+---------+-------------+---------+------+
        | ID                                   | Name    | Description | Project | Tags |
        +--------------------------------------+---------+-------------+---------+------+
        | afd90680-9ace-46eb-957c-44b34e4b323c | default | default     | None    | []   |   #defaultが見えればok
        +--------------------------------------+---------+-------------+---------+------+
        ~~~

1. セキュリティグループの作成

    - conoha-net
        ~~~
        $ ./conoha-net create-group test-group-a
        ~~~
    - openstack
        ~~~
        $ openstack security group create test-group-b
        ~~~

1. ルールの追加（**例：12345/tcp受信を開放する場合**）

    - conoha-net
        ~~~
        $ ./conoha-net create-rule -p 12345 -P tcp test-group-a
        ~~~
    - openstack
        ~~~
        $ openstack security group rule create --dst-port 12345 --protocol tcp test-group-b
        ~~~

1. 追加されたルールの確認

    - conoha-net
        ~~~
        $ ./conoha-net list-group
        UUID                                     SecurityGroup     Direction     EtherType     Proto     IP Range     Port
        8c44791a-4ff8-44eb-b660-b7a0d8f569c5     test-group-a      ingress       IPv4          tcp                    12345 - 12345
        a9a3bf17-c442-4a61-b119-c6e9d4355404     test-group-a      egress        IPv4          ALL                    ALL
        cd590260-fece-4929-ac52-d5d93c34aabe     test-group-a      egress        IPv6          ALL                    ALL
        ~~~
    - openstack
        ~~~
        $ openstack security group rule list test-group-b
        +--------------------------------------+-------------+-----------+-----------+-------------+-----------+-
        | ID                                   | IP Protocol | Ethertype | IP Range  | Port Range  | Direction | 
        +--------------------------------------+-------------+-----------+-----------+-------------+-----------+-
        | 022a83b6-80c4-4394-bbb7-f07549112396 | tcp         | IPv4      | 0.0.0.0/0 | 12345:12345 | ingress   | 
        | b65fa2e5-f736-4b95-adb6-25e2a26d3bb5 | None        | IPv6      | ::/0      |             | egress    | 
        | fc59cbf8-ad44-4a63-80cc-3947037cda32 | None        | IPv4      | 0.0.0.0/0 |             | egress    | 
        +--------------------------------------+-------------+-----------+-----------+-------------+-----------+-
        ~~~

1. セキュルティグループをサーバーにアタッチ（即時反映）

    - conoha-net
        ~~~
        $ conoha-net attach -n [サーバー名] test-group-a
        ~~~
    - openstack
        ~~~
        $ openstack server add security group [サーバー名] test-group-b
        ~~~

1. （補足）セキュルティグループの外し方

    - conoha-net
        ~~~
        $ conoha-net detach -n [サーバー名] test-group-a
        ~~~
    - openstack
        ~~~
        $ openstack server remove security group [サーバー名] test-group-b
        ~~~


### C. firewalld/iptables等で開ける

1. コントロールパネルから「接続許可ポート」で「全て許可」を選択

2. OSでfirewalld/iptablesを有効化して設定


あとがき
----

conoha-net/openstackコマンドでポート開放する方法が通常は推奨されます。
Conohaに限らずほとんどのIaaSでは、仮想サーバーのポート管理サービスはデフォルトで無効化されています。
これはポート管理する役割がIaaS側にあるからです。ポート管理を仮想サーバー内のサービスでやるのは巨大なデプロイメントでは大変な作業になります。

個人ユースではfirewalld/iptablesでも間に合うと思いますが、自宅サーバでポートスキャン&&sshリバースブルートフォースの被害にあった自分からすると、ログイン失敗のログがsyslogに大量に流れてきたり無駄なCPUリソースを食ったりするのであまりおすすめしません。