Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
frp — 빠른 리버스 프록시로, NAT 또는 방화벽 뒤에 있는 로컬 서버를 인터넷에 노출할 수 있도록 도와줍니다. | Kitploit
도구/GitHubGitHub/fatedier/frp
Network SecurityPenetration TestingUtilities & FrameworksRed Teaming
GitHubfatedier/frp

frp

빠른 리버스 프록시로, NAT 또는 방화벽 뒤에 있는 로컬 서버를 인터넷에 노출할 수 있도록 도와줍니다.

저장소 보기
108.2k15.1k19시간 58분 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

frp

Build Status GitHub release GitHub Releases Stats

README | 中文文档

스폰서

frp는 훌륭한 스폰서들의 지원으로 지속적인 개발이 가능한 오픈 소스 프로젝트입니다. 함께하고 싶다면 frp 개발 후원을 고려해 주세요.

골드 스폰서


전문 Go 개발자를 위해 제작된 완벽한 IDE


당신이 직접 제어하는 주권 클라우드
데이터 소유권과 프라이버시를 위해 구축된 오픈 소스, 자체 호스팅 퍼블릭 클라우드 대안

Recall.ai - 회의 녹화용 API

회의 녹화 API를 찾고 있다면 Recall.ai를 확인해 보세요.

Zoom, Google Meet, Microsoft Teams, 대면 회의 등을 녹화하는 API입니다.

frp란 무엇인가?

frp는 NAT 또는 방화벽 뒤에 있는 로컬 서버를 인터넷에 노출할 수 있게 해주는 빠른 역방향 프록시입니다. 현재 TCP와 UDP, 그리고 HTTP 및 HTTPS 프로토콜을 지원하며, 도메인 이름을 통해 내부 서비스로 요청을 전달할 수 있습니다.

frp는 또한 P2P 연결 모드를 제공합니다.

목차

  • 개발 현황
    • V2에 대하여
  • 아키텍처
  • 사용 예시
    • SSH를 통해 LAN 네트워크의 컴퓨터에 접근하기
    • 동일한 포트를 공유하는 여러 SSH 서비스
    • LAN에서 사용자 지정 도메인으로 내부 웹 서비스 접근하기
    • DNS 쿼리 요청 전달
    • Unix 도메인 소켓 전달
    • 간단한 HTTP 파일 서버 노출
    • 로컬 HTTP(S) 서비스에 HTTPS 활성화
    • 서비스를 비공개로 노출
    • P2P 모드
  • 기능
    • 구성 파일
    • 환경 변수 사용
    • 구성을 여러 파일로 분할
    • 서버 대시보드
    • 클라이언트 관리 UI
      • 동적 프록시 관리 (Store)
    • 모니터링
      • Prometheus
    • 클라이언트 인증
      • 토큰 인증
      • OIDC 인증
    • 암호화 및 압축
      • TLS
    • frpc 구성 핫-리로드
    • 클라이언트에서 프록시 상태 가져오기
    • 서버에서 특정 포트만 허용
    • 포트 재사용
    • 대역폭 제한
      • 프록시별
    • TCP 스트림 멀티플렉싱
    • KCP 프로토콜 지원
    • QUIC 프로토콜 지원
    • 연결 풀링
    • 로드 밸런싱
    • 서비스 상태 확인

개발 현황

frp는 현재 개발 중입니다. master 브랜치에서 최신 릴리스 버전을 사용해 보거나, dev 브랜치를 사용하여 현재 개발 중인 버전에 접근할 수 있습니다.

현재 버전 2를 작업 중이며 일부 코드 리팩토링과 개선을 시도하고 있습니다. 다만 버전 1과 호환되지 않을 것임을 유의하시기 바랍니다.

적절한 시점에 버전 0에서 버전 1로 전환할 예정이며, 큰 기능 요청보다는 버그 수정과 개선만 수용할 것입니다.

V2에 대하여

v2 버전의 복잡성과 난이도는 예상보다 훨씬 높습니다. 산발적인 시간에만 개발을 진행할 수 있고, 끊임없는 중단이 생산성을 크게 저하시킵니다. 이러한 상황에서 메이저 버전 개편을 진행할 충분한 시간이 생길 때까지 현재 버전을 계속 최적화하고 반복할 것입니다.

v2의 개념은 클라우드 네이티브 분야, 특히 K8s와 ServiceMesh에서의 수년간의 경험과 성찰에 기반합니다. 그 핵심은 envoy와 유사한 현대화된 4계층 및 7계층 프록시입니다. 이 프록시 자체는 확장성이 매우 높아 내트래버스(내트워크 관통) 기능을 구현할 수 있을 뿐만 아니라 다양한 다른 영역에도 적용할 수 있습니다. 이 확장성이 높은 코어를 기반으로 frp v1의 모든 기능을 구현하면서도 이전에는 달성할 수 없었거나 우아한 방식으로 구현하기 어려웠던 기능들도 해결하고자 합니다. 또한 효율적인 개발 및 반복 역량을 유지할 것입니다.

또한 frp 자체가 K8s를 기반으로 다양한 확장 기능을 제공할 수 있는 것처럼, 고도로 확장 가능한 시스템이자 플랫폼이 되기를 구상하고 있습니다. K8s에서는 CRD, 컨트롤러 모드, webhook, CSI, CNI와 같은 기능을 활용하여 기업 요구에 맞게 맞춤 개발할 수 있습니다. frp v1에서는 서버 플러그인 개념을 도입하여 기본적인 확장성을 구현했습니다. 그러나 이는 단순한 HTTP 프로토콜에 의존하며 사용자가 독립적인 프로세스를 시작하고 직접 관리해야 합니다. 이 방식은 유연하고 편리하다고 보기 어렵고, 실제 요구 사항은 매우 다양합니다. 소수의 인원이 유지 관리하는 비영리 오픈 소스 프로젝트가 모든 사람의 요구를 충족시킬 것이라고 기대하는 것은 비현실적입니다.

마지막으로, 구성 관리, 권한 검증, 인증서 관리, API 관리와 같은 모듈의 현재 설계가 충분히 현대적이지 않다는 점을 인정합니다. v1 버전에서 일부 최적화를 수행할 수는 있지만, 호환성을 유지하는 것은 상당한 노력이 필요한 어려운 문제로 남아 있습니다.

frp에 대한 지원에 진심으로 감사드립니다.

아키텍처

architecture

사용 예시

먼저 Release 페이지에서 운영 체제와 아키텍처에 맞는 최신 프로그램을 다운로드하세요.

다음으로, 공인 IP 주소가 있는 서버 A에 frps 바이너리와 서버 구성 파일을 배치하세요.

마지막으로, 공용 인터넷에서 직접 접근할 수 없는 LAN에 있는 서버 B에 frpc 바이너리와 클라이언트 구성 파일을 배치하세요.

일부 백신 프로그램은 frpc를 악성코드로 잘못 표시하여 삭제합니다. 이는 frp가 역방향 프록시를 생성할 수 있는 네트워킹 도구이기 때문입니다. 백신 프로그램은 방화벽 포트 제한을 우회할 수 있는 능력 때문에 역방향 프록시를 플래그 처리하는 경우가 있습니다. 백신을 사용 중이라면 우발적인 격리/삭제를 방지하기 위해 백신 설정에서 frpc를 허용 목록/제외 목록에 추가해야 할 수 있습니다. 자세한 내용은 issue 3637을 참조하세요.

SSH를 통해 LAN 네트워크의 컴퓨터에 접근하기

  1. 서버 A에서 frps.toml을 수정하여 frp 클라이언트가 연결할 bindPort를 설정합니다: ```toml

frps.toml

bindPort = 7000

root@kitploit:~
2. 서버 A에서 `frps`를 시작합니다:

`./frps -c ./frps.toml`

3. 서버 B에서 `frpc.toml`을 수정하고 `serverAddr` 필드를 frps 서버의 공용 IP 주소로 설정합니다:  ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

참고로 localPort(클라이언트에서 수신)와 remotePort(서버에서 노출)는 frp 시스템을 오가는 트래픽에 사용되며, serverPort는 frps와 frpc 간의 통신에 사용됩니다.

  1. 서버 B에서 frpc를 시작합니다:

./frpc -c ./frpc.toml

  1. 서버 A를 통해 다른 머신에서 SSH로 서버 B에 접근하려면(사용자 이름이 test라고 가정), 다음 명령어를 사용합니다:

ssh -oPort=6000 [email protected]

여러 SSH 서비스가 동일한 포트를 공유

이 예제는 tcpmux 유형의 프록시를 사용하여 동일한 포트를 통해 여러 SSH 서비스를 노출합니다. 마찬가지로, 클라이언트가 HTTP Connect 프록시 연결 방식을 지원하기만 하면 이 방식으로 포트 재사용을 달성할 수 있습니다.

  1. 공인 IP가 있는 머신에 frps를 배포하고 frps.toml 파일을 수정합니다. 다음은 간소화된 구성입니다: ```toml bindPort = 7000 tcpmuxHTTPConnectPort = 5002
root@kitploit:~
2. 내부 머신 A에 다음 구성으로 frpc를 배포합니다:  ```toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh1"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["machine-a.example.com"]
localIP = "127.0.0.1"
localPort = 22
  1. 내부 머신 B에 다음 구성을 사용하여 다른 frpc를 배포합니다: ```toml serverAddr = "x.x.x.x" serverPort = 7000

[[proxies]] name = "ssh2" type = "tcpmux" multiplexer = "httpconnect" customDomains = ["machine-b.example.com"] localIP = "127.0.0.1" localPort = 22

root@kitploit:~
4. SSH ProxyCommand를 사용하여 내부 머신 A에 접근하려면, 사용자 이름이 "test"라고 가정합니다:

`ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' [email protected]`

5. 내부 머신 B에 접근하려면, 도메인 이름만 다르며 사용자 이름이 "test"라고 가정합니다:

`ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' [email protected]`

### LAN에서 사용자 지정 도메인으로 내부 웹 서비스에 접근하기

때로는 NAT 네트워크 뒤에 있는 로컬 웹 서비스를 테스트 목적으로 다른 사람에게 노출해야 할 때가 있으며, 자체 도메인 이름을 사용하고 싶을 수 있습니다.

안타깝게도 도메인 이름을 로컬 IP로 해석할 수는 없습니다. 그러나 frp를 사용하여 HTTP(S) 서비스를 노출할 수 있습니다.

1. `frps.toml`을 수정하고 vhost의 HTTP 포트를 8080으로 설정합니다:  ```toml
# frps.toml
bindPort = 7000
vhostHTTPPort = 8080

HTTPS 프록시를 구성하려면 vhostHTTPSPort를 설정해야 합니다.

  1. frps를 시작합니다:

./frps -c ./frps.toml

  1. frpc.toml을 수정하고 serverAddr을 원격 frps 서버의 IP 주소로 설정합니다. 웹 서비스의 localPort를 지정합니다: ```toml

frpc.toml

serverAddr = "x.x.x.x" serverPort = 7000

[[proxies]] name = "web" type = "http" localPort = 80 customDomains = ["www.example.com"]

root@kitploit:~
4. `frpc`를 시작합니다:

`./frpc -c ./frpc.toml`

5. `www.example.com`의 A 레코드를 원격 frps 서버의 공인 IP 또는 원래 도메인을 가리키는 CNAME 레코드에 매핑합니다.

6. `http://www.example.com:8080` URL을 사용하여 로컬 웹 서비스에 접속합니다.

### DNS 쿼리 요청 전달

1. `frps.toml`을 수정합니다:  ```toml
# frps.toml
bindPort = 7000
  1. frps를 시작합니다:

./frps -c ./frps.toml

  1. frpc.toml을 수정하고 serverAddr을 원격 frps 서버의 IP 주소로 설정합니다. DNS 쿼리 요청을 Google Public DNS 서버 8.8.8.8:53으로 전달합니다: ```toml

frpc.toml

serverAddr = "x.x.x.x" serverPort = 7000

[[proxies]] name = "dns" type = "udp" localIP = "8.8.8.8" localPort = 53 remotePort = 6000

root@kitploit:~
4. frpc를 시작합니다:

`./frpc -c ./frpc.toml`

5. `dig` 명령을 사용하여 DNS 해석을 테스트합니다:

`dig @x.x.x.x -p 6000 www.google.com`

### Unix 도메인 소켓 포워딩

Unix 도메인 소켓(예: Docker 데몬 소켓)을 TCP로 노출합니다.

위와 같이 `frps`를 구성합니다.

1. 다음 구성으로 `frpc`를 시작합니다:  ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "unix_domain_socket"
type = "tcp"
remotePort = 6000
[proxies.plugin]
type = "unix_domain_socket"
unixPath = "/var/run/docker.sock"
  1. curl을 사용하여 Docker 버전을 가져와서 구성을 테스트합니다:

curl http://x.x.x.x:6000/version

간단한 HTTP 파일 서버 노출

LAN에 저장된 파일에 공용 인터넷에서 접근할 수 있도록 간단한 HTTP 파일 서버를 노출합니다.

위에서 설명한 대로 frps를 구성한 다음:

  1. 다음 구성으로 frpc를 시작합니다: ```toml

frpc.toml

serverAddr = "x.x.x.x" serverPort = 7000

[[proxies]] name = "test_static_file" type = "tcp" remotePort = 6000 [proxies.plugin] type = "static_file" localPath = "/tmp/files" stripPrefix = "static" httpUser = "abc" httpPassword = "abc"

root@kitploit:~
2. 브라우저에서 `http://x.x.x.x:6000/static/`에 접속하고 올바른 사용자 이름과 비밀번호를 입력하여 `frpc` 머신의 `/tmp/files`에 있는 파일을 확인합니다.

### 로컬 HTTP(S) 서비스에 HTTPS 활성화

플러그인을 `https2https`로 대체하고 `localAddr`을 HTTPS 엔드포인트로 지정할 수 있습니다.

1. 다음 구성으로 `frpc`를 시작합니다:  ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "test_https2http"
type = "https"
customDomains = ["test.example.com"]

[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
  1. https://test.example.com를 방문하세요.

서비스를 비공개로 노출하기

특정 서비스를 공용 네트워크에 직접 노출하는 것과 관련된 위험을 완화하기 위해, STCP(Secret TCP) 모드는 다른 클라이언트가 서비스에 접근할 때 사전 공유 키(preshared key)를 사용하도록 요구합니다.

frps를 위와 동일하게 구성하세요.

  1. 머신 B에서 다음 구성으로 frpc를 시작하세요. 이 예시는 SSH 서비스(포트 22)를 노출하기 위한 것이며, 사전 공유 키를 위한 secretKey 필드에 주의하고, 여기서 remotePort 필드는 제거되었습니다: ```toml

frpc.toml

serverAddr = "x.x.x.x" serverPort = 7000

[[proxies]] name = "secret_ssh" type = "stcp" secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22

root@kitploit:~
2. 다른 머신(일반적으로 머신 C)에서 다음 구성을 사용하여 보안 키(`secretKey` 필드)로 SSH 서비스에 접근하도록 또 다른 `frpc`를 시작합니다:  ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[visitors]]
name = "secret_ssh_visitor"
type = "stcp"
serverName = "secret_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000
  1. 머신 C에서 다음 명령을 사용하여 머신 B의 SSH에 연결합니다:

ssh -oPort=6000 127.0.0.1

P2P 모드

xtcp는 클라이언트 간에 대량의 데이터를 직접 전송하도록 설계되었습니다. 여기서 P2P는 실제 데이터 전송만을 의미하므로 frps 서버는 여전히 필요합니다.

모든 유형의 NAT 장치에서 작동하지 않을 수 있습니다. xtcp가 작동하지 않으면 stcp로 대체하는 것이 좋습니다.

  1. 머신 B에서 frpc를 시작하고 SSH 포트를 노출합니다. remotePort 필드가 제거되었습니다: ```toml

frpc.toml

serverAddr = "x.x.x.x" serverPort = 7000

set up a new stun server if the default one is not available.

natHoleStunServer = "xxx"

[[proxies]] name = "p2p_ssh" type = "xtcp" secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22

root@kitploit:~
2. P2P 모드를 사용하여 SSH에 연결하도록 구성된 다른 `frpc`(일반적으로 다른 머신 C에서)를 시작합니다:  ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
# set up a new stun server if the default one is not available.
# natHoleStunServer = "xxx"

[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
serverName = "p2p_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000
# when automatic tunnel persistence is required, set it to true
keepTunnelOpen = false
  1. 머신 C에서 다음 명령을 사용하여 머신 B의 SSH에 연결합니다:

ssh -oPort=6000 127.0.0.1

기능

구성 파일

v0.52.0부터 TOML, YAML, JSON 구성을 지원합니다. INI는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 새로운 기능은 TOML, YAML 또는 JSON에서만 사용할 수 있습니다. 이러한 새 기능을 사용하려는 사용자는 이에 맞게 구성 형식을 전환해야 합니다.

여기에 설명되지 않은 더 많은 기능을 확인하려면 전체 예제 구성 파일을 읽어보세요.

예제는 TOML 형식을 사용하지만 YAML 또는 JSON을 계속 사용할 수 있습니다.

이 구성 파일은 참고용입니다. 다양한 문제가 발생할 수 있으므로 이 구성을 직접 사용하여 프로그램을 실행하지 마세요.

frps(서버) 전체 구성 파일

frpc(클라이언트) 전체 구성 파일

환경 변수 사용

환경 변수는 Go의 표준 형식을 사용하여 구성 파일에서 참조할 수 있습니다:```toml

frpc.toml

serverAddr = "{{ .Envs.FRP_SERVER_ADDR }}" serverPort = 7000

[[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = {{ .Envs.FRP_SSH_REMOTE_PORT }}

root@kitploit:~
위 구성으로, 변수들을 `frpc` 프로그램에 다음과 같이 전달할 수 있습니다:```
export FRP_SERVER_ADDR=x.x.x.x
export FRP_SSH_REMOTE_PORT=6000
./frpc -c ./frpc.toml

frpc는 OS 환경 변수를 사용하여 구성 파일 템플릿을 렌더링합니다. 참조 앞에 .Envs를 접두사로 붙이는 것을 기억하세요.

구성을 여러 파일로 분할

여러 프록시 구성을 다른 파일로 분할하고 기본 파일에 포함할 수 있습니다.```toml

frpc.toml

serverAddr = "x.x.x.x" serverPort = 7000 includes = ["./confd/*.toml"]

root@kitploit:~
I need the input content to translate. Please provide the chunk of Markdown content you'd like me to translate from English to Korean.```toml
# ./confd/test.toml

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

서버 대시보드

Dashboard를 통해 frp의 상태와 프록시의 통계 정보를 확인하세요.

이 기능을 활성화하려면 대시보드용 포트를 구성하세요:```toml

The default value is 127.0.0.1. Change it to 0.0.0.0 when you want to access it from a public network.

webServer.addr = "0.0.0.0" webServer.port = 7500

dashboard's username and password are both optional

webServer.user = "admin" webServer.password = "admin"

root@kitploit:~
그런 다음 `http://[serverAddr]:7500`을(를) 방문하면 대시보드를 볼 수 있으며, 사용자 이름과 비밀번호는 모두 `admin`입니다.

또한, 도메인의 와일드카드 또는 일반 SSL 인증서를 사용하여 HTTPS 포트를 이용할 수 있습니다:```toml
webServer.port = 7500
# dashboard's username and password are both optional
webServer.user = "admin"
webServer.password = "admin"
webServer.tls.certFile = "server.crt"
webServer.tls.keyFile = "server.key"

그런 다음 https://[serverAddr]:7500을(를) 방문하면 사용자 이름과 비밀번호가 모두 admin인 보안 HTTPS 연결로 대시보드를 볼 수 있습니다.

dashboard

클라이언트 관리 UI

클라이언트 관리 UI는 frpc의 구성과 프록시를 확인하고 관리하는 데 도움을 줍니다.

이 기능을 활성화하려면 관리 UI용 주소를 구성하세요:```toml webServer.addr = "127.0.0.1" webServer.port = 7400 webServer.user = "admin" webServer.password = "admin"

root@kitploit:~
그런 다음 `http://127.0.0.1:7400`을 방문하면 관리자 UI를 볼 수 있으며, 사용자 이름과 비밀번호는 모두 `admin`입니다.

#### 동적 프록시 관리 (Store)

Web UI 또는 API를 통해 frpc를 재시작하지 않고도 런타임 중에 프록시와 방문자를 동적으로 생성, 업데이트, 삭제할 수 있습니다.

이 기능을 활성화하려면 `store.path`를 구성하여 설정을 영속화할 파일을 지정하세요:```toml
[store]
path = "./db.json"

Store를 통해 관리되는 프록시와 방문자는 디스크에 저장되며 frpc 재시작 시 자동으로 복원됩니다. 이들은 구성 파일에 정의된 프록시와 함께 작동하며, 이름이 충돌할 경우 Store 항목이 우선합니다.

Monitor

웹 서버가 활성화되면 frps는 모니터 데이터를 7일 동안 캐시에 저장합니다. 프로세스 재시작 후에는 지워집니다.

Prometheus도 지원됩니다.

Prometheus

먼저 대시보드를 활성화한 다음 frps.toml에서 enablePrometheus = true를 구성합니다.

http://{dashboard_addr}/metrics에서 prometheus 모니터 데이터를 제공합니다.

클라이언트 인증

frpc를 frps에 인증하는 방법에는 2가지가 있습니다.

frpc.toml과 frps.toml에서 auth.method를 구성하여 사용할 방법을 결정할 수 있으며, 기본값은 token입니다.

auth.additionalScopes = ["HeartBeats"]를 구성하면 frpc와 frps 간의 모든 하트비트에 구성된 인증 방법을 사용하여 인증을 추가하고 검증합니다.

auth.additionalScopes = ["NewWorkConns"]를 구성하면 frpc와 frps 간의 모든 새 작업 연결에 대해 동일한 작업을 수행합니다.

토큰 인증

frpc.toml과 frps.toml에서 auth.method = "token"을 지정하면 토큰 기반 인증이 사용됩니다.

frpc가 frps 검증을 통과하려면 frps.toml과 frpc.toml에 동일한 auth.token을 지정해야 합니다.

토큰 소스

frp는 tokenSource 구성을 사용하여 외부 소스에서 인증 토큰을 읽는 것을 지원합니다. 현재 파일 기반 토큰 소스가 지원됩니다.

파일 기반 토큰 소스:```toml

frpc.toml

auth.method = "token" auth.tokenSource.type = "file" auth.tokenSource.file.path = "/path/to/token/file"

root@kitploit:~
토큰은 시작 시 지정된 파일에서 읽힙니다. 이는 토큰이 외부 시스템에서 관리되거나 보안상의 이유로 구성 파일과 분리되어 유지되어야 하는 시나리오에서 유용합니다.

#### OIDC 인증

`frpc.toml` 및 `frps.toml`에서 `auth.method = "oidc"`를 지정하면 OIDC 기반 인증이 사용됩니다.

OIDC는 OpenID Connect를 의미하며, 사용되는 흐름은 [클라이언트 자격 증명 부여](https://tools.ietf.org/html/rfc6749#section-4.4)라고 합니다.

이 인증 유형을 사용하려면 `frpc.toml` 및 `frps.toml`을 다음과 같이 구성하십시오:```toml
# frps.toml
auth.method = "oidc"
auth.oidc.issuer = "https://example-oidc-issuer.com/"
auth.oidc.audience = "https://oidc-audience.com/.default"

(no output)```toml

frpc.toml

auth.method = "oidc" auth.oidc.clientID = "98692467-37de-409a-9fac-bb2585826f18" # Replace with OIDC client ID auth.oidc.clientSecret = "oidc_secret" auth.oidc.audience = "https://oidc-audience.com/.default" auth.oidc.tokenEndpointURL = "https://example-oidc-endpoint.com/oauth2/v2.0/token"

root@kitploit:~
### 암호화 및 압축

이 기능들은 기본적으로 꺼져 있습니다. 암호화 및/또는 압축을 켤 수 있습니다:```toml
# frpc.toml

[[proxies]]
name = "ssh"
type = "tcp"
localPort = 22
remotePort = 6000
transport.useEncryption = true
transport.useCompression = true

TLS

v0.50.0부터 transport.tls.enable 및 transport.tls.disableCustomTLSFirstByte의 기본값이 true로 변경되어, TLS가 기본적으로 활성화됩니다.

포트 멀티플렉싱을 위해 frp는 TLS 연결을 다이얼할 때 첫 번째 바이트 0x17을 전송합니다. 이는 transport.tls.disableCustomTLSFirstByte를 false로 설정한 경우에만 적용됩니다.

frps가 TLS 연결만 수락하도록 강제하려면 frps.toml에서 transport.tls.force = true를 설정하세요. 이는 선택 사항입니다.

frpc TLS 설정:```toml transport.tls.enable = true transport.tls.certFile = "certificate.crt" transport.tls.keyFile = "certificate.key" transport.tls.trustedCaFile = "ca.crt"

root@kitploit:~
**`frps` TLS 설정:**```toml
transport.tls.force = true
transport.tls.certFile = "certificate.crt"
transport.tls.keyFile = "certificate.key"
transport.tls.trustedCaFile = "ca.crt"

루트 CA 인증서와 최소 하나의 SSL/TLS 인증서가 필요합니다. 자체 서명 또는 일반 인증서(예: Let's Encrypt 또는 다른 SSL/TLS 인증서 제공업체)일 수 있습니다.

frp를 호스트 이름이 아닌 IP 주소로 사용하는 경우, SSL/TLS 인증서 생성 시 Subject Alternative Name (SAN) 영역에 적절한 IP 주소를 설정해야 합니다.

예시:

  • openssl 구성 파일을 준비합니다. Linux 시스템에서는 /etc/pki/tls/openssl.cnf, MacOS에서는 /System/Library/OpenSSL/openssl.cnf에 있으며, cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf와 같이 현재 경로로 복사할 수 있습니다. 없는 경우 직접 만들 수도 있습니다. 예를 들면:``` cat > my-openssl.cnf << EOF [ ca ] default_ca = CA_default [ CA_default ] x509_extensions = usr_cert [ req ] default_bits = 2048 default_md = sha256 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = utf8only [ req_distinguished_name ] [ req_attributes ] [ usr_cert ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:true EOF
root@kitploit:~
* CA 인증서 빌드:```
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
  • frps 인증서 빌드:``` openssl genrsa -out server.key 2048

openssl req -new -sha256 -key server.key
-subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com"
-reqexts SAN
-config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com"))
-out server.csr

openssl x509 -req -days 365 -sha256
-in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial
-extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com")
-out server.crt

root@kitploit:~
* frpc 인증서 빌드:```
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:client.com,DNS:example.client.com")) \
    -out client.csr

openssl x509 -req -days 365 -sha256 \
    -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
	-extfile <(printf "subjectAltName=DNS:client.com,DNS:example.client.com") \
	-out client.crt

frpc 구성 핫 리로드

HTTP API를 활성화하려면 webServer 필드가 필요합니다:```toml

frpc.toml

webServer.addr = "127.0.0.1" webServer.port = 7400

root@kitploit:~
그런 다음 `frpc reload -c ./frpc.toml` 명령을 실행하고 약 10초 정도 기다리면 `frpc`가 프록시를 생성, 업데이트 또는 제거합니다.

**전역 클라이언트 매개변수는 'start'를 제외하고는 수정되지 않습니다.**

`start`는 모든 소스(구성 파일/include/store)가 병합된 후에 평가되는 전역 허용 목록입니다.
`start`가 비어 있지 않으면 여기에 나열되지 않은 모든 프록시 또는 방문자는 시작되지 않으며, 여기에는
Store API를 통해 생성된 항목도 포함됩니다.

`start`는 주로 호환성을 위해 유지되며, 일반적으로 새 구성에는 권장되지 않습니다.
프록시/방문자별 `enabled`를 선호하고, 이 전역 허용 목록 동작을 명시적으로 원하지 않는 한 `start`를 비워 두세요.

리로드 전에 `frpc verify -c ./frpc.toml` 명령을 실행하여 구성 오류가 있는지 확인할 수 있습니다.

### 클라이언트에서 프록시 상태 가져오기

`frpc status -c ./frpc.toml`을 사용하여 모든 프록시의 상태를 가져옵니다. HTTP API를 활성화하려면 `webServer` 필드가 필요합니다.

### 서버에서 특정 포트만 허용하기

`frps.toml`의 `allowPorts`는 포트 남용을 방지하는 데 사용됩니다:```toml
# frps.toml
allowPorts = [
  { start = 2000, end = 3000 },
  { single = 3001 },
  { single = 3003 },
  { start = 4000, end = 50000 }
]

포트 재사용

frps의 vhostHTTPPort와 vhostHTTPSPort는 bindPort와 동일한 포트를 사용할 수 있습니다. frps는 연결의 프로토콜을 감지하여 그에 따라 처리합니다.

주의해야 할 점은 vhostHTTPSPort와 bindPort를 동일한 포트로 구성하려면 먼저 transport.tls.disableCustomTLSFirstByte를 false로 설정해야 한다는 것입니다.

향후에는 서로 다른 프로토콜을 사용하는 여러 프록시가 동일한 원격 포트에 바인딩되도록 허용하려고 합니다.

대역폭 제한

각 프록시별```toml

frpc.toml

[[proxies]] name = "ssh" type = "tcp" localPort = 22 remotePort = 6000 transport.bandwidthLimit = "1MB"

root@kitploit:~
각 프록시의 `configure`에서 `transport.bandwidthLimit`을 설정하여 이 기능을 활성화할 수 있습니다. 지원되는 단위는 `MB`와 `KB`입니다.

`transport.bandwidthLimitMode`를 `client` 또는 `server`로 설정하여 클라이언트 또는 서버 측의 대역폭을 제한할 수 있습니다. 기본값은 `client`입니다.

### TCP 스트림 멀티플렉싱

frp는 v0.10.0부터 HTTP2 멀티플렉싱과 같은 TCP 스트림 멀티플렉싱을 지원합니다. 이 경우 동일한 frpc에 대한 모든 논리적 연결이 동일한 TCP 연결로 멀티플렉싱됩니다.

`frps.toml`과 `frpc.toml`을 수정하여 이 기능을 비활성화할 수 있습니다:```toml
# frps.toml and frpc.toml, must be same
transport.tcpMux = false

KCP 프로토콜 지원

KCP는 빠르고 안정적인 프로토콜로, TCP보다 10%~20% 더 많은 대역폭을 소모하는 대신 평균 지연 시간을 30%~40% 줄이고 최대 지연 시간을 3배까지 감소시키는 전송 효과를 달성할 수 있습니다.

KCP 모드는 기본 전송 계층으로 UDP를 사용합니다. frp에서 KCP를 사용하는 방법:

  1. frps에서 KCP 활성화: ```toml

frps.toml

bindPort = 7000

Specify a UDP port for KCP.

kcpBindPort = 7000

root@kitploit:~
`kcpBindPort` 번호는 `bindPort`와 동일한 번호일 수 있습니다. `bindPort` 필드는 TCP 포트를 지정하기 때문입니다.

2. KCP를 사용하여 frps에 연결하도록 `frpc.toml`을 구성합니다:  ```toml
# frpc.toml
serverAddr = "x.x.x.x"
# Same as the 'kcpBindPort' in frps.toml
serverPort = 7000
transport.protocol = "kcp"

QUIC 프로토콜 지원

QUIC는 UDP 위에 구축된 새로운 다중화 전송 프로토콜입니다.

frp에서 QUIC 사용하기:

  1. frps에서 QUIC 활성화: ```toml

frps.toml

bindPort = 7000

Specify a UDP port for QUIC.

quicBindPort = 7000

root@kitploit:~
`quicBindPort` 번호는 `bindPort`와 동일한 번호일 수 있습니다. `bindPort` 필드는 TCP 포트를 지정하기 때문입니다.

2. `frpc.toml`을 구성하여 QUIC를 사용해 frps에 연결합니다:  ```toml
# frpc.toml
serverAddr = "x.x.x.x"
# Same as the 'quicBindPort' in frps.toml
serverPort = 7000
transport.protocol = "quic"

연결 풀링

기본적으로 frps는 사용자 요청이 있을 때 백엔드 서비스에 대한 새 frpc 연결을 생성합니다. 연결 풀링을 사용하면 frps가 사전 설정된 일정 수의 연결을 유지하여 연결을 설정하는 데 필요한 시간을 줄입니다.

이 기능은 다수의 짧은 연결에 적합합니다.

  1. frps.toml에서 각 프록시가 사용할 수 있는 풀 수의 제한을 구성합니다: ```toml

frps.toml

transport.maxPoolCount = 5

root@kitploit:~
2. 연결 풀을 활성화하고 수를 지정합니다:  ```toml
# frpc.toml
transport.poolCount = 1

로드 밸런싱

로드 밸런싱은 group에 의해 지원됩니다.

이 기능은 현재 tcp, http, tcpmux 유형에서만 사용할 수 있습니다.```toml

frpc.toml

[[proxies]] name = "test1" type = "tcp" localPort = 8080 remotePort = 80 loadBalancer.group = "web" loadBalancer.groupKey = "123"

[[proxies]] name = "test2" type = "tcp" localPort = 8081 remotePort = 80 loadBalancer.group = "web" loadBalancer.groupKey = "123"

root@kitploit:~
`loadBalancer.groupKey`는 인증에 사용됩니다.

포트 80으로의 연결은 동일한 그룹의 프록시에 무작위로 분산됩니다.

`tcp` 유형의 경우, 동일한 그룹의 `remotePort`는 동일해야 합니다.

`http` 유형의 경우, `customDomains`, `subdomain`, `locations`는 동일해야 합니다.

### 서비스 상태 확인

상태 확인 기능은 로드 밸런싱과 함께 고가용성을 달성하는 데 도움이 됩니다.

`healthCheck.type = "tcp"` 또는 `healthCheck.type = "http"`를 추가하여 상태 확인을 활성화하세요.

상태 확인 유형이 **tcp**인 경우, 서비스 포트가 핑(TCPing)됩니다:```toml
# frpc.toml

[[proxies]]
name = "test1"
type = "tcp"
localPort = 22
remotePort = 6000
# Enable TCP health check
healthCheck.type = "tcp"
# TCPing timeout seconds
healthCheck.timeoutSeconds = 3
# If health check failed 3 times in a row, the proxy will be removed from frps
healthCheck.maxFailed = 3
# A health check every 10 seconds
healthCheck.intervalSeconds = 10

건강 검사 유형이 http인 경우, 서비스에 HTTP 요청이 전송되며 HTTP 2xx OK 응답이 예상됩니다:```toml

frpc.toml

[[proxies]] name = "web" type = "http" localIP = "127.0.0.1" localPort = 80 customDomains = ["test.example.com"]

Enable HTTP health check

healthCheck.type = "http"

frpc will send a GET request to '/status'

and expect an HTTP 2xx OK response

healthCheck.path = "/status" healthCheck.timeoutSeconds = 3 healthCheck.maxFailed = 3 healthCheck.intervalSeconds = 10

root@kitploit:~
### HTTP Host 헤더 재작성

기본적으로 frp는 터널링된 HTTP 요청을 전혀 수정하지 않으며, 이는 바이트 단위의 복사본이기 때문입니다.

하지만 웹 서버와 HTTP 요청에 관해 말하자면, 웹 서버가 접근할 웹사이트를 결정하기 위해 `Host` HTTP 헤더에 의존할 수 있습니다. frp는 `hostHeaderRewrite` 필드를 사용하여 HTTP 요청을 전달할 때 `Host` 헤더를 재작성할 수 있습니다:```toml
# frpc.toml

[[proxies]]
name = "web"
type = "http"
localPort = 80
customDomains = ["test.example.com"]
hostHeaderRewrite = "dev.example.com"

브라우저의 요청에는 Host: test.example.com이 포함되어 있을 수 있지만, 실제 웹 서버에 도달할 때 HTTP 요청의 Host 헤더는 Host: dev.example.com으로 다시 작성됩니다.

기타 HTTP 헤더 설정

Host와 유사하게, 프록시 유형 http를 사용하여 다른 HTTP 요청 및 응답 헤더도 재정의할 수 있습니다.```toml

frpc.toml

[[proxies]] name = "web" type = "http" localPort = 80 customDomains = ["test.example.com"] hostHeaderRewrite = "dev.example.com" requestHeaders.set.x-from-where = "frp" responseHeaders.set.foo = "bar"

root@kitploit:~
이 예시에서는 HTTP 요청에 `x-from-where: frp` 헤더를, HTTP 응답에 `foo: bar` 헤더를 설정합니다.

### 실제 IP 가져오기

#### HTTP X-Forwarded-For

이 기능은 `http` 프록시 또는 `https2http` 및 `https2https` 플러그인이 활성화된 프록시를 위한 것입니다.

HTTP 요청 헤더 `X-Forwarded-For`에서 사용자의 실제 IP를 가져올 수 있습니다.

#### Proxy Protocol

frp는 Proxy Protocol을 지원하여 사용자의 실제 IP를 로컬 서비스로 전송합니다.

다음은 https 서비스에 대한 예시입니다:```toml
# frpc.toml

[[proxies]]
name = "web"
type = "https"
localPort = 443
customDomains = ["test.example.com"]

# now v1 and v2 are supported
transport.proxyProtocolVersion = "v2"

nginx에서 Proxy Protocol 지원을 활성화하여 사용자의 실제 IP를 HTTP 헤더 X-Real-IP에 노출시킬 수 있으며, 웹 서비스에서 X-Real-IP 헤더를 읽어 실제 IP를 확인할 수 있습니다.

웹 서비스에 HTTP Basic Auth(비밀번호) 요구

터널 URL을 추측할 수 있는 사람은 비밀번호로 보호하지 않는 한 로컬 웹 서버에 접근할 수 있습니다.

이 기능은 frpc의 설정 파일에 지정된 사용자 이름과 비밀번호로 모든 요청에 HTTP Basic Auth를 적용합니다.

프록시 유형이 http일 때만 활성화할 수 있습니다.```toml

frpc.toml

[[proxies]] name = "web" type = "http" localPort = 80 customDomains = ["test.example.com"] httpUser = "abc" httpPassword = "abc"

root@kitploit:~
브라우저에서 `http://test.example.com`을 방문하면 사용자 이름과 비밀번호를 입력하라는 메시지가 표시됩니다.

### 사용자 지정 하위 도메인 이름

많은 사람들이 하나의 frps 서버를 공유할 때 http 및 https 유형에 대해 `subdomain` 구성을 사용하는 것이 편리합니다.```toml
# frps.toml
subDomainHost = "frps.com"

*.frps.com을 frps 서버의 IP로 해석합니다. 이를 일반적으로 와일드카드 DNS 레코드라고 합니다.```toml

frpc.toml

[[proxies]] name = "web" type = "http" localPort = 80 subdomain = "test"

root@kitploit:~
이제 `test.frps.com`에서 웹 서비스를 방문할 수 있습니다.

`subdomainHost`가 비어 있지 않으면 `customDomains`는 `subdomainHost`의 서브도메인이 아니어야 합니다.

### URL 라우팅

frp는 URL 라우팅을 통해 HTTP 요청을 서로 다른 백엔드 웹 서비스로 전달하는 것을 지원합니다.

`locations`는 라우팅에 사용되는 URL의 접두사를 지정합니다. frps는 먼저 리터럴 문자열로 주어진 가장 구체적인 접두사 위치를 목록 순서와 관계없이 검색합니다.```toml
# frpc.toml

[[proxies]]
name = "web01"
type = "http"
localPort = 80
customDomains = ["web.example.com"]
locations = ["/"]

[[proxies]]
name = "web02"
type = "http"
localPort = 81
customDomains = ["web.example.com"]
locations = ["/news", "/about"]

HTTP 요청 중 URL 접두사가 /news 또는 /about인 경우 web02로 전달되고, 그 외의 요청은 web01로 전달됩니다.

TCP 포트 멀티플렉싱

frp는 vhostHTTPPort 및 vhostHTTPSPort와 유사하게, frps의 단일 포트에서 서로 다른 프록시로 전달되는 TCP 소켓을 수신하는 것을 지원합니다.

현재 지원되는 유일한 TCP 포트 멀티플렉싱 방식은 httpconnect - HTTP CONNECT 터널입니다.

frps에서 tcpmuxHTTPConnectPort를 0이 아닌 값으로 설정하면, frps는 이 포트에서 HTTP CONNECT 요청을 수신합니다.

HTTP CONNECT 요청의 호스트는 frps에서 프록시를 매칭하는 데 사용됩니다. multiplexer = "httpconnect"로 설정된 경우, tcpmux 프록시 아래에서 customDomains 및/또는 subdomain을 구성하여 frpc에서 프록시 호스트를 설정할 수 있습니다.

예를 들어:```toml

frps.toml

bindPort = 7000 tcpmuxHTTPConnectPort = 1337

root@kitploit:~
(번역할 콘텐츠가 제공되지 않았습니다. 마크다운 텍스트를 입력해 주세요.)```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "proxy1"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["test1"]
localPort = 80

[[proxies]]
name = "proxy2"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["test2"]
localPort = 8080

위 구성에서 - frps는 다음과 같은 HTTP CONNECT 헤더와 함께 포트 1337에서 연결할 수 있습니다:``` CONNECT test1 HTTP/1.1\r\n\r\n

root@kitploit:~
and the connection will be routed to `proxy1`.

### PROXY를 통한 frps 연결

frpc는 OS 환경 변수 `HTTP_PROXY`를 설정하거나 frpc.toml 파일에 `transport.proxyURL`이 설정된 경우 프록시를 통해 frps에 연결할 수 있습니다.

이는 프로토콜이 tcp일 때만 작동합니다.```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
transport.proxyURL = "http://user:[email protected]:8080"

포트 범위 매핑

v0.56.0에서 추가됨

Go 템플릿의 범위 구문을 내장된 parseNumberRangePair 함수와 결합하여 포트 범위 매핑을 구현할 수 있습니다.

다음 예제를 실행하면 test-6000, test-6001 ... test-6007이라는 이름의 프록시 8개가 생성되며, 각각 원격 포트를 로컬 포트에 매핑합니다.``` {{- range $_, $v := parseNumberRangePair "6000-6006,6007" "6000-6006,6007" }} [[proxies]] name = "tcp-{{ $v.First }}" type = "tcp" localPort = {{ $v.First }} remotePort = {{ $v.Second }} {{- end }}

root@kitploit:~
### 클라이언트 플러그인

frpc는 기본적으로 요청을 로컬 TCP 또는 UDP 포트로만 전달합니다.

플러그인은 다양한 기능을 제공하는 데 사용됩니다. `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https`와 같은 내장 플러그인이 있으며 [예제 사용법](#example-usage)을 참조할 수 있습니다.

**http_proxy** 플러그인 사용:```toml
# frpc.toml

[[proxies]]
name = "http_proxy"
type = "tcp"
remotePort = 6000
[proxies.plugin]
type = "http_proxy"
httpUser = "abc"
httpPassword = "abc"

httpUser 및 httpPassword는 http_proxy 플러그인에서 사용되는 구성 매개변수입니다.

서버 관리 플러그인

문서를 읽어보세요.

gofrp/plugin에서 더 많은 플러그인을 찾아보세요.

SSH 터널 게이트웨이

v0.53.0에서 추가됨

frp는 frps 측에서 SSH 포트를 수신하고, frpc에 의존하지 않고 SSH -R 프로토콜을 통해 TCP 프로토콜 프록시를 달성하는 것을 지원합니다.```toml

frps.toml

sshTunnelGateway.bindPort = 2200

root@kitploit:~
`./frps -c frps.toml` 명령을 실행하면 현재 작업 디렉터리에 `.autogen_ssh_key`라는 개인 키 파일이 자동으로 생성됩니다. 이 생성된 개인 키 파일은 frps의 SSH 서버에서 사용됩니다.

명령을 실행하면```bash
ssh -R :80:127.0.0.1:8080 v0@{frp address} -p 2200 tcp --proxy_name "test-tcp" --remote_port 9090

frps에 로컬 8080 서비스를 9090 포트로 전달하는 프록시를 설정합니다.```bash frp (via SSH) (Ctrl+C to quit)

User: ProxyName: test-tcp Type: tcp RemoteAddress: :9090

root@kitploit:~
이것은 다음과 동일합니다:```bash
frpc tcp --proxy_name "test-tcp" --local_ip 127.0.0.1 --local_port 8080 --remote_port 9090

자세한 내용은 이 문서를 참조하세요.

가상 네트워크 (VirtualNet)

v0.62.0에서 추가된 알파 기능

VirtualNet 기능은 frp가 TUN 인터페이스를 통해 클라이언트와 방문자 간의 가상 네트워크 연결을 생성하고 관리할 수 있게 해줍니다. 이를 통해 머신 간 IP 수준의 라우팅이 가능해져, frp가 단순한 포트 포워딩을 넘어 완전한 네트워크 연결을 지원하도록 확장됩니다.

구성 및 사용에 대한 자세한 내용은 VirtualNet 문서를 참조하세요.

기능 게이트 (Feature Gates)

frp는 실험적 기능을 활성화하거나 비활성화하기 위한 기능 게이트를 지원합니다. 이를 통해 사용자는 기능이 안정적으로 간주되기 전에 새 기능을 시험해 볼 수 있습니다.

사용 가능한 기능 게이트

이름단계기본값설명
VirtualNetALPHAfalsefrp의 가상 네트워크 기능

기능 게이트 활성화

실험적 기능을 활성화하려면 구성에 기능 게이트를 추가하세요:```toml featureGates = { VirtualNet = true }

root@kitploit:~
### 기능 수명 주기

기능은 일반적으로 세 단계를 거칩니다:
1. **ALPHA**: 기본적으로 비활성화되어 있으며, 불안정할 수 있습니다
2. **BETA**: 기본적으로 활성화될 수 있으며, 더 안정적이지만 여전히 발전 중입니다
3. **GA (일반 제공)**: 기본적으로 활성화되어 있으며, 프로덕션 사용에 적합합니다

## 관련 프로젝트

* [gofrp/plugin](https://github.com/gofrp/plugin) - frp 확장 메커니즘을 기반으로 구현된 다양한 플러그인을 포함하는 frp 플러그인 저장소로, 다양한 시나리오의 맞춤형 요구를 충족합니다.
* [gofrp/tiny-frpc](https://github.com/gofrp/tiny-frpc) - ssh 프로토콜을 사용하여 구현된 경량 버전의 frp 클라이언트(최소 약 3.5MB)로, 가장 일반적으로 사용되는 기능 중 일부를 지원하며 리소스가 제한된 장치에 적합합니다.

## 기여하기

참여에 관심이 있으신가요? 저희가 도와드리겠습니다!

* [이슈 목록](https://github.com/fatedier/frp/issues)을 살펴보시고 **dev 브랜치**로 Pull Request를 보내는 것을 고려해 주세요.
* 새 기능을 추가하려면 먼저 이슈를 생성하여 새 기능과 구현 방식을 설명해 주세요. 제안이 승인되면 새 기능의 구현을 만들어 Pull Request로 제출해 주세요.
* 제 영어 실력이 부족한 점 양해 부탁드립니다. 이 문서의 개선 사항은 오타 수정을 포함하여 언제든 환영합니다.
* 좋은 아이디어가 있으시면 [email protected]으로 이메일을 보내 주세요.

**참고: [이슈](https://github.com/fatedier/frp/issues)에 의견을 남겨 주시는 것을 선호합니다. 같은 질문을 가진 다른 사람들이 빠르게 검색할 수 있고, 반복해서 답변할 필요가 없기 때문입니다.**

## 후원

frp가 많은 도움이 되셨다면, 다음과 같은 방법으로 저희를 지원해 주실 수 있습니다:

### GitHub Sponsors

[Github Sponsors](https://github.com/sponsors/fatedier)를 통해 지원해 주세요.

이 프로젝트의 README 파일에 회사 로고를 게재하실 수 있습니다.

### PayPal

[PayPal](https://www.paypal.me/fatedier)을 통해 제 계정 **[email protected]**으로 기부해 주세요.
도구 다운로드
HTTP Host 헤더 재작성
  • 기타 HTTP 헤더 설정
  • 실제 IP 가져오기
    • HTTP X-Forwarded-For
    • 프록시 프로토콜
  • 웹 서비스에 HTTP 기본 인증(비밀번호) 요구
  • 사용자 지정 하위 도메인 이름
  • URL 라우팅
  • TCP 포트 멀티플렉싱
  • PROXY를 통한 frps 연결
  • 포트 범위 매핑
  • 클라이언트 플러그인
  • 서버 관리 플러그인
  • SSH 터널 게이트웨이
  • 가상 네트워크 (VirtualNet)
  • 기능 게이트
    • 사용 가능한 기능 게이트
    • 기능 게이트 활성화
    • 기능 수명 주기
  • 관련 프로젝트
  • 기여
  • 후원
    • GitHub 스폰서
    • PayPal