---
title: Ingress-Nginx ControllerのRate limiting機能を用いてDoS攻撃を防御する
tags: 
author: [マスダカズキ](https://convert.docswell.com/user/5592427366)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/LJ138QYY7G.jpg?width=480
description: Ingress-Nginx ControllerのRate limiting機能を用いてDoS攻撃を防御する
published: December 20, 24
canonical: https://convert.docswell.com/s/5592427366/KXE22P-2024-12-20-174449
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/LJ138QYY7G.jpg)

Ingress-Nginx Controllerの
Rate limiting機能を用いてDoS攻撃を防御する
NTTコミュニケーションズ株式会社
ソリューションサービス部
増田 和己
2024/12/10
© NTT Communications Corporation All Rights Reserved.


# Page. 2

![Page Image](https://bcdn.docswell.com/page/GJWPZMG172.jpg)

発表者 自己紹介
増田 和己
Kazuki Masuda
◆得意分野と現業務
Windows OS/Microsoft Azureを用いたシステム開発
やトラブルシューティングを得意とし、現在は
Kubernetesの開発運用にも従事しています。
写真右が発表者
2020年ミャンマー勤務時に撮影
© NTT Communications Corporation All Rights Reserved.
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/4EZK1QLXE3.jpg)

本資料_概要
本資料はIngress-Nginx ControllerのRate-Limiting機能を用いて、
Kubernetesクラスタ内のコンテナをDoS攻撃から保護するための手順を記載したものである。
© NTT Communications Corporation All Rights Reserved.
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/Y76QL6WP7V.jpg)

前提
本検証にあたっての前提は以下の通り。
• KubernetesはAKS 1.29.9を用いている(AKS = Azure Kubernetes Service)。
• Ingress-Nginx Controller(OSS製品)を用いている。
• Ingress-Nginx Controllerはバージョン1.11.3である。
• AKSやIngress-Nginx Controllerの構築は完了している。
• Windows 11端末にDocker Desktopをインストールしている。
© NTT Communications Corporation All Rights Reserved.
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/G75R16MPE4.jpg)

目次
1. Ingress とは
2. システム構成
3. Rate-limiting機能_利用の流れ
a.
b.
c.
d.
e.
エラーページ表示用イメージを作成
エラーページ表示用イメージをAKSにデプロイ
Ingress Controller(Deployment)の設定
Ingress Controller(ConfigMap)の設定
Ingress Ruleの設定
4. デモ
© NTT Communications Corporation All Rights Reserved.
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/9J2D1M9ZJR.jpg)

目次
1. Ingress とは
2. システム構成
3. Rate-limiting機能_利用の流れ
a.
b.
c.
d.
e.
エラーページ表示用イメージを作成
エラーページ表示用イメージをAKSにデプロイ
Ingress Controller(Deployment)の設定
Ingress Controller(ConfigMap)の設定
Ingress Ruleの設定
4. デモ
© NTT Communications Corporation All Rights Reserved.
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/DEY2ZX4NEM.jpg)

1. Ingressとは
• Kubernetes内のアプリケーション提供用podに対して、外部からの(HTTP/HTTPS)アクセス
を管理するAPIオブジェクトである。
• Ingress RuleとIngress Controllerがあり、Ingress RuleはL7ロードバランサの設定を行う。
Ingress ControllerはIngress Ruleの設定内容に基づき各種制御する。
• Kubernetes上のL7ロードバランサとして、以下を含めた機能を提供する。
a. 外部からHTTPS通信を受付する際のSSL終端機能
b. Ingressとアプリケーション提供用pod間のセッションアフィニティ機能
c. URLパスベースのルーティング機能
(例 : /authの場合は認証用podに、/appの場合なアプリ用podに通信を振り分ける)
d. 外部からのアクセス量を制御する機能(Rate Limiting機能)
本日のターゲット機能
© NTT Communications Corporation All Rights Reserved.
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/VJN831YV78.jpg)

1. Ingressとは(Rate Limiting機能)
• 特定IPアドレスからのHTTPリクエスト通信を時間単位で制御する
• 制御された通信はデフォルトでHTTP 503のエラーを返す(※)
※本検証ではHTTP 502エラーを返すように変更
本日のターゲット機能
※同機能詳細は以下Web参照
Annotations - Ingress-Nginx Controller
© NTT Communications Corporation All Rights Reserved.
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/YE9K95PVE3.jpg)

目次
1. Ingress とは
2. システム構成
3. Rate-limiting機能_利用の流れ
a.
b.
c.
d.
e.
エラーページ表示用イメージを作成
エラーページ表示用イメージをAKSにデプロイ
Ingress Controller(Deployment)の設定
Ingress Controller(ConfigMap)の設定
Ingress Ruleの設定
4. デモ
© NTT Communications Corporation All Rights Reserved.
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GE8R9YD4JD.jpg)

2. システム構成
本検証にあたってのシステム構成は以下のとおり。
Ingress
アプリケーション用pod
AKSクラスタ
DoS通信発生
させる人
Ingress Rule
(/)
ログオン画面
(/app1)
Web画面
Internet
Load
Balancer
ユーザー
保守
端末
Registory
(Azure Container
Registory)
© NTT Communications Corporation All Rights Reserved.
Ingress Controller
エラーページ表示用pod


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LELKW4MVJR.jpg)

目次
1. Ingress とは
2. システム構成
3. Rate-limiting機能_利用の流れ
a.
b.
c.
d.
e.
エラーページ表示用イメージを作成
エラーページ表示用イメージをAKSにデプロイ
Ingress Controller(Deployment)の設定
Ingress Controller(ConfigMap)の設定
Ingress Ruleの設定
4. デモ
© NTT Communications Corporation All Rights Reserved.
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/4JM29KYNJW.jpg)

3-a. エラーページ表示用イメージを作成
Ingress
アプリケーション用pod
AKSクラスタ
Ingress Rule
(/)
ログオン画面
(/app1)
Web画面
Internet
Load
Balancer
ユーザー
保守
端末
Registory
(Azure Container
Registory)
© NTT Communications Corporation All Rights Reserved.
Ingress Controller


# Page. 13

![Page Image](https://bcdn.docswell.com/page/PJRMGX94E9.jpg)

3-a. エラーページ表示用イメージを作成
保守端末にて、以下2つの資材を同一ディレクトリ階層に保存する。
• 以下内容が記載されたDockerfile
• エラーページ用HTMLファイル(502.html)が格納されたwwwディレクトリ
Dockerfile
FROM registry.k8s.io/ingress-nginx/custom-errorpages:v1.0.2@sha256:b2259cf6bfda813548a64bded551b1854cb600c4f095738b49b4c
5cdf8ab9d21
COPY ./www /www
※イメージ格納元のレジストリ名は以下URLのyaml39行目から抽出
ingress-nginx/docs/examples/customization/custom-errors/custom-default-backend.yaml at main · kubernetes/ingress-nginx · GitHub
© NTT Communications Corporation All Rights Reserved.
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/PEXVX6QZ7X.jpg)

3-a(補足). 502.html
© NTT Communications Corporation All Rights Reserved.
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/3EKQW19VED.jpg)

3-a. エラーページ表示用イメージを作成
Dockerコマンドでイメージの作成、ならびにACR(Azure Container Registory)への
イメージのプッシュを行う。
cmd
# イメージをビルド(※1)
Docker build –t errorimage .
# イメージにタグを割り当て(※2)
Docker tag errorimage xxx.azurecr.io/Kubernetes-ingress-controller/nginx-error:v1.0
# イメージをACRにプッシュ
Docker push xxx.azurecr.io/kubernetes-ingress-controller/nginx-error:v1.0
※1:errorimageはイメージ名
※2:acr01.azurecr.ioはACRのホスト名、nginx-error:v1.0はリポジトリ名とタグ
© NTT Communications Corporation All Rights Reserved.
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/L73P1Q9QE5.jpg)

3-b. エラーページ表示用イメージをAKSにデプロイ
Ingress
アプリケーション用pod
AKSクラスタ
Ingress Rule
(/)
ログオン画面
(/app1)
Web画面
Internet
Load
Balancer
ユーザー
保守
端末
Registory
(Azure Container
Registory)
© NTT Communications Corporation All Rights Reserved.
Ingress Controller
エラーページ表示用pod


# Page. 17

![Page Image](https://bcdn.docswell.com/page/87DLX9GWEG.jpg)

3-b. エラーページ表示用イメージをAKSにデプロイ
保守端末にエラーコンテナ用のDeploymentとServiceのマニフェストファイルを用意し、
AKSにデプロイする。
Cmd
kubectl apply -f errordeployment.yaml
kubectl apply -f errorservice.yaml
※基となるマニフェストファイルは以下から取得
ingress-nginx/docs/examples/customization/custom-errors/custom-default-backend.yaml at main · kubernetes/ingress-nginx · GitHub
© NTT Communications Corporation All Rights Reserved.
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/VJP2PZ3XJ8.jpg)

3-b. エラーページ表示用イメージをAKSにデプロイ(Deployment)
errordeployment.yaml (サンプル)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-errors
namespace: ingress-basic
labels:
app.kubernetes.io/name: nginx-errors
app.kubernetes.io/part-of: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: nginx-errors
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: nginx-errors
app.kubernetes.io/part-of: ingress-nginx
spec:
containers:
- name: nginx-error-server
image: xxx.azurecr.io/nginx-error:v1.0
ports:
- containerPort: 8080
© NTT Communications Corporation All Rights Reserved.
15頁にて設定したACRを指定
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/2EVD2W43EQ.jpg)

3-b. エラーページ表示用イメージをAKSにデプロイ(Service)
errorservice.yaml (サンプル)
apiVersion: v1
kind: Service
metadata:
name: nginx-errors
namespace: ingress-basic
labels:
app.kubernetes.io/name: nginx-errors
app.kubernetes.io/part-of: ingress-nginx
spec:
selector:
app.kubernetes.io/name: nginx-errors
app.kubernetes.io/part-of: ingress-nginx
ports:
- port: 80
targetPort: 8080
name: http
© NTT Communications Corporation All Rights Reserved.
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/57GYRD1Y7L.jpg)

3-c. Ingress Controller(Deployment)の設定
Ingress
アプリケーション用pod
AKSクラスタ
Deploymentを更新
Ingress Rule
(/)
ログオン画面
(/app1)
Web画面
Internet
Load
Balancer
ユーザー
保守
端末
Registory
(Azure Container
Registory)
© NTT Communications Corporation All Rights Reserved.
Ingress Controller
エラーページ表示用pod


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4EQMV1D6JP.jpg)

3-c. Ingress Controller(Deployment)の設定
アクセス過多時の通信先をエラーページ表示用podに振り向かせるために、Ingress
ControllerのDeployment YAMLのSpec-template-spec-containers-argsセクションに、
以下1行を追加する
ingress-nginx-controller_(Deployment.yaml)
kind: Deployment
apiVersion: apps/v1
metadata:
name: ingress-nginx-controller
namespace: ingress-basic
~
spec:
selector:
matchLabels:
app.kubernetes.io/component: controller
~
template:
~
spec:
~
containers:
~
args:
~
- &#039;--default-backend-service=$(POD_NAMESPACE)/nginx-errors&#039;
© NTT Communications Corporation All Rights Reserved.
1秒間に許容するHTTPリクエスト数を超える場合、
エラーページ表示用podに通信させるための設定
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/KJ4VMRZME1.jpg)

3-d. Ingress Controller(ConfigMap)の設定
Ingress
アプリケーション用pod
AKSクラスタ
ConfigMapを更新
Ingress Rule
(/)
ログオン画面
(/app1)
Web画面
Internet
Load
Balancer
ユーザー
保守
端末
Registory
(Azure Container
Registory)
© NTT Communications Corporation All Rights Reserved.
Ingress Controller
エラーページ表示用pod


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LE138QRYJG.jpg)

3-d. Ingress Controller(ConfigMap)の設定
エラーページ表示用podアクセス時のHTTPレスポンスコードを指定するために、
Ingress ControllerのConfigMap YAMLのdataセクションに以下赤字2行を追加する
ingress-nginx-controller (ConfigMap.yaml)
kind: ConfigMap
apiVersion: v1
metadata:
name: ingress-nginx-controller
namespace: ingress-basic
～
1秒間に許容するHTTPリクエスト数を超える場合の
data:
HTTPレスポンスコードを指定
custom-http-errors: &#039;502‘
limit-req-status-code: &#039;502&#039;
© NTT Communications Corporation All Rights Reserved.
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/GEWPZM11J2.jpg)

3-e. Ingress Ruleの設定
Ingress
アプリケーション用pod
AKSクラスタ
Ingress Rule
(/)
ログオン画面
(/app1)
Web画面
Internet
Load
Balancer
ユーザー
保守
端末
Registory
(Azure Container
Registory)
© NTT Communications Corporation All Rights Reserved.
Ingress Controller
エラーページ表示用pod


# Page. 25

![Page Image](https://bcdn.docswell.com/page/47ZK1QPX73.jpg)

3-e. Ingress Ruleの設定
1秒間に許可するアクセス量を指定するために、Ingress Ruleのannotationセクションに
以下赤字2行を追加する。
ingress-rule_Ingress.yaml
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: ingress-rule
~
annotations:
~
nginx.ingress.kubernetes.io/limit-rps: &#039;1&#039;
© NTT Communications Corporation All Rights Reserved.
1秒間に許容するHTTPリクエスト数を指定
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/YJ6QL6MPJV.jpg)

目次
1. Ingress とは
2. システム構成
3. Rate-limiting機能_利用の流れ
a.
b.
c.
d.
e.
エラーページ表示用イメージを作成
エラーページ表示用イメージをAKSにデプロイ
Ingress Controller(Deployment)の設定
Ingress Controller(ConfigMap)の設定
Ingress Ruleの設定
4. デモ
© NTT Communications Corporation All Rights Reserved.
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/GJ5R16ZP74.jpg)

4. デモ
JMETER(通信負荷生成ツール)を用いて、ユーザーから大量アクセス時(※)の挙動を確認する。
※本件では10HTTPリクエスト/秒 、limit-rps=1で実施。
Ingress
アプリケーション用pod
AKSクラスタ
DoS通信発生
(10 HTTP req)
Ingress Rule
(/)
ログオン画面
(/app1)
Web画面
Internet
Load
Balancer
ユーザー
保守
端末
Registory
(Azure Container
Registory)
© NTT Communications Corporation All Rights Reserved.
Ingress Controller
エラーページ表示用pod
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/LE3P1Q96J5.jpg)

4. デモ
1秒間に10HTTPリクエストを発生させたときの結果(ユーザー側_JMETERで大量アクセス)
緑 : 正常通信(HTTP 200)
赤 : ブロック通信(HTTP 502)
© NTT Communications Corporation All Rights Reserved.
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/8EDLX9GMJG.jpg)

4. デモ
1秒間に10HTTPリクエストを発生させたときの結果(ユーザー側_ブラウザでアクセス)
HTTP 502エラーが返却
© NTT Communications Corporation All Rights Reserved.
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/V7P2PZ3Q78.jpg)

4. デモ
1秒間に10HTTPリクエストを発生させたときのIngress Controller(サーバー側)のログ
service custom error response for code 502、
格納した502.htmlに関する情報が記録
© NTT Communications Corporation All Rights Reserved.
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/2JVD2W4PJQ.jpg)

本日お伝えしたかったこと
• Ingress-Nginx ControllerのRate-Limiting機能を用いて、Kubernetesクラスタ内のコンテ
ナをDoS攻撃から保護するための手順を紹介
• Rate-Limiting機能を用いて、ユーザ側とサーバ側(Ingress Controller)で必要以上のHTTP
リクエストがブロックされることの確認
© NTT Communications Corporation All Rights Reserved.
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/5EGYRD1QEL.jpg)

補足
DoS攻撃のような特定通信元からのアクセス制御ではなく、Ingress-Nginx Controllerで
システム全体のアクセス量を制御したい場合(サーキットブレーカ機能)、Global Rate
Limiting機能が必要である。しかし、2024/8/27に同機能の記述が公式サイトから消去された。
2024/8/27に消去
© NTT Communications Corporation All Rights Reserved.
Annotations - Ingress-Nginx Controller 32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/4JQMV1DW7P.jpg)

ご静聴ありがとうございました
© NTT Communications Corporation All Rights Reserved.


