읽어보기 | 중국어(중국어)
frp는 우리의 멋진 스폰서들의 지원 덕분에 지속적으로 개발이 가능한 오픈 소스 프로젝트입니다. 만약 당신이 그들과 함께하고 싶다면, frp의 개발을 후원하는 것을 고려해 보세요.
frp는 NAT 또는 방화벽 뒤에 있는 로컬 서버를 인터넷에 노출시킬 수 있는 빠른 역방향 프록시입니다. 현재 TCP 및 UDP는 물론 HTTP 및 HTTPS 프로토콜도 지원하므로 요청이 도메인 이름을 통해 내부 서비스로 전달될 수 있습니다.
frp는 P2P 연결 모드도 제공합니다.
개발현황
V2 소개
건축학
사용 예
SSH를 통해 LAN 네트워크의 컴퓨터에 액세스
동일한 포트를 공유하는 여러 SSH 서비스
LAN에서 사용자 정의 도메인을 사용하여 내부 웹 서비스에 액세스
DNS 쿼리 요청 전달
포워드 Unix 도메인 소켓
간단한 HTTP 파일 서버 노출
로컬 HTTP(S) 서비스에 대해 HTTPS를 활성화합니다.
서비스를 비공개로 노출하세요
P2P 모드
특징
HTTP X-전달-For
프록시 프로토콜
각 프록시에 대해
TLS
토큰 인증
OIDC 인증
프로메테우스
구성 파일
환경 변수 사용
구성을 다른 파일로 분할
서버 대시보드
클라이언트 관리 UI
감시 장치
클라이언트 인증
암호화 및 압축
핫 리로딩 frpc 구성
클라이언트로부터 프록시 상태 가져오기
서버의 특정 포트만 허용
포트 재사용
대역폭 제한
TCP 스트림 다중화
KCP 프로토콜 지원
QUIC 프로토콜 지원
연결 풀링
로드 밸런싱
서비스 상태 점검
HTTP 호스트 헤더 다시 작성
기타 HTTP 헤더 설정
실제 IP 받기
웹 서비스에 대해 HTTP 기본 인증(비밀번호) 필요
사용자 정의 하위 도메인 이름
URL 라우팅
TCP 포트 다중화
PROXY를 통해 frps에 연결
포트 범위 매핑
클라이언트 플러그인
서버 관리 플러그인
SSH 터널 게이트웨이
관련 프로젝트
기여
기부
GitHub 후원자
페이팔
frp는 현재 개발 중입니다. master
브랜치에서 최신 릴리스 버전을 사용해 보거나 dev
브랜치를 사용하여 현재 개발 중인 버전에 액세스할 수 있습니다.
우리는 현재 버전 2를 작업 중이며 일부 코드 리팩토링 및 개선을 수행하려고 시도하고 있습니다. 단, 버전 1과 호환되지 않으니 주의하시기 바랍니다.
우리는 적절한 시기에 버전 0에서 버전 1로 전환할 것이며 큰 기능 요청보다는 버그 수정 및 개선 사항만 받아들일 것입니다.
v2 버전의 복잡성과 난이도는 예상보다 훨씬 높습니다. 단편적인 기간 동안에만 개발 작업을 할 수 있으며, 지속적인 중단으로 인해 생산성이 크게 저하됩니다. 이러한 상황을 고려하여, 주요 버전 점검을 진행할 수 있는 여유 시간이 더 확보될 때까지 현재 버전을 계속 최적화하고 반복할 것입니다.
v2의 기본 개념은 클라우드 네이티브 도메인, 특히 K8s 및 ServiceMesh에 대한 수년간의 경험과 성찰을 기반으로 합니다. 그 핵심은 Envoy와 유사한 현대화된 4계층 및 7계층 프록시입니다. 이 프록시 자체는 확장성이 뛰어나며 인트라넷 침투 기능을 구현할 수 있을 뿐만 아니라 다양한 다른 도메인에도 적용할 수 있습니다. 확장성이 뛰어난 이 코어를 기반으로 우리는 frp v1의 모든 기능을 구현하는 동시에 이전에 달성할 수 없거나 구현하기 어려웠던 기능을 우아한 방식으로 해결하는 것을 목표로 합니다. 또한, 효율적인 개발 및 Iteration 역량을 유지하겠습니다.
또한 저는 K8을 기반으로 다양한 확장 기능을 제공할 수 있는 방법과 유사하게 FRP 자체가 고도로 확장 가능한 시스템 및 플랫폼이 되는 것을 상상합니다. K8s에서는 CRD, 컨트롤러 모드, 웹훅, CSI, CNI 등의 기능을 활용해 기업 요구에 따라 개발을 맞춤화할 수 있습니다. frp v1에서는 몇 가지 기본 확장성을 구현하는 서버 플러그인 개념을 도입했습니다. 그러나 이는 단순한 HTTP 프로토콜에 의존하며 사용자가 독립적인 프로세스를 시작하고 스스로 관리해야 합니다. 이 접근 방식은 유연하고 편리하지 않으며 실제 요구 사항은 매우 다양합니다. 소수의 개인이 유지 관리하는 비영리 오픈 소스 프로젝트가 모든 사람의 요구를 충족할 것이라고 기대하는 것은 비현실적입니다.
마지막으로, 구성 관리, 권한 확인, 인증서 관리, API 관리와 같은 모듈의 현재 설계가 충분히 현대적이지 않다는 점을 인정합니다. v1 버전에서 일부 최적화를 수행할 수 있지만 호환성 보장은 해결하기 위해 상당한 노력이 필요한 어려운 문제로 남아 있습니다.
frp에 대한 귀하의 지원에 진심으로 감사드립니다.
시작하려면 릴리스 페이지에서 운영 체제 및 아키텍처에 맞는 최신 프로그램을 다운로드하세요.
다음으로, 공용 IP 주소가 있는 서버 A에 frps
바이너리 및 서버 구성 파일을 배치합니다.
마지막으로 공용 인터넷에서 직접 액세스할 수 없는 LAN에 있는 서버 B에 frpc
바이너리 및 클라이언트 구성 파일을 배치합니다.
일부 바이러스 백신은 frpc를 악성 코드로 부적절하게 표시하고 삭제합니다. 이는 frp가 역방향 프록시를 생성할 수 있는 네트워킹 도구이기 때문입니다. 바이러스 백신은 방화벽 포트 제한을 우회하는 기능으로 인해 역방향 프록시에 플래그를 지정하는 경우가 있습니다. 바이러스 백신을 사용하는 경우 실수로 격리/삭제되는 것을 방지하기 위해 바이러스 백신 설정에서 frpc를 허용 목록에 추가/제외해야 할 수도 있습니다. 자세한 내용은 문제 3637을 참조하세요.
frp 클라이언트가 연결할 bindPort
설정하여 서버 A에서 frps.toml
수정합니다.
# frps.tomlbindPort = 7000
서버 A에서 frps
시작합니다.
./frps -c ./frps.toml
서버 B에서 frpc.toml
수정하고 serverAddr
필드를 frps 서버의 공용 IP 주소로 설정합니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
localPort
(클라이언트에서 수신 대기) 및 remotePort
(서버에 노출됨)는 frp 시스템으로 들어오고 나가는 트래픽에 사용되는 반면, serverPort
frps와 frpc 간의 통신에 사용됩니다.
서버 B에서 frpc
시작합니다.
./frpc -c ./frpc.toml
SSH를 통해 서버 A를 통해 다른 시스템에서 서버 B에 액세스하려면(사용자 이름이 test
라고 가정) 다음 명령을 사용하십시오.
ssh -oPort=6000 test@xxxx
이 예에서는 tcpmux 유형의 프록시를 사용하여 동일한 포트를 통해 노출되는 여러 SSH 서비스를 구현합니다. 마찬가지로 클라이언트가 HTTP Connect 프록시 연결 방법을 지원하는 한 이러한 방식으로 포트 재사용이 가능합니다.
공용 IP가 있는 머신에 frps를 배포하고 frps.toml 파일을 수정합니다. 다음은 단순화된 구성입니다.
바인딩 포트 = 7000tcpmuxHTTPConnectPort = 5002
다음 구성을 사용하여 내부 머신 A에 frpc를 배포합니다.
serverAddr = "xxxx"serverPort = 7000[[proxies]]name = "ssh1"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["machine-a.example.com"]localIP = "127.0.0.1"localPort = 22
다음 구성을 사용하여 내부 시스템 B에 다른 frpc를 배포합니다.
serverAddr = "xxxx"serverPort = 7000[[proxies]]name = "ssh2"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["machine-b.example.com"]localIP = "127.0.0.1"localPort = 22
SSH ProxyCommand를 사용하여 내부 시스템 A에 액세스하려면 사용자 이름이 "test"라고 가정합니다.
ssh -o 'proxycommand socat - PROXY:xxxx:%h:%p,proxyport=5002' [email protected]
내부 머신 B에 액세스하기 위한 유일한 차이점은 사용자 이름이 "test"라고 가정할 때 도메인 이름입니다.
ssh -o 'proxycommand socat - PROXY:xxxx:%h:%p,proxyport=5002' [email protected]
때로는 자체 도메인 이름을 사용하여 테스트 목적으로 NAT 네트워크 뒤의 로컬 웹 서비스를 다른 사람에게 노출해야 하는 경우도 있습니다.
안타깝게도 도메인 이름을 로컬 IP로 확인할 수 없습니다. 그러나 frp를 사용하여 HTTP(S) 서비스를 노출할 수 있습니다.
frps.toml
수정하고 vhost의 HTTP 포트를 8080으로 설정합니다.
# frps.tomlbindPort = 7000vhostHTTPPort = 8080
https 프록시를 구성하려면 vhostHTTPSPort
를 설정해야 합니다.
frps
시작 :
./frps -c ./frps.toml
frpc.toml
수정하고 serverAddr
원격 frps 서버의 IP 주소로 설정합니다. 웹 서비스의 localPort
를 지정합니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["www.example.com"]
frpc
시작:
./frpc -c ./frpc.toml
www.example.com
의 A 레코드를 원격 frps 서버의 공용 IP 또는 원래 도메인을 가리키는 CNAME 레코드에 매핑합니다.
URL http://www.example.com:8080
을 사용하여 로컬 웹 서비스를 방문하세요.
frps.toml
수정:
# frps.tomlbindPort = 7000
frps
시작 :
./frps -c ./frps.toml
frpc.toml
수정하고 serverAddr
원격 frps 서버의 IP 주소로 설정합니다. Google Public DNS 서버 8.8.8.8:53
으로 DNS 쿼리 요청을 전달합니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "dns"type = "udp"localIP = "8.8.8.8"localPort = 53remotePort = 6000
frpc를 시작합니다:
./frpc -c ./frpc.toml
dig
명령을 사용하여 DNS 확인을 테스트합니다.
dig @xxxx -p 6000 www.google.com
Unix 도메인 소켓(예: Docker 데몬 소켓)을 TCP로 노출합니다.
위와 같이 frps
구성합니다.
다음 구성으로 frpc
시작하십시오.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "unix_domain_socket"type = "tcp"remotePort = 6000[proxies.plugin]type = "unix_domain_socket"unixPath = "/var/run/docker.sock "
curl
사용하여 Docker 버전을 가져와 구성을 테스트합니다.
curl http://xxxx:6000/version
공용 인터넷에서 LAN에 저장된 파일에 액세스하기 위해 간단한 HTTP 파일 서버를 노출합니다.
위에 설명된 대로 frps
구성한 후 다음을 수행합니다.
다음 구성으로 frpc
시작하십시오.
# frpc.tomlserverAddr = "xxxx"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"
frpc
시스템의 /tmp/files
에 있는 파일을 보려면 브라우저에서 http://xxxx:6000/static/
방문하고 올바른 사용자 이름과 비밀번호를 지정하십시오.
플러그인을 https2https
로 대체하고 localAddr
이 HTTPS 엔드포인트를 가리킬 수 있습니다.
다음 구성으로 frpc
시작하십시오.
# frpc.tomlserverAddr = "xxxx"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- 어디서부터 = "frp"
https://test.example.com
방문하세요.
특정 서비스를 공용 네트워크에 직접 노출하는 것과 관련된 위험을 완화하기 위해 STCP(비밀 TCP) 모드에서는 다른 클라이언트에서 서비스에 액세스하는 데 사전 공유 키를 사용해야 합니다.
위와 동일하게 frps
구성합니다.
다음 구성을 사용하여 머신 B에서 frpc
시작합니다. 이 예는 SSH 서비스(포트 22)를 노출하기 위한 것이며, 사전 공유 키에 대한 secretKey
필드를 기록하고 여기서는 remotePort
필드가 제거되었음을 확인하세요.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "secret_ssh"type = "stcp"secretKey = "abcdefg"localIP = "127.0.0.1"localPort = 22
보안 키( secretKey
필드)를 사용하여 SSH 서비스에 액세스하려면 다음 구성을 사용하여 다른 frpc
(일반적으로 다른 컴퓨터 C에서)를 시작합니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[visitors]]name = "secret_ssh_visitor"type = "stcp"serverName = "secret_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = 6000
머신 C에서 다음 명령을 사용하여 머신 B의 SSH에 연결합니다.
ssh -oPort=6000 127.0.0.1
xtcp 는 클라이언트 간에 대량의 데이터를 직접 전송하도록 설계되었습니다. 여기서 P2P는 실제 데이터 전송만을 의미하므로 frps 서버가 여전히 필요합니다.
모든 유형의 NAT 장치에서는 작동하지 않을 수 있습니다. xtcp가 작동하지 않으면 stcp로 대체할 수 있습니다.
머신 B에서 frpc
시작하고 SSH 포트를 노출합니다. remotePort
필드가 제거되었습니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# 기본 서버를 사용할 수 없는 경우 새 스턴 서버를 설정합니다.# natHoleStunServer = "xxx"[[proxies]]name = "p2p_ssh"type = "xtcp"secretKey = " abcdefg"localIP = "127.0.0.1"localPort = 22
P2P 모드를 사용하여 SSH에 연결하는 구성으로 다른 frpc
(일반적으로 다른 컴퓨터 C에서)를 시작합니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# 기본 서버를 사용할 수 없는 경우 새 스턴 서버를 설정합니다.# natHoleStunServer = "xxx"[[visitors]]name = "p2p_ssh_visitor"type = "xtcp"serverName = " p2p_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = 6000# 자동 터널 지속성이 필요한 경우 truekeepTunnelOpen = false로 설정하세요.
머신 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의 표준 형식을 사용하여 구성 파일에서 참조될 수 있습니다.
# frpc.tomlserverAddr = "{{ .Envs.FRP_SERVER_ADDR }}"serverPort = 7000[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = "{{ .Envs. FRP_SSH_REMOTE_PORT }}"
위의 구성을 사용하면 다음과 같이 변수를 frpc
프로그램에 전달할 수 있습니다.
export FRP_SERVER_ADDR=x.x.x.x export FRP_SSH_REMOTE_PORT=6000 ./frpc -c ./frpc.toml
frpc
OS 환경 변수를 사용하여 구성 파일 템플릿을 렌더링합니다. 참조 앞에 .Envs
를 붙여야 합니다.
여러 프록시 구성을 서로 다른 파일로 분할하여 기본 파일에 포함할 수 있습니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000includes = ["./confd/*.toml"]
# ./confd/test.toml[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
대시보드를 통해 frp의 상태와 프록시의 통계 정보를 확인하세요.
이 기능을 활성화하려면 대시보드용 포트를 구성하세요.
# 기본값은 127.0.0.1입니다. 공용 네트워크에서 접속하려면 0.0.0.0으로 변경하세요.webServer.addr = "0.0.0.0"webServer.port = 7500# 대시보드의 사용자 이름과 비밀번호는 모두 선택 사항입니다webServer.user = "admin"webServer.password = " 관리자"
그런 다음 http://[serverAddr]:7500
방문하여 사용자 이름과 비밀번호가 모두 admin
인 대시보드를 확인하세요.
또한 도메인 와일드카드 또는 일반 SSL 인증서를 사용하여 HTTPS 포트를 사용할 수 있습니다.
webServer.port = 7500# 대시보드의 사용자 이름과 비밀번호는 모두 선택 사항입니다webServer.user = "admin"webServer.password = "admin"webServer.tls.certFile = "server.crt"webServer.tls.keyFile = "server.key"
그런 다음 https://[serverAddr]:7500
방문하여 보안 HTTPS 연결의 대시보드를 확인하세요. 사용자 이름과 비밀번호는 모두 admin
입니다.
클라이언트 관리 UI는 frpc 구성을 확인하고 관리하는 데 도움이 됩니다.
이 기능을 활성화하려면 관리 UI에 대한 주소를 구성하십시오.
webServer.addr = "127.0.0.1"webServer.port = 7400webServer.user = "admin"webServer.password = "admin"
그런 다음 http://127.0.0.1:7400
방문하여 사용자 이름과 비밀번호가 모두 admin
인 관리 UI를 확인하세요.
웹 서버가 활성화되면 frps는 모니터 데이터를 7일 동안 캐시에 저장합니다. 프로세스를 다시 시작하면 지워집니다.
프로메테우스도 지원됩니다.
먼저 대시보드를 활성화한 다음 frps.toml
에서 enablePrometheus = true
를 구성하세요.
http://{dashboard_addr}/metrics
Prometheus 모니터 데이터를 제공합니다.
frps로 frpc를 인증하는 데는 2가지 인증 방법이 있습니다.
frpc.toml
및 frps.toml
에서 auth.method
구성하여 사용할 항목을 결정할 수 있으며, 기본 항목은 토큰입니다.
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
지정해야 합니다.
frpc.toml
및 frps.toml
에서 auth.method = "oidc"
지정하면 OIDC 기반 인증이 사용됩니다.
OIDC는 OpenID Connect의 약자이며 사용되는 흐름을 클라이언트 자격 증명 부여라고 합니다.
이 인증 유형을 사용하려면 frpc.toml
및 frps.toml
다음과 같이 구성합니다.
# frps.tomlauth.method = "oidc"auth.oidc.issuer = "https://example-oidc-issuer.com/"auth.oidc.audience = "https://oidc-audience.com/.default"
# frpc.tomlauth.method = "oidc"auth.oidc.clientID = "98692467-37de-409a-9fac-bb2585826f18" # OIDC 클라이언트로 교체 IDauth.oidc.clientSecret = "oidc_secret"auth.oidc.audience = "https: //oidc-audience.com/.default"auth.oidc.tokenEndpointURL = "https://example-oidc-endpoint.com/oauth2/v2.0/token"
해당 기능은 기본적으로 꺼져 있습니다. 암호화 및/또는 압축을 켤 수 있습니다.
# frpc.toml[[proxies]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.useEncryption = truetransport.useCompression = true
v0.50.0부터 transport.tls.enable
및 transport.tls.disableCustomTLSFirstByte
의 기본값이 true로 변경되었으며 tls가 기본적으로 활성화되어 있습니다.
포트 멀티플렉싱의 경우 frp는 TLS 연결을 다이얼하기 위해 첫 번째 바이트 0x17
보냅니다. 이는 transport.tls.disableCustomTLSFirstByte
false로 설정한 경우에만 적용됩니다.
TLS 연결만 허용하도록 frps
적용 하려면 frps.toml
에서 transport.tls.force = true
구성합니다. 이는 선택 사항입니다.
frpc
TLS 설정:
Transport.tls.enable = truetransport.tls.certFile = "certificate.crt"transport.tls.keyFile = "certificate.key"transport.tls.trustedCaFile = "ca.crt"
frps
TLS 설정:
Transport.tls.force = truetransport.tls.certFile = "certificate.crt"transport.tls.keyFile = "certificate.key"transport.tls.trustedCaFile = "ca.crt"
루트 CA 인증서 와 하나 이상의 SSL/TLS 인증서가 필요합니다. 자체 서명되거나 일반(예: Let's Encrypt 또는 다른 SSL/TLS 인증서 공급자)일 수 있습니다 .
호스트 이름이 아닌 IP 주소를 통해 frp
사용하는 경우 SSL/TLS 인증서 생성 시 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
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
FRP 인증서 빌드:
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
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
HTTP API를 활성화하려면 webServer
필드가 필요합니다.
# frpc.tomlwebServer.addr = "127.0.0.1"webServer.port = 7400
그런 다음 frpc reload -c ./frpc.toml
명령을 실행하고 frpc
프록시를 생성, 업데이트 또는 제거할 때까지 약 10초 동안 기다립니다.
전역 클라이언트 매개변수는 'start'를 제외하고는 수정되지 않습니다.
다시 로드하기 전에 frpc verify -c ./frpc.toml
명령을 실행하여 구성 오류가 있는지 확인할 수 있습니다.
모든 프록시의 상태를 확인하려면 frpc status -c ./frpc.toml
사용하세요. HTTP API를 활성화하려면 webServer
필드가 필요합니다.
frps.toml
의 allowPorts
포트 남용을 방지하는 데 사용됩니다.
# frps.tomlallowPorts = [ { 시작 = 2000, 끝 = 3000 }, { 단일 = 3001 }, { 단일 = 3003 }, { 시작 = 4000, 끝 = 50000 } ]
frps의 vhostHTTPPort
및 vhostHTTPSPort
bindPort
와 동일한 포트를 사용할 수 있습니다. frps는 연결의 프로토콜을 감지하고 이에 따라 처리합니다.
주의하셔야 할 점은 vhostHTTPSPort
와 bindPort
동일한 포트로 구성하려면 먼저 transport.tls.disableCustomTLSFirstByte
false로 설정해야 한다는 것입니다.
우리는 앞으로 여러 프록시가 서로 다른 프로토콜을 사용하여 동일한 원격 포트를 바인딩할 수 있도록 노력하고 싶습니다.
# frpc.toml[[proxies]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.bandwidthLimit = "1MB"
이 기능을 활성화하려면 각 프록시의 구성에서 transport.bandwidthLimit
설정하세요. 지원되는 단위는 MB
및 KB
입니다.
클라이언트 또는 서버 측에서 대역폭을 제한하려면 transport.bandwidthLimitMode
client
또는 server
로 설정하십시오. 기본값은 client
입니다.
frp는 v0.10.0부터 HTTP2 다중화와 같은 tcp 스트림 다중화를 지원합니다. 이 경우 동일한 frpc에 대한 모든 논리 연결이 동일한 TCP 연결로 다중화됩니다.
frps.toml
및 frpc.toml
수정하여 이 기능을 비활성화할 수 있습니다.
# frps.toml과 frpc.toml은 동일해야 합니다transport.tcpMux = false
KCP는 대역폭을 10~20% 더 낭비하는 대신 평균 지연 시간을 30~40% 줄이고 최대 지연 시간을 3배 줄이는 전송 효과를 달성할 수 있는 빠르고 안정적인 프로토콜입니다. TCP보다.
KCP 모드는 UDP를 기본 전송으로 사용합니다. frp에서 KCP 사용:
FRP에서 KCP를 활성화합니다.
# frps.tomlbindPort = 7000# KCP.kcpBindPort = 7000에 UDP 포트를 지정합니다.
bindPort
필드가 TCP 포트를 지정하므로 kcpBindPort
번호는 bindPort
와 동일한 번호일 수 있습니다.
KCP를 사용하여 frps에 연결하도록 frpc.toml
구성합니다.
# frpc.tomlserverAddr = "xxxx"# frps.tomlserverPort = 7000transport.protocol = "kcp"의 'kcpBindPort'와 동일
QUIC는 UDP 위에 구축된 새로운 다중화 전송입니다.
frp에서 QUIC 사용:
FRP에서 QUIC를 활성화합니다:
# frps.tomlbindPort = 7000# QUIC.quicBindPort = 7000에 대한 UDP 포트를 지정합니다.
bindPort
필드가 TCP 포트를 지정하므로 quicBindPort
번호는 bindPort
와 동일한 번호일 수 있습니다.
QUIC를 사용하여 frps에 연결하도록 frpc.toml
구성합니다.
# frpc.tomlserverAddr = "xxxx"# frps.tomlserverPort = 7000transport.protocol = "quic"의 'quicBindPort'와 동일
기본적으로 frps는 사용자 요청 시 백엔드 서비스에 대한 새로운 frpc 연결을 생성합니다. 연결 풀링을 사용하면 frps는 미리 설정된 특정 수의 연결을 유지하여 연결을 설정하는 데 필요한 시간을 줄입니다.
이 기능은 다수의 짧은 연결에 적합합니다.
frps.toml
에서 각 프록시가 사용할 수 있는 풀 수 제한을 구성합니다.
# frps.tomltransport.maxPoolCount = 5
연결 풀 수를 활성화하고 지정합니다.
# frpc.tomltransport.poolCount = 1
로드 밸런싱은 group
별로 지원됩니다.
이 기능은 현재 tcp
, http
, tcpmux
유형에만 사용할 수 있습니다.
# frpc.toml[[proxies]]name = "test1"type = "tcp"localPort = 8080remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123"[[proxies]]name = "test2"type = " tcp"localPort = 8081remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123"
loadBalancer.groupKey
는 인증에 사용됩니다.
포트 80에 대한 연결은 동일한 그룹의 프록시에 무작위로 전달됩니다.
tcp
유형의 경우 동일한 그룹의 remotePort
는 동일해야 합니다.
http
유형의 경우 customDomains
, subdomain
, locations
동일해야 합니다.
상태 확인 기능은 로드 밸런싱을 통해 고가용성을 달성하는 데 도움이 됩니다.
상태 확인을 활성화하려면 healthCheck.type = "tcp"
또는 healthCheck.type = "http"
를 추가하세요.
상태 확인 유형 tcp 를 사용하면 서비스 포트가 핑(TCPing)됩니다.
# frpc.toml[[proxies]]name = "test1"type = "tcp"localPort = 22remotePort = 6000# TCP 상태 확인 활성화healthCheck.type = "tcp"# TCPing 시간 초과 초healthCheck.timeoutSeconds = 3# 상태 확인이 3번 실패한 경우 연속해서 프록시가 frpshealthCheck.maxFailed = 3#에서 10초마다 상태 확인으로 제거됩니다.healthCheck.intervalSeconds = 10
상태 확인 유형 http 를 사용하면 HTTP 요청이 서비스로 전송되고 HTTP 2xx OK 응답이 예상됩니다.
# frpc.toml[[proxies]]name = "web"type = "http"localIP = "127.0.0.1"localPort = 80customDomains = ["test.example.com"]# HTTP 상태 확인 활성화healthCheck.type = "http" # frpc는 '/status'#에 GET 요청을 보내고 HTTP 2xx를 기대합니다. responsehealthCheck.path = "/status"healthCheck.timeoutSeconds = 3healthCheck.maxFailed = 3healthCheck.intervalSeconds = 10
기본적으로 frp는 바이트 단위 복사본이므로 터널링된 HTTP 요청을 전혀 수정하지 않습니다.
그러나 웹 서버 및 HTTP 요청에 관해 말하자면, 웹 서버는 Host
HTTP 헤더를 사용하여 액세스할 웹 사이트를 결정할 수 있습니다. frp는 HTTP 요청을 전달할 때 hostHeaderRewrite
필드를 사용하여 Host
헤더를 다시 쓸 수 있습니다.
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"
HTTP 요청은 실제 웹 서버에 도달할 때 Host
헤더가 Host: dev.example.com
으로 다시 작성되지만, 브라우저의 요청에는 Host: test.example.com
있을 수 있습니다.
Host
와 마찬가지로 다른 HTTP 요청 및 응답 헤더를 프록시 유형 http
로 재정의할 수 있습니다.
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"requestHeaders.set.x-from-where = "frp"responseHeaders.set.foo = "바"
이 예에서는 HTTP 요청에 x-from-where: frp
헤더를 설정하고 HTTP 응답에 foo: bar
헤더를 설정합니다.
이 기능은 http
프록시 또는 https2http
및 https2https
플러그인이 활성화된 프록시용입니다.
HTTP 요청 헤더 X-Forwarded-For
에서 사용자의 실제 IP를 얻을 수 있습니다.
frp는 사용자의 실제 IP를 로컬 서비스로 보내기 위해 프록시 프로토콜을 지원합니다. UDP를 제외한 모든 유형을 지원합니다.
https 서비스의 예는 다음과 같습니다.
# frpc.toml[[proxies]]name = "web"type = "https"localPort = 443customDomains = ["test.example.com"]# 이제 v1과 v2가 지원됩니다transport.proxyProtocolVersion = "v2"
nginx에서 프록시 프로토콜 지원을 활성화하여 HTTP 헤더 X-Real-IP
에 사용자의 실제 IP를 노출한 다음 웹 서비스에서 실제 IP에 대한 X-Real-IP
헤더를 읽을 수 있습니다.
비밀번호로 보호하지 않는 한 터널 URL을 추측할 수 있는 사람은 누구나 로컬 웹 서버에 액세스할 수 있습니다.
이는 frpc의 구성 파일에 지정된 사용자 이름과 비밀번호를 사용하여 모든 요청에 HTTP 기본 인증을 적용합니다.
프록시 유형이 http인 경우에만 활성화할 수 있습니다.
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]httpUser = "abc"httpPassword = "abc"
브라우저에서 http://test.example.com
방문하면 이제 사용자 이름과 비밀번호를 입력하라는 메시지가 표시됩니다.
여러 사람이 하나의 FRP 서버를 공유하는 경우 http 및 https 유형에 대해 subdomain
구성을 사용하는 것이 편리합니다.
# frps.tomlsubDomainHost = "frps.com"
*.frps.com
frps 서버의 IP로 확인합니다. 이를 일반적으로 와일드카드 DNS 레코드라고 합니다.
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80subdomain = "test"
이제 test.frps.com
에서 웹 서비스를 방문할 수 있습니다.
subdomainHost
비어 있지 않은 경우 customDomains
subdomainHost
의 하위 도메인이 아니어야 합니다.
frp는 URL 라우팅을 통해 HTTP 요청을 다른 백엔드 웹 서비스로 전달하는 것을 지원합니다.
locations
라우팅에 사용되는 URL의 접두사를 지정합니다. frps는 먼저 나열된 순서에 관계없이 리터럴 문자열로 제공되는 가장 구체적인 접두사 위치를 검색합니다.
# frpc.toml[[proxies]]name = "web01"type = "http"localPort = 80customDomains = ["web.example.com"]locations = ["/"] [[proxies]]name = "web02"type = "http"localPort = 81customDomains = ["web.example.com"]locations = ["/news", "/about"]
URL 접두사 /news
또는 /about
이 포함된 HTTP 요청은 web02 로 전달되고 기타 요청은 web01 로 전달됩니다.
frp는 vhostHTTPPort
및 vhostHTTPSPort
와 유사하게 frp의 단일 포트에서 다른 프록시로 향하는 TCP 소켓 수신을 지원합니다.
현재 사용 가능한 유일한 지원되는 TCP 포트 멀티플렉싱 방법은 httpconnect
- HTTP CONNECT 터널입니다.
frps에서 tcpmuxHTTPConnectPort
0이 아닌 다른 값으로 설정하면 frps는 이 포트에서 HTTP CONNECT 요청을 수신합니다.
HTTP CONNECT 요청의 호스트는 frps의 프록시를 일치시키는 데 사용됩니다. multiplexer = "httpconnect"
일 때 tcpmux
프록시 아래에 customDomains
및/또는 subdomain
구성하여 frpc에서 프록시 호스트를 구성할 수 있습니다.
예를 들어:
# frps.tomlbindPort = 7000tcpmuxHTTPConnectPort = 1337
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "proxy1"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["test1"]localPort = 80[[proxies]]name = "proxy2 "유형 = "tcpmux"멀티플렉서 = "httpconnect"customDomains = ["test2"]localPort = 8080
위 구성에서 다음과 같은 HTTP CONNECT 헤더를 사용하여 포트 1337에서 frps에 연결할 수 있습니다.
CONNECT test1 HTTP/1.1rnrn
연결은 proxy1
로 라우팅됩니다.
OS 환경 변수 HTTP_PROXY
설정하거나 frpc.toml 파일에 transport.proxyURL
이 설정된 경우 frpc는 프록시를 통해 frps에 연결할 수 있습니다.
프로토콜이 tcp인 경우에만 작동합니다.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000transport.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 }}
frpc는 기본적으로 로컬 TCP 또는 UDP 포트로만 요청을 전달합니다.
플러그인은 풍부한 기능을 제공하는 데 사용됩니다. unix_domain_socket
, http_proxy
, socks5
, static_file
, http2https
, https2http
, https2https
와 같은 내장 플러그인이 있으며 예제 사용법을 볼 수 있습니다.
플러그인 http_proxy 사용:
# 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에서 더 많은 플러그인을 찾아보세요.
v0.53.0에 추가됨
frp는 frps 측에서 SSH 포트 수신 대기를 지원하고 frpc에 의존하지 않고 SSH -R 프로토콜을 통해 TCP 프로토콜 프록시를 구현합니다.
# frps.tomlsshTunnelGateway.bindPort = 2200
./frps -c frps.toml
실행하면 .autogen_ssh_key
라는 개인 키 파일이 현재 작업 디렉터리에 자동으로 생성됩니다. 생성된 개인 키 파일은 frps의 SSH 서버에서 사용됩니다.
명령 실행
ssh -R :80:127.0.0.1:8080 v0@{frp 주소} -p 2200 tcp --proxy_name "test-tcp" --remote_port 9090
로컬 8080 서비스를 포트 9090으로 전달하는 frps에 프록시를 설정합니다.
frp(SSH를 통해)(종료하려면 Ctrl+C) 사용자: 프록시 이름: test-tcp 유형: TCP 원격주소: :9090
이는 다음과 같습니다.
frpc tcp --proxy_name "test-tcp" --local_ip 127.0.0.1 --local_port 8080 --remote_port 9090
자세한 내용은 이 문서를 참조하세요.
gofrp/plugin - FRP 확장 메커니즘을 기반으로 구현된 다양한 플러그인을 포함하는 FRP 플러그인용 저장소로, 다양한 시나리오의 사용자 정의 요구 사항을 충족합니다.
gofrp/tiny-frpc - SSH 프로토콜을 사용하여 구현된 frp 클라이언트의 경량 버전(최소 약 3.5MB)으로 가장 일반적으로 사용되는 일부 기능을 지원하며 리소스가 제한된 장치에 적합합니다.
참여에 관심이 있으십니까? 우리는 당신을 돕고 싶습니다!
문제 목록을 살펴보고 dev 브랜치 에 Pull Request를 보내는 것을 고려해 보세요.
새로운 기능을 추가하려면 먼저 이슈를 생성하여 새로운 기능과 구현 방식을 설명하세요. 제안이 수락되면 새로운 기능의 구현을 생성하고 끌어오기 요청으로 제출하세요.
내 영어가 서툴러서 미안해요. 이 문서의 개선 사항은 환영합니다. 심지어 일부 오타도 수정되었습니다.
좋은 아이디어가 있으시면 [email protected]으로 이메일을 보내주세요.
참고: 동일한 질문을 가진 다른 사람들이 신속하게 검색할 수 있고 반복적으로 답변할 필요가 없도록 문제에 대한 조언을 제공하는 것을 선호합니다.
frp가 당신에게 많은 도움이 된다면, 다음과 같은 방법으로 우리를 지원할 수 있습니다:
Github 스폰서로 우리를 지원하세요.
이 프로젝트의 README 파일에 회사 로고를 넣을 수 있습니다.
PayPal을 통해 내 계정 [email protected] 으로 돈을 기부하세요.