📝

ECS on EC2 で VPN サーバーを構築してみた

に公開

Amazon ECS タスクおよびコンテナのセキュリティのベストプラクティス - Amazon Elastic Container Service

AWS Fargate 上の Amazon ECS では、コンテナを privileged として実行することはサポートされていません。

Fargate ではできなかったので EC2 起動タイプでやってみました。

前提

  • VPN の接続元端末は Windows PC

1. ECS クラスターの作成

EC2 起動タイプでクラスターを作成します。
必要な容量で最小、最大を 1 に設定しましたが、その他の設定はデフォルト値です。


2. セキュリティグループのルール変更

VPN サーバーへの接続にあたり、以下のインバウンドルールを追加しました。

  • カスタム UDP
    • ポート範囲: 500
    • ソース: マイ IP
  • カスタム UDP
    • ポート範囲: 4500
    • ソース: マイ IP
  • カスタム TCP
    • ポート範囲: 1701
    • ソース: マイ IP

3. タスク定義の作成

以下の内容で作成しました。
注意点として、privileged を true に設定する必要がありますが、この設定は JSON を編集する方法でのみ変更可能です。

{
    "compatibilities": [
        "EC2"
    ],
    "containerDefinitions": [
        {
            "cpu": 0,
            "environment": [
                {
                    "name": "USERS",
                    "value": "test-user:test2025"
                },
                {
                    "name": "PSK",
                    "value": "test2025"
                }
            ],
            "essential": true,
            "image": "siomiz/softethervpn",
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/vpn-server-task",
                    "awslogs-create-group": "true",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                }
            },
            "mountPoints": [],
            "name": "vpn-server",
            "portMappings": [
                {
                    "containerPort": 500,
                    "hostPort": 500,
                    "protocol": "udp"
                },
                {
                    "containerPort": 4500,
                    "hostPort": 4500,
                    "protocol": "udp"
                },
                {
                    "containerPort": 1701,
                    "hostPort": 1701,
                    "name": "vpn-server-1701-tcp",
                    "protocol": "tcp"
                }
            ],
            "privileged": true,
            "systemControls": [],
            "volumesFrom": []
        }
    ],
    "cpu": "1024",
    "enableFaultInjection": false,
    "executionRoleArn": "arn:aws:iam::012345678901:role/ecsTaskExecutionRole",
    "family": "vpn-server-task",
    "memory": "3072",
    "networkMode": "host",
    "placementConstraints": [],
    "registeredAt": "2025-08-26T04:28:53.846Z",
    "registeredBy": "xxx",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "ecs.capability.execution-role-awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.privileged-container"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
        }
    ],
    "requiresCompatibilities": [
        "EC2"
    ],
    "revision": 2,
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "status": "ACTIVE",
    "taskDefinitionArn": "xxx",
    "volumes": [],
    "tags": []
}

4. タスクの作成

手順 3 のタスク定義でタスクを作成します。
クラスターは手順 1 で作成したクラスターを指定します。

5. 動作確認

タスクが起動したらパブリック IP を確認しておきます。

Windows のネットワークとインターネットの設定を開き、VPN を追加します。

VPN 追加時の設定値は以下の通りです。

  • 接続名: 任意の名称
  • サーバー名または IP アドレス: タスクのパブリック IP アドレス
  • VPN の種類: 事前共有キーを使った L2TP/IPsec
  • 事前共有キー: test2025
  • ユーザー名: test-user

上記設定で保存後、接続をクリックします。

サインインのポップアップが表示されるので以下の値を入力して OK をクリックします。

  • メールアドレス: test-user
  • パスワード: test2025

接続済みになれば VPN 接続完了です。

まとめ

今回は ECS on EC2 で VPN サーバーを構築してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion