はじめに
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 22123.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プロジェクトのフォルダ整理で失敗しないために - 開発環境の整理方法

- CloudShellとローカル環境でのAWS開発 - 使い分けと注意点 - CloudShellでの真のIP確認方法

終わりに
セキュリティグループのIP制限は、正しく設定すれば強力なセキュリティ対策になります。
しかし、「真の送信元IP」を正確に把握していないと、自分自身をロックアウトしてしまうことも。
ルーター管理画面で確認するのが最も簡単で確実です。まずはこの方法を試してみてください!
同じ問題で困っている方の助けになれば嬉しいです。質問があれば、コメント欄でお気軽にどうぞ!
コメント