Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
toxiproxy — :alarm_clock: :fire: 네트워크 및 시스템 상태를 시뮬레이션하여 카오스 및 복원력 테스트를 수행하는 TCP 프록시 | Kitploit
도구/GitHubGitHub/shopify/toxiproxy
General Purpose UtilitiesWeb Proxies & InterceptionChaos EngineeringChaos Engineering #5위
GitHubshopify/toxiproxy

toxiproxy

⏰ 🔥 네트워크 및 시스템 상태를 시뮬레이션하여 카오스 및 복원력 테스트를 수행하는 TCP 프록시

저장소 보기
12.5k51718010일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Toxiproxy

GitHub release Build Status

Toxiproxy는 네트워크 상태를 시뮬레이션하기 위한 프레임워크입니다. 이는 테스트, CI 및 개발 환경에서 작동하도록 특별히 만들어졌으며, 연결에 대한 결정론적 변조를 지원하는 동시에 무작위 카오스와 사용자 정의도 지원합니다. Toxiproxy는 애플리케이션에 단일 장애점이 없다는 것을 테스트로 증명하는 데 필요한 도구입니다. 우리는 2014년 10월부터 Shopify의 모든 개발 및 테스트 환경에서 이를 성공적으로 사용해 왔습니다. 자세한 내용은 복원력에 관한 [블로그 글][blog]을 참조하세요.

Toxiproxy 사용법은 두 부분으로 구성됩니다. Go로 작성된 TCP 프록시(이 저장소에 포함된 것)와 HTTP를 통해 프록시와 통신하는 클라이언트입니다. 애플리케이션이 모든 테스트 연결을 Toxiproxy를 통해 이루어지도록 구성한 다음 HTTP를 통해 연결 상태를 조작할 수 있습니다. 프로젝트를 설정하는 방법은 아래의 사용법을 참조하세요.

예를 들어, Ruby 클라이언트에서 MySQL 응답에 1000ms의 지연을 추가하려면:

Toxiproxy[:mysql_master].downstream(:latency, latency: 1000).apply do
  Shop.first # this takes at least 1s
end

모든 Redis 인스턴스를 종료하려면:

Toxiproxy[/redis/].down do
  Shop.first # this will throw an exception
end

이 README의 예제는 현재 Ruby로 작성되어 있지만, 다른 언어로 클라이언트를 만드는 것을 막는 것은 아무것도 없습니다(클라이언트 참조).

목차

  • Toxiproxy
    • 목차
    • 왜 또 다른 혼돈의 TCP 프록시인가?
    • 클라이언트
    • 예제
    • 사용법
      • 1. Toxiproxy 설치
        • Toxiproxy 1.x에서 업그레이드
      • 2. Toxiproxy 채우기
      • 3. Toxiproxy 사용하기
      • 4. 로깅
      • Toxics
        • latency
        • down
        • bandwidth
        • slow_close
        • timeout
        • reset_peer
        • slicer
        • limit_data
        • packet_loss
      • HTTP API
        • 프록시 필드:
        • Toxic 필드:
        • 엔드포인트
        • 프록시 채우기
      • CLI 예제
      • 메트릭
      • 자주 묻는 질문
      • 개발
      • 릴리스

왜 또 다른 혼돈의 TCP 프록시인가?

우리가 찾은 기존 도구들은 통합 및 단위 테스트에 필요한 종류의 동적 API를 제공하지 않았습니다. nc 같은 Linux 도구들은 크로스 플랫폼이 아니며 root 권한이 필요해서 테스트, 개발 및 CI 환경에서 문제가 됩니다.

클라이언트

  • toxiproxy-ruby
  • toxiproxy-go
  • toxiproxy-python
  • toxiproxy.net
  • toxiproxy-php-client
  • toxiproxy-node-client
  • toxiproxy-java
  • toxiproxy-haskell
  • toxiproxy-rust
  • toxiproxy-elixir

예제

Rails 애플리케이션을 사용한 예제를 살펴보겠습니다. Toxiproxy는 Ruby와 전혀 무관하며, 단지 우리의 첫 번째 사용 사례였을 뿐입니다. 전체 예제는 sirupsen/toxiproxy-rails-example에서 확인할 수 있습니다. 바로 시작하려면 사용법으로 이동하세요.

우리의 인기 블로그에서는 어떤 이유에서인지 게시물의 태그를 Redis에, 게시물 자체는 MySQL에 저장하고 있습니다. Redis set에서 태그를 조작하는 메서드를 포함하는 Post 클래스가 있을 수 있습니다:

class Post < ActiveRecord::Base
  # Return an Array of all the tags.
  def tags
    TagRedis.smembers(tag_key)
  end

  # Add a tag to the post.
  def add_tag(tag)
    TagRedis.sadd(tag_key, tag)
  end

  # Remove a tag from the post.
  def remove_tag(tag)
    TagRedis.srem(tag_key, tag)
  end

  # Return the key in Redis for the set of tags for the post.
  def tag_key
    "post:tags:#{self.id}"
  end
end

태그 데이터 저장소에 쓰는 동안(추가/제거) 오류가 발생해도 괜찮다고 결정했습니다. 하지만 태그 데이터 저장소가 다운된 경우에도 태그 없이 게시물을 볼 수 있어야 합니다. tags 메서드의 SMEMBERS Redis 호출 주변에서 Redis::CannotConnectError를 단순히 rescue하면 됩니다. Toxiproxy를 사용해 이를 테스트해 봅시다.

이미 Toxiproxy를 설치했고 우리 머신에서 실행 중이므로 2단계로 건너뛸 수 있습니다. 여기서 Toxiproxy에 Redis 태그에 대한 매핑이 있는지 확인해야 합니다. config/boot.rb에(연결이 이루어지기 전에) 다음을 추가합니다:

require 'toxiproxy'

Toxiproxy.populate([
  {
    name: "toxiproxy_test_redis_tags",
    listen: "127.0.0.1:22222",
    upstream: "127.0.0.1:6379"
  }
])

그런 다음 config/environments/test.rb에서 다음 줄을 추가하여 TagRedis가 Toxiproxy를 통해 Redis에 연결하는 Redis 클라이언트가 되도록 설정합니다:

TagRedis = Redis.new(port: 22222)

테스트 환경의 모든 호출은 이제 Toxiproxy를 통과합니다. 즉, 장애를 시뮬레이션하는 단위 테스트를 추가할 수 있습니다:

test "should return empty array when tag redis is down when listing tags" do
  @post.add_tag "mammals"

  # Take down all Redises in Toxiproxy
  Toxiproxy[/redis/].down do
    assert_equal [], @post.tags
  end
end

테스트가 Redis::CannotConnectError로 실패합니다. 완벽합니다! Toxiproxy가 클로저가 실행되는 동안 Redis를 성공적으로 다운시켰습니다. 이제 tags 메서드가 복원력을 갖도록 수정해 보겠습니다:

def tags
  TagRedis.smembers(tag_key)
rescue Redis::CannotConnectError
  []
end

테스트가 통과합니다! 이제 Redis가 다운되었을 때 태그를 가져오면 예외를 던지는 대신 빈 배열을 반환한다는 것을 증명하는 단위 테스트가 생겼습니다. 완전한 커버리지를 위해서는 Redis가 다운되었을 때 전체 블로그 게시물 페이지를 가져오는 과정을 감싸는 통합 테스트도 작성해야 합니다.

전체 예제 애플리케이션은 sirupsen/toxiproxy-rails-example에 있습니다.

사용법

프로젝트에서 Toxiproxy를 사용하도록 구성하는 것은 세 단계로 이루어집니다:

  1. Toxiproxy 설치
  2. Toxiproxy 채우기
  3. Toxiproxy 사용하기

1. Toxiproxy 설치

Linux

사용 중인 아키텍처에 맞는 최신 바이너리와 시스템 패키지는 Releases를 참고하세요.

Ubuntu

$ wget -O toxiproxy-2.13.0.deb https://github.com/Shopify/toxiproxy/releases/download/v2.13.0/toxiproxy_2.13.0_linux_amd64.deb
$ sudo dpkg -i toxiproxy-2.13.0.deb
$ sudo service toxiproxy start

OS X

Homebrew 사용 시:

$ brew tap shopify/shopify
$ brew install toxiproxy

또는 MacPorts 사용:

$ port install toxiproxy

Windows

Windows용 Toxiproxy는 https://github.com/Shopify/toxiproxy/releases/latest/download/toxiproxy-server-windows-amd64.exe 에서 다운로드할 수 있으며, 대응하는 CLI는 https://github.com/Shopify/toxiproxy/releases/latest/download/toxiproxy-cli-windows-amd64.exe 에서 받을 수 있습니다.

Docker

Toxiproxy는 Github 컨테이너 레지스트리에서 사용할 수 있습니다. 구버전 <= 2.1.4는 Docker Hub에서 사용할 수 있습니다.

$ docker pull ghcr.io/shopify/toxiproxy
$ docker run --rm -it ghcr.io/shopify/toxiproxy

다른 컨테이너가 아닌 호스트에서 Toxiproxy를 사용하는 경우 --net=host로 호스트 네트워킹을 활성화하세요. 이미지는 API를 0.0.0.0에 바인딩하므로, 호스트 네트워킹을 사용하면 모든 호스트 인터페이스에서 접근할 수 있습니다. 다른 머신이 호스트에 접근할 수 있는 경우 -e TOXIPROXY_AUTH_TOKEN=<token>을 전달하세요(HTTP API 참조).

$ docker run --rm --entrypoint="/toxiproxy-cli" -it ghcr.io/shopify/toxiproxy list

출처

Go가 설치되어 있다면 make 파일을 사용하여 소스에서 Toxiproxy를 빌드할 수 있습니다:

$ make build
$ ./dist/toxiproxy-server

Toxiproxy 1.x에서 업그레이드하기

Toxiproxy 2.0에서는 API에 여러 변경 사항이 적용되어 버전 1.x와 호환되지 않습니다. Toxiproxy 서버의 2.x 버전을 사용하려면 클라이언트 라이브러리가 동일한 버전을 지원하는지 확인해야 합니다. 실행 중인 Toxiproxy 버전은 /version 엔드포인트를 통해 확인할 수 있습니다.

클라이언트 라이브러리별 변경 사항은 해당 라이브러리의 문서를 참조하십시오. Toxiproxy 서버의 자세한 변경 사항은 CHANGELOG.md에서 확인할 수 있습니다.

2. Toxiproxy 채우기

애플리케이션이 부팅될 때, Toxiproxy가 어떤 엔드포인트를 어디로 프록시할지 알아야 합니다. 주요 매개변수는 이름, Toxiproxy가 수신할 주소, 그리고 업스트림의 주소입니다.

일부 클라이언트 라이브러리에는 이 작업을 위한 헬퍼가 있으며, 이는 본질적으로 목록에 있는 각 프록시가 생성되었는지 확인하는 것에 불과합니다. Ruby 클라이언트의 예시는 다음과 같습니다:

도구 다운로드