التمهيدي | 中文文档
frp هو مشروع مفتوح المصدر، وقد أصبح تطويره المستمر ممكنًا بالكامل بفضل دعم الرعاة الرائعين لدينا. إذا كنت ترغب في الانضمام إليهم، يرجى النظر في رعاية تطوير frp.
frp هو وكيل عكسي سريع يسمح لك بكشف خادم محلي موجود خلف NAT أو جدار الحماية على الإنترنت. وهو يدعم حاليًا TCP و UDP ، بالإضافة إلى بروتوكولات HTTP و HTTPS ، مما يتيح إعادة توجيه الطلبات إلى الخدمات الداخلية عبر اسم المجال.
يوفر frp أيضًا وضع اتصال P2P.
حالة التطوير
حول V2
بنيان
مثال الاستخدام
قم بالوصول إلى جهاز الكمبيوتر الخاص بك في شبكة LAN عبر SSH
خدمات SSH متعددة تشترك في نفس المنفذ
الوصول إلى خدمات الويب الداخلية باستخدام المجالات المخصصة في الشبكة المحلية
إعادة توجيه طلبات استعلام DNS
إعادة توجيه مقبس مجال Unix
كشف خادم ملفات HTTP بسيط
تمكين HTTPS لخدمة HTTP(S) المحلية
فضح خدمتك على انفراد
وضع P2P
سمات
HTTP X-Forwarded-For
بروتوكول الوكيل
لكل وكيل
TLS
مصادقة الرمز المميز
مصادقة OIDC
بروميثيوس
ملفات التكوين
استخدام متغيرات البيئة
تقسيم التكوينات إلى ملفات مختلفة
لوحة تحكم الخادم
واجهة المستخدم الادارية للعميل
شاشة
المصادقة على العميل
التشفير والضغط
إعادة تحميل تكوين frpc
الحصول على حالة الوكيل من العميل
السماح فقط بمنافذ معينة على الخادم
إعادة استخدام المنفذ
حد عرض النطاق الترددي
تعدد إرسال تيار TCP
دعم بروتوكول KCP
دعم بروتوكول كويك
تجمع الاتصال
موازنة التحميل
فحص صحة الخدمة
إعادة كتابة رأس مضيف HTTP
ضبط رؤوس HTTP الأخرى
احصل على IP حقيقي
يتطلب مصادقة HTTP الأساسية (كلمة المرور) لخدمات الويب
أسماء النطاقات الفرعية المخصصة
توجيه URL
تعدد منفذ TCP
الاتصال بـ frps عبر PROXY
رسم خرائط نطاق المنفذ
ملحقات العميل
إدارة الخادم المكونات الإضافية
بوابة نفق SSH
المشاريع ذات الصلة
المساهمة
هبة
رعاة جيثب
باي بال
فرب قيد التطوير حاليا. يمكنك تجربة أحدث إصدار في الفرع master
، أو استخدام فرع dev
للوصول إلى الإصدار قيد التطوير حاليًا.
نحن نعمل حاليًا على الإصدار 2 ونحاول تنفيذ بعض عمليات إعادة هيكلة التعليمات البرمجية والتحسينات. ومع ذلك، يرجى ملاحظة أنه لن يكون متوافقًا مع الإصدار 1.
سننتقل من الإصدار 0 إلى الإصدار 1 في الوقت المناسب ولن نقبل سوى إصلاحات الأخطاء والتحسينات، بدلاً من طلبات الميزات الكبيرة.
تعقيد وصعوبة الإصدار v2 أعلى بكثير مما كان متوقعًا. لا يمكنني العمل على تطويره إلا خلال فترات زمنية مجزأة، كما أن الانقطاعات المستمرة تعطل الإنتاجية بشكل كبير. نظرًا لهذا الموقف، سنستمر في تحسين الإصدار الحالي وتكراره حتى يتوفر لدينا المزيد من وقت الفراغ لمتابعة الإصلاح الشامل للإصدار.
يعتمد المفهوم الكامن وراء الإصدار الثاني على سنوات خبرتي وتفكيري في المجال السحابي الأصلي، خاصة في K8s وServiceMesh. جوهرها هو وكيل حديث من أربع طبقات وسبع طبقات، على غرار المبعوث. هذا الوكيل في حد ذاته قابل للتطوير بشكل كبير، وليس فقط قادرًا على تنفيذ وظيفة اختراق الإنترانت ولكنه ينطبق أيضًا على مجالات أخرى مختلفة. بناءً على هذا النواة القابلة للتطوير بدرجة كبيرة، نهدف إلى تنفيذ جميع إمكانيات frp v1 مع معالجة الوظائف التي لم يكن من الممكن تحقيقها أو كان من الصعب تنفيذها في السابق بطريقة أنيقة. علاوة على ذلك، سنحافظ على قدرات التطوير والتكرار الفعالة.
بالإضافة إلى ذلك، أتصور أن frp نفسه أصبح نظامًا ومنصة قابلة للتوسعة للغاية، على غرار الطريقة التي يمكننا بها توفير مجموعة من إمكانيات الامتداد بناءً على K8s. في K8s، يمكننا تخصيص التطوير وفقًا لاحتياجات المؤسسة، باستخدام ميزات مثل CRD ووضع التحكم وخطاف الويب وCSI وCNI. في frp v1، قدمنا مفهوم المكونات الإضافية للخادم، والتي نفذت بعض القابلية للتوسعة الأساسية. ومع ذلك، فهو يعتمد على بروتوكول HTTP بسيط ويتطلب من المستخدمين بدء عمليات مستقلة وإدارتها بأنفسهم. وهذا النهج أبعد ما يكون عن المرونة والملاءمة، وتختلف متطلبات العالم الحقيقي بشكل كبير. من غير الواقعي أن نتوقع من مشروع مفتوح المصدر غير ربحي يديره عدد قليل من الأفراد أن يلبي احتياجات الجميع.
أخيرًا، نحن نقر بأن التصميم الحالي للوحدات مثل إدارة التكوين والتحقق من الأذونات وإدارة الشهادات وإدارة واجهة برمجة التطبيقات ليس حديثًا بما فيه الكفاية. على الرغم من أننا قد نجري بعض التحسينات في الإصدار v1، إلا أن ضمان التوافق يظل يمثل مشكلة صعبة تتطلب قدرًا كبيرًا من الجهد لمعالجتها.
نحن نقدر بصدق دعمكم لـ frp.
للبدء، قم بتنزيل أحدث برنامج لنظام التشغيل والبنية الخاصة بك من صفحة الإصدار.
بعد ذلك، ضع ملف تكوين frps
الثنائي والخادم على الخادم A، الذي يحتوي على عنوان IP عام.
أخيرًا، ضع ملف تكوين frpc
الثنائي والعميل على الخادم B، الموجود على شبكة LAN لا يمكن الوصول إليها مباشرة من الإنترنت العام.
تقوم بعض برامج مكافحة الفيروسات بوضع علامة بشكل غير صحيح على frpc كبرامج ضارة ثم تقوم بحذفها. ويرجع ذلك إلى كون frp أداة شبكة قادرة على إنشاء وكلاء عكسيين. تقوم برامج مكافحة الفيروسات أحيانًا بوضع علامة على الوكلاء العكسيين نظرًا لقدرتها على تجاوز قيود منفذ جدار الحماية. إذا كنت تستخدم برنامج مكافحة فيروسات، فقد تحتاج إلى إضافة/استبعاد frpc إلى القائمة البيضاء في إعدادات برنامج مكافحة الفيروسات لديك لتجنب العزل/الحذف غير المقصود. وانظر العدد 3637 للمزيد من التفاصيل.
قم بتعديل frps.toml
على الخادم A عن طريق تعيين bindPort
لعملاء frp للاتصال بهم:
# فرببس.توملبيندبورت = 7000
بدء frps
على الخادم A:
./frps -c ./frps.toml
قم بتعديل frpc.toml
على الخادم B وقم بتعيين حقل serverAddr
على عنوان IP العام لخادم frps الخاص بك:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]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[[proxies]]name = "ssh1"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["machine-a.example.com"]localIP = "127.0.0.1"localPort = 22
انشر frpc آخر على الجهاز الداخلي B بالتكوين التالي:
serverAddr = "xxxx"serverPort = 7000[[proxies]]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، الاختلاف الوحيد هو اسم المجال، بافتراض أن اسم المستخدم هو "اختبار":
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[[proxies]]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
:
# فرببس.توملبيندبورت = 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[[proxies]]name = "dns"type = "udp"localIP = "8.8.8.8"localPort = 53remotePort = 6000
بدء فربك:
./frpc -c ./frpc.toml
اختبار دقة DNS باستخدام الأمر dig
:
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
:
curl http://xxxx:6000/version
كشف خادم ملفات 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 = " ثابت"httpUser = "abc"httpPassword = "abc"
تفضل بزيارة http://xxxx:6000/static/
من متصفحك وحدد اسم المستخدم وكلمة المرور الصحيحين لعرض الملفات في /tmp/files
على جهاز frpc
.
يمكنك استبدال 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 (Secret TCP) استخدام مفتاح مشترك مسبقًا للوصول إلى الخدمة من عملاء آخرين.
قم بتكوين frps
بنفس الطريقة المذكورة أعلاه.
ابدأ تشغيل frpc
على الجهاز B باستخدام التكوين التالي. هذا المثال مخصص لكشف خدمة SSH (المنفذ 22)، ولاحظ حقل secretKey
للمفتاح المشترك مسبقًا، وأنه تمت إزالة حقل remotePort
هنا:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "secret_ssh"type = "stcp"secretKey = "abcdefg"localIP = "127.0.0.1"localPort = 22
ابدأ تشغيل frpc
آخر (عادةً على جهاز آخر C) باستخدام التكوين التالي للوصول إلى خدمة SSH باستخدام مفتاح الأمان (حقل secretKey
):
# 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، اتصل بـ SSH على الجهاز B، باستخدام هذا الأمر:
ssh -oPort=6000 127.0.0.1
تم تصميم xtcp لنقل كميات كبيرة من البيانات مباشرة بين العملاء. لا تزال هناك حاجة إلى خادم frps، حيث يشير P2P هنا فقط إلى نقل البيانات الفعلي.
لاحظ أنه قد لا يعمل مع جميع أنواع أجهزة NAT. قد ترغب في الرجوع إلى stcp إذا لم يعمل xtcp.
ابدأ تشغيل frpc
على الجهاز B، واكشف عن منفذ SSH. لاحظ أنه تمت إزالة الحقل remotePort
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# قم بإعداد خادم مذهل جديد إذا كان الخادم الافتراضي غير متاح.# natHoleStunServer = "xxx"[[proxies]]name = "p2p_ssh"type = "xtcp"secretKey = " abcdefg"localIP = "127.0.0.1"localPort = 22
ابدأ تشغيل frpc
آخر (عادةً على جهاز آخر C) مع التكوين للاتصال بـ SSH باستخدام وضع P2P:
# 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، اتصل بـ 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[[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
قالب ملف التكوين باستخدام متغيرات بيئة نظام التشغيل. تذكر أن تبدأ مرجعك بـ .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
.
بالإضافة إلى ذلك، يمكنك استخدام منفذ 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
.
تساعدك واجهة مستخدم Client Admin على التحقق من تكوين frpc وإدارته.
قم بتكوين عنوان لواجهة مستخدم المسؤول لتمكين هذه الميزة:
webServer.addr = "127.0.0.1"webServer.port = 7400webServer.user = "admin"webServer.password = "admin"
ثم قم بزيارة http://127.0.0.1:7400
لرؤية واجهة مستخدم المسؤول، مع اسم المستخدم وكلمة المرور كلاهما admin
.
عند تمكين خادم الويب، سيقوم برنامج frps بحفظ بيانات الشاشة في ذاكرة التخزين المؤقت لمدة 7 أيام. سيتم مسحه بعد إعادة تشغيل العملية.
بروميثيوس مدعوم أيضًا.
قم بتمكين لوحة التحكم أولاً، ثم قم بتكوين enablePrometheus = true
في frps.toml
.
سيوفر http://{dashboard_addr}/metrics
بيانات مراقبة بروميثيوس.
هناك طريقتان للمصادقة لمصادقة 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، ويسمى التدفق المستخدم بمنحة بيانات اعتماد العميل.
لاستخدام نوع المصادقة هذا - قم بتكوين 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
منذ الإصدار 0.50.0، تم تغيير القيمة الافتراضية لـ transport.tls.enable
و transport.tls.disableCustomTLSFirstByte
إلى true، ويتم تمكين tls افتراضيًا.
لتعدد إرسال المنفذ، يرسل frp البايت الأول 0x17
لطلب اتصال TLS. يسري هذا فقط عندما تقوم بتعيين transport.tls.disableCustomTLSFirstByte
على false.
لفرض أن يقبل 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 المناسب في منطقة الاسم البديل للموضوع (SAN) عند إنشاء شهادات SSL/TLS.
على سبيل المثال:
قم بإعداد ملف التكوين opensl. إنه موجود في /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
بناء شهادات كاليفورنيا:
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 = [ { البداية = 2000، النهاية = 3000 }، { مفرد = 3001 }، { مفرد = 3003 }، { البداية = 4000، النهاية = 50000 } ]
يمكن لـ vhostHTTPPort
و vhostHTTPSPort
في frps استخدام نفس المنفذ مع bindPort
. سيكتشف frps بروتوكول الاتصال ويتعامل معه وفقًا لذلك.
ما تحتاج إلى الانتباه إليه هو أنه إذا كنت تريد تكوين vhostHTTPSPort
و bindPort
على نفس المنفذ، فأنت بحاجة أولاً إلى تعيين transport.tls.disableCustomTLSFirstByte
على false.
نود أن نحاول السماح لوكلاء متعددين بربط نفس المنفذ البعيد ببروتوكولات مختلفة في المستقبل.
# frpc.toml[[proxies]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.bandwidthLimit = "1 ميجابايت"
قم بتعيين transport.bandwidthLimit
في تكوين كل وكيل لتمكين هذه الميزة. الوحدات المدعومة هي MB
و KB
.
قم بتعيين transport.bandwidthLimitMode
على client
أو server
للحد من عرض النطاق الترددي على جانب العميل أو الخادم. الافتراضي هو client
.
يدعم frp تعدد إرسال دفق tcp منذ الإصدار 0.10.0 مثل تعدد إرسال HTTP2، وفي هذه الحالة يتم مضاعفة جميع الاتصالات المنطقية لنفس frpc في نفس اتصال TCP.
يمكنك تعطيل هذه الميزة عن طريق تعديل frps.toml
و frpc.toml
:
# frps.toml و frpc.toml، يجب أن يكون Sametransport.tcpMux = false
KCP هو بروتوكول سريع وموثوق يمكنه تحقيق تأثير الإرسال المتمثل في تقليل متوسط زمن الوصول بنسبة 30% إلى 40% وتقليل الحد الأقصى للتأخير بعامل ثلاثة، بتكلفة 10% إلى 20% إهدار المزيد من عرض النطاق الترددي من برنامج التعاون الفني.
يستخدم وضع 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[[proxies]]name = "test1"type = "tcp"localPort = 8080remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123"[[proxies]]name = "test2"type = " tcp"localPort = 8081remotePort = 80loadBalancer.group = "الويب"loadBalancer.groupKey = "123"
يُستخدم loadBalancer.groupKey
للمصادقة.
سيتم إرسال الاتصالات بالمنفذ 80 إلى الوكلاء في نفس المجموعة بشكل عشوائي.
بالنسبة للنوع tcp
، يجب أن يكون remotePort
الموجود في نفس المجموعة هو نفسه.
بالنسبة للنوع http
، يجب أن تكون locations
customDomains
subdomain
هي نفسها.
يمكن أن تساعدك ميزة التحقق من السلامة في تحقيق التوفر العالي من خلال موازنة التحميل.
أضف healthCheck.type = "tcp"
أو healthCheck.type = "http"
لتمكين التحقق من الصحة.
باستخدام نوع الفحص الصحي tcp ، سيتم اختبار اتصال منفذ الخدمة (TCPing):
# frpc.toml[[proxies]]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[[proxies]]name = "web"type = "http"localIP = "127.0.0.1"localPort = 80customDomains = ["test.example.com"]# تمكين فحص صحة HTTP healthCheck.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[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"
ستتم إعادة كتابة رأس Host
لطلب HTTP إلى 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 = "شريط"
في هذا المثال، سيتم تعيين الرأس x-from-where: frp
في طلب HTTP وشريط foo: bar
في استجابة HTTP.
هذه الميزة مخصصة لوكلاء http
أو الوكلاء مع تمكين المكونات الإضافية https2http
و https2https
.
يمكنك الحصول على عنوان IP الحقيقي للمستخدم من رؤوس طلبات HTTP X-Forwarded-For
.
يدعم frp بروتوكول الوكيل لإرسال عنوان IP الحقيقي للمستخدم إلى الخدمات المحلية. وهو يدعم جميع الأنواع باستثناء UDP.
فيما يلي مثال لخدمة https:
# frpc.toml[[proxies]]name = "web"type = "https"localPort = 443customDomains = ["test.example.com"]# الآن يتم دعم v1 وv2transport.proxyProtocolVersion = "v2"
يمكنك تمكين دعم بروتوكول الوكيل في nginx لكشف عنوان IP الحقيقي للمستخدم في رأس HTTP X-Real-IP
، ثم قراءة رأس X-Real-IP
في خدمة الويب الخاصة بك للحصول على عنوان IP الحقيقي.
يمكن لأي شخص يمكنه تخمين عنوان URL الخاص بالنفق الوصول إلى خادم الويب المحلي الخاص بك ما لم تقم بحمايته بكلمة مرور.
يؤدي هذا إلى فرض مصادقة HTTP الأساسية على جميع الطلبات باستخدام اسم المستخدم وكلمة المرور المحددين في ملف تكوين frpc.
لا يمكن تمكينه إلا عندما يكون نوع الوكيل http.
# frpc.toml[[proxies]]name = "web"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[[proxies]]name = "web"type = "http"localPort = 80subdomain = "test"
يمكنك الآن زيارة خدمة الويب الخاصة بك على test.frps.com
.
لاحظ أنه إذا لم يكن subdomainHost
فارغًا، فلا ينبغي أن يكون customDomains
هو المجال الفرعي لـ subdomainHost
.
يدعم frp إعادة توجيه طلبات HTTP إلى خدمات الويب الخلفية المختلفة عن طريق توجيه عنوان url.
تحدد locations
بادئة عنوان URL المستخدم للتوجيه. يبحث frps أولاً عن موقع البادئة الأكثر تحديدًا المعطى بواسطة سلاسل حرفية بغض النظر عن الترتيب المدرج.
# frpc.toml[[proxies]]name = "web01"type = "http"localPort = 80customDomains = ["web.example.com"]مواقع = ["/"] [[الوكلاء]]الاسم = "web02"النوع = "http"localPort = 81customDomains = ["web.example.com"]المواقع = ["/news"، "/about"]
ستتم إعادة توجيه طلبات HTTP التي تحتوي على بادئة URL /news
أو /about
إلى web02 والطلبات الأخرى إلى web01 .
يدعم frp استقبال مآخذ TCP الموجهة إلى وكلاء مختلفين على منفذ واحد على frps، على غرار vhostHTTPPort
و vhostHTTPSPort
.
الطريقة الوحيدة المدعومة لتعدد إرسال منفذ TCP المتوفرة حاليًا هي httpconnect
- نفق HTTP CONNECT.
عند تعيين tcpmuxHTTPConnectPort
على أي شيء آخر غير 0 في frps، سوف يستمع frps على هذا المنفذ لطلبات HTTP CONNECT.
سيتم استخدام مضيف طلب HTTP CONNECT لمطابقة الوكيل في frps. يمكن تكوين مضيفي الوكيل في frpc عن طريق تكوين customDomains
و/أو subdomain
ضمن وكلاء tcpmux
، عندما يكون multiplexer = "httpconnect"
.
على سبيل المثال:
# 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
في التكوين أعلاه - يمكن الاتصال بـ 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"
تمت الإضافة في الإصدار 0.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[[proxies]]name = "http_proxy"type = "tcp"remotePort = 6000[proxies.plugin]type = "http_proxy"httpUser = "abc"httpPassword = "abc"
httpUser
و httpPassword
هما معلمات التكوين المستخدمة في البرنامج المساعد http_proxy
.
اقرأ الوثيقة.
ابحث عن المزيد من المكونات الإضافية في gofrp/plugin.
تمت إضافته في الإصدار 0.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 "test-tcp" --local_ip 127.0.0.1 --local_port 8080 --remote_port 9090
يرجى الرجوع إلى هذه الوثيقة لمزيد من المعلومات.
gofrp/plugin - مستودع لمكونات frp الإضافية الذي يحتوي على مجموعة متنوعة من المكونات الإضافية التي تم تنفيذها بناءً على آلية تمديد frp، مما يلبي احتياجات التخصيص لسيناريوهات مختلفة.
gofrp/tiny-frpc - إصدار خفيف الوزن من عميل frp (حوالي 3.5 ميجابايت كحد أدنى) يتم تنفيذه باستخدام بروتوكول ssh، ويدعم بعض الميزات الأكثر استخدامًا، ومناسب للأجهزة ذات الموارد المحدودة.
هل أنت مهتم بالمشاركة؟ نود مساعدتك!
قم بإلقاء نظرة على قائمة المشكلات الخاصة بنا وفكر في إرسال طلب سحب إلى فرع التطوير .
إذا كنت تريد إضافة ميزة جديدة، فيرجى إنشاء مشكلة أولاً لوصف الميزة الجديدة، بالإضافة إلى أسلوب التنفيذ. بمجرد قبول الاقتراح، قم بإنشاء تطبيق للميزات الجديدة وأرسله كطلب سحب.
آسف لغتي الإنجليزية سيئة. نرحب بإدخال تحسينات على هذا المستند، وحتى بعض إصلاحات الأخطاء المطبعية.
إذا كانت لديك أفكار رائعة، أرسل بريدًا إلكترونيًا إلى [email protected].
ملاحظة: نفضل أن تقدم نصيحتك في المسائل حتى يتمكن الآخرون الذين لديهم نفس السؤال من البحث عنه بسرعة ولا نحتاج إلى الإجابة عليه بشكل متكرر.
إذا كان frp يساعدك كثيرًا، فيمكنك دعمنا من خلال:
ادعمنا من خلال رعاة جيثب.
يمكنك وضع شعار شركتك على ملف README الخاص بهذا المشروع.
التبرع بالمال عن طريق PayPal إلى حسابي [email protected] .