Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
HAProxy-Keepalived-Sec-HighLoads — HAProxyとKeepalivedのトピックについて、ロードバランサーとクラスターに加えて、セキュリティ(弱いSSL/暗号使用(LOGJAM)(CVE-2015-4000)脆弱性対策)と高負荷への対策を取り扱います。 | Kitploit
ツール/GitHubGitHub/fatlan/haproxy-keepalived-sec-highloads
脆弱性スキャナー構成監査ネットワークセキュリティ
GitHubfatlan/haproxy-keepalived-sec-highloads

HAProxy-Keepalived-Sec-HighLoads

HAProxyとKeepalivedのトピックについて、ロードバランサーとクラスターに加えて、セキュリティ(弱いSSL/暗号使用(LOGJAM)(CVE-2015-4000)脆弱性対策)と高負荷への対策を取り扱います。

リポジトリを見る

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
623年前未レビュー

HAProxyとKeepalived (LoadBalancer+Cluster+Sec+HighLoads) インストールと設定

Crepe

HAProxyは、高可用性(high availability)を持つロードバランサー(load balancing)を備え、TCPおよびHTTPベースのアプリケーション向けにプロキシサーバサービスを提供するオープンソースソフトウェアです。

Keepalivedは、2台以上のサーバに対してIPフェイルオーバー(IP failover)機能を提供できるオープンソースソフトウェアです。Keepalivedはノード間でマルチキャスト通信技術を使用します。

今回の構成では、HAProxyのロードバランサとして、KeepalivedをIPの引き継ぎ(つまりHAProxy構成をクラスタ化するため)に使用します。

シナリオでは3台のサーバがあります。これらの3台のサーバにHAProxyをインストールしてロードバランサ化します。その後、Keepalivedサービスをインストールし、いずれかのサーバがダウンした場合にIPフェイルオーバーを行い、中断なく別のサーバに切り替えてロードバランササービスを継続できるようにします。

そのために4つのIPアドレスを使用します(IPは完全に仮想的なものです)

  1. サーバ : 10.10.5.13
  2. サーバ : 10.10.5.14
  3. サーバ : 10.10.5.15
  4. Keepalived Virtual IP : 10.10.5.5

次に、3台のサーバそれぞれに以下のようにHAProxyとKeepalivedサービスをインストールします。

root@kitploit:~
sudo add-apt-repository ppa:vbernat/haproxy-2.7 -y
sudo apt update
sudo apt install haproxy keepalived -y
sudo openssl dhparam -out /etc/haproxy/dhparams.pem 2048

NoT1 : サーバで「net.ipv4.ip_nonlocal_bind=1」が設定されている必要があります。設定されていない場合、HAProxyの構成で同じIPを同時に保持できず、バインドエラーが発生してサービスが動作しません。そのため、以下の手順を実行する必要があります。

まず、「vi /etc/sysctl.conf」ファイルを編集し、以下のパラメータを貼り付けて保存して終了します。

root@kitploit:~
net.ipv4.ip_nonlocal_bind=1

その後、以下のコマンドを実行します。

root@kitploit:~
sysctl -p

Not2: 443 SSLを使用する場合は、「/etc/ssl/private/」ディレクトリ内に「haproxy.pem」という名前でSSL証明書のBundle(.crt、.ca、*.key)が配置されている必要があります。

次に、例として以下のHAPoxy設定を見てみましょう。環境内の各HAProxyで同じ設定を使用します。

HAPoxy

そのために「/etc/haproxy/haproxy.cfg」ファイルを編集します。以下の設定は最低限HAv2をサポートしています。

root@kitploit:~
vi /etc/haproxy/haproxy.cfg

以下はデフォルト値です

root@kitploit:~
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon
#        maxconn 100000 #replaceable


        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        # An alternative list with additional directives can be obtained from
        #  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        #ssl-default-bind-options no-sslv3
	ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
	ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
	ssl-dh-param-file /etc/haproxy/dhparams.pem
	#tune.ssl.default-dh-param 2048


#	nbproc 1
#	nbthread 8

	tune.maxrewrite 16384
	tune.bufsize 32768

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
	option forwardfor
#        maxconn 1000000 #replaceable
        timeout connect 3000000
        timeout client  6000000
        timeout server  6000000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

HAProxyのダッシュボード設定部分(監視用のprometheus統合を追加)

root@kitploit:~
listen stats
        bind fatlan.com:8989
        mode http
        stats enable
        stats uri /stats
        option http-use-htx
        http-request use-service prometheus-exporter if { path /metrics }
        #stats hide-version
        stats realm HAProxy\ Statistics
        stats auth admin:admin

以下の設定では2つのブロックでACLが使用されています。最初のブロックでは、リンク内のどこかに「rest」という単語が含まれている場合にmiddleware-fatlan-backendブロックが機能し、2つ目では異なるドメイン要求(forum.fatlan.com)に対してbackend fatlan-forum-backendが機能し、それ以外のすべてのリクエストはfatlan-backend443ブロックで処理されます。ただし、他のポート転送は除きます。

80番ポートを443番ポートにリダイレクトする部分

root@kitploit:~
frontend fatlan80
        bind fatlan.com:80
        mode http
        redirect scheme https if !{ ssl_fc }

frontend fatlan443
        bind fatlan.com:443 ssl crt /etc/ssl/private/haproxy.pem ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
        option httplog
	option forwardfor
 	#http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
        #option forwardfor except 127.0.0.0/8
        option http-server-close
	http-request set-header X-Forwarded-Proto https
#        reqadd X-Forwarded-Proto:\ https #old config
        mode http
        default_backend fatlan-backend443

ACL設定例(proxypass)リンク内のどこかにrestという単語がある場合に転送

root@kitploit:~
        acl middleware-fatlan path_beg /rest
        use_backend middleware-fatlan-backend if middleware-fatlan

ACLで異なるフォーラムホストに転送

root@kitploit:~
    	acl host_fatlanforum hdr(host) -i forum.fatlan.com
    	use_backend fatlan-forum-backend if host_fatlanforum

デフォルトで転送される部分、443用に転送される部分

root@kitploit:~
backend fatlan-backend443
        mode http
        balance roundrobin
        stick store-request src
        stick-table type ip size 256k expire 30m
        option forwardfor
#        option httplog
        option httpchk HEAD /
	
        server frontend_01 10.10.37.12:8001 check port 8001 inter 3000 rise 2 fall 3
        server frontend_02 10.10.37.13:8001 check port 8001 inter 3000 rise 2 fall 3

ACLで受信したrestを転送する部分

root@kitploit:~
backend middleware-fatlan-backend
        mode http
        balance roundrobin
        stick store-request src
        stick-table type ip size 256k expire 30m
        option forwardfor
#        option httplog
        option httpchk OPTIONS /login HTTP/1.0
        http-check expect status 200
	http-request replace-path (.*)(?:rest\/)(.*) \1\2
#        reqrep ^([^\ :]*)\ /rest[/]?(.*) \1\ //\2  #old config 
	
        server middleware_01 10.10.37.34:3000 check port 4000 inter 12000 rise 3 fall 3
        server middleware_02 10.10.37.35:3000 check port 4000 inter 12000 rise 3 fall 3

ACLで受信したforumを転送する部分

root@kitploit:~
backend fatlan-forum-backend
        mode http
        option forwardfor
#        option httplog
        option httpchk HEAD /
	
        server forum_01 10.10.37.45:8080 check port 8080 inter 3000 rise 2 fall 3

外部の例は以下のように設定することもできます。

5000番ポートの例;

root@kitploit:~
frontend Panel5000
        bind fatlan.com:5000
#        option httplog
        option forwardfor except 127.0.0.0/8
        #option http-server-close
	http-request set-header X-Forwarded-Proto https
#        reqadd X-Forwarded-Proto:\ https #old config
        mode http
        default_backend panel-backend5000

5000番ポートを転送する部分

root@kitploit:~
backend panel-backend5000
        mode http
        balance roundrobin
        stick store-request src
        stick-table type ip size 256k expire 30m
        option forwardfor
#        option httplog
        option httpchk HEAD /
	
        server panel_01 10.10.37.43:5000 check port 5000 inter 12000 rise 3 fall 3
        server panel_02 10.10.37.44:5000 check port 5000 inter 12000 rise 3 fall 3

3306 MySQLの例;

root@kitploit:~
frontend fatlanmysql
        bind fatlan.com:3306
        mode tcp
        default_backend fatlanmysql-backend3306

3306番ポートを転送する部分

root@kitploit:~
backend fatlanmysql-backend3306
        mode tcp
	
        server mysql_01 10.10.37.60:3306 check
        server mysql_02 10.10.37.61:3306 check backup
        server mysql_03 10.10.37.62:3306 check backup

他のドメイン、サブドメイン、ポートへの転送も同じhaproxyで行えます。ただし、上記でサブドメインのACL転送についても説明しました。

egitim.fatlan.comサブドメイン用の4444番ポートの例;

root@kitploit:~
frontend egitim4444
        bind egitim.fatlan.com:4444
#        option httplog
        option forwardfor except 127.0.0.0/8
        #option http-server-close
	http-request set-header X-Forwarded-Proto https
#        reqadd X-Forwarded-Proto:\ https #old config
        mode http
        default_backend egitim-backend4444

egitim.fatlan.comサブドメインの4444番ポートを転送する部分

root@kitploit:~
backend egitim-backend4444
        mode http
        balance roundrobin
        stick store-request src
        stick-table type ip size 256k expire 30m
        option forwardfor
#        option httplog
        option httpchk HEAD /
	
        server egitim_01 10.10.37.77:4444 check port 4444 inter 12000 rise 3 fall 3
        server egitim_02 10.10.37.78:4444 check port 4444 inter 12000 rise 3 fall 3

上記でHAProxy設定の例について説明しました。私は独自の設定を行い、3台のサーバに同じ設定を貼り付けました。

Keepalived

次にKeepalivedの設定を行います。Keepalivedでは3台のサーバで部分的に異なるパラメータ設定があります。そのために「/etc/keepalived/keepalived.conf」ファイルを作成して設定します。なお、「priority」が高い方が優先されます。

NoT1: Keepalivedは他のピアとマルチキャスト通信を行い、この方法でマスターとバックアップが決定されます。

Tcpdumpを使用してピア間のマルチキャスト通信をキャプチャすることもできます(tcpdump -n "multicast")。

https://www.redhat.com/sysadmin/keepalived-basics

1. サーバ(HAProxy+Keepalived)

root@kitploit:~
vrrp_sync_group haproxy {
  group {
   VI_01
  }
}

vrrp_script haproxy_check_script {
  script "killall -0 haproxy"
  interval 2 # checking every 2 seconds (default: 5 seconds)
  fall 3 # require 3 failures for KO (default: 3)
  rise 6 # require 6 successes for OK (default: 6)
}

#Virtual interface
vrrp_instance VI_01 {
  state MASTER
  interface ens3
  ### 61 id'sini degistirin, diger peer'lerde de aynı olacak
  virtual_router_id 61
  ### 103 id'sini degistirin, diger peer'lerde azalan şekilde olacak
  priority 103
  
  authentication {
    auth_type PASS
    auth_pass 123456
  }

# Virtual ip address – floating ip
  virtual_ipaddress {
    10.10.5.5
  }
  
  track_script {
    haproxy_check_script
  }
}

2. サーバ(HAProxy+Keepalived) (違いのみ記述)

root@kitploit:~
  state BACKUP
  priority 102

3. サーバ(HAProxy+Keepalived) (違いのみ記述)

root@kitploit:~
  state BACKUP
  priority 101

NoT2: サーバ間でマルチキャスト通信が不可能な場合(例:KVM、クラウド環境など)は、ユニキャスト通信を使用して設定する必要があります。そうしないと動作しません。

Unicast設定: 以下のように設定の間に追加できます。

root@kitploit:~
###Her sunucu için diğer eşneliği(peer) ip olarak belirtilmelidir(yazılır)

...
#Virtual interface
...

  unicast_peer {
    <anaother_peer_ip>
    <anaother_peer_ip>
  }

# Virtual ip address – floating ip
...

設定は以上です。すべてのサーバでHAProxyが問題なく動作し、同時にkeepalivedサービスも動作している必要があります。サーバやサービスに障害が発生した場合でも、稼働中の別のサーバからロードバランササービスが継続されます。

高負荷

HAProxyとLinuxカーネルの高負荷向け設定

root@kitploit:~
sudo vi /etc/security/limits.conf


* soft no le 1000000
* hard no le 1000000
root soft no le 1000000
root hard no le 1000000
root@kitploit:~
sudo vi /etc/default/haproxy

ulimit 1000000
root@kitploit:~
sudo vi /lib/systemd/system/haproxy.service

LimitNOFILE=1000000
root@kitploit:~
sudo vi /etc/sysctl.conf

net.ipv4.ip_local_port_range=1024 65535
net.ipv4.tcp_max_syn_backlog = 100000
net.core.somaxconn = 100000
net.core.netdev_max_backlog = 100000
root@kitploit:~
sudo vi /etc/haproxy/haproxy.cfg

global
    nbproc 1
    nbthread 8
    tune.maxrewrite 16384
    tune.bufsize 32768
    maxconn 1000000
    tune.ssl.cachesize 1000000
defaults
    maxconn 1000000

その後再起動。すぐに再起動できない場合は

root@kitploit:~
sudo systemctl daemon-reload
sudo systemctl restart haproxy.service

セキュリティ

また、脆弱なSSL/暗号使用(LOGJAM)(CVE-2015-4000)のセキュリティテストには、以下のコマンドを使用するか、https://www.ssllabs.com/ssltest/ を利用できます。

root@kitploit:~
sudo nmap -sV --script ssl-enum-ciphers -p 443 fatlan.com

sudo nmap -p 443 --script ssl-cert fatlan.com

openssl s_client -connect fatlan.com:443

また、上記の設定でクライアントIPを取得するためのx-forwarded-for(option forwardfor)設定の確認、つまりIPをhaproxy側でキャプチャするためにtcpdumpを使用できます。

root@kitploit:~
sudo tcpdump -i ens3 -A -s 10240 | grep -v IP | egrep --line-buffered "..(GET |\.HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " |sed -r 's/..(GET |HTTP\/|POST |HEAD )/\n\n\1/g'

Crepe

ツールをダウンロード