質問: お世話になっております。 表記の件につきまして、LANの中からはSSH接続できるのですが、LANの外からRaspberry Piに接続できなくて困っております。 色々試したつもりではいるのですが、接続できませんでしたのでお力添えいただきたく質問致しました。 ``` 環境 MacBook Pro(macOS High Sierra 10.13.6) raspberry pi 3 model b+ ``` 思いつく限りやったことを列挙します。 プライベートIPアドレスを固定 ---------------- ``` $ sudo nano /etc/dhcpcd.conf ``` ``` # ファイルの文末に以下を追加 interface wlan0 static ip_address=192.168.2.○/24 #固定するローカルIP static routers=192.168.2.1 #デフォルトゲートウェイのIP static domain_name_servers=192.168.2.1 #DNSサーバーのIP? ``` LAN内でSSH接続して、ポート番号の変更 ---------------------- Macで接続 ``` $ ssh pi@192.168.2.○ $ sudo nano /etc/ssh/sshd_config ``` ``` # What ports, IPs and protocols we listen for # Port 22 Port 50000 # 仮に50000とする ``` デーモンの再起動`sudo /etc/init.d/sshd restart` ``` # 接続確認 $ ssh pi@192.168.2.○ -p 50000 ``` 公開鍵認証 ------ Macで鍵を作成してRaspberry Piに送る ``` # 鍵の作成 $ cd ~/ssh $ ssh-keygen Enter file in which to save the key (/home/pi/.ssh/id_rsa): # 鍵の名前と保存するパスを指定。そのままEnterでいいと思う Enter passphrase (empty for no passphrase): # パスフレーズを設定。絶対に忘れない様にすること Enter same passphrase again: # 設定したパスフレーズをもう一度入力 # 公開鍵をRaspberry Piに送信 $ scp id_rsa.pub pi@192.168.2.○ -p 50000:/home/pi/.ssh/id_rsa # 公開鍵としてauthorized_keysに書き出し $ cat .ssh/id_rsa.pub >> .ssh/authorized_keys # 公開鍵に権限を付与 $ chmod 700 .ssh $ chmod 600 .ssh/authorized_keys # SSHの設定変更 $ sudo nano /etc/ssh/sshd_config ``` ``` # SSH での root ログインを出来なくする PermitRootLogin no # パスワードでのログインを禁止 #PasswordAuthentication yes PasswordAuthentication no # 空パスワードでのログインを禁止 PermitEmptyPasswords no ``` ポートフォワーディング ------------ Q.【Wi-Fiルーター】【WRC-】ポートフォワーディング設定方法/特定の機器の通信を許可する方法はありますか?を参考にして、 ・上で固定したローカルIPアドレスを指定 ・タイプは両方 ・ポートは仮に「50000-50000」とした 上記設定でルーターの再起動を行った グローバルIPで接続を試す -------------- `curl ifconfig.me`でグローバルIPを確認 `ssh pi@{グローバルIP} -p {ポート番号}`を試すも繋がらず... nmapでポート解放を確認 -------------- Raspberry Piにnmapをインストール ``` # nmapのインストール $ sudo apt-get install nmap ``` `/etc/ssh/sshd_config`で80番を指定しているときは`$ nmap localhost`で80番が表示されるが、50000を指定した時には表示されない →そもそもポートが開いていない可能性がある...? 設定ファイルの編集 ---------- `/etc/hosts.deny`は修正しない `/etc/hosts.allow`には`sshd:all`を追記 →接続できず 素人のため、根本的なことが抜けていたりするかもしれませんが、ネットで調べれる様なことは大抵やった様な気がしてまして、これ以上どう修正をすれば接続できるのかが分かりませんでした。 ご回答いただけると幸いです。 追記:たくさんご回答いただいたので、その内容を試して見ました * まずはこのご回答からチャレンジ > > 念の為の確認ですが、 > > curl ifconfig.meでグローバルIPを確認 > > これは Raspberry Pi にて実行したんですよね? > > ssh pi@{グローバルIP} -p {ポート番号}を試すも繋がらず... > > これはLANの外(インターネット上)のホストから実行したんですよね? > > 書き方からは Raspberry Pi にて実行したようにも見えますが、そのような事は無いですよね? > > インターネット上のホストで実行したとして、この時にどのようなエラーメッセージが表示されましたか? > > 設定をざっと見た限りでは問題なさそうなので、まずはどの部分に問題が有るかを切り分ける為、tcpdump を使って Raspberry Pi までパケットが届いているかを確認してください。 > > tcpdump -n -i wlan0 host {インターネット上のホストのIPアドレス} > > tcpdump を実行中にインターネット上のホストから ssh を実行し、パケットが Raspberry Pi まで届いているかを確認します。 > > パケットが届いていない場合はルータまでに問題が有りますので、 > > ルータの設定を再度見直す > > ルータを再起動してみる > > インターネット上のホスト側で接続できるポートに制限がかけられていないか確認する > > などを確認してみてください。 > > Raspberry Pi まで届いている場合は、そのパケットがどうなっているかを確認します。 > > 外部からパケットが来るだけで Raspberry Pi が応答していない > > 外部からのパケットに対し、Raspberry Pi は RST を返している > > 外部からのSYNパケットに対し、Raspberry Pi は SYN+ACK パケットを返している > > その他 > > 上記のどれに当てはまるかを確認し、それによって怪しい部分を絞り込みます。 > > > LAN内からSSHで接続`ssh pi@raspi.local -p 50000` Raspberry Piから`curl ifconfig.me` →`{グローバルIP}` Macの無線LANの接続を切り、スマホとMacをWi-Fiで接続してスマホをアクセスポイントとしてインターネットに接続 WAN側から接続を試すがタイムアウト`ssh pi@{グローバルIP} -p 50000` →`ssh: connect to host {グローバルIP} port 50000: Operation timed out` tcpdunpを使ってインターネット上のホストから ssh を実行し、パケットが Raspberry Pi まで届いているかを確認`sudo tcpdump -n -i wlan0 host {グローバルIP}` →`tcpdump: wlan0: No such device exists (BIOCSETIF failed: Device not configured)` →パケットが届いていない! そもそもPingが通っていない ``` $ ping {グローバルIP} PING {グローバルIP} ({グローバルIP}): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3 Request timeout for icmp_seq 4 ... --- {グローバルIP} ping statistics --- 17 packets transmitted, 0 packets received, 100.0% packet loss ``` * 次の回答にチャレンジ > > /etc/ssh/sshd_configで80番を指定しているときは$ nmap localhostで80番が表示されるが、50000を指定した時には表示されない > > →そもそもポートが開いていない可能性がある...? > > → nmapはデフォルト(オプションつけない)だと1024までのポートをスキャンします。50000は範囲外です。LAN内からSSHができているのであれば、ポートは開いていると思います。 > > sudo netstat -tnlp で右端にsshdとある行の、Local Addressの列に、0.0.0.0:50000(SSHで使うポート)が出てくれば、さらに間違いないです。 > > > Raspberry Piで`sudo netstat -tnlp` ``` Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:50000 0.0.0.0:* LISTEN 9145/sshd ``` →Local Addressの列に0.0.0.0:50000(SSHで使うポート)と出てくるから、Raspberry Pi上ではポート番号50000で待ち受けれている
回答: 念の為の確認ですが、 > > `curl ifconfig.me`でグローバルIPを確認 > > > これは Raspberry Pi にて実行したんですよね? > > `ssh pi@{グローバルIP} -p {ポート番号}`を試すも繋がらず... > > > これはLANの外(インターネット上)のホストから実行したんですよね? 書き方からは Raspberry Pi にて実行したようにも見えますが、そのような事は無いですよね? インターネット上のホストで実行したとして、この時にどのようなエラーメッセージが表示されましたか? 設定をざっと見た限りでは問題なさそうなので、まずはどの部分に問題が有るかを切り分ける為、tcpdump を使って Raspberry Pi までパケットが届いているかを確認してください。 ``` tcpdump -n -i wlan0 host {インターネット上のホストのIPアドレス} ``` tcpdump を実行中にインターネット上のホストから ssh を実行し、パケットが Raspberry Pi まで届いているかを確認します。 パケットが届いていない場合はルータまでに問題が有りますので、 * ルータの設定を再度見直す * ルータを再起動してみる * インターネット上のホスト側で接続できるポートに制限がかけられていないか確認する などを確認してみてください。 Raspberry Pi まで届いている場合は、そのパケットがどうなっているかを確認します。 1. 外部からパケットが来るだけで Raspberry Pi が応答していない 2. 外部からのパケットに対し、Raspberry Pi は RST を返している 3. 外部からのSYNパケットに対し、Raspberry Pi は SYN+ACK パケットを返している 4. その他 上記のどれに当てはまるかを確認し、それによって怪しい部分を絞り込みます。