最近VPSを使い始めました。  
sshで使用される22番ポートがちゃんと開いているかを確認したいのですが、外部のlinuxから確認するコマンドはありますか?  
また、ポート番号を変えた時や、現在使ってもいないのに開いていないかどうかというのを調べる方法があれば教えて下さい。

内側からはiptablesで確認したのですが、不安なので外からも確認してみたいのですが。

よろしくおねがいします。
CC BY-SA 3.0
2015-02-02T12:41:21.973
5785
2015-02-03T18:33:45.680
5855
question
linux centos ssh
centosの22番ポートが開いているかどうか外部から確認する方法
`nmap` コマンドが適当かと思います。

```

    $ nmap -p ssh [destination host]
    
    Starting Nmap 6.40 ( http://nmap.org )
    Nmap scan report for XXX.XXX.XXX.XXX
    Host is up (0.051s latency).
    PORT   STATE SERVICE
    22/tcp open  ssh
    
    Nmap done: 1 IP address (1 host up) scanned in 0.35 seconds
    
```

`open` と表示されれば開放されています。`filtered` と表示される場合には開放されていない事になります。また、sshd
が使用しているポート番号が 22 以外の場合は、そのポート番号を指定することになります。Debian 系、RedHat 系 Linux ともに `nmap`
パッケージとして提供されている様です。  
なお、`nmap` コマンドでは複数のサービス名/ポート番号を指定できます。

```

    $ nmap -p ssh,http,https [destination host]
    
    Starting Nmap 6.40 ( http://nmap.org )
    Nmap scan report for XXX.XXX.XXX.XXX
    Host is up (0.056s latency).
    PORT     STATE    SERVICE
    22/tcp   open     ssh
    80/tcp   open     http
    443/tcp  filtered https
    
    Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds
    
```

* * *

  
その他には `tcptraceroute` コマンドがあります。

```

    $ tcptraceroute -n -q 1 -w 1 [destination host] ssh
    
    Selected device eth0, address 192.168.0.3, port 58368 for outgoing packets
    Tracing the path to XXX.XXX.XXX.XXX on TCP port 22 (ssh), 30 hops max
    1  192.168.0.1  0.807 ms
                      :
    
    13  *
    14  XXX.XXX.XXX.XXX [open]  48.457 ms
    
```

最終的に `[open]` と表示されれば、そのポートが開放されていることになります。開放されていない場合には `[closed]` と表示されます。  
Debian 系、RedHat 系 Linux ともに `tcptraceroute` パッケージとして提供されている様です。
CC BY-SA 3.0
2015-02-02T12:57:57.390
5786
2015-02-02T13:34:37.767
2015-02-02T13:34:37.767
5785
answer
簡単に確認するには`telnet`コマンドが使えます。`$ telnet host port`で実行します。

＃手元の環境がFreeBSDなのでそう表示されてますがそこは気にしないでください

ポートがあいている場合

```

    $ telnet 192.168.1.1 22
    Trying 192.168.1.1...
    Connected to 192.168.1.1.
    Escape character is '^]'.
    SSH-2.0-OpenSSH_5.8p2_hpn13v11 FreeBSD-20110503
    ^] ←入力してください(Ctrl + ])
    telnet> quit ←入力してください
    
```

ポートが閉じている場合

```

    $ telnet 192.168.1.1 22 
    Trying 192.168.1.1...
    telnet: connect to address 192.168.1.1: Connection refused
    telnet: Unable to connect to remote host
    
```

Trying ... の表示で止まる場合もポートは閉じています

ポートは開いているがtcpwrapperで止まっている場合

```

    $ telnet 192.168.1.1 22
    Trying 192.168.1.1...
    Connected to 192.168.1.1.
    Escape character is '^]'.
    ^] ←入力してください(Ctrl + ])
    telnet> quit ←入力してください
    
```

1 番目の例と比べると、`SSH-2.0-OpenSSH_5.8p2_hpn13v11 FreeBSD-20110503`が無いのが違います

網羅的に調べるには、ポートスキャンを行うことになります。有名なプログラムに`nmap`があります。たいていのディストリビューションではバイナリパッケージが提供されています。次の例では1-1024までのポートをスキャンしています。オプションでポートを指定したり広げたりすることもできます。

```

    $ nmap 192.168.1.1
    
    Starting Nmap 6.25 ( http://nmap.org ) at 2015-02-02 22:25 JST
    Nmap scan report for host.example.jp (192.168.1.1)
    Host is up (0.046s latency).
    Not shown: 993 filtered ports
    PORT    STATE  SERVICE
    22/tcp  open   ssh
    53/tcp  closed domain
    80/tcp  open   http
    443/tcp open   https
    587/tcp open   submission
    
    Nmap done: 1 IP address (1 host up) scanned in 45.61 seconds
    
```

間違っても自分が管理していないホストに実施してはいけません。
CC BY-SA 3.0
2015-02-02T13:34:17.227
5790
2015-02-02T13:34:17.227
5793
5785
answer
`nc` (または `netcat`) コマンドはどうでしょうか。  
`-z`オプションを追加することでポートスキャンモードとして動作します。

以下に`man nc`から動作例を抜粋します。ポート番号の複数スキャンも可能です。

```

    $ nc -z host.example.com 20-30
    Connection to host.example.com 22 port [tcp/ssh] succeeded!
    Connection to host.example.com 25 port [tcp/smtp] succeeded!
    
```
CC BY-SA 3.0
2015-02-02T13:58:12.537
5793
2015-02-02T13:58:12.537
2391
5785
answer
どこでも使えるコマンドとして、 [netcat](http://netcat.sourceforge.net/) (`nc`) が軽くておすすめ。

```

    nc -v -z -w 1 <my_server.com> 22
    echo $?
    
```

`echo` の出力が `0` だと成功（OPEN）、 `1`
だと失敗(CLOSE)です。動作がはっきりしてるので、シェルスクリプトに組み込むときに使えると思います。以下、簡単に要素を説明します:

> nc:
>
>   * `-z` : スキャンのみをする
>   * `-w` : タイムアウト値（秒）
>   * `-v` : 詳細出力をする
>

>
> bash:
>
>   * `$?` : 一つ前に実行されたコマンドの Exit code
>

ポート 80 から 500 まで、スキャンするときは以下のようにします。(TCP でなく UDP のサービスのチェックをしたい時は、オプションに`-u`
を付けてください)

```

    $nc -z -w 1 <my_server.com> 80-500
    Connection to my_server.com port 80 [tcp/http] succeeded!
    Connection to my_server.com port 222 [tcp/rsh-spx] succeeded!
    Connection to my_server.com port 443 [tcp/https] succeeded!
    
```

ポートチェックだけでなく、テキストベースのサービスが動いているかどうかを調べるときは、 `telnet <my_server> <port>`
で対話します。専用のポートスキャナが使えない環境のとき `telnet`
で対話することで本当に正しいサービスが上がっているか判断できることがあります。たしか Windows ですら同じ名前のコマンドを持っているので、
数ポートのチェックであれば、`telnet` だけ覚えておいてもいいかもしれません。
CC BY-SA 3.0
2015-02-02T14:02:59.870
5795
2015-02-02T14:02:59.870
4978
5785
answer
ssh限定であれば -p オプションでポート番号を指定すればお望みの確認はできると思います。

```

    $ ssh -p 22 user@server exit
    $ ssh -p 222 user@server exit
    ssh: connect to host server port 222: Connection refused
    
```
CC BY-SA 3.0
2015-02-03T18:33:45.680
5896
2015-02-03T18:33:45.680
5008
5785
answer