อ่านต่อ | 中文档
frp เป็นโครงการโอเพ่นซอร์สที่มีการพัฒนาอย่างต่อเนื่องซึ่งเกิดขึ้นได้ทั้งหมดโดยการสนับสนุนของผู้สนับสนุนที่ยอดเยี่ยมของเรา หากคุณต้องการเข้าร่วม โปรดพิจารณาสนับสนุนการพัฒนาของ frp
frp เป็นพร็อกซีย้อนกลับที่รวดเร็วซึ่งช่วยให้คุณเปิดเผยเซิร์ฟเวอร์ภายในเครื่องที่อยู่ด้านหลัง NAT หรือไฟร์วอลล์กับอินเทอร์เน็ต ปัจจุบันรองรับ TCP และ UDP รวมถึงโปรโตคอล HTTP และ HTTPS ทำให้สามารถส่งต่อคำขอไปยังบริการภายในผ่านชื่อโดเมนได้
frp ยังมีโหมดการเชื่อมต่อ P2P
สถานะการพัฒนา
เกี่ยวกับ วี2
สถาปัตยกรรม
ตัวอย่างการใช้งาน
เข้าถึงคอมพิวเตอร์ของคุณในเครือข่าย LAN ผ่าน SSH
บริการ SSH หลายบริการใช้พอร์ตเดียวกัน
การเข้าถึงบริการเว็บภายในด้วยโดเมนที่กำหนดเองใน LAN
ส่งต่อคำขอค้นหา DNS
ส่งต่อซ็อกเก็ตโดเมน Unix
เปิดเผยเซิร์ฟเวอร์ไฟล์ HTTP แบบธรรมดา
เปิดใช้งาน HTTPS สำหรับบริการ HTTP(S) ในเครื่อง
เปิดเผยบริการของคุณเป็นการส่วนตัว
โหมด P2P
คุณสมบัติ
HTTP X-ส่งต่อ-สำหรับ
โปรโตคอลพร็อกซี
สำหรับผู้รับมอบฉันทะแต่ละราย
ทลส
การรับรองความถูกต้องโทเค็น
การรับรองความถูกต้อง OIDC
โพรมีธีอุส
ไฟล์การกำหนดค่า
การใช้ตัวแปรสภาพแวดล้อม
แยกการกำหนดค่าออกเป็นไฟล์ต่างๆ
แดชบอร์ดเซิร์ฟเวอร์
UI ผู้ดูแลระบบไคลเอ็นต์
เฝ้าสังเกต
การตรวจสอบความถูกต้องของลูกค้า
การเข้ารหัสและการบีบอัด
การกำหนดค่า frpc แบบ Hot-Reloading
รับสถานะพร็อกซีจากลูกค้า
อนุญาตเฉพาะบางพอร์ตบนเซิร์ฟเวอร์เท่านั้น
พอร์ตนำมาใช้ใหม่
ขีดจำกัดแบนด์วิธ
TCP สตรีมมัลติเพล็กซ์
รองรับโปรโตคอล KCP
รองรับโปรโตคอล QUIC
การรวมการเชื่อมต่อ
โหลดบาลานซ์
บริการตรวจสุขภาพ
เขียนส่วนหัวโฮสต์ HTTP ใหม่
การตั้งค่าส่วนหัว HTTP อื่น ๆ
รับ IP จริง
ต้องใช้ HTTP Basic Auth (รหัสผ่าน) สำหรับบริการบนเว็บ
ชื่อโดเมนย่อยที่กำหนดเอง
การกำหนดเส้นทาง URL
มัลติเพล็กซ์พอร์ต TCP
กำลังเชื่อมต่อกับ frps ผ่าน PROXY
การทำแผนที่ช่วงพอร์ต
ปลั๊กอินไคลเอนต์
เซิร์ฟเวอร์จัดการปลั๊กอิน
เกตเวย์อุโมงค์ SSH
โครงการที่เกี่ยวข้อง
มีส่วนร่วม
บริจาค
ผู้สนับสนุน GitHub
เพย์พาล
frp อยู่ระหว่างการพัฒนา คุณสามารถลองใช้เวอร์ชันล่าสุดได้ในสาขา master
หรือใช้สาขา dev
เพื่อเข้าถึงเวอร์ชันที่กำลังพัฒนาอยู่
ขณะนี้เรากำลังดำเนินการกับเวอร์ชัน 2 และพยายามปรับเปลี่ยนโครงสร้างและปรับปรุงโค้ดบางส่วน อย่างไรก็ตาม โปรดทราบว่าจะไม่สามารถใช้งานร่วมกับเวอร์ชัน 1 ได้
เราจะเปลี่ยนจากเวอร์ชัน 0 เป็นเวอร์ชัน 1 ในเวลาที่เหมาะสม และจะยอมรับเฉพาะการแก้ไขข้อบกพร่องและการปรับปรุง แทนที่จะเป็นคำขอคุณลักษณะขนาดใหญ่
ความซับซ้อนและความยากของเวอร์ชัน v2 นั้นสูงกว่าที่คาดไว้มาก ฉันสามารถพัฒนาได้เฉพาะในช่วงเวลาที่กระจัดกระจายเท่านั้น และการหยุดชะงักอย่างต่อเนื่องจะรบกวนประสิทธิภาพการผลิตอย่างมาก เมื่อพิจารณาจากสถานการณ์นี้ เราจะเพิ่มประสิทธิภาพและทำซ้ำเวอร์ชันปัจจุบันต่อไปจนกว่าเราจะมีเวลาว่างมากขึ้นเพื่อดำเนินการยกเครื่องเวอร์ชันหลักต่อไป
แนวคิดเบื้องหลัง v2 นั้นอิงจากประสบการณ์หลายปีและการไตร่ตรองของฉันในโดเมนแบบคลาวด์เนทีฟ โดยเฉพาะใน K8 และ ServiceMesh แกนกลางของมันคือพร็อกซีสี่ชั้นและเจ็ดชั้นที่ทันสมัย คล้ายกับทูต พร็อกซีนี้สามารถปรับขนาดได้สูง ไม่เพียงแต่สามารถนำฟังก์ชันการทำงานของการเจาะอินทราเน็ตไปใช้เท่านั้น แต่ยังใช้ได้กับโดเมนอื่นๆ อีกด้วย จากคอร์ที่สามารถปรับขนาดได้สูงนี้ เรามุ่งมั่นที่จะนำความสามารถทั้งหมดของ frp v1 ไปใช้ในขณะเดียวกันก็จัดการกับฟังก์ชันการทำงานที่ไม่สามารถทำได้ก่อนหน้านี้หรือยากที่จะนำไปใช้ในลักษณะที่หรูหรา นอกจากนี้ เราจะรักษาความสามารถในการพัฒนาและการทำซ้ำที่มีประสิทธิภาพ
นอกจากนี้ ฉันจินตนาการว่า frp จะกลายเป็นระบบและแพลตฟอร์มที่สามารถขยายได้สูง คล้ายกับวิธีที่เราสามารถมอบความสามารถในการขยายที่หลากหลายโดยอิงจาก K8 ใน K8 เราสามารถปรับแต่งการพัฒนาได้ตามความต้องการขององค์กร โดยใช้คุณสมบัติต่างๆ เช่น CRD, โหมดคอนโทรลเลอร์, webhook, CSI และ CNI ใน frp v1 เราได้แนะนำแนวคิดของปลั๊กอินเซิร์ฟเวอร์ ซึ่งใช้ความสามารถในการขยายพื้นฐานบางอย่าง อย่างไรก็ตาม มันต้องใช้โปรโตคอล HTTP แบบธรรมดา และกำหนดให้ผู้ใช้เริ่มต้นกระบวนการอิสระและจัดการด้วยตนเอง แนวทางนี้ไม่มีความยืดหยุ่นและความสะดวกสบาย และความต้องการในโลกแห่งความเป็นจริงก็แตกต่างกันอย่างมาก มันไม่สมจริงเลยที่จะคาดหวังว่าโครงการโอเพ่นซอร์สที่ไม่หวังผลกำไรจะดูแลโดยบุคคลเพียงไม่กี่คนเพื่อตอบสนองความต้องการของทุกคน
สุดท้ายนี้ เรารับทราบว่าการออกแบบโมดูลในปัจจุบัน เช่น การจัดการการกำหนดค่า การตรวจสอบสิทธิ์ การจัดการใบรับรอง และการจัดการ API ยังไม่ทันสมัยเพียงพอ แม้ว่าเราอาจดำเนินการปรับแต่งบางอย่างในเวอร์ชัน v1 แต่การรับรองว่าความเข้ากันได้ยังคงเป็นปัญหาที่ท้าทายซึ่งต้องใช้ความพยายามอย่างมากในการแก้ไข
เราขอขอบคุณสำหรับการสนับสนุน frp ของคุณอย่างจริงใจ
ในการเริ่มต้น ให้ดาวน์โหลดโปรแกรมล่าสุดสำหรับระบบปฏิบัติการและสถาปัตยกรรมของคุณจากหน้าเผยแพร่
จากนั้น วางไฟล์การกำหนดค่าไบนารี frps
และเซิร์ฟเวอร์บนเซิร์ฟเวอร์ A ซึ่งมีที่อยู่ IP สาธารณะ
สุดท้าย วางไฟล์การกำหนดค่าไบนารี่ frpc
และไคลเอนต์บนเซิร์ฟเวอร์ B ซึ่งอยู่บน LAN ที่ไม่สามารถเข้าถึงได้โดยตรงจากอินเทอร์เน็ตสาธารณะ
โปรแกรมป้องกันไวรัสบางตัวทำเครื่องหมาย frpc ว่าเป็นมัลแวร์อย่างไม่เหมาะสมและลบออก นี่เป็นเพราะ frp เป็นเครื่องมือเครือข่ายที่สามารถสร้างพร็อกซีย้อนกลับได้ บางครั้งแอนติไวรัสจะตั้งค่าสถานะพร็อกซีแบบย้อนกลับเนื่องจากความสามารถในการข้ามข้อจำกัดพอร์ตไฟร์วอลล์ หากคุณใช้โปรแกรมป้องกันไวรัส คุณอาจต้องอนุญาตพิเศษ/ยกเว้น frpc ในการตั้งค่าโปรแกรมป้องกันไวรัสเพื่อหลีกเลี่ยงการกักกัน/การลบโดยไม่ตั้งใจ ดูปัญหา 3637 สำหรับรายละเอียดเพิ่มเติม
แก้ไข frps.toml
บนเซิร์ฟเวอร์ A โดยการตั้งค่า bindPort
สำหรับไคลเอนต์ frp เพื่อเชื่อมต่อกับ:
# frps.tomlbindPort = 7000
เริ่ม frps
บนเซิร์ฟเวอร์ A:
./frps -c ./frps.toml
แก้ไข frpc.toml
บนเซิร์ฟเวอร์ B และตั้งค่าฟิลด์ serverAddr
เป็นที่อยู่ IP สาธารณะของเซิร์ฟเวอร์ frps ของคุณ:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
โปรดทราบว่า localPort
(ฟังบนไคลเอนต์) และ remotePort
(เปิดเผยบนเซิร์ฟเวอร์) ใช้สำหรับการรับส่งข้อมูลที่เข้าและออกจากระบบ frp ในขณะที่ serverPort
ใช้สำหรับการสื่อสารระหว่าง frps และ frpc
เริ่ม frpc
บนเซิร์ฟเวอร์ B:
./frpc -c ./frpc.toml
หากต้องการเข้าถึงเซิร์ฟเวอร์ B จากเครื่องอื่นผ่านเซิร์ฟเวอร์ A ผ่าน SSH (สมมติว่าชื่อผู้ใช้คือ test
) ให้ใช้คำสั่งต่อไปนี้:
ssh -oPort=6000 test@xxxx
ตัวอย่างนี้ใช้บริการ SSH หลายบริการที่เปิดเผยผ่านพอร์ตเดียวกันโดยใช้พร็อกซีประเภท tcpmux ในทำนองเดียวกัน ตราบใดที่ไคลเอนต์รองรับวิธีการเชื่อมต่อพร็อกซี HTTP Connect คุณสามารถใช้พอร์ตซ้ำได้ด้วยวิธีนี้
ปรับใช้ frps บนเครื่องที่มี IP สาธารณะและแก้ไขไฟล์ frps.toml นี่คือการกำหนดค่าแบบง่าย:
bindPort = 7000tcpmuxHTTPConnectPort = 5002
ปรับใช้ frpc บนเครื่องภายใน A ด้วยการกำหนดค่าต่อไปนี้:
serverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "ssh1"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["machine-a.example.com"]localIP = "127.0.0.1"localPort = 22
ปรับใช้ frpc อื่นบนเครื่องภายใน B ด้วยการกำหนดค่าต่อไปนี้:
serverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "ssh2"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["machine-b.example.com"]localIP = "127.0.0.1"localPort = 22
ในการเข้าถึงเครื่องภายใน A โดยใช้ SSH ProxyCommand โดยสมมติว่าชื่อผู้ใช้คือ "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
และตั้งค่าพอร์ต HTTP สำหรับ vhost เป็น 8080:
# frps.tomlbindPort = 7000vhostHTTPPort = 8080
หากคุณต้องการกำหนดค่าพร็อกซี https คุณต้องตั้งค่า vhostHTTPSPort
เริ่ม frps
:
./frps -c ./frps.toml
แก้ไข frpc.toml
และตั้งค่า serverAddr
เป็นที่อยู่ IP ของเซิร์ฟเวอร์ frps ระยะไกล ระบุ localPort
ของบริการเว็บของคุณ:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "web"type = "http"localPort = 80customDomains = ["www.example.com"]
เริ่ม frpc
:
./frpc -c ./frpc.toml
แมปบันทึก A ของ www.example.com
กับ IP สาธารณะของเซิร์ฟเวอร์ frps ระยะไกลหรือบันทึก CNAME ที่ชี้ไปยังโดเมนเดิมของคุณ
เยี่ยมชมบริการเว็บในพื้นที่ของคุณโดยใช้ url http://www.example.com:8080
แก้ไข frps.toml
:
# frps.tomlbindPort = 7000
เริ่ม frps
:
./frps -c ./frps.toml
แก้ไข frpc.toml
และตั้งค่า serverAddr
เป็นที่อยู่ IP ของเซิร์ฟเวอร์ frps ระยะไกล ส่งต่อคำขอค้นหา DNS ไปยังเซิร์ฟเวอร์ Google Public DNS 8.8.8.8:53
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "dns"type = "udp"localIP = "8.8.8.8"localPort = 53remotePort = 6000
เริ่ม frpc:
./frpc -c ./frpc.toml
ทดสอบความละเอียด DNS โดยใช้คำสั่ง dig
:
dig @xxxx -p 6000 www.google.com
เปิดเผยซ็อกเก็ตโดเมน Unix (เช่นซ็อกเก็ต Docker daemon) เป็น TCP
กำหนดค่า frps
ดังข้างต้น
เริ่ม frpc
ด้วยการกำหนดค่าต่อไปนี้:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "unix_domain_socket"type = "tcp"remotePort = 6000[proxies.plugin]type = "unix_domain_socket"unixPath = "/var/run/docker.sock "
ทดสอบการกำหนดค่าโดยรับเวอร์ชันนักเทียบท่าโดยใช้ curl
:
curl http://xxxx:6000/version
เปิดเผยเซิร์ฟเวอร์ไฟล์ HTTP อย่างง่ายเพื่อเข้าถึงไฟล์ที่จัดเก็บไว้ใน LAN จากอินเทอร์เน็ตสาธารณะ
กำหนดค่า frps
ตามที่อธิบายไว้ข้างต้น จากนั้น:
เริ่ม frpc
ด้วยการกำหนดค่าต่อไปนี้:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "test_static_file"type = "tcp"remotePort = 6000[proxies.plugin]type = "static_file"localPath = "/tmp/files"stripPrefix = " คงที่"httpUser = "abc"httpPassword = "abc"
ไปที่ http://xxxx:6000/static/
จากเบราว์เซอร์ของคุณและระบุชื่อผู้ใช้และรหัสผ่านที่ถูกต้องเพื่อดูไฟล์ใน /tmp/files
บนเครื่อง frpc
คุณสามารถแทนที่ https2https
สำหรับปลั๊กอิน และชี้ localAddr
ไปยังจุดสิ้นสุด HTTPS
เริ่ม frpc
ด้วยการกำหนดค่าต่อไปนี้:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]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 (Secret TCP) ต้องใช้คีย์ที่แชร์ล่วงหน้าเพื่อใช้ในการเข้าถึงบริการจากไคลเอนต์อื่น
กำหนดค่า frps
เช่นเดียวกับด้านบน
เริ่ม frpc
บนเครื่อง B ด้วยการกำหนดค่าต่อไปนี้ ตัวอย่างนี้มีไว้สำหรับการเปิดเผยบริการ SSH (พอร์ต 22) และจดบันทึกฟิลด์ secretKey
สำหรับคีย์ที่แชร์ล่วงหน้า และฟิลด์ remotePort
จะถูกลบออกที่นี่:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "secret_ssh"type = "stcp"secretKey = "abcdefg"localIP = "127.0.0.1"localPort = 22
เริ่มต้น frpc
อื่น (โดยทั่วไปบนเครื่อง C อื่น) ด้วยการกำหนดค่าต่อไปนี้เพื่อเข้าถึงบริการ SSH ด้วยรหัสความปลอดภัย (ฟิลด์ secretKey
):
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[ผู้เยี่ยมชม]]name = "secret_ssh_visitor"type = "stcp"serverName = "secret_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = 6000
บนเครื่อง C ให้เชื่อมต่อกับ SSH บนเครื่อง B โดยใช้คำสั่งนี้:
ssh -oPort=6000 127.0.0.1
xtcp ได้รับการออกแบบมาเพื่อส่งข้อมูลจำนวนมากระหว่างไคลเอนต์โดยตรง ยังคงจำเป็นต้องใช้เซิร์ฟเวอร์ frps เนื่องจาก P2P ในที่นี้หมายถึงการส่งข้อมูลจริงเท่านั้น
โปรดทราบว่าอาจไม่ทำงานกับอุปกรณ์ NAT ทุกประเภท คุณอาจต้องการใช้ทางเลือกกลับเป็น stcp หาก xtcp ไม่ทำงาน
เริ่ม frpc
บนเครื่อง B และเปิดเผยพอร์ต SSH โปรดทราบว่าฟิลด์ remotePort
จะถูกลบออก:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# ตั้งค่าเซิร์ฟเวอร์ stun ใหม่หากไม่มีเซิร์ฟเวอร์เริ่มต้น# natHoleStunServer = "xxx "[[พรอกซี]]name = "p2p_ssh"type = "xtcp"secretKey = " abcdefg"localIP = "127.0.0.1"localPort = 22
เริ่ม frpc
อื่น (โดยทั่วไปบนเครื่อง C อื่น) ด้วยการกำหนดค่าเพื่อเชื่อมต่อกับ SSH โดยใช้โหมด P2P:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# ตั้งค่าเซิร์ฟเวอร์ stun ใหม่ หากไม่มีเซิร์ฟเวอร์เริ่มต้น# natHoleStunServer = "xxx "[[visitors]]name = "p2p_ssh_visitor"type = "xtcp"serverName = " p2p_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = 6000# เมื่อจำเป็นต้องมีการคงอยู่ของช่องสัญญาณอัตโนมัติ ให้ตั้งค่าเป็น truekeepTunnelOpen = false
บนเครื่อง C ให้เชื่อมต่อกับ SSH บนเครื่อง B โดยใช้คำสั่งนี้:
ssh -oPort=6000 127.0.0.1
ตั้งแต่เวอร์ชัน 0.52.0 เรารองรับ TOML, YAML และ JSON สำหรับการกำหนดค่า โปรดทราบว่า INI เลิกใช้แล้วและจะถูกลบออกในรุ่นต่อๆ ไป คุณลักษณะใหม่จะมีเฉพาะใน TOML, YAML หรือ JSON เท่านั้น ผู้ใช้ที่ต้องการคุณสมบัติใหม่เหล่านี้ควรเปลี่ยนรูปแบบการกำหนดค่าตามนั้น
อ่านไฟล์การกำหนดค่าตัวอย่างแบบเต็มเพื่อดูคุณสมบัติอื่นๆ ที่ไม่ได้อธิบายไว้ที่นี่
ตัวอย่างใช้รูปแบบ TOML แต่คุณยังคงใช้ YAML หรือ JSON ได้
ไฟล์การกำหนดค่าเหล่านี้ใช้สำหรับการอ้างอิงเท่านั้น กรุณาอย่าใช้การกำหนดค่านี้โดยตรงในการรันโปรแกรม เนื่องจากอาจมีปัญหาต่างๆ
ไฟล์การกำหนดค่าแบบเต็มสำหรับ frps (เซิร์ฟเวอร์)
ไฟล์การกำหนดค่าแบบเต็มสำหรับ frpc (ไคลเอนต์)
ตัวแปรสภาพแวดล้อมสามารถอ้างอิงได้ในไฟล์กำหนดค่า โดยใช้รูปแบบมาตรฐานของ Go:
# frpc.tomlserverAddr = "{{ .Envs.FRP_SERVER_ADDR }}"serverPort = 7000[[พรอกซี]]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
จะแสดงเทมเพลตไฟล์การกำหนดค่าโดยใช้ตัวแปรสภาพแวดล้อมระบบปฏิบัติการ อย่าลืมนำหน้าการอ้างอิงของคุณด้วย .Envs
คุณสามารถแยกการกำหนดค่าพร็อกซีหลายรายการออกเป็นไฟล์ต่างๆ และรวมไว้ในไฟล์หลักได้
# frpc.tomlserverAddr = "xxxx"serverPort = 7000includes = ["./confd/*.toml"]
# ./confd/test.toml[[พรอกซี]]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
นอกจากนี้ คุณสามารถใช้พอร์ต HTTPS ได้โดยใช้ไวด์การ์ดโดเมนของคุณหรือใบรับรอง SSL ปกติ:
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 = "ผู้ดูแลระบบ"webServer.password = "ผู้ดูแลระบบ"
จากนั้นไปที่ http://127.0.0.1:7400
เพื่อดู UI ผู้ดูแลระบบ โดยมีชื่อผู้ใช้และรหัสผ่านเป็น admin
ทั้งคู่
เมื่อเปิดใช้งานเว็บเซิร์ฟเวอร์ frps จะบันทึกข้อมูลการตรวจสอบในแคชเป็นเวลา 7 วัน มันจะถูกล้างหลังจากรีสตาร์ทกระบวนการ
รองรับ Prometheus ด้วย
เปิดใช้งานแดชบอร์ดก่อน จากนั้นกำหนดค่า enablePrometheus = true
ใน frps.toml
http://{dashboard_addr}/metrics
จะให้ข้อมูลการตรวจสอบโพร
มีวิธีการรับรองความถูกต้อง 2 วิธีในการตรวจสอบสิทธิ์ frpc ด้วย frps
คุณสามารถเลือกได้ว่าจะใช้อันไหนโดยกำหนด auth.method
ใน frpc.toml
และ frps.toml
โดยค่าเริ่มต้นคือโทเค็น
การกำหนดค่า auth.additionalScopes = ["HeartBeats"]
จะใช้วิธีการรับรองความถูกต้องที่กำหนดค่าไว้เพื่อเพิ่มและตรวจสอบความถูกต้องของทุกการเต้นของหัวใจระหว่าง frpc และ frps
การกำหนดค่า auth.additionalScopes = ["NewWorkConns"]
จะทำเช่นเดียวกันสำหรับการเชื่อมต่องานใหม่ทุกครั้งระหว่าง frpc และ frps
เมื่อระบุ auth.method = "token"
ใน frpc.toml
และ frps.toml
- จะใช้การตรวจสอบสิทธิ์แบบโทเค็น
ตรวจสอบให้แน่ใจว่าได้ระบุ auth.token
เดียวกันใน frps.toml
และ frpc.toml
เพื่อให้ frpc ผ่านการตรวจสอบ frps
เมื่อระบุ auth.method = "oidc"
ใน frpc.toml
และ frps.toml
- จะใช้การตรวจสอบสิทธิ์แบบ OIDC
OIDC ย่อมาจาก OpenID Connect และโฟลว์ที่ใช้เรียกว่า Client Credentials Grant
หากต้องการใช้ประเภทการตรวจสอบสิทธิ์นี้ - กำหนดค่า 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[[พรอกซี]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.useEncryption = truetransport.useCompression = true
ตั้งแต่เวอร์ชัน 0.50.0 ค่าเริ่มต้นของ transport.tls.enable
และ transport.tls.disableCustomTLSFirstByte
ได้ถูกเปลี่ยนเป็น True และ tls จะถูกเปิดใช้งานตามค่าเริ่มต้น
สำหรับพอร์ตมัลติเพล็กซ์ frp จะส่งไบต์แรก 0x17
เพื่อหมุนการเชื่อมต่อ TLS สิ่งนี้จะมีผลเมื่อคุณตั้งค่า transport.tls.disableCustomTLSFirstByte
เป็นเท็จเท่านั้น
หากต้องการ บังคับใช้ frps
ให้ยอมรับเฉพาะการเชื่อมต่อ TLS - กำหนดค่า transport.tls.force = true
ใน frps.toml
นี่เป็นทางเลือก
การตั้งค่า 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 รายอื่น)
หากคุณใช้ frp
ผ่านที่อยู่ IP และไม่ใช่ชื่อโฮสต์ ตรวจสอบให้แน่ใจว่าได้ตั้งค่าที่อยู่ IP ที่เหมาะสมในพื้นที่ Subject Alternative Name (SAN) เมื่อสร้างใบรับรอง SSL/TLS
ยกตัวอย่าง:
เตรียมไฟล์กำหนดค่า openssl มีอยู่ที่ /etc/pki/tls/openssl.cnf
ในระบบ Linux และ /System/Library/OpenSSL/openssl.cnf
ใน MacOS และคุณสามารถคัดลอกไปยังเส้นทางปัจจุบันได้ เช่น 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
สร้างใบรับรอง 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
สร้างใบรับรอง 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
ช่อง webServer
จำเป็นสำหรับการเปิดใช้งาน HTTP API:
# frpc.tomlwebServer.addr = "127.0.0.1"webServer.port = 7400
จากนั้นรันคำสั่ง frpc reload -c ./frpc.toml
และรอประมาณ 10 วินาทีเพื่อให้ frpc
สร้างหรืออัปเดตหรือลบพรอกซี
โปรดทราบว่าพารามิเตอร์ไคลเอนต์ส่วนกลางจะไม่ได้รับการแก้ไขยกเว้น 'เริ่มต้น'
คุณสามารถเรียกใช้คำสั่ง frpc verify -c ./frpc.toml
ก่อนที่จะโหลดซ้ำเพื่อตรวจสอบว่ามีข้อผิดพลาดในการกำหนดค่าหรือไม่
ใช้ frpc status -c ./frpc.toml
เพื่อรับสถานะของพรอกซีทั้งหมด ช่อง webServer
จำเป็นสำหรับการเปิดใช้งาน HTTP API
allowPorts
ใน frps.toml
ใช้เพื่อหลีกเลี่ยงการใช้พอร์ตในทางที่ผิด:
# frps.tomlallowPorts = [ { เริ่มต้น = 2,000, สิ้นสุด = 3,000 }, { เดี่ยว = 3001 }, { เดี่ยว = 3003 }, { เริ่มต้น = 4000 สิ้นสุด = 50000 } -
vhostHTTPPort
และ vhostHTTPSPort
ใน frps สามารถใช้พอร์ตเดียวกันกับ bindPort
ได้ frps จะตรวจจับโปรโตคอลของการเชื่อมต่อและจัดการตามนั้น
สิ่งที่คุณต้องใส่ใจก็คือ หากคุณต้องการกำหนดค่า vhostHTTPSPort
และ bindPort
ไปยังพอร์ตเดียวกัน คุณต้องตั้ง transport.tls.disableCustomTLSFirstByte
เป็น false ก่อน
เราอยากจะลองอนุญาตให้พรอกซีหลายตัวเชื่อมโยงพอร์ตระยะไกลเดียวกันกับโปรโตคอลที่แตกต่างกันในอนาคต
# frpc.toml[[พรอกซี]]ชื่อ = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.bandwidthLimit = "1MB"
ตั้งค่า transport.bandwidthLimit
ในการกำหนดค่าของพร็อกซีแต่ละรายการเพื่อเปิดใช้งานคุณลักษณะนี้ หน่วยที่รองรับคือ MB
และ KB
ตั้งค่า transport.bandwidthLimitMode
เป็น client
หรือ server
เพื่อจำกัดแบนด์วิดท์บนฝั่งไคลเอ็นต์หรือเซิร์ฟเวอร์ ค่าเริ่มต้นคือ client
frp รองรับ tcp stream multiplexing ตั้งแต่ v0.10.0 เช่น HTTP2 Multiplexing ซึ่งในกรณีนี้การเชื่อมต่อลอจิกทั้งหมดไปยัง frpc เดียวกันจะถูก multiplexed เป็นการเชื่อมต่อ TCP เดียวกัน
คุณสามารถปิดการใช้งานคุณสมบัตินี้ได้โดยแก้ไข frps.toml
และ frpc.toml
:
# frps.toml และ frpc.toml ต้องเป็น Sametransport.tcpMux = false
KCP เป็นโปรโตคอลที่รวดเร็วและเชื่อถือได้ซึ่งสามารถบรรลุผลการส่งข้อมูลโดยการลดเวลาแฝงโดยเฉลี่ยลง 30% ถึง 40% และลดความล่าช้าสูงสุดลงได้สามเท่าโดยมีค่าใช้จ่ายแบนด์วิดท์ที่สิ้นเปลืองมากขึ้น 10% ถึง 20% กว่า TCP
โหมด KCP ใช้ UDP เป็นพาหนะพื้นฐาน การใช้ KCP ใน frp:
เปิดใช้งาน KCP ใน frps:
# frps.tomlbindPort = 7000# ระบุพอร์ต UDP สำหรับ KCP.kcpBindPort = 7000
หมายเลข kcpBindPort
สามารถเป็นหมายเลขเดียวกันกับ bindPort
ได้ เนื่องจากฟิลด์ bindPort
ระบุพอร์ต TCP
กำหนดค่า frpc.toml
เพื่อใช้ KCP เพื่อเชื่อมต่อกับ frps:
# frpc.tomlserverAddr = "xxxx"# เหมือนกับ 'kcpBindPort' ใน frps.tomlserverPort = 7000transport.protocol = "kcp"
QUIC คือการขนส่งแบบมัลติเพล็กซ์ใหม่ที่สร้างขึ้นบน UDP
ใช้ QUIC ใน frp:
เปิดใช้งาน QUIC ใน frps:
# frps.tomlbindPort = 7000# ระบุพอร์ต UDP สำหรับ QUIC.quicBindPort = 7000
หมายเลข quicBindPort
สามารถเป็นหมายเลขเดียวกันกับ bindPort
ได้ เนื่องจากฟิลด์ bindPort
ระบุพอร์ต TCP
กำหนดค่า frpc.toml
เพื่อใช้ QUIC เพื่อเชื่อมต่อกับ frps:
# frpc.tomlserverAddr = "xxxx"# เหมือนกับ 'quicBindPort' ใน frps.tomlserverPort = 7000transport.protocol = "quic"
ตามค่าเริ่มต้น frps จะสร้างการเชื่อมต่อ frpc ใหม่ไปยังบริการแบ็กเอนด์ตามคำขอของผู้ใช้ ด้วยการรวมการเชื่อมต่อ frps จะรักษาการเชื่อมต่อที่กำหนดไว้ล่วงหน้าจำนวนหนึ่ง ช่วยลดเวลาที่ต้องใช้ในการสร้างการเชื่อมต่อ
คุณสมบัตินี้เหมาะสำหรับการเชื่อมต่อระยะสั้นจำนวนมาก
กำหนดค่าขีดจำกัดจำนวนพูลที่แต่ละพร็อกซีสามารถใช้ได้ใน frps.toml
:
# frps.tomltransport.maxPoolCount = 5
เปิดใช้งานและระบุจำนวนพูลการเชื่อมต่อ:
# frpc.tomltransport.poolCount = 1
โหลดบาลานซ์ได้รับการสนับสนุนโดย group
คุณลักษณะนี้ใช้ได้เฉพาะกับประเภท tcp
, http
, tcpmux
ในขณะนี้
# frpc.toml[[พรอกซี]]name = "test1"type = "tcp"localPort = 8080remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123 "[[พรอกซี]]name = "test2"type = " tcp"localPort = 8081remotePort = 80loadBalancer.group = "เว็บ"loadBalancer.groupKey = "123"
loadBalancer.groupKey
ใช้สำหรับการตรวจสอบสิทธิ์
การเชื่อมต่อกับพอร์ต 80 จะถูกส่งไปยังพร็อกซีในกลุ่มเดียวกันแบบสุ่ม
สำหรับประเภท tcp
นั้น remotePort
ในกลุ่มเดียวกันควรเหมือนกัน
สำหรับประเภท http
, customDomains
, subdomain
locations
ควรจะเหมือนกัน
คุณสมบัติการตรวจสอบสภาพสามารถช่วยให้คุณมีความพร้อมใช้งานสูงด้วยการทำโหลดบาลานซ์
เพิ่ม healthCheck.type = "tcp"
หรือ healthCheck.type = "http"
เพื่อเปิดใช้งานการตรวจสุขภาพ
ด้วยประเภทการตรวจสุขภาพ tcp พอร์ตบริการจะถูก ping (TCPing):
# frpc.toml[[พรอกซี]]name = "test1"type = "tcp"localPort = 22remotePort = 6000# เปิดใช้งานการตรวจสอบสุขภาพ TCPhealthCheck.type = "tcp"# TCPing หมดเวลาวินาทีhealthCheck.timeoutSeconds = 3# หากการตรวจสอบสุขภาพล้มเหลว 3 ครั้ง ติดต่อกัน พร็อกซีจะถูกลบออกจาก frpshealthCheck.maxFailed = 3# การตรวจสุขภาพทุกๆ 10 วินาทีhealthCheck.intervalSeconds = 10
ด้วยประเภทการตรวจสุขภาพ http คำขอ HTTP จะถูกส่งไปยังบริการและคาดว่าจะตอบสนอง HTTP 2xx OK:
# frpc.toml[[พรอกซี]]name = "web"type = "http"localIP = "127.0.0.1"localPort = 80customDomains = ["test.example.com"]# เปิดใช้งานการตรวจสอบสุขภาพ HTTPhealthCheck.type = "http" # frpc จะส่งคำขอ GET ไปที่ '/status'# และคาดว่าจะมี HTTP 2xx OK responsehealthCheck.path = "/status"healthCheck.timeoutSeconds = 3healthCheck.maxFailed = 3healthCheck.intervalSeconds = 10
ตามค่าเริ่มต้น frp จะไม่แก้ไขคำขอ HTTP แบบช่องสัญญาณเลย เนื่องจากเป็นการคัดลอกแบบไบต์ต่อไบต์
อย่างไรก็ตาม เมื่อพูดถึงเว็บเซิร์ฟเวอร์และคำขอ HTTP เว็บเซิร์ฟเวอร์ของคุณอาจใช้ส่วนหัว Host
HTTP เพื่อกำหนดเว็บไซต์ที่จะเข้าถึง frp สามารถเขียนส่วนหัว Host
ใหม่ได้เมื่อส่งต่อคำขอ HTTP โดยมีฟิลด์ hostHeaderRewrite
:
# frpc.toml[[พรอกซี]]name = "เว็บ"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[[พรอกซี]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"requestHeaders.set.x-from-where = "frp"responseHeaders.set.foo = "บาร์"
ในตัวอย่างนี้ จะตั้งค่าส่วนหัว x-from-where: frp
ในคำขอ HTTP และ foo: bar
ในการตอบกลับ HTTP
คุณลักษณะนี้มีไว้สำหรับพร็อกซี http
หรือพร็อกซีที่เปิดใช้งานปลั๊กอิน https2http
และ https2https
คุณสามารถรับ IP จริงของผู้ใช้ได้จากส่วนหัวคำขอ HTTP X-Forwarded-For
frp รองรับ Proxy Protocol เพื่อส่ง IP จริงของผู้ใช้ไปยังบริการในพื้นที่ รองรับทุกประเภทยกเว้น UDP
นี่คือตัวอย่างสำหรับบริการ https:
# frpc.toml[[พรอกซี]]name = "web"type = "https"localPort = 443customDomains = ["test.example.com"]# ตอนนี้ v1 และ v2 ได้รับการสนับสนุนtransport.proxyProtocolVersion = "v2"
คุณสามารถเปิดใช้งานการสนับสนุน Proxy Protocol ใน nginx เพื่อแสดง IP จริงของผู้ใช้ในส่วนหัว HTTP X-Real-IP
จากนั้นอ่านส่วนหัว X-Real-IP
ในบริการเว็บของคุณสำหรับ IP จริง
ใครก็ตามที่สามารถเดา URL ช่องสัญญาณของคุณได้จะสามารถเข้าถึงเว็บเซิร์ฟเวอร์ในพื้นที่ของคุณได้ เว้นแต่คุณจะป้องกันด้วยรหัสผ่าน
สิ่งนี้บังคับใช้ HTTP Basic Auth กับคำขอทั้งหมดด้วยชื่อผู้ใช้และรหัสผ่านที่ระบุในไฟล์กำหนดค่าของ frpc
สามารถเปิดใช้งานได้เฉพาะเมื่อประเภทพรอกซีเป็น http
# frpc.toml[[พรอกซี]]name = "เว็บ"type = "http"localPort = 80customDomains = ["test.example.com"]httpUser = "abc"httpPassword = "abc"
ไปที่ http://test.example.com
ในเบราว์เซอร์ และตอนนี้คุณจะได้รับแจ้งให้ป้อนชื่อผู้ใช้และรหัสผ่าน
สะดวกในการใช้การกำหนด subdomain
สำหรับประเภท http และ https เมื่อมีคนจำนวนมากแชร์เซิร์ฟเวอร์ frps เดียว
# frps.tomlsubDomainHost = "frps.com"
แก้ไข *.frps.com
เป็น IP ของเซิร์ฟเวอร์ frps โดยปกติจะเรียกว่าระเบียน Wildcard DNS
# frpc.toml[[พรอกซี]]name = "เว็บ"type = "http"localPort = 80subdomain = "ทดสอบ"
ตอนนี้คุณสามารถเยี่ยมชมบริการเว็บของคุณได้ที่ test.frps.com
โปรดทราบว่าหาก subdomainHost
ไม่ว่างเปล่า customDomains
ก็ไม่ควรเป็นโดเมนย่อยของ subdomainHost
frp รองรับการส่งต่อคำขอ HTTP ไปยังบริการเว็บแบ็กเอนด์ที่แตกต่างกันโดยการกำหนดเส้นทาง URL
locations
ระบุคำนำหน้าของ URL ที่ใช้สำหรับการกำหนดเส้นทาง frps ค้นหาตำแหน่งคำนำหน้าที่เฉพาะเจาะจงที่สุดก่อนซึ่งกำหนดโดยสตริงตัวอักษรโดยไม่คำนึงถึงลำดับที่แสดง
# frpc.toml[[พรอกซี]]name = "web01"type = "http"localPort = 80customDomains = ["web.example.com"]locations = ["/"] [[พรอกซี]]name = "web02"type = "http"localPort = 81customDomains = ["web.example.com"]locations = ["/news", "/about"]
คำขอ HTTP ที่มีคำนำหน้า URL /news
หรือ /about
จะถูกส่งต่อไปยัง web02 และคำขออื่นๆ ไปยัง web01
frp รองรับการรับซ็อกเก็ต TCP ที่ส่งตรงไปยังพร็อกซีที่แตกต่างกันบนพอร์ตเดียวบน frps คล้ายกับ vhostHTTPPort
และ vhostHTTPSPort
วิธีการมัลติเพล็กซ์พอร์ต TCP ที่รองรับที่มีอยู่ในขณะนี้คือ httpconnect
- HTTP CONNECT tunnel
เมื่อตั้งค่า tcpmuxHTTPConnectPort
เป็นอย่างอื่นที่ไม่ใช่ 0 ใน frps frps จะรับฟังพอร์ตนี้สำหรับคำขอ HTTP CONNECT
โฮสต์ของคำขอ HTTP CONNECT จะถูกใช้เพื่อจับคู่พร็อกซีใน frps โฮสต์พร็อกซีสามารถกำหนดค่าใน frpc ได้โดยการกำหนดค่า customDomains
และ / หรือ subdomain
ภายใต้พร็อกซี tcpmux
เมื่อ multiplexer = "httpconnect"
ตัวอย่างเช่น:
# frps.tomlbindPort = 7000tcpmuxHTTPConnectPort = 1337
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[พรอกซี]]name = "proxy1"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["test1"]localPort = 80[[พรอกซี]]name = "proxy2 "type = "tcpmux"multiplexer = "httpconnect"customDomains = ["test2"]localPort = 8080
ในการกำหนดค่าข้างต้น - สามารถติดต่อ frps บนพอร์ต 1337 ด้วยส่วนหัว HTTP CONNECT เช่น:
CONNECT test1 HTTP/1.1rnrn
และการเชื่อมต่อจะถูกส่งไปยัง proxy1
frpc สามารถเชื่อมต่อกับ frps ผ่านพร็อกซีได้ หากคุณตั้งค่าตัวแปรสภาพแวดล้อมระบบปฏิบัติการ HTTP_PROXY
หรือหากตั้ง transport.proxyURL
ในไฟล์ frpc.toml
ใช้งานได้เฉพาะเมื่อโปรโตคอลเป็น tcp
# frpc.tomlserverAddr = "xxxx"serverPort = 7000transport.proxyURL = "http://user:[email protected]:8080"
เพิ่มใน v0.56.0
เราสามารถใช้ไวยากรณ์ช่วงของเทมเพลต Go รวมกับฟังก์ชัน parseNumberRangePair
ในตัวเพื่อให้ได้การแมปช่วงพอร์ต
ตัวอย่างต่อไปนี้ เมื่อรัน จะสร้างพรอกซี 8 ตัวชื่อ test-6000, test-6001 ... test-6007
โดยแต่ละอันจะแมปพอร์ตระยะไกลกับพอร์ตในเครื่อง
{{- 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[[พรอกซี]]ชื่อ = "http_proxy"type = "tcp"remotePort = 6000[พรอกซี.ปลั๊กอิน]ประเภท = "http_proxy"httpUser = "abc"httpPassword = "abc"
httpUser
และ httpPassword
เป็นพารามิเตอร์การกำหนดค่าที่ใช้ในปลั๊กอิน http_proxy
อ่านเอกสาร
ค้นหาปลั๊กอินเพิ่มเติมใน gofrp/plugin
เพิ่มใน v0.53.0
frp รองรับการฟังพอร์ต SSH ทางฝั่ง frps และบรรลุโปรโตคอล TCP พร็อกซีผ่านโปรโตคอล SSH -R โดยไม่ต้องอาศัย frpc
# frps.tomlsshTunnelGateway.bindPort = 2200
เมื่อรัน ./frps -c frps.toml
ไฟล์คีย์ส่วนตัวชื่อ .autogen_ssh_key
จะถูกสร้างขึ้นโดยอัตโนมัติในไดเร็กทอรีการทำงานปัจจุบัน ไฟล์คีย์ส่วนตัวที่สร้างขึ้นนี้จะถูกใช้โดยเซิร์ฟเวอร์ SSH ในรูปแบบ frps
การดำเนินการคำสั่ง
ssh -R :80:127.0.0.1:8080 v0@{ที่อยู่ frp} -p 2200 tcp --proxy_name "test-tcp" --remote_port 9090
ตั้งค่าพร็อกซีบน frps ที่ส่งต่อบริการ 8080 ในเครื่องไปยังพอร์ต 9090
frp (ผ่าน SSH) (Ctrl+C เพื่อออก) ผู้ใช้: ชื่อพร็อกซี: ทดสอบ TCP ประเภท: ทีซีพี ที่อยู่ระยะไกล: :9090
นี่เทียบเท่ากับ:
frpc tcp --proxy_name "ทดสอบ tcp" --local_ip 127.0.0.1 --local_port 8080 --remote_port 9090
โปรดดูเอกสารนี้สำหรับข้อมูลเพิ่มเติม
gofrp/plugin - พื้นที่เก็บข้อมูลสำหรับปลั๊กอิน frp ที่มีปลั๊กอินต่างๆ ที่ใช้งานตามกลไกส่วนขยาย frp ซึ่งตอบสนองความต้องการในการปรับแต่งในสถานการณ์ต่างๆ
gofrp/tiny-frpc - ไคลเอนต์ frp เวอร์ชันน้ำหนักเบา (อย่างน้อยประมาณ 3.5MB) ใช้งานโดยใช้โปรโตคอล ssh รองรับคุณสมบัติบางอย่างที่ใช้บ่อยที่สุด เหมาะสำหรับอุปกรณ์ที่มีทรัพยากรจำกัด
สนใจที่จะมีส่วนร่วมหรือไม่? เราอยากจะช่วยคุณ!
ดูรายการปัญหาของเราและพิจารณาส่ง Pull Request ไปที่ dev Branch
หากคุณต้องการเพิ่มคุณลักษณะใหม่ โปรดสร้างปัญหาก่อนเพื่ออธิบายคุณลักษณะใหม่ ตลอดจนแนวทางการใช้งาน เมื่อข้อเสนอได้รับการยอมรับ ให้สร้างการใช้งานคุณลักษณะใหม่และส่งเป็นคำขอดึง
ขออภัยสำหรับภาษาอังกฤษที่ไม่ดีของฉัน เรายินดีรับการปรับปรุงสำหรับเอกสารนี้ แม้กระทั่งการแก้ไขคำผิดบางประการ
หากคุณมีไอเดียดีๆ โปรดส่งอีเมลไปที่ [email protected]
หมายเหตุ: เราต้องการให้คุณให้คำแนะนำในประเด็นต่างๆ เพื่อให้ผู้ที่มีคำถามเดียวกันสามารถค้นหาได้อย่างรวดเร็ว และเราไม่จำเป็นต้องตอบคำถามซ้ำๆ
หาก frp ช่วยคุณได้มาก คุณสามารถสนับสนุนเราได้โดย:
สนับสนุนเราโดยผู้สนับสนุน Github
คุณสามารถวางโลโก้ของ บริษัท ไว้ในไฟล์ readme ของโครงการนี้
บริจาคเงินโดย PayPal ไปยังบัญชีของฉัน [email protected]