EC2セキュリティグループのIP制限で接続できない?真の送信元IPを特定する確実な方法

AWS Basic
スポンサーリンク
スポンサーリンク

はじめに

EC2インスタンスを構築し、セキュリティグループで自分のIPアドレスに制限したのに、なぜかSSH接続もWebアクセスもできない

そんな経験はありませんか?

実は、一般的なIP確認方法(curlや確認くん)で表示されるIPアドレスと、実際にSSH/HTTP通信で使われるIPアドレスが異なる場合があるんです。

この記事では、私が実際に遭遇したトラブルと、真の送信元IPを確実に特定する方法を解説します。


問題の発覚:IP制限しているのに接続できない

最初の設定

EC2インスタンスを構築し、セキュリティグループで自分のIPアドレスを確認して設定しました。

curl https://checkip.amazonaws.com
# 結果: 222.444.111.100

# セキュリティグループに設定
# ポート22(SSH): 222.444.111.100/32
# ポート80(HTTP): 222.444.111.100/32

完璧!...と思いきや。

接続できない

# SSH接続を試みる
ssh -i my-ec2-test-key.pem ec2-user@13.231.231.97
# ssh: connect to host 13.231.231.97 port 22: Connection timed out

ブラウザでのWebアクセスも同様にタイムアウト。

「なぜ?!IPアドレスは合ってるはずなのに...」


試行錯誤の過程:様々なIP確認方法を試した

方法1: curl https://checkip.amazonaws.com

curl https://checkip.amazonaws.com
# 結果: 222.444.111.100

結論: このIPでは接続できなかった。

方法2: 確認くんサイト

https://www.ugtop.com/spill.shtml

結論: curlと同じIPが表示されたが、やはり接続できず。

方法3: SSH接続して$SSH_CLIENTで確認

一時的にセキュリティグループを0.0.0.0/0(全開放)にして、SSH接続を試みました。

# EC2にSSH接続
ssh -i my-ec2-test-key.pem ec2-user@パブリックIP

# 接続後、真の送信元IPを確認
echo $SSH_CLIENT
# 結果: 123.456.78.901 17508 22

123.456.78.901が表示された!

curlで確認した222.444.111.100とは全く異なるIPアドレスです。

方法4: Apacheアクセスログで確認

さらに確実性を高めるため、HTTPアクセスでも確認しました。

# EC2インスタンス内で実行
# ローカルPCのブラウザで http://パブリックIP にアクセス後
sudo cat /var/log/httpd/access_log | tail -5

# 出力例:
# 123.456.78.901 - - [14/Jan/2025:12:34:56 +0000] "GET / HTTP/1.1" 200 ...

SSH接続とHTTPアクセスで同じIPが確認できた。これが真の送信元IPだ!


解決:ルータ管理画面が最も確実だった

しかし、実はもっと簡単で確実な方法がありました。

ルータの管理画面で確認

自宅のWi-Fiルーター(TP-Link AX1800)の管理画面にアクセス:

http://192.168.0.1

ネットワークマップを開くと、**「インターネットIPアドレス: 123.456.78.901」**と表示されていました。

ルータ管理画面

これが最も簡単で確実な方法でした。

なぜこの方法が最適なのか

ルーター側で実際に使用しているIPを直接確認できる

  • ブラウザやコマンドを経由しないため、プロキシの影響を受けない

一目で分かる

  • SSH接続やログ確認などの手間が不要

確実

  • ルーターがISPから割り当てられているIPアドレスそのもの

なぜIPアドレスが異なるのか?

通信経路の違い(推測)

【HTTPS通信(curl、確認くん)の場合】
PC → プロキシサーバー? → インターネット
              ↓
       222.444.111.100 として認識される

【SSH/HTTP通信の場合】
PC → ルーター → インターネット
         ↓
    123.456.78.901 として認識される

プロバイダ固有の問題?

**BIGLOBE(プロバイダ)**を使用していますが、HTTPSトラフィック(ポート443)とその他のトラフィック(ポート22, 80)で異なる経路を通している可能性があります。

他のプロバイダを使用している友人は、確認くんで表示されるIPで問題なく接続できたため、ISP固有の設定が関係していると推測しています。


真の送信元IPを確実に特定する手順

推奨:ルータ管理画面で確認(最も簡単)

1. ブラウザでルーターの管理画面を開く
   - 一般的なアドレス: 192.168.0.1 または 192.168.1.1
   - ルーターの裏面に記載されていることが多い

2. 「ネットワークマップ」や「インターネット」の項目を開く

3. 「インターネットIPアドレス」や「WAN IPアドレス」を確認

4. このIPアドレスをセキュリティグループに設定

これだけです!

代替手順:一時全開放→SSH接続で確認

ルーター管理画面にアクセスできない場合の手順です。

ステップ1: セキュリティグループを一時的に全開放

# template.yaml(CloudFormation)の設定
SecurityGroupIngress:
  - IpProtocol: tcp
    FromPort: 22
    ToPort: 22
    CidrIp: 0.0.0.0/0  # 一時的に全開放
  - IpProtocol: tcp
    FromPort: 80
    ToPort: 80
    CidrIp: 0.0.0.0/0  # 一時的に全開放

または、既存のセキュリティグループをAWS CLIで変更:

aws ec2 authorize-security-group-ingress --group-id sg-XXX --protocol tcp --port 22 --cidr 0.0.0.0/0 --region ap-northeast-1
aws ec2 authorize-security-group-ingress --group-id sg-XXX --protocol tcp --port 80 --cidr 0.0.0.0/0 --region ap-northeast-1

ステップ2: SSH接続して真のIPを確認

# ローカルPC(VSCode)のターミナルで実行
ssh -i my-ec2-test-key.pem ec2-user@パブリックIP

# EC2インスタンス内で実行
echo $SSH_CLIENT
# 出力例: 123.456.78.901 17508 22
#         ↑この部分が真の送信元IP

このIPアドレスをメモしておきます。

ステップ3: HTTPアクセスでも確認(推奨)

SSH接続したまま、Apache httpdのアクセスログを確認:

# EC2インスタンス内で実行
# ローカルPCのブラウザで http://パブリックIP にアクセス後
sudo cat /var/log/httpd/access_log | tail -5

# 出力例:
# 123.456.78.901 - - [14/Jan/2025:12:34:56 +0000] "GET / HTTP/1.1" 200 ...

SSH接続とHTTPアクセスのIPが一致していれば完璧です。

ステップ4: セキュリティグループを制限

# EC2からログアウト
exit

# ローカルPC(VSCode)のターミナルで実行
# 全開放ルールを削除
aws ec2 revoke-security-group-ingress --group-id sg-XXX --protocol tcp --port 22 --cidr 0.0.0.0/0 --region ap-northeast-1
aws ec2 revoke-security-group-ingress --group-id sg-XXX --protocol tcp --port 80 --cidr 0.0.0.0/0 --region ap-northeast-1

# 真のIPのみ許可
aws ec2 authorize-security-group-ingress --group-id sg-XXX --protocol tcp --port 22 --cidr 123.456.78.901/32 --region ap-northeast-1
aws ec2 authorize-security-group-ingress --group-id sg-XXX --protocol tcp --port 80 --cidr 123.456.78.901/32 --region ap-northeast-1

ステップ5: 動作確認

# SSH接続
ssh -i my-ec2-test-key.pem ec2-user@パブリックIP
# → 成功!

# ブラウザで http://パブリックIP にアクセス
# → 表示される!

template.yamlへの反映

次回以降のEC2構築時のために、template.yamlを更新しておきましょう。

SecurityGroupIngress:
  - IpProtocol: tcp
    FromPort: 22
    ToPort: 22
    CidrIp: 123.456.78.901/32  # ルーター管理画面で確認したIP
    Description: Allow SSH from my IP
  - IpProtocol: tcp
    FromPort: 80
    ToPort: 80
    CidrIp: 123.456.78.901/32  # ルーター管理画面で確認したIP
    Description: Allow HTTP from my IP

よくあるトラブルと対処法

トラブル1: EC2内部でセキュリティグループを変更しようとしてエラー

[ec2-user@ip-172-31-34-41 ~]$ aws ec2 revoke-security-group-ingress ...
An error occurred (UnauthorizedOperation) ...

原因: EC2インスタンスのIAMロールには、セキュリティグループ変更権限がありません。

対処: SSH接続を終了(exit)して、ローカルPC(VSCode)のターミナルから実行してください。

# 現在どこにいるか確認
aws sts get-caller-identity

# EC2内部だと「assumed-role/EC2Role」が表示される
# ローカルPCだと「arn:aws:iam::...:user/...」が表示される

トラブル2: IPアドレスが頻繁に変わる

動的IPアドレスの場合、モデム再起動などで変わる可能性があります。

対処法1: 固定IP契約

  • プロバイダーに固定IPサービス(有料)を申し込む

対処法2: Session Manager利用

  • SSH不要でブラウザ/CLIから接続
  • IP制限が不要になる
aws ssm start-session --target i-XXX --region ap-northeast-1

対処法3: 変わったらルーター管理画面で再確認

1. ルーター管理画面で新しいIPを確認
2. セキュリティグループを更新

まとめ

重要なポイント

ルーター管理画面(192.168.0.1)が最も簡単で確実

  • 「インターネットIPアドレス」をそのまま使用

curlや確認くんで確認したIPと実際の接続元IPは異なる場合がある

  • プロキシやISP(特にBIGLOBE?)の経路の違いが原因

代替手段:echo $SSH_CLIENTで確認

  • 一時的に全開放→SSH接続して確認→制限

HTTPアクセスログでも確認すると完璧

  • /var/log/httpd/access_logで確認

セキュリティグループ変更はローカルPCから

  • EC2内部では権限エラーになる

推奨ワークフロー

【最も簡単な方法】
1. ルーター管理画面(192.168.0.1)を開く
2. 「インターネットIPアドレス」を確認
3. そのIPでセキュリティグループを設定
4. template.yamlを更新して次回に備える

【ルーターにアクセスできない場合】
1. セキュリティグループを0.0.0.0/0で構築
2. SSH接続して「echo $SSH_CLIENT」で真のIPを確認
3. Webアクセス後、httpdログでも確認(推奨)
4. ローカルPCから、セキュリティグループを真のIPに制限
5. template.yamlを更新

関連記事

  • AWSプロジェクトのフォルダ整理で失敗しないために - 開発環境の整理方法
AWSプロジェクトのフォルダ整理で失敗しないために - Python仮想環境の落とし穴
はじめにAWSでの開発を進めていくと、ec2-test、sam-api-project、my-serverless-appなど、プロジェクトフォルダがユーザーディレクトリ直下に散らばってしまいませんか?「そろそろ整理しないと...」と思って...
  • CloudShellとローカル環境でのAWS開発 - 使い分けと注意点 - CloudShellでの真のIP確認方法
CloudShellとローカル環境でのAWS開発 - 使い分けと注意点
はじめにAWS開発を始めると、「ローカルPC(VSCode)」と「CloudShell」、どちらで作業するのが良いのか迷いませんか?実は、それぞれに適した使い方があり、理解しないまま使うと思わぬトラブルに遭遇します。この記事では、両環境の違...

終わりに

セキュリティグループのIP制限は、正しく設定すれば強力なセキュリティ対策になります。

しかし、「真の送信元IP」を正確に把握していないと、自分自身をロックアウトしてしまうことも。

ルーター管理画面で確認するのが最も簡単で確実です。まずはこの方法を試してみてください!

同じ問題で困っている方の助けになれば嬉しいです。質問があれば、コメント欄でお気軽にどうぞ!

コメント