├── .github └── workflows │ ├── deploy.yml │ └── test-deploy.yml ├── .gitignore ├── .pnp.cjs ├── .pnp.loader.mjs ├── LICENSE ├── README.md ├── babel.config.js ├── blog ├── 2019-05-28-first-blog-post.md ├── 2019-05-29-long-blog-post.md ├── 2021-08-01-mdx-blog-post.mdx ├── 2021-08-26-welcome │ ├── docusaurus-plushie-banner.jpeg │ └── index.md ├── authors.yml └── tags.yml ├── docs ├── intro.mdx ├── manually │ ├── _category_.json │ ├── begin.mdx │ ├── config-json.mdx │ ├── core-json.mdx │ └── tunnels │ │ ├── _category_.json │ │ ├── bgp4-tunnel-or-direct.mdx │ │ ├── cdn-tunnel.mdx │ │ ├── direct-trojan.mdx │ │ ├── free-bind.mdx │ │ ├── halfduplex-tunnel-or-direct.mdx │ │ ├── http2-mux-grpc.mdx │ │ ├── load-balancing.mdx │ │ ├── port-to-port.mdx │ │ ├── pre-connect.mdx │ │ ├── reality-direct-tunnel.mdx │ │ ├── reality-reverse-tunnel.mdx │ │ ├── reset-tunnel.mdx │ │ ├── reverse-tunnel.mdx │ │ └── tls-tunnel.mdx └── scripts.mdx ├── docusaurus.config.ts ├── install.sh ├── package.json ├── sidebars.ts ├── src ├── components │ └── HomepageFeatures │ │ ├── index.tsx │ │ └── styles.module.css ├── css │ └── custom.css └── pages │ ├── index.module.css │ ├── index.tsx │ └── markdown-page.md ├── static ├── .nojekyll ├── fonts │ └── webfonts │ │ ├── Vazirmatn-Black.woff2 │ │ ├── Vazirmatn-Bold.woff2 │ │ ├── Vazirmatn-ExtraBold.woff2 │ │ ├── Vazirmatn-ExtraLight.woff2 │ │ ├── Vazirmatn-Light.woff2 │ │ ├── Vazirmatn-Medium.woff2 │ │ ├── Vazirmatn-Regular.woff2 │ │ ├── Vazirmatn-SemiBold.woff2 │ │ ├── Vazirmatn-Thin.woff2 │ │ └── Vazirmatn[wght].woff2 └── img │ ├── docusaurus-social-card.jpg │ ├── docusaurus.png │ ├── favicon.ico │ ├── logo.svg │ ├── ptechgithub-script.jpg │ ├── tcp.png │ ├── undraw_docusaurus_mountain.svg │ ├── undraw_docusaurus_react.svg │ └── undraw_docusaurus_tree.svg ├── tsconfig.json └── yarn.lock /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | # Review gh actions docs if you want to further define triggers, paths, etc 8 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on 9 | 10 | jobs: 11 | build: 12 | name: Build Docusaurus 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 18 | - uses: actions/setup-node@v4 19 | with: 20 | node-version: 18 21 | cache: yarn 22 | 23 | - name: Install dependencies 24 | run: yarn install 25 | - name: Build website 26 | run: yarn build 27 | 28 | - name: Upload Build Artifact 29 | uses: actions/upload-pages-artifact@v3 30 | with: 31 | path: build 32 | 33 | deploy: 34 | name: Deploy to GitHub Pages 35 | needs: build 36 | 37 | # Grant GITHUB_TOKEN the permissions required to make a Pages deployment 38 | permissions: 39 | pages: write # to deploy to Pages 40 | id-token: write # to verify the deployment originates from an appropriate source 41 | 42 | # Deploy to the github-pages environment 43 | environment: 44 | name: github-pages 45 | url: ${{ steps.deployment.outputs.page_url }} 46 | 47 | runs-on: ubuntu-latest 48 | steps: 49 | - name: Deploy to GitHub Pages 50 | id: deployment 51 | uses: actions/deploy-pages@v4 52 | -------------------------------------------------------------------------------- /.github/workflows/test-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Test deployment 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | # Review gh actions docs if you want to further define triggers, paths, etc 8 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on 9 | 10 | jobs: 11 | test-deploy: 12 | name: Test deployment 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 18 | - uses: actions/setup-node@v4 19 | with: 20 | node-version: 18 21 | cache: yarn 22 | 23 | - name: Install dependencies 24 | run: yarn install 25 | - name: Test build website 26 | run: yarn build 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Not sure what a .gitignore is? 2 | # See: https://git-scm.com/docs/gitignore 3 | 4 | # These are directly copied from Jekyll's first-party docs on `.gitignore` files: 5 | # https://jekyllrb.com/tutorials/using-jekyll-with-bundler/#commit-to-source-control 6 | 7 | # Ignore the default location of the built site, and caches and metadata generated by Jekyll 8 | _site/ 9 | .sass-cache/ 10 | .jekyll-cache/ 11 | .jekyll-metadata 12 | node_modules 13 | .docusaurus 14 | build 15 | .yarn 16 | # Ignore folders generated by Bundler 17 | .bundle/ 18 | vendor/ 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 just-the-docs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WaterWall Documentation 2 | 3 | docs are hosted there, read here: 4 | 5 | 6 | https://radkesvat.github.io/WaterWall-Docs/docs/intro 7 | 8 | ## Install 9 | 10 | ``` 11 | bash <(curl -fsSL https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/main/install.sh) 12 | ``` 13 | ![31](https://raw.githubusercontent.com/Ptechgithub/configs/main/media/31.jpg) 14 | 15 | 16 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /blog/2019-05-28-first-blog-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: first-blog-post 3 | title: First Blog Post 4 | authors: 5 | name: Gao Wei 6 | title: Docusaurus Core Team 7 | url: https://github.com/wgao19 8 | image_url: https://github.com/wgao19.png 9 | tags: [hola, docusaurus] 10 | --- 11 | 12 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 13 | -------------------------------------------------------------------------------- /blog/2019-05-29-long-blog-post.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: long-blog-post 3 | title: Long Blog Post 4 | authors: endi 5 | tags: [hello, docusaurus] 6 | --- 7 | 8 | This is the summary of a very long blog post, 9 | 10 | Use a `` comment to limit blog post size in the list view. 11 | 12 | 13 | 14 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 15 | 16 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 17 | 18 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 19 | 20 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 21 | 22 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 23 | 24 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 25 | 26 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 27 | 28 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 29 | 30 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 31 | 32 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 33 | 34 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 35 | 36 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 37 | 38 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 39 | 40 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 41 | 42 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 43 | 44 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet 45 | -------------------------------------------------------------------------------- /blog/2021-08-01-mdx-blog-post.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: mdx-blog-post 3 | title: MDX Blog Post 4 | authors: [slorber] 5 | tags: [docusaurus] 6 | --- 7 | 8 | Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). 9 | 10 | :::tip 11 | 12 | Use the power of React to create interactive blog posts. 13 | 14 | ```js 15 | 16 | ``` 17 | 18 | 19 | 20 | ::: 21 | -------------------------------------------------------------------------------- /blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg -------------------------------------------------------------------------------- /blog/2021-08-26-welcome/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: welcome 3 | title: Welcome 4 | authors: [slorber, yangshun] 5 | tags: [facebook, hello, docusaurus] 6 | --- 7 | 8 | [Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog). 9 | 10 | Simply add Markdown files (or folders) to the `blog` directory. 11 | 12 | Regular blog authors can be added to `authors.yml`. 13 | 14 | The blog post date can be extracted from filenames, such as: 15 | 16 | - `2019-05-30-welcome.md` 17 | - `2019-05-30-welcome/index.md` 18 | 19 | A blog post folder can be convenient to co-locate blog post images: 20 | 21 | ![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) 22 | 23 | The blog supports tags as well! 24 | 25 | **And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config. 26 | -------------------------------------------------------------------------------- /blog/authors.yml: -------------------------------------------------------------------------------- 1 | endi: 2 | name: Endilie Yacop Sucipto 3 | title: Maintainer of Docusaurus 4 | url: https://github.com/endiliey 5 | image_url: https://github.com/endiliey.png 6 | 7 | yangshun: 8 | name: Yangshun Tay 9 | title: Front End Engineer @ Facebook 10 | url: https://github.com/yangshun 11 | image_url: https://github.com/yangshun.png 12 | 13 | slorber: 14 | name: Sébastien Lorber 15 | title: Docusaurus maintainer 16 | url: https://sebastienlorber.com 17 | image_url: https://github.com/slorber.png 18 | -------------------------------------------------------------------------------- /blog/tags.yml: -------------------------------------------------------------------------------- 1 | facebook: 2 | label: Facebook 3 | permalink: /facebook 4 | description: Facebook tag description 5 | hello: 6 | label: Hello 7 | permalink: /hello 8 | description: Hello tag description 9 | docusaurus: 10 | label: Docusaurus 11 | permalink: /docusaurus 12 | description: Docusaurus tag description 13 | hola: 14 | label: Hola 15 | permalink: /hola 16 | description: Hola tag description 17 | -------------------------------------------------------------------------------- /docs/intro.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # معرفی WaterWall 6 | 7 | WaterWall یک چارچوب قدرتمند و انعطاف‌پذیر برای ایجاد تونل‌های شبکه و اتصالات سفارشی کاربر-سرور است. این پلتفرم بر پایه گره‌های (**nodes**) کاملاً قابل پیکربندی با کارایی بالا بنا شده است، که امکان پیاده‌سازی طیف گسترده‌ای از پروتکل‌های شبکه را بدون نیاز به کدنویسی پیچیده فراهم می‌کند. 8 | 9 | ## ویژگی‌ها و قابلیت‌های کلیدی 10 | 11 | WaterWall مجموعه جامعی از امکانات و قابلیت‌ها را در اختیار کاربران قرار می‌دهد: 12 | 13 | - **راه‌اندازی آسان**: اسکریپت‌های خودکار نصب و پیکربندی، شروع کار با WaterWall را ساده و سریع می‌کنند. 14 | 15 | - **تونل‌های امن**: پشتیبانی از تونل‌های مستقیم **Port-to-Port** با رمزنگاری **TLS** برای انتقال ایمن داده‌ها. 16 | 17 | - **گره‌های PreConnect**: برقراری ارتباط و انجام عملیات سفارشی قبل از انتقال داده‌ها بین گره‌ها. 18 | 19 | - **مالتی‌پلکسینگ**: بهینه‌سازی عملکرد شبکه با استفاده از قابلیت‌های مالتی‌پلکسینگ **HTTP/2** و **gRPC**. 20 | 21 | - **تونل‌های Reality**: امکان ایجاد تونل‌های مستقیم (**Direct Tunnel**) و معکوس (**Reverse Tunnel**) با پروتکل Reality. 22 | 23 | - **پروتکل‌های متنوع**: پشتیبانی از تونل‌های مستقیم یا مبتنی بر پروتکل **BGP4** برای انعطاف‌پذیری بیشتر. 24 | 25 | - **مقاومت در برابر سانسور**: استفاده از پروتکل **Trojan** با قابلیت مقاومت در برابر تکنیک **TLS-in-TLS** برای دور زدن سانسور. 26 | 27 | - **تونل‌های HalfDuplex**: برقراری ارتباطات نیمه‌دوطرفه با استفاده از تونل‌های **HalfDuplex**. 28 | 29 | - **توازن بار**: توزیع ترافیک شبکه بین گره‌های مختلف با قابلیت **Load Balancing**. 30 | 31 | - **یکپارچگی با CDN**: ایجاد تونل‌های **CDN** مستقیم یا معکوس برای بهبود کارایی تحویل محتوا. 32 | 33 | - **اتصالات Free Bind**: برقراری اتصال بین گره‌ها بدون محدودیت‌های پورت‌ها و آدرس‌های IP. 34 | 35 | ### پیکربندی ساده 36 | 37 | پیکربندی هسته WaterWall و گره‌های آن به ترتیب از طریق فایل‌های `core.json` و `config.json` انجام می‌شود. مستندات جامع، جزئیات هر یک از ویژگی‌ها و نحوه تنظیم آنها را پوشش می‌دهد. 38 | 39 | ### جمع‌بندی 40 | 41 | WaterWall یک پلتفرم قدرتمند برای ساخت انواع تونل‌های شبکه و پروتکل‌های سفارشی است که پیچیدگی‌های کدنویسی را به حداقل می‌رساند. با قابلیت‌های متنوع و انعطاف‌پذیری بالای خود، WaterWall می‌تواند نیازهای گسترده‌ای در حوزه شبکه و ارتباطات را برآورده سازد. 42 | 43 | #### دانشنامه اصطلاحات 44 | 45 | - **Node**: واحدهای پردازشی و منطقی مستقل در WaterWall که وظیفه برقراری ارتباط و انتقال داده‌ها را بر عهده دارند. 46 | - **TLS** (Transport Layer Security): پروتکلی برای رمزنگاری و ایمن‌سازی ارتباطات در شبکه. 47 | - **PreConnect**: فرآیند برقراری ارتباط و انجام عملیات سفارشی بین گره‌ها قبل از شروع انتقال داده‌ها. 48 | - **HTTP/2**: نسخه بهبودیافته پروتکل HTTP که قابلیت‌های مالتی‌پلکسینگ را برای افزایش کارایی فراهم می‌کند. 49 | - **gRPC**: چارچوبی مدرن برای ارتباطات بین سرویس‌ها (Inter-Service Communication) که از HTTP/2 استفاده می‌کند. 50 | - **BGP4** (Border Gateway Protocol version 4): پروتکل مسیریابی استاندارد برای تبادل اطلاعات مسیریابی بین سیستم‌های خودمختار (Autonomous Systems) در شبکه. 51 | - **Trojan**: پروتکلی برای ایجاد ارتباطات مقاوم در برابر سانسور و دور زدن تکنیک‌های محدودسازی مانند TLS-in-TLS. 52 | - **Load Balancing**: فرآیند توزیع ترافیک شبکه بین گره‌های مختلف برای بهبود کارایی و پایداری سرویس. 53 | - **CDN** (Content Delivery Network): شبکه‌ای از سرورهای توزیع‌شده جغرافیایی برای تحویل سریع و کارآمد محتوا به کاربران. 54 | - **Free Bind**: قابلیت برقراری اتصال بین گره‌ها بدون نیاز به پورت یا آدرس IP از پیش تعیین‌شده. 55 | -------------------------------------------------------------------------------- /docs/manually/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Manually", 3 | "position": 3, 4 | "link": { 5 | "type": "generated-index", 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /docs/manually/begin.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # شروع به کار با WaterWall 6 | 7 | به صفحه راهنمای شروع به کار با **WaterWall** خوش آمدید! در این بخش، با ویژگی‌ها و قابلیت‌های کلیدی WaterWall آشنا خواهید شد و نحوه نصب و پیکربندی اولیه آن را فرا خواهید گرفت. 8 | 9 | ## معرفی WaterWall 10 | 11 | **WaterWall** یک هسته (core) چندمنظوره و انعطاف‌پذیر است که به شما امکان می‌دهد روش‌های متنوعی برای ایجاد تونل (tunnel) بر اساس نیازهای خود انتخاب و اجرا کنید. هدف اصلی پروژه WaterWall عبارتند از: 12 | 13 | 1. **ایجاد تونل قدرتمند و مطمئن**: تمرکز اولیه بر توانایی اجرای یک تونل کارآمد و مطمئن است. 14 | 15 | 2. **پیکربندی مستقیم**: امکان ساخت پیکربندی مستقیم برای بررسی فایروال ایران، اعمال یافته‌ها و جلوگیری از فیلتر شدن. WaterWall با آخرین تغییرات فایروال ایران سازگار است. 16 | 17 | ## پیکربندی هسته WaterWall 18 | 19 | برای اجرای هسته WaterWall، دو فایل JSON را در کنار فایل اجرایی قرار دهید: 20 | 21 | 1. **core.json**: شامل تنظیمات لاگ‌ها (logs) و تعداد ترد‌ها (threads). می‌توانید لاگ‌های مورد نظر و سطح جزئیات آنها را مشخص کنید. همچنین، تعداد ترد‌های برنامه را در این فایل تنظیم کنید (پیش‌فرض برابر با تعداد هسته‌های CPU سرور). 22 | 23 | 2. **config.json**: پیکربندی اصلی که تونل مورد نظر و پروتکل استفاده شده را مشخص می‌کند. در این فایل، پروتکل را به صورت protocol stack توصیف کنید. برنامه از این توصیف به عنوان دستورالعمل برای ساخت پروتکل استفاده می‌کند. 24 | 25 | ## نصب WaterWall 26 | 27 | برای نصب WaterWall روی سرور، مراحل زیر را دنبال کنید: 28 | 29 | 1. دانلود فایل WaterWall: 30 | 31 | ```sh 32 | wget https://github.com/radkesvat/WaterWall/releases/download/vx.x/Waterwall-linux-64.zip 33 | ``` 34 | 35 | 2. نصب unzip و استخراج فایل دانلود شده: 36 | 37 | ```sh 38 | apt install unzip && unzip Waterwall-linux-64.zip 39 | ``` 40 | 41 | 3. تغییر مجوزهای (permission) فایل اجرایی WaterWall: 42 | 43 | ```sh 44 | chmod +rwx Waterwall 45 | ``` 46 | 47 | ## اجرای WaterWall 48 | 49 | برای اجرای عادی WaterWall، دستور زیر را در ترمینال وارد کنید: 50 | 51 | ```sh 52 | ./Waterwall 53 | ``` 54 | 55 | نکته: برای اجرای WaterWall در پس‌زمینه و جلوگیری از بسته شدن آن پس از بستن اتصال SSH، می‌توانید از دستورات tmux، nohup، screen یا service استفاده کنید. به عنوان مثال: 56 | 57 | ```sh 58 | nohup ./Waterwall & 59 | ``` 60 | 61 | اکنون آماده هستید تا طبق آموزش‌ها، تانل (tunnel) خود را پیکربندی و اجرا کنید. برای اطلاعات بیشتر در مورد گزینه‌های پیکربندی و مثال‌ها، به بخش‌های مربوطه در منوی گیت‌هاب مراجعه کنید. 62 | -------------------------------------------------------------------------------- /docs/manually/config-json.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # config.json 6 | 7 | در این فایل، روش تونلی که قصد استفاده از آن را داریم توصیف می‌شود. 8 | 9 | ## ساختار کلی فایل config.json 10 | 11 | ```json title="config.json" 12 | { 13 | "name": "", 14 | "author": "", 15 | "config-version": 1, 16 | "core-minimum-version": 1, 17 | "nodes": [] 18 | } 19 | ``` 20 | 21 | - پارامتر name: یک نام دلخواه برای پیکربندی (configuration) است. 22 | - پارامتر author: نام نویسنده پیکربندی را مشخص می‌کند. 23 | - پارامتر config-version: نسخه فایل پیکربندی را نشان می‌دهد. 24 | - پارامتر core-minimum-version: حداقل نسخه مورد نیاز هسته (core) برنامه WaterWall را تعیین می‌کند. 25 | - آرایه nodes: شامل پروتکل‌ها و تنظیمات تونل‌هایی است که قصد استفاده از آنها را داریم. 26 | 27 | این فایل config.json، امکان سفارشی‌سازی و پیکربندی روش تونل مورد نظر کاربر را فراهم می‌کند. پارامترهای name و author به شناسایی و مدیریت پیکربندی‌های مختلف کمک می‌کنند. 28 | 29 | config-version و core-minimum-version حداقل نیازمندی‌های نسخه را برای حصول اطمینان از سازگاری مشخص می‌کنند. 30 | 31 | بخش کلیدی، آرایه nodes است که جزئیات پروتکل‌های تونل و تنظیمات مربوطه را تعریف می‌کند. این قابلیت، امکان ترکیب و پیکربندی انواع مختلف تونل‌ها را به شیوه‌ای انعطاف‌پذیر در اختیار کاربر قرار می‌دهد. 32 | 33 | به طور خلاصه، فایل config.json به تنظیم WaterWall بر اساس نیازهای ویژه کاربر یاری می‌رساند و توانایی پیکربندی روش‌های متنوع تونل را ارائه می‌دهد. 34 | -------------------------------------------------------------------------------- /docs/manually/core-json.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # core.json 6 | 7 | این فایل تنظیمات اصلی و کلی WaterWall را توصیف می‌کند، مانند لاگ‌ها، فایل‌های مورد نیاز و سایر پارامترها. فایل `core.json` باید در کنار اجرایی WaterWall قرار گیرد و می‌توانید مقادیر داخل آن را بنا به نیاز خود تغییر دهید. 8 | 9 | ## ساختار کلی فایل core.json 10 | 11 | ```json title="core.json" 12 | { 13 | "log": { 14 | "path": "log/", 15 | "core": { 16 | "loglevel": "DEBUG", 17 | "file": "core.log", 18 | "console": true 19 | }, 20 | "network": { 21 | "loglevel": "DEBUG", 22 | "file": "network.log", 23 | "console": true 24 | }, 25 | "dns": { 26 | "loglevel": "SILENT", 27 | "file": "dns.log", 28 | "console": false 29 | } 30 | }, 31 | "dns": {}, 32 | "misc": { 33 | "workers": 0, 34 | "ram-profile": "server", 35 | "libs-path": "libs/" 36 | }, 37 | "configs": ["config_name.json"] 38 | } 39 | ``` 40 | 41 | ### بخش log 42 | 43 | - path: مسیر فولدری که فایل‌های لاگ در آن ذخیره می‌شوند. در این مثال، پوشه‌ای به نام log در دایرکتوری فعلی ایجاد شده و لاگ‌ها درون آن قرار می‌گیرند. 44 | بخش‌های مختلف لاگ عبارتند از: 45 | - core: لاگ‌های مربوط به هسته برنامه 46 | - network: لاگ‌های مربوط به شبکه 47 | - dns: لاگ‌های مربوط به DNS 48 | - loglevel: سطح جزئیات لاگ را تعیین می‌کند. مقادیر ممکن از بیشترین تا کمترین جزئیات عبارتند از: 49 | - VERBOSE 50 | - DEBUG 51 | - INFO 52 | - WARN 53 | - ERROR 54 | - FATAL 55 | - SILENT (بدون لاگ) 56 | - file: نام فایلی که لاگ‌های مربوطه در آن ذخیره می‌شوند. 57 | - console: اگر true باشد، لاگ‌ها علاوه بر فایل، در ترمینال نیز نمایش داده می‌شوند. 58 | 59 | ### بخش dns 60 | 61 | - این بخش در حال حاضر برای استفاده در آینده در نظر گرفته شده و هنوز تکمیل نشده است. قرار است برای تنظیمات DNS مانند (adblock) بکار رود. 62 | - فعلاً WaterWall از تنظیمات DNS سیستم‌عامل پیروی می‌کند. 63 | 64 | ### بخش misc 65 | 66 | - workers: تعداد ترد‌های (thread) برنامه را مشخص می‌کند. اگر صفر باشد، به تعداد هسته‌های پردازنده ترد ایجاد می‌شود که پیش‌فرض مناسبی است. البته می‌توان تعداد ترد‌ها را بیشتر از هسته‌ها هم تنظیم کرد. 67 | - یک ترد مجزا برای امور جانبی مانند ارتباط با سوکت‌ها و فایل‌ها در نظر گرفته می‌شود تا ترد‌های اصلی شبکه را درگیر نکند. 68 | - ram-profile: پروفایل مصرف حافظه را کنترل می‌کند. گزینه‌های ممکن عبارتند از: 69 | - minimal: کمترین میزان ممکن رم (حدود 250 کیلوبایت) مصرف می‌شود. 70 | - client: مصرف رم کمتر اما CPU کمی بیشتر است. مناسب برای استفاده کمتر افراد یا سیستم‌هایی با رم محدود. بسته به تعداد ترد‌ها بین 2 تا 10 مگابایت رم اشغال می‌کند. 71 | - server: حدود 40 مگابایت به ازای هر ترد رم مصرف می‌کند که موجب کاهش مصرف CPU می‌شود. (پیش‌فرض) 72 | - میزان مصرف حافظه به صورت پویا بسته به حجم درخواست‌ها تغییر می‌کند و محدودیت خاصی ندارد. 73 | - libs-path: محل بارگذاری ماژول‌های جانبی را تعیین می‌کند. تغییر آن تأثیر زیادی ندارد. 74 | 75 | ### بخش configs 76 | 77 | - در این بخش می‌توانید فایل‌های پیکربندی که قرار است توسط هسته اجرا شوند را مشخص کنید. امکان اجرای تعداد نامحدودی فایل پیکربندی وجود دارد. 78 | - توصیه می‌شود برای سازماندهی بهتر، فایل‌های پیکربندی را بر اساس کارکرد تفکیک کنید. مثلاً اگر دو روش مختلف اعمال می‌کنید، بهتر است هر کدام را در یک فایل مجزا قرار دهید. 79 | -------------------------------------------------------------------------------- /docs/manually/tunnels/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Tunnels", 3 | "position": 4, 4 | "link": { 5 | "type": "generated-index", 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /docs/manually/tunnels/bgp4-tunnel-or-direct.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 8 3 | --- 4 | 5 | import YouTube from 'react-youtube' 6 | 7 | # Bgp4 Tunnel or Direct 8 | 9 | پروتکل BGP4 (Border Gateway Protocol version 4) یک روش استاندارد برای ارتباط بین 10 | روترها است که بر روی پروتکل TCP پیاده‌سازی شده است. 11 | 12 | علیرغم نام پیچیده، روش BGP4 بسیار ساده بوده و می‌توان آن را به عنوان یک ترنسپورت 13 | اضافه کرد. 14 | 15 | ## ویژگی‌ها و مزایا 16 | 17 | - پروتکل BGP دارای وضعیت (state) است که به صورت ساده شبیه‌سازی شده است. 18 | - برای استفاده از این روش، نیاز است تا در هر دو سرور ایران و خارج، WaterWall را 19 | اجرا کنید. 20 | - این روش می‌تواند با ترکیب با نودهای معکوس (reverse) نیز پیاده‌سازی شود. 21 | - نیازی به رمزنگاری وجود ندارد. 22 | - هدف اصلی این روش، ایجاد تونل مستقیم پایدار و پرسرعت است. 23 | - انتظار می‌رود که این روش بتواند محدودیت‌های اعمال شده بر روی اتصالات مستقیم را 24 | برطرف کند. 25 | 26 | :::caution توجه این روش جادویی نیست و قرار نیست آدرس IP مسدود شده را آزاد کند. 27 | در تست‌های اولیه، اتصال مستقیم به سرور با IP مسدود برقرار نشد، اما اتصال معکوس 28 | (reverse) موفقیت‌آمیز بود. 29 | ::: 30 | 31 | ## ویدیوهای آموزشی 32 | 33 | #### آموزش تانل BGP4 با هسته ی واتروال 34 | 35 | 36 | 37 | ## فلوچارت ارتباط 38 | 39 | ```mermaid 40 | flowchart LR; 41 | subgraph Kharej; 42 | B1[179] --> W_K; 43 | B4[443 Xray]; 44 | W_K[WaterWall] --> B4 45 | end; 46 | subgraph IRan; 47 | PIN[443] --> W_I; 48 | W_I[WaterWall] -- "Bgp Handshake + Simulate"--> B1; 49 | end; 50 | ``` 51 | 52 | ```json title="سرور ایران" 53 | { 54 | "name": "bgp_client", 55 | "nodes": [ 56 | { 57 | "name": "input", 58 | "type": "TcpListener", 59 | "settings": { 60 | "address": "0.0.0.0", 61 | "port": 443, 62 | "nodelay": true 63 | }, 64 | "next": "bgp_client" 65 | }, 66 | { 67 | "name": "bgp_client", 68 | "type": "Bgp4Client", 69 | "settings": {}, 70 | "next": "output" 71 | }, 72 | { 73 | "name": "output", 74 | "type": "TcpConnector", 75 | "settings": { 76 | "nodelay": true, 77 | "address": "1.1.1.1", // آدرس IP سرور خارج 78 | "port": 179 79 | } 80 | } 81 | ] 82 | } 83 | ``` 84 | 85 | ```json title="سرور خارج" 86 | { 87 | "name": "bgp_server", 88 | "nodes": [ 89 | { 90 | "name": "input", 91 | "type": "TcpListener", 92 | "settings": { 93 | "address": "0.0.0.0", 94 | "port": 179, 95 | "nodelay": true 96 | }, 97 | "next": "bgp_server" 98 | }, 99 | { 100 | "name": "bgp_server", 101 | "type": "Bgp4Server", 102 | "settings": {}, 103 | "next": "output" 104 | }, 105 | 106 | { 107 | "name": "output", 108 | "type": "TcpConnector", 109 | "settings": { 110 | "nodelay": true, 111 | "address": "127.0.0.1", 112 | "port": 443 113 | } 114 | } 115 | ] 116 | } 117 | ``` 118 | 119 | :::tip نکات 120 | 121 | به شدت توصیه می‌شود از پورت 179 مطابق با استاندارد BGP استفاده شود. این 122 | پیکربندی، پورت 443 سرور ایران را به پورت 443 سرور خارج متصل می‌کند و تک پورت 123 | است. تبدیل آن به حالت چند پورت (multi-port) بسیار ساده است. ارتباط بین ایران و 124 | خارج از طریق پورت 179 برقرار می‌شود، برخلاف روش‌های قبلی که پورت 443 پیشنهاد 125 | می‌شد. 126 | ::: 127 | 128 | ### دانشنامه 129 | 130 | #### BGP (Border Gateway Protocol) 131 | 132 | - پروتکل استاندارد برای تبادل اطلاعات مسیریابی بین سیستم‌های خودمختار (AS) در 133 | شبکه‌های کامپیوتری 134 | - نسخه 4 (BGPv4) در حال حاضر نسخه رایج مورد استفاده است 135 | - بر روی پروتکل TCP پورت 179 اجرا می‌شود 136 | - پروتکلی با وضعیت (stateful) است که اتصالات طولانی مدت برقرار می‌کند 137 | - از آن برای تبادل جداول مسیریابی IP بین روترهای مرزی استفاده می‌شود 138 | -------------------------------------------------------------------------------- /docs/manually/tunnels/cdn-tunnel.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 12 3 | --- 4 | 5 | # CDN Tunnel 6 | 7 | ## هدف 8 | 9 | هدف اصلی این پروژه، ایجاد یک تونل معکوس بهینه و آزمایش شده با استفاده از Cloudflare است که انعطاف‌پذیری لازم برای اضافه کردن ایده‌های جدید را نیز دارد. 10 | 11 | ## مزایای استفاده از Cloudflare 12 | 13 | - یکی از امن‌ترین روش‌های تونل به دلیل استفاده از آی‌پی‌های تمیز و قانونی Cloudflare 14 | - مناسب برای کاهش نگرانی از دسترسی غیرمجاز به سرور ایرانی 15 | - محافظت در برابر حملات DDoS و سایر مزایای Cloudflare 16 | 17 | ## نیازمندی‌ها 18 | 19 | 1. **دامنه شخصی**: ترجیحاً دامنه `.ir` (اما سایر دامنه‌ها نیز کار می‌کنند) 20 | 21 | - استفاده از دامنه `.ir` نگرانی خاصی ندارد زیرا اتصال تحت پروتکل امن TLS برقرار می‌شود. 22 | 23 | 2. **گواهینامه امنیتی (Certificate)**: 24 | 25 | - دریافت گواهینامه از طریق ابزار `certbot` یا Cloudflare 26 | - گواهینامه Cloudflare فقط توسط Cloudflare قابل اعتماد است و برای کانفیگ مستقیم کار نمی‌کند. 27 | - هر دو روش برای تونل Cloudflare مناسب هستند. 28 | 29 | 3. **زیردامنه (Subdomain)**: 30 | 31 | - گواهینامه `certbot` فقط برای زیردامنه درخواست شده معتبر است، مگر به روش Wildcard درخواست شود. 32 | - Cloudflare به صورت پیش‌فرض گواهینامه Wildcard ارائه می‌دهد. 33 | - زیردامنه‌ها با گواهینامه Cloudflare باید تک‌بخشی باشند (مثلاً `sub1.mydomain.com` مجاز است اما `sub2.sub1.mydomain.com` خیر). 34 | 35 | 4. فعال‌سازی **gRPC** در Cloudflare: 36 | 37 | - فعال‌سازی از طریق بخش "Network" در پنل Cloudflare 38 | - غیرفعال کردن "Bot Fight Mode" 39 | - تنظیم حداقل نسخه پروتکل TLS روی 1.2 40 | - تنظیم "SSL/TLS encryption mode" روی "Full" 41 | 42 | 5. **محدودیت پورت** در Cloudflare: 43 | - اتصال Cloudflare به سرور ایران فقط از طریق پورت 443 44 | - Waterwall از یک سیستم فیلترینگ بسته‌های داخلی پشتیبانی می‌کند که امکان استفاده دوگانه از پورت 443 را فراهم می‌کند. 45 | 46 | ## نمونه‌های تونل معکوس با gRPC 47 | 48 | ### مثال ساده: تونل معکوس TLS gRPC تک‌پورت 49 | 50 | این کانفیگ فقط پورت 443 را تونل می‌کند. کاربر به پورت 443 سرور ایران متصل می‌شود و در نهایت به پورت 443 سرور خارجی وصل می‌شود. 51 | 52 | ```json title="سرور خارج" 53 | { 54 | "name": "config_reverse_tls_grpc_singleport_kharej", 55 | "nodes": [ 56 | { 57 | "name": "core_outbound", 58 | "type": "TcpConnector", 59 | "settings": { 60 | "nodelay": true, 61 | "address": "127.0.0.1", 62 | "port": 443 63 | } 64 | }, 65 | { 66 | "name": "bridge1", 67 | "type": "Bridge", 68 | "settings": { 69 | "pair": "bridge2" 70 | }, 71 | "next": "core_outbound" 72 | }, 73 | { 74 | "name": "bridge2", 75 | "type": "Bridge", 76 | "settings": { 77 | "pair": "bridge1" 78 | }, 79 | "next": "reverse_client" 80 | }, 81 | { 82 | "name": "reverse_client", 83 | "type": "ReverseClient", 84 | "settings": {}, 85 | "next": "grpc_client" 86 | }, 87 | { 88 | "name": "grpc_client", 89 | "type": "ProtoBufClient", 90 | "settings": {}, 91 | "next": "h2client" 92 | }, 93 | { 94 | "name": "h2client", 95 | "type": "Http2Client", 96 | "settings": { 97 | "host": "sub.mydomain.com", 98 | "port": 443, 99 | "path": "/service", 100 | "content-type": "application/grpc" 101 | }, 102 | "next": "sslclient" 103 | }, 104 | { 105 | "name": "sslclient", 106 | "type": "OpenSSLClient", 107 | "settings": { 108 | "sni": "sub.mydomain.com", 109 | "verify": true, 110 | "alpn": "h2" 111 | }, 112 | "next": "iran_outbound" 113 | }, 114 | { 115 | "name": "iran_outbound", 116 | "type": "TcpConnector", 117 | "settings": { 118 | "nodelay": true, 119 | "address": "sub.mydomain.com", 120 | "port": 443 121 | } 122 | } 123 | ] 124 | } 125 | ``` 126 | 127 | ```json title="سرور ایران" 128 | { 129 | "name": "config_reverse_tls_grpc_singleport_iran", 130 | "nodes": [ 131 | { 132 | "name": "inbound_users", 133 | "type": "TcpListener", 134 | "settings": { 135 | "address": "0.0.0.0", 136 | "port": 443, 137 | "nodelay": true 138 | }, 139 | "next": "bridge2" 140 | }, 141 | { 142 | "name": "bridge2", 143 | "type": "Bridge", 144 | "settings": { 145 | "pair": "bridge1" 146 | } 147 | }, 148 | { 149 | "name": "bridge1", 150 | "type": "Bridge", 151 | "settings": { 152 | "pair": "bridge2" 153 | } 154 | }, 155 | { 156 | "name": "reverse_server", 157 | "type": "ReverseServer", 158 | "settings": {}, 159 | "next": "bridge1" 160 | }, 161 | { 162 | "name": "grpc_server", 163 | "type": "ProtoBufServer", 164 | "settings": {}, 165 | "next": "reverse_server" 166 | }, 167 | { 168 | "name": "h2server", 169 | "type": "Http2Server", 170 | "settings": {}, 171 | "next": "grpc_server" 172 | }, 173 | { 174 | "name": "sslserver", 175 | "type": "OpenSSLServer", 176 | "settings": { 177 | "cert-file": "fullchain.pem", 178 | "key-file": "privkey.pem", 179 | "alpns": [ 180 | { 181 | "value": "h2", 182 | "next": "node->next" 183 | }, 184 | { 185 | "value": "http/1.1", 186 | "next": "node->next" 187 | } 188 | ], 189 | "fallbackintencedelay": 0 190 | }, 191 | "next": "h2server" 192 | }, 193 | { 194 | "name": "inbound_cloudflare", 195 | "type": "TcpListener", 196 | "settings": { 197 | "address": "0.0.0.0", 198 | "port": 443, 199 | "nodelay": true, 200 | "whitelist": [ 201 | // فهرست IP های Cloudflare 202 | ] 203 | }, 204 | "next": "sslserver" 205 | } 206 | ] 207 | } 208 | ``` 209 | 210 | ## مثال چندپورت: تونل معکوس TLS gRPC چندپورت 211 | 212 | این کانفیگ امکان تونل کردن چندین پورت را فراهم می‌کند. کاربر به هر پورتی که به سرور ایران متصل شود، به همان پورت در سرور خارجی وصل خواهد شد. 213 | 214 | ```json title="سرور خارج" 215 | { 216 | "name": "config_reverse_tls_grpc_multiport_kharej", 217 | "nodes": [ 218 | { 219 | "name": "core_outbound", 220 | "type": "TcpConnector", 221 | "settings": { 222 | "nodelay": true, 223 | "address": "127.0.0.1", 224 | "port": "dest_context->port" 225 | } 226 | }, 227 | { 228 | "name": "port_header", 229 | "type": "HeaderServer", 230 | "settings": { 231 | "override": "dest_context->port" 232 | }, 233 | "next": "core_outbound" 234 | }, 235 | { 236 | "name": "bridge1", 237 | "type": "Bridge", 238 | "settings": { 239 | "pair": "bridge2" 240 | }, 241 | "next": "port_header" 242 | } 243 | // سایر گره‌ها مشابه قبل 244 | ] 245 | } 246 | ``` 247 | 248 | ```json title="سرور ایران" 249 | { 250 | "name": "config_reverse_tls_grpc_multiport_iran", 251 | "nodes": [ 252 | { 253 | "name": "inbound_users", 254 | "type": "TcpListener", 255 | "settings": { 256 | "address": "0.0.0.0", 257 | "port": [23, 65535], 258 | "nodelay": true 259 | }, 260 | "next": "port_header" 261 | }, 262 | { 263 | "name": "port_header", 264 | "type": "HeaderClient", 265 | "settings": { 266 | "data": "src_context->port" 267 | }, 268 | "next": "bridge2" 269 | } 270 | // سایر گره‌ها مشابه قبل 271 | ] 272 | } 273 | ``` 274 | 275 | ## مثال ترکیب با HalfDuplex 276 | 277 | این کانفیگ تونل معکوس را با پروتکل HalfDuplex ترکیب می‌کند تا مشکلات پینگ یا نوسان را کاهش دهد. 278 | 279 | :::warning 280 | ترکیب با HalfDuplex ممکن است مشکلاتی داشته باشد و بیشتر برای تونل معکوس عادی آزمایش شده است. در به‌روزرسانی‌های آینده، مشکلات احتمالی برطرف خواهند شد. 281 | ::: 282 | 283 | ```json title="تغییرات در کانفیگ سرور خارج" 284 | "nodes": [ 285 | // گره‌های قبلی 286 | { 287 | "name": "reverse_client", 288 | "type": "ReverseClient", 289 | "settings": {}, 290 | "next": "halfc" 291 | }, 292 | { 293 | "name": "halfc", 294 | "type": "HalfDuplexClient", 295 | "settings": {}, 296 | "next": "grpc_client" 297 | }, 298 | // سایر گره‌ها 299 | ] 300 | ``` 301 | 302 | ```json title="تغییرات در کانفیگ سرور ایران" 303 | "nodes": [ 304 | // گره‌های قبلی 305 | { 306 | "name": "reverse_server", 307 | "type": "ReverseServer", 308 | "settings": {}, 309 | "next": "bridge1" 310 | }, 311 | { 312 | "name": "halfs", 313 | "type": "HalfDuplexServer", 314 | "settings": {}, 315 | "next": "reverse_server" 316 | }, 317 | { 318 | "name": "grpc_server", 319 | "type": "ProtoBufServer", 320 | "settings": {}, 321 | "next": "halfs" 322 | }, 323 | // سایر گره‌ها 324 | ] 325 | ``` 326 | 327 | #### دانشنامه 328 | 329 | - Cloudflare: یک شرکت ارائه‌دهنده خدمات شبکه تحویل محتوا (CDN) و امنیت وب که از آی‌پی‌های تمیز و قانونی برخوردار است. 330 | - gRPC: یک فریمورک متن‌باز که امکان ارتباطات کارآمد و سبک بین سرویس‌ها را فراهم می‌کند. 331 | - گواهینامه امنیتی (Certificate): یک فایل دیجیتال که هویت و مالکیت یک وب‌سایت را تأیید می‌کند و برای برقراری اتصالات امن HTTPS استفاده می‌شود. 332 | - Certbot: یک ابزار خط فرمان برای دریافت و نصب خودکار گواهینامه‌های SSL/TLS از Let's Encrypt. 333 | - HalfDuplex: یک پروتکل ارتباطی که انتقال داده‌ها را در هر زمان فقط در یک جهت امکان‌پذیر می‌کند، اما جهت انتقال قابل تغییر است. 334 | -------------------------------------------------------------------------------- /docs/manually/tunnels/direct-trojan.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 9 3 | --- 4 | 5 | # Trojan 6 | 7 | این روش به صورت مستقیم کار می‌کند و نیازی به سرور واسط (intermediate server) در ایران ندارد. با استفاده از این روش، می‌توانید پیکربندی Trojan را ایجاد کنید، اما این پیکربندی با پیکربندی Trojan بر روی سایر هسته‌ها (cores) متفاوت خواهد بود. 8 | 9 | در حال حاضر، نیازی به تغییر در سمت کلاینت نیست و این پیکربندی بر روی تمامی برنامه‌های v2ray قابل اجرا است. همچنین، تغییرات به گونه‌ای اعمال می‌شوند که بر روی شبکه‌های ایرانسل و همراه اول فیلتر نشوند. 10 | 11 | مهم‌ترین تغییر در حال حاضر، مقاوم‌سازی در برابر `tls in tls` است و با استفاده از `trojan-killer` قابل شناسایی نیست. کاربرانی که می‌خواهند این پیکربندی را تست کنند، می‌توانند آن را بر روی سرور خارجی و پورت `443` اجرا کنند. 12 | 13 | در این پیکربندی، یک حساب کاربری Trojan با رمز عبور `1234` در نظر گرفته شده است. 14 | 15 | :::note وضعیت فیلترینگ 16 | تغییرات در به‌روزرسانی 1.20 برای تست قرار داده شده است و تا کنون به مدت 4 روز مشکلی مشاهده نشده است. 17 | ::: 18 | 19 | :::tip نکات مهم 20 | 21 | - فایل‌های گواهینامه (certificate) ضروری هستند. 22 | - بهتر است فالبک HTTP را به وب‌سایت خودتان یا سایر وب‌سایت‌های تصادفی تغییر دهید. احتمال دارد این فالبک مورد توجه قرار گرفته باشد. 23 | - پیشنهاد می‌شود در پیکربندی کلاینت، مقدار `alpn` را برابر با `h2` یا `http/1.1` قرار دهید. 24 | ::: 25 | 26 | ```json 27 | { 28 | "name": "direct_trojan", 29 | "nodes": [ 30 | { 31 | "name": "my-tcp-listener", 32 | "type": "TcpListener", 33 | "settings": { 34 | "address": "0.0.0.0", 35 | "port": 443, 36 | "nodelay": true 37 | }, 38 | "next": "my-ssl-server" 39 | }, 40 | { 41 | "name": "my-ssl-server", 42 | "type": "OpenSSLServer", 43 | "settings": { 44 | "anti-tls-in-tls": true, 45 | "cert-file": "fullchain.pem", 46 | "key-file": "privkey.pem", 47 | "alpns": [ 48 | { 49 | "value": "h2", 50 | "next": "node->next" 51 | }, 52 | { 53 | "value": "http/1.1", 54 | "next": "node->next" 55 | } 56 | ], 57 | "fallback": "my-tls-fallback" 58 | }, 59 | "next": "my-trojan-auth" 60 | }, 61 | { 62 | "name": "my-trojan-auth", 63 | "type": "TrojanAuthServer", 64 | "settings": { 65 | "fallback": "my-trojan-fallback", 66 | "fallback-intence-delay": 200, 67 | "users": [ 68 | { 69 | "name": "sample_user", 70 | "uid": "1234", 71 | "enable": true 72 | } 73 | ] 74 | }, 75 | "next": "my-trojan-socks" 76 | }, 77 | { 78 | "name": "my-trojan-socks", 79 | "type": "TrojanSocksServer", 80 | "settings": {}, 81 | "next": "my-connector" 82 | }, 83 | { 84 | "name": "my-connector", 85 | "type": "Connector", 86 | "settings": { 87 | "nodelay": true, 88 | "address": "dest_context->address", 89 | "port": "dest_context->port" 90 | } 91 | }, 92 | { 93 | "name": "my-tls-fallback", 94 | "type": "TcpConnector", 95 | "settings": { 96 | "nodelay": true, 97 | "address": "demo.nginx.com", 98 | "port": 443 99 | } 100 | }, 101 | { 102 | "name": "my-trojan-fallback", 103 | "type": "TcpConnector", 104 | "settings": { 105 | "nodelay": true, 106 | "address": "httpforever.com", 107 | "port": 80 108 | } 109 | } 110 | ] 111 | } 112 | ``` 113 | 114 | :::info 115 | با پیشرفت پروژه، توضیحات کامل‌تری ارائه خواهد شد، اما تا جایی که می‌دانم، با نگاه کردن به خود فایل JSON می‌توان تا حد زیادی درک کرد که هر بخش به چه منظوری است. 116 | ::: 117 | 118 | ### دانشنامه 119 | 120 | - Trojan: پروتکل امنیتی برای عبور از سانسور و فیلترینگ اینترنت 121 | - V2Ray: ابزاری برای ایجاد شبکه‌های پراکسی و عبور از فیلترینگ 122 | - TLS in TLS: تکنیکی برای شناسایی و مسدودسازی ترافیک رمزگذاری شده 123 | - ALPN (Application Layer Protocol Negotiation): مکانیزمی برای مذاکره پروتکل‌های لایه کاربرد روی TLS 124 | - Fallback: آدرس یا سرویس جایگزین در صورت عدم دسترسی به آدرس اصلی 125 | - NodeDelay: گزینه‌ای برای غیرفعال کردن الگوریتم Nagle و کاهش تأخیر در ارسال بسته‌های TCP 126 | 127 | ```mermaid 128 | graph LR 129 | A[Client] --> B[TcpListener] 130 | B --> C[OpenSSLServer] 131 | C --> D{Trojan Auth} 132 | D -->|Authenticated| E[Trojan Socks] 133 | D -->|Unauthenticated| F[TLS Fallback] 134 | E --> G[Connector] 135 | G --> H[Destination] 136 | D --> I[Trojan Fallback] 137 | ``` 138 | 139 | این نمودار گردش پیکربندی Trojan در WaterWall را نشان می‌دهد. درخواست‌های کلاینت ابتدا توسط TcpListener دریافت شده و سپس به OpenSSLServer منتقل می‌شوند. در آنجا، احراز هویت Trojan توسط TrojanAuthServer انجام می‌شود. اگر احراز هویت موفقیت‌آمیز باشد، درخواست به TrojanSocksServer فرستاده می‌شود و در غیر این صورت، به آدرس فالبک TLS هدایت می‌شود. Connector درخواست تأیید شده را به مقصد نهایی ارسال می‌کند. 140 | -------------------------------------------------------------------------------- /docs/manually/tunnels/free-bind.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 13 3 | --- 4 | 5 | # Freebind 6 | 7 | روش Freebind به ما این امکان را می‌دهد که به جای اتصال به یک آی‌پی مشخص سرور خارج، بین یک رنج آی‌پی که با سابنت‌ماسک مشخص می‌شود، تعادل بار ایجاد کنیم و به صورت تصادفی به یکی از آن‌ها متصل شویم. این عمل برای عدم فیلترینگ و بهبود سرعت بسیار مناسب به نظر می‌رسد. 8 | 9 | سرورها یک رنج عظیم از آی‌پی‌های IPv6 را در اختیار شما قرار می‌دهند. با استفاده از این قابلیت، می‌توانید هر اتصال جدید را به صورت تصادفی به یکی از آی‌پی‌های این رنج متصل کنید. به این ترتیب، فایروال همواره آی‌پی‌های متفاوت را مشاهده می‌کند. 10 | 11 | به عنوان مثال، سرورهای Hetzner رنج `/64` را ارائه می‌دهند که به این معنی است که `2^64` یعنی `18446744073709551615` آدرس آی‌پی برای اتصال در دسترس خواهد بود. 12 | 13 | ## اجرای روش مستقیم 14 | 15 | برای پیاده‌سازی Freebind، نیازی به نود جداگانه نیست و فقط باید در نودهای Listener و Connector تغییراتی ایجاد کنیم. فرض کنیم یک سرور خارجی داریم که هتزنر این آی‌پی IPv6 را به ما داده است: 16 | 17 | > `2a01:4f8:1c1b:276c::1/64` 18 | 19 | برای مثال، می‌خواهیم کانفیگ TLS Multi Port را به حالت Freebind تبدیل کنیم. 20 | 21 | ```mermaid 22 | flowchart LR; 23 | user1 --> A1; 24 | user2 --> A1; 25 | user3 --> A1; 26 | subgraph Kharej; 27 | B1[443 Waterwall] --> B2; 28 | B1[443 Waterwall] --> B2; 29 | B1[443 Waterwall] --> B2; 30 | B2[2083 Xray]; 31 | end; 32 | subgraph IRan; 33 | A1[2083 Waterwall] -- "TLS Handshake + Random Dest IP6" --> B1; 34 | A1[2083 Waterwall] -- "TLS Handshake + Random Dest IP6" --> B1; 35 | A1[2083 Waterwall] -- "TLS Handshake + Random Dest IP6" --> B1; 36 | end; 37 | ``` 38 | 39 | در سرور ایران، تغییری که انجام می‌دهیم این است که در TCP Connector می‌آییم و آدرس را به صورت یک رنج وارد می‌کنیم: 40 | 41 | ```json 42 | { 43 | "name": "tls_port_to_port", 44 | "nodes": [ 45 | { 46 | "name": "input", 47 | "type": "TcpListener", 48 | "settings": { 49 | "address": "0.0.0.0", 50 | "port": 2083, 51 | "nodelay": true 52 | }, 53 | "next": "mysslclient" 54 | }, 55 | { 56 | "name": "mysslclient", 57 | "type": "OpenSSLClient", 58 | "settings": { 59 | "sni": "mydomain.ir", 60 | "verify": true, 61 | "alpn": "http/1.1" 62 | }, 63 | "next": "output" 64 | }, 65 | { 66 | "name": "output", 67 | "type": "TcpConnector", 68 | "settings": { 69 | "nodelay": true, 70 | "address": "2a01:4f8:1c1b:276c::1/64", 71 | "port": 443 72 | } 73 | } 74 | ] 75 | } 76 | ``` 77 | 78 | همانطور که مشاهده می‌کنید، دقیقاً همان آی‌پی که هتزنر داده است، همراه با رنج آن /64، در پارامتر address قرار گرفته است. 79 | 80 | در سرور خارج، تنها تغییر این است که در نود Listener، پارامتر address به جای "0.0.0.0" به "::" تغییر پیدا کرده تا علاوه بر اتصال‌های IPv4، بتوانیم اتصال‌های IPv6 را نیز دریافت کنیم: 81 | 82 | ```json 83 | { 84 | "name": "tls_port_to_port_kharej", 85 | "nodes": [ 86 | { 87 | "name": "input", 88 | "type": "TcpListener", 89 | "settings": { 90 | "address": "::", 91 | "port": 443, 92 | "nodelay": true 93 | }, 94 | "next": "mysslserver" 95 | }, 96 | { 97 | "name": "mysslserver", 98 | "type": "OpenSSLServer", 99 | "settings": { 100 | "cert-file": "fullchain.pem", 101 | "key-file": "privkey.pem", 102 | "alpns": [ 103 | { 104 | "value": "h2", 105 | "next": "node->next" 106 | }, 107 | { 108 | "value": "http/1.1", 109 | "next": "node->next" 110 | } 111 | ] 112 | }, 113 | "next": "output" 114 | }, 115 | { 116 | "name": "output", 117 | "type": "TcpConnector", 118 | "settings": { 119 | "nodelay": true, 120 | "address": "127.0.0.1", 121 | "port": 2083 122 | } 123 | } 124 | ] 125 | } 126 | ``` 127 | 128 | در این مرحله، کار تقریباً تمام است، اما یک مرحله مهم باقی مانده که حتماً باید در سرور خارج انجام دهید. نیاز است که این دستور را در سرور خارج اجرا کنید: 129 | 130 | ```sh 131 | ip route add local 2a01:4f8:1c1b:276c::/64 dev eth0 132 | ``` 133 | -------------------------------------------------------------------------------- /docs/manually/tunnels/halfduplex-tunnel-or-direct.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 10 3 | --- 4 | 5 | import YouTube from 'react-youtube' 6 | 7 | # HalfDuplex 8 | 9 | HalfDuplex یک قابلیت است که هر اتصال (Connection) را به دو اتصال تبدیل می‌کند: 10 | 11 | - یک اتصال فقط برای **ارسال** داده‌ها استفاده می‌شود. 12 | - اتصال دیگر فقط برای **دریافت** داده‌ها استفاده می‌شود. 13 | 14 | در ابتدای برقراری هر کدام از این اتصالات، یک `Handshake` از نوع `TLS` انجام 15 | می‌شود، حتی اگر دامنه‌های متفاوتی داشته باشند. 16 | 17 | مزایای HalfDuplex: 18 | 19 | 1. **محدود کردن تحلیل ترافیک توسط فایروال:** چون داده‌ها روی هر اتصال به صورت یک 20 | طرفه منتقل می‌شوند. 21 | 2. **قابل پیاده‌سازی در اتصالات مستقیم (نه فقط تونل):** می‌تواند از فیلتر شدن 22 | پیکربندی‌های مستقیم جلوگیری کند. 23 | 24 | نکات: 25 | 26 | - اتصالات با انتقال دوطرفه داده، معمولاً نشان‌دهنده وجود تونل هستند. 27 | - مثلاً در `HTTP/2` معمولی، ابتدا آپلود کم و سپس دانلود زیاد انجام می‌شود. 28 | - اما در `VPN` با `Multiplexing`، آپلود به طور مداوم روی اتصال انجام می‌شود. 29 | - این ویژگی برای تونل‌های معکوس (`Reverse Tunnel`) برای حفظ کیفیت سرویس ضروری 30 | است. 31 | - احتمالاً تونل‌های عادی `port-to-port` را نیز در برابر فیلتر شدن مقاوم می‌کند 32 | (هنوز تست نشده). 33 | 34 | ## ویدیو های آموزشی 35 | 36 | #### آموزش تانل زدن به روش waterwall بین سرور ایران و خارج: آموزش تانل v2ray 37 | 38 | 39 | 40 | ## اجرای ساده چند پورت (Multi-port) 41 | 42 | نحوه اعمال HalfDuplex در حالت چند پورت ساده، با فرض آدرس سرور خارج `1.1.1.1`: 43 | 44 | #### سرور ایران 45 | 46 | ```json 47 | { 48 | "name": "simple_multiport_hd_client", 49 | "nodes": [ 50 | { 51 | "name": "input", 52 | "type": "TcpListener", 53 | "settings": { 54 | "address": "0.0.0.0", 55 | "port": [23, 65535], 56 | "nodelay": true 57 | }, 58 | "next": "port_header" 59 | }, 60 | { 61 | "name": "port_header", 62 | "type": "HeaderClient", 63 | "settings": { 64 | "data": "src_context->port" 65 | }, 66 | "next": "halfc" 67 | }, 68 | { 69 | "name": "halfc", 70 | "type": "HalfDuplexClient", 71 | "next": "output" 72 | }, 73 | { 74 | "name": "output", 75 | "type": "TcpConnector", 76 | "settings": { 77 | "nodelay": true, 78 | "address": "1.1.1.1", 79 | "port": 443 80 | } 81 | } 82 | ] 83 | } 84 | ``` 85 | 86 | ```json title="سرور خارج" 87 | { 88 | "name": "simple_multiport_hd_server", 89 | "nodes": [ 90 | { 91 | "name": "input", 92 | "type": "TcpListener", 93 | "settings": { 94 | "address": "0.0.0.0", 95 | "port": 443, 96 | "nodelay": true 97 | }, 98 | "next": "halfs" 99 | }, 100 | { 101 | "name": "halfs", 102 | "type": "HalfDuplexServer", 103 | "settings": {}, 104 | "next": "port_header" 105 | }, 106 | { 107 | "name": "port_header", 108 | "type": "HeaderServer", 109 | "settings": { 110 | "override": "dest_context->port" 111 | }, 112 | "next": "output" 113 | }, 114 | { 115 | "name": "output", 116 | "type": "TcpConnector", 117 | "settings": { 118 | "nodelay": true, 119 | "address": "127.0.0.1", 120 | "port": "dest_context->port" 121 | } 122 | } 123 | ] 124 | } 125 | ``` 126 | 127 | ## پیکربندی Reverse Reality با mux 128 | 129 | پیکربندی Reverse Reality با استفاده از mux که توسط نویسنده برای کاربرانش استفاده 130 | می‌شود: 131 | 132 | :::note فرضیات 133 | 134 | - fake sni: sahab.ir 135 | - ip kharej: 2.2.2.2 136 | - password: passwd 137 | ::: 138 | 139 | ```json title="سرور ایران" 140 | { 141 | "name": "reverse_reality_grpc_client_hd_multiport_client", 142 | "nodes": [ 143 | { 144 | "name": "outbound_to_core", 145 | "type": "TcpConnector", 146 | "settings": { 147 | "nodelay": true, 148 | "address": "127.0.0.1", 149 | "port": "dest_context->port" 150 | } 151 | }, 152 | { 153 | "name": "header", 154 | "type": "HeaderServer", 155 | "settings": { 156 | "override": "dest_context->port" 157 | }, 158 | "next": "outbound_to_core" 159 | }, 160 | { 161 | "name": "bridge1", 162 | "type": "Bridge", 163 | "settings": { 164 | "pair": "bridge2" 165 | }, 166 | "next": "header" 167 | }, 168 | { 169 | "name": "bridge2", 170 | "type": "Bridge", 171 | "settings": { 172 | "pair": "bridge1" 173 | }, 174 | "next": "reverse_client" 175 | }, 176 | { 177 | "name": "reverse_client", 178 | "type": "ReverseClient", 179 | "settings": { 180 | "minimum-unused": 16 181 | }, 182 | "next": "pbclient" 183 | }, 184 | { 185 | "name": "pbclient", 186 | "type": "ProtoBufClient", 187 | "settings": {}, 188 | "next": "h2client" 189 | }, 190 | { 191 | "name": "h2client", 192 | "type": "Http2Client", 193 | "settings": { 194 | "host": "sahab.ir", 195 | "port": 443, 196 | "path": "/", 197 | "content-type": "application/grpc", 198 | "concurrency": 64 199 | }, 200 | "next": "halfc" 201 | }, 202 | { 203 | "name": "halfc", 204 | "type": "HalfDuplexClient", 205 | "next": "reality_client" 206 | }, 207 | { 208 | "name": "reality_client", 209 | "type": "RealityClient", 210 | "settings": { 211 | "sni": "sahab.ir", 212 | "password": "passwd" 213 | }, 214 | "next": "outbound_to_iran" 215 | }, 216 | { 217 | "name": "outbound_to_iran", 218 | "type": "TcpConnector", 219 | "settings": { 220 | "nodelay": true, 221 | "address": "1.1.1.1", 222 | "port": 443 223 | } 224 | } 225 | ] 226 | } 227 | ``` 228 | 229 | :::note فرضیات 230 | 231 | - fake sni: sahab.ir 232 | - ip kharej: 2.2.2.2 233 | - password: passwd 234 | 235 | ::: 236 | 237 | ```json title="سرور خارج" 238 | { 239 | "name": "reverse_reality_grpc_hd_multiport_server", 240 | "nodes": [ 241 | { 242 | "name": "users_inbound", 243 | "type": "TcpListener", 244 | "settings": { 245 | "address": "0.0.0.0", 246 | "port": [23, 65535], 247 | "nodelay": true 248 | }, 249 | "next": "header" 250 | }, 251 | { 252 | "name": "header", 253 | "type": "HeaderClient", 254 | "settings": { 255 | "data": "src_context->port" 256 | }, 257 | "next": "bridge2" 258 | }, 259 | { 260 | "name": "bridge2", 261 | "type": "Bridge", 262 | "settings": { 263 | "pair": "bridge1" 264 | } 265 | }, 266 | { 267 | "name": "bridge1", 268 | "type": "Bridge", 269 | "settings": { 270 | "pair": "bridge2" 271 | } 272 | }, 273 | { 274 | "name": "reverse_server", 275 | "type": "ReverseServer", 276 | "settings": {}, 277 | "next": "bridge1" 278 | }, 279 | { 280 | "name": "pbserver", 281 | "type": "ProtoBufServer", 282 | "settings": {}, 283 | "next": "reverse_server" 284 | }, 285 | { 286 | "name": "h2server", 287 | "type": "Http2Server", 288 | "settings": {}, 289 | "next": "pbserver" 290 | }, 291 | { 292 | "name": "halfs", 293 | "type": "HalfDuplexServer", 294 | "settings": {}, 295 | "next": "h2server" 296 | }, 297 | { 298 | "name": "reality_server", 299 | "type": "RealityServer", 300 | "settings": { 301 | "destination": "reality_dest", 302 | "password": "passwd" 303 | }, 304 | "next": "halfs" 305 | }, 306 | { 307 | "name": "kharej_inbound", 308 | "type": "TcpListener", 309 | "settings": { 310 | "address": "0.0.0.0", 311 | "port": 443, 312 | "nodelay": true, 313 | "whitelist": ["2.2.2.2/32"] 314 | }, 315 | "next": "reality_server" 316 | }, 317 | { 318 | "name": "reality_dest", 319 | "type": "TcpConnector", 320 | "settings": { 321 | "nodelay": true, 322 | "address": "sahab.ir", 323 | "port": 443 324 | } 325 | } 326 | ] 327 | } 328 | ``` 329 | 330 | :::tip نکته مهم بدون توجه به تعداد هسته‌های سرور، تعداد Worker ها در سرور خارج 331 | را همیشه 4 برابر تعداد Worker های سرور ایران قرار دهید (حتی اگر 8 برابر). این 332 | کار سرعت را به میزان قابل توجهی بهبود می‌بخشد. 333 | 334 | دلیل آن ارتباطی به مصرف CPU ندارد، بلکه هر Worker یک اتصال مجزا ایجاد می‌کند و 335 | کاربران روی یک اتصال Multiplexed قرار نمی‌گیرند. 336 | 337 | :::note توجه این نکته فقط برای Reverse Reality با mux صادق است. در سایر روش‌ها، 338 | بهتر است تعداد Worker ها صفر باشد. 339 | 340 | ::: 341 | -------------------------------------------------------------------------------- /docs/manually/tunnels/http2-mux-grpc.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | --- 4 | 5 | import YouTube from 'react-youtube' 6 | 7 | # Http2 Mux Grpc 8 | 9 | افزودن پروتکل Http2 به تونل، امکانات و ویژگی‌های جدیدی را در اختیار ما قرار 10 | می‌دهد، از جمله قابلیت‌های multiplexing (mux) و gRPC. 11 | 12 | با بهره‌گیری از gRPC، می‌توان ارتباط را هم از طریق سرویس Cloudflare عبور داد و 13 | هم به صورت مستقیم استفاده کرد، بدون تفاوت. 14 | 15 | استفاده از mux نیز باعث کاهش تعداد اتصالات (connections) بین سرور داخل ایران و 16 | خارج می‌شود و همچنین زمان handshake را به میزان قابل توجهی بهبود می‌بخشد. 17 | 18 | روش‌های تونل بدون mux، احتمال بروز اختلال یا حتی فیلتر شدن سرور خارجی شما را 19 | افزایش می‌دهند. 20 | 21 | بنابراین، به ویژه اگر تعداد زیادی کاربر روی یک سرور دارید، اکیداً توصیه می‌شود 22 | این قابلیت را در تونل‌های خود پیاده‌سازی کنید. 23 | 24 | هنگام استفاده از Http2، دیگر نیازی به preconnect نیست و تأثیر چندانی نخواهد 25 | داشت. 26 | 27 | ## ویدیو های آموزشی 28 | 29 | #### آموزش تانل MUX با هسته ی واتروال 30 | 31 | 32 | 33 | ## پیاده‌سازی روی Tls tunnel 34 | 35 | در این مثال، آدرس IP سرور خارجی `1.1.1.1` فرض شده است. اگر IP پشت دامنه قرار 36 | دارد، می‌توانید در بخش `node output`، به جای IP، نام دامنه را وارد کنید. 37 | 38 | ## فلوچارت 39 | 40 | ```mermaid 41 | flowchart LR; 42 | user1 --> A1; 43 | user2 --> A2; 44 | user3 --> A3; 45 | user4 --> A4; 46 | subgraph Kharej; 47 | B1[443 Waterwall] --> B2 & B2 & B2 & B2; 48 | B2[2083 Xray]; 49 | end; 50 | subgraph IRan; 51 | A1[443] --> Ain ; 52 | A2[443] --> Ain ; 53 | A3[443] --> Ain; 54 | A4[443] --> Ain; 55 | Ain[Http2 Mux] -- "TLS Handshake" ---> B1; 56 | end; 57 | ``` 58 | 59 | ```json title="سرور ایران" 60 | { 61 | "name": "tls_port_to_port_grpc_iran", 62 | "nodes": [ 63 | { 64 | "name": "input", 65 | "type": "TcpListener", 66 | "settings": { 67 | "address": "0.0.0.0", 68 | "port": 443, 69 | "nodelay": true 70 | }, 71 | "next": "pbclient" 72 | }, 73 | { 74 | "name": "pbclient", 75 | "type": "ProtoBufClient", 76 | "settings": {}, 77 | "next": "h2client" 78 | }, 79 | { 80 | "name": "h2client", 81 | "type": "Http2Client", 82 | "settings": { 83 | "host": "mydomain.ir", 84 | "port": 443, 85 | "path": "/", 86 | "content-type": "application/grpc", 87 | "concurrency": 64 88 | }, 89 | "next": "sslclient" 90 | }, 91 | { 92 | "name": "sslclient", 93 | "type": "OpenSSLClient", 94 | "settings": { 95 | "sni": "mydomain.ir", 96 | "verify": true, 97 | "alpn": "h2" 98 | }, 99 | "next": "output" 100 | }, 101 | { 102 | "name": "output", 103 | "type": "TcpConnector", 104 | "settings": { 105 | "nodelay": true, 106 | "address": "1.1.1.1", 107 | "port": 443 108 | } 109 | } 110 | ] 111 | } 112 | ``` 113 | 114 | ```json title="سرور خارج" 115 | { 116 | "name": "tls_port_to_port_grpc_kharej", 117 | "nodes": [ 118 | { 119 | "name": "input", 120 | "type": "TcpListener", 121 | "settings": { 122 | "address": "0.0.0.0", 123 | "port": 443, 124 | "nodelay": true 125 | }, 126 | "next": "sslserver" 127 | }, 128 | { 129 | "name": "sslserver", 130 | "type": "OpenSSLServer", 131 | "settings": { 132 | "cert-file": "fullchain.pem", 133 | "key-file": "privkey.pem", 134 | "alpns": [ 135 | { 136 | "value": "h2", 137 | "next": "node->next" 138 | }, 139 | { 140 | "value": "http/1.1", 141 | "next": "node->next" 142 | } 143 | ] 144 | }, 145 | "next": "h2server" 146 | }, 147 | 148 | { 149 | "name": "h2server", 150 | "type": "Http2Server", 151 | "settings": {}, 152 | "next": "pbserver" 153 | }, 154 | { 155 | "name": "pbserver", 156 | "type": "ProtoBufServer", 157 | "settings": {}, 158 | "next": "output" 159 | }, 160 | { 161 | "name": "output", 162 | "type": "Connector", 163 | "settings": { 164 | "nodelay": true, 165 | "address": "127.0.0.1", 166 | "port": 2083 167 | } 168 | } 169 | ] 170 | } 171 | ``` 172 | 173 | در این مثال، وجود node ProtoBuf الزامی نیست، اما با قرار دادن آن، ارتباط به 174 | عنوان gRPC شناخته می‌شود و می‌تواند از طریق CDN عبور کند. 175 | 176 | :::info پارامتر concurrency همانطور که در پیکربندی مشاهده می‌کنید، در گره 177 | Http2Client پارامتری به نام concurrency وجود دارد. 178 | 179 | به صورت پیش‌فرض، مقدار آن 64 تنظیم شده است که بدین معناست به ازای هر 64 اتصال 180 | کاربر، یک اتصال به سرور خارجی برقرار می‌شود. 181 | 182 | اگر تعداد کاربران شما بسیار زیاد است (مثلاً بیش از 150 یا 200 نفر)، پیشنهاد 183 | می‌شود مقدار concurrency را دو برابر کنید و روی 128 تنظیم نمایید تا احتمال فیلتر 184 | شدن بر اساس تعداد اتصالات نیز نصف شود. 185 | ::: 186 | 187 | #### دانشنامه Http2 و gRPC در WaterWall 188 | 189 | - Http2: نسخه بهبود یافته پروتکل HTTP که امکاناتی مانند multiplexing، فشرده‌سازی 190 | هدر، و Server Push را ارائه می‌دهد. استفاده از Http2 در تونل‌های WaterWall، 191 | کارایی و عملکرد را به میزان چشمگیری افزایش می‌دهد. 192 | - gRPC: چارچوبی برای ارتباطات بین سرویس‌ها که از Http2 برای انتقال داده بهره 193 | می‌برد. با استفاده از gRPC در پیکربندی تونل، امکان عبور ارتباط از سرویس‌های 194 | CDN مانند Cloudflare فراهم می‌شود. 195 | - Multiplexing (Mux): قابلیت Http2 برای برقراری چندین ارتباط همزمان روی یک اتصال 196 | واحد. در WaterWall، mux باعث کاهش تعداد اتصالات بین سرور داخل و خارج ایران شده 197 | و زمان handshake را بهبود می‌بخشد. 198 | - Concurrency: پارامتری در گره Http2Client که تعداد اتصالات کاربر به ازای هر 199 | اتصال به سرور خارجی را مشخص می‌کند. تنظیم مقدار مناسب برای concurrency بسته به 200 | تعداد کاربران، از اهمیت بالایی برخوردار است. 201 | - ProtoBuf (Protocol Buffers): فرمت سریال‌سازی داده توسعه یافته توسط Google که 202 | در gRPC به کار می‌رود. گره‌های ProtoBufClient و ProtoBufServer در پیکربندی 203 | WaterWall، نقش مهمی در شناسایی ارتباط به عنوان gRPC ایفا می‌کنند. 204 | -------------------------------------------------------------------------------- /docs/manually/tunnels/load-balancing.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 11 3 | --- 4 | 5 | # LoadBalancing 6 | 7 | در این نوشته، چند روش کاربردی برای پیاده‌سازی Load Balancing در پیکربندی‌های مستقیم و معکوس (ریورس) توضیح داده می‌شود. 8 | 9 | ## تعریف Load Balancing 10 | 11 | Load Balancing به دو حالت تقسیم می‌شود: 12 | 13 | 1. **حالت اول**: یک سرور در ایران وجود دارد که به چند سرور خارجی متصل می‌شود و کاربران را بین آن‌ها توزیع می‌کند. 14 | 15 | 2. **حالت دوم**: چند سرور ایرانی به یک سرور خارجی متصل می‌شوند. این حالت بسیار ساده است و نیازی به قابلیت Load Balancing اضافی ندارد. تنها کافی است برای هر سرور ایرانی، یک پیکربندی جداگانه در سرور خارجی اضافه شود. مثالی از این حالت در ادامه ارائه خواهد شد، اما تمرکز اصلی این آموزش بر روی حالت اول است. 16 | 17 | Load Balancing مزایای زیادی دارد: 18 | 19 | - احتمال فیلتر شدن سرور خارجی و یا شناسایی سرور ایرانی را به شدت کاهش می‌دهد. 20 | - دیتاسنترها دیگر متوجه نمی‌شوند که ترافیک به صورت تونل از یک مبدأ به یک مقصد در حال انتقال است. 21 | 22 | ## پیکربندی مستقیم (Direct Tunnel) 23 | 24 | برای توضیح Load Balancing، ابتدا یک پیکربندی مستقیم را نشان می‌دهیم. 25 | 26 | :::note فرضیات 27 | 28 | - آی‌پی سرور ایران: `1.1.1.1` 29 | - آی‌پی سرور آلمان: `2.2.2.2` 30 | - آی‌پی سرور هلند: `3.3.3.3` 31 | ::: 32 | 33 | ابتدا یک ارتباط ساده بین پورت‌های سرور ایران و آلمان برقرار می‌کنیم: 34 | 35 | ```json 36 | { 37 | "name": "simple_port_to_port", 38 | "nodes": [ 39 | { 40 | "name": "input", 41 | "type": "TcpListener", 42 | "settings": { 43 | "address": "0.0.0.0", 44 | "port": 443, 45 | "nodelay": true 46 | }, 47 | "next": "output" 48 | }, 49 | { 50 | "name": "output", 51 | "type": "TcpConnector", 52 | "settings": { 53 | "nodelay": true, 54 | "address": "1.1.1.1", 55 | "port": 443 56 | } 57 | } 58 | ] 59 | } 60 | ``` 61 | 62 | این پیکربندی، پورت به پورت است و نیازی به اجرای دیوار آتش (Firewall) روی سرور خارجی ندارد. اما اگر در حالتی هستید که نیاز به اجرای دیوار آتش در سرور خارجی دارید، می‌توانید پیکربندی مخصوص به خود را در سرور خارجی اجرا کنید. 63 | 64 | در این مثال، پورت 443 سرور ایران به پورت 443 سرور خارجی آلمان متصل شده است. 65 | 66 | حال می‌خواهیم همین پورت 443 را به سرور هلند نیز متصل کنیم تا کاربری که به سرور ایران متصل می‌شود، به صورت تصادفی یا به آلمان وصل شود یا به هلند. 67 | 68 | پیکربندی را تغییر می‌دهیم و هلند را اضافه می‌کنیم: 69 | 70 | ```json 71 | { 72 | "name": "simple_port_to_port_2_kharej", 73 | "nodes": [ 74 | { 75 | "name": "input1", 76 | "type": "TcpListener", 77 | "settings": { 78 | "address": "0.0.0.0", 79 | "port": 443, 80 | "nodelay": true 81 | }, 82 | "next": "output_alman" 83 | }, 84 | { 85 | "name": "output_alman", 86 | "type": "TcpConnector", 87 | "settings": { 88 | "nodelay": true, 89 | "address": "1.1.1.1", 90 | "port": 443 91 | } 92 | }, 93 | { 94 | "name": "input2", 95 | "type": "TcpListener", 96 | "settings": { 97 | "address": "0.0.0.0", 98 | "port": 443, 99 | "nodelay": true 100 | }, 101 | "next": "output_holand" 102 | }, 103 | { 104 | "name": "output_holand", 105 | "type": "TcpConnector", 106 | "settings": { 107 | "nodelay": true, 108 | "address": "2.2.2.2", 109 | "port": 443 110 | } 111 | } 112 | ] 113 | } 114 | ``` 115 | 116 | در این پیکربندی، دو ورودی (input) روی یک پورت داریم که کاملاً مشابه هم هستند. اگر اکنون پیکربندی را اجرا کنیم، متوجه خواهیم شد که همه کاربران به input1 وصل می‌شوند و در نتیجه همگی به آلمان متصل می‌شوند. 117 | 118 | برای ایجاد Load Balancing، باید بین input1 و input2 یک balance-group تعریف کنیم: 119 | 120 | ```json 121 | { 122 | "name": "simple_port_to_port_2_kharej", 123 | "nodes": [ 124 | { 125 | "name": "input1", 126 | "type": "TcpListener", 127 | "settings": { 128 | "address": "0.0.0.0", 129 | "port": 443, 130 | "nodelay": true, 131 | "balance-group": "group name" 132 | }, 133 | "next": "output_alman" 134 | }, 135 | { 136 | "name": "output_alman", 137 | "type": "TcpConnector", 138 | "settings": { 139 | "nodelay": true, 140 | "address": "1.1.1.1", 141 | "port": 443 142 | } 143 | }, 144 | { 145 | "name": "input2", 146 | "type": "TcpListener", 147 | "settings": { 148 | "address": "0.0.0.0", 149 | "port": 443, 150 | "nodelay": true, 151 | "balance-group": "group name" 152 | }, 153 | "next": "output_holand" 154 | }, 155 | { 156 | "name": "output_holand", 157 | "type": "TcpConnector", 158 | "settings": { 159 | "nodelay": true, 160 | "address": "2.2.2.2", 161 | "port": 443 162 | } 163 | } 164 | ] 165 | } 166 | ``` 167 | 168 | :::info 169 | در این پیکربندی، پارامتر balance-group را به تنظیمات (Settings) گره‌های ورودی (input) اضافه کرده‌ایم. این پارامتر یک نام دلخواه می‌گیرد و گره‌های ورودی که این نام گروه را داشته باشند، با هم متعادل (Balance) می‌شوند و کاربران را بین خود تقسیم می‌کنند. 170 | 171 | وقتی یک کاربر متصل می‌شود، ممکن است به input1 یا input2 تخصیص داده شود و تا زمانی که متصل باشد، در همان input باقی می‌ماند. اگر کاربر برای مدت یک دقیقه غیرفعال باشد (یعنی از VPN استفاده نکند، نه اینکه فقط برنامه v2rayng را قطع کند)، در اتصال بعدی ممکن است به یک input جدید تخصیص داده شود و به جای آلمان، به هلند متصل شود. 172 | ::: 173 | 174 | ## پارامتر balance-interval 175 | 176 | اگر می‌خواهید مدت زمان یک دقیقه‌ای را برای تست یا هر منظور دیگری تغییر دهید، می‌توانید پارامتر balance-interval را به تنظیمات (Settings) اضافه کنید. این پارامتر یک عدد به میلی‌ثانیه می‌گیرد. 177 | 178 | توجه داشته باشید که نباید این عدد را خیلی کم تنظیم کنید. اگر مثلاً آن را روی 1 ثانیه تنظیم کنید، کاربر خیلی سریع جابجا می‌شود و وب‌سایت‌ها معمولاً به چنین کاربری اجازه ورود یا انجام کار نمی‌دهند. سایت برای کاربر به درستی بارگذاری نمی‌شود و کپچاها (Captcha) نیز مشکل ایجاد می‌کنند. 179 | 180 | پارامتر balance-interval را می‌توانید برای هر گره ورودی (input) به صورت جداگانه تعریف کنید. معمولاً اگر بخواهید تغییر دهید، برای همه گره‌ها عدد جدید را یکسان تنظیم می‌کنید. 181 | 182 | اگر برای گره‌های مختلف، مقادیر متفاوتی تنظیم کنید (مثلاً برای input2، 5 دقیقه و برای input1، 1 دقیقه)، در این صورت اگر کاربر به هلند متصل شود، باید 5 دقیقه غیرفعال باشد تا دوباره شانس اتصال به جای دیگری را داشته باشد. اما اگر به آلمان متصل شود، تنها 1 دقیقه غیرفعالی کافی است. این حالت کاربرد خاصی ندارد، مگر اینکه بخواهید عمداً ترافیک بیشتری را به سمت هلند هدایت کنید تا آلمان. 183 | 184 | :::tip نکته فنی 185 | وقتی کاربری را بین چند سرور خارجی متعادل (Balance) می‌کنید، باید روی هر دو سرور خارجی، یک پنل xui یا راهی برای دسترسی به هسته وجود داشته باشد تا کاربر بتواند متصل شود. 186 | 187 | معمولاً یک نسخه پشتیبان از پنل را روی دو سرور نصب می‌کنند. اما یک حالت کم‌طرفدار دیگر نیز وجود دارد که در آن، ترافیک سرور خارجی دوم را به سرور خارجی اول هدایت می‌کنند. در این حالت، کاربر همیشه آی‌پی سرور اول را خواهد داشت، اما در سرور ایرانی، ترافیک بین دو سرور خارجی توزیع می‌شود. 188 | 189 | شاید تنها کاربرد این نوع Load Balancing، کاهش احتمال فیلتر شدن آی‌پی خارجی باشد. یا زمانی که هر دو سرور شما در آلمان قرار دارند و نمی‌خواهید دردسر مدیریت دو پنل را داشته باشید. 190 | ::: 191 | 192 | ### اضافه کردن سرور سوم 193 | 194 | اگر بخواهید به پیکربندی فعلی، یک سرور دیگر مانند فنلاند را اضافه کنید، کافی است آن را به همان balance-group اضافه کنید. 195 | :::info 196 | می‌توانید تا 64 عضو را در یک گروه داشته باشید. 197 | ::: 198 | 199 | ## Load Balancing در پیکربندی‌های معکوس (Reverse) 200 | 201 | برای پیاده‌سازی Load Balancing چند سرور خارجی به یک سرور ایرانی در پیکربندی‌های معکوس، تنها کاری که باید انجام دهید این است که در پیکربندی سرور ایرانی، در بخشی که آی‌پی سرور خارجی اول را در لیست سفید (Whitelist) قرار داده‌اید، آی‌پی سایر سرورهای خارجی را نیز به لیست سفید اضافه کنید. 202 | 203 | سپس برنامه را در سایر سرورهای خارجی اجرا کنید. 204 | 205 | اگر پنل روی یک سرور خارجی نصب شده باشد، در پیکربندی سرورهای خارجی دیگر، باید آدرس سرور خارجی اصلی را به جای `127.0.0.1` قرار دهید. 206 | 207 | اما اگر روی هر کدام از سرورهای خارجی، پنل جداگانه‌ای نصب شده باشد و کاربران روی آن‌ها تعریف شده باشند، باید جلوی مشکل جابجایی سریع کاربران بین آی‌پی‌های مختلف خارجی را بگیریم. برای این منظور، باید balance-group را هم برای گره ورودی خارجی و هم برای گره ورودی کاربر به صورت جداگانه تعریف کنیم. مثال آن را در ادامه خواهیم دید. 208 | 209 | ادامه این مستند در آینده نوشته خواهد شد... 210 | 211 | # دانشنامه 212 | 213 | - Load Balancing: فرآیند توزیع بار ترافیک بین چندین سرور برای بهبود عملکرد، قابلیت اطمینان و مقیاس‌پذیری. 214 | - Direct Tunnel: تونل مستقیم بین دو سرور که ترافیک را بدون واسطه انتقال می‌دهد. 215 | - TcpListener: گره‌ای در WaterWall که روی یک پورت گوش می‌دهد و درخواست‌های TCP را دریافت می‌کند. 216 | - TcpConnector: گره‌ای در WaterWall که به یک آدرس و پورت مشخص متصل می‌شود و ترافیک را انتقال می‌دهد. 217 | - balance-group: ویژگی‌ای در پیکربندی WaterWall که برای ایجاد Load Balancing بین چند گره ورودی استفاده می‌شود. 218 | 219 | ``` 220 | 221 | ``` 222 | -------------------------------------------------------------------------------- /docs/manually/tunnels/port-to-port.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Port to Port 6 | 7 | انواع روش‌های تونل پورت به پورت 8 | 9 | پورت به پورت یکی از ساده‌ترین و رایج‌ترین روش‌های ایجاد تونل است. در این روش، کاربر به سرور ایران متصل می‌شود و سرور ایران نیز مستقیماً به سرور خارج وصل می‌شود تا ارتباط برقرار شود. 10 | 11 | ## تک پورت به تک پورت ساده (Single Port to Single Port) 12 | 13 | این روش که به دوکودر (Decoder) هم معروف است، می‌تواند با استفاده از آی‌پی تیبل (iptables) یا ابزارهایی مانند WaterWall در لایه اپلیکیشن انجام شود. تفاوت اصلی در این است که آی‌پی تیبل در لایه‌های پایین‌تر NAT را انجام می‌دهد، در حالی که WaterWall این کار را در لایه اپلیکیشن انجام می‌دهد. 14 | 15 | برای مثال، اگر بخواهیم پورت `443` سرور ایران را به پورت `443` سرور خارج با آی‌پی `1.1.1.1` هدایت کنیم، فایل پیکربندی در سرور ایران به صورت زیر خواهد بود: 16 | 17 | ```mermaid 18 | graph LR; 19 | subgraph Kharej; 20 | B[443] ; 21 | end; 22 | subgraph IRan; 23 | A[443] --> B[443]; 24 | end; 25 | ``` 26 | 27 | ```json 28 | { 29 | "name": "simple_port_to_port", 30 | "nodes": [ 31 | { 32 | "name": "input", 33 | "type": "TcpListener", 34 | "settings": { 35 | "address": "0.0.0.0", 36 | "port": 443, 37 | "nodelay": true 38 | }, 39 | "next": "output" 40 | }, 41 | { 42 | "name": "output", 43 | "type": "TcpConnector", 44 | "settings": { 45 | "nodelay": true, 46 | "address": "1.1.1.1", 47 | "port": 443 48 | } 49 | } 50 | ] 51 | } 52 | ``` 53 | 54 | این روش فقط نیاز به اجرای WaterWall بر روی سرور ایران دارد و نیازی به اجرای آن بر روی سرور خارج نیست. 55 | 56 | ## چند پورت به تک پورت ساده (Multi Port to Single Port) 57 | 58 | در این حالت، هر پورتی که کاربر به سرور ایران متصل شود، به پورت 443 سرور خارج وصل خواهد شد. 59 | 60 | ```mermaid 61 | flowchart LR; 62 | subgraph Kharej; 63 | B[443]; 64 | end; 65 | subgraph IRan; 66 | A1[443] --> B[443]; 67 | A2[444] --> B[443]; 68 | A3[...] --> B[443]; 69 | A4[65535] --> B[443]; 70 | end; 71 | ``` 72 | 73 | ```json 74 | { 75 | "name": "simple_multiport_to_port", 76 | "nodes": [ 77 | { 78 | "name": "input", 79 | "type": "TcpListener", 80 | "settings": { 81 | "address": "0.0.0.0", 82 | "port": [23, 65535], 83 | "nodelay": true 84 | }, 85 | "next": "output" 86 | }, 87 | { 88 | "name": "output", 89 | "type": "TcpConnector", 90 | "settings": { 91 | "nodelay": true, 92 | "address": "1.1.1.1", 93 | "port": 443 94 | } 95 | } 96 | ] 97 | } 98 | ``` 99 | 100 | ## چند پورت به چند پورت ساده (Multi Port to Multi Port) 101 | 102 | در این روش، هر پورتی که کاربر به سرور ایران متصل شود، به همان پورت روی سرور خارج وصل خواهد شد. این روش شبیه به آی‌پی تیبل است که تمام پورت‌ها را تونل می‌کند، اما در لایه اپلیکیشن انجام می‌شود. 103 | 104 | ```mermaid 105 | flowchart LR; 106 | subgraph Kharej; 107 | B1[443]; 108 | B2[444]; 109 | B3[...]; 110 | B4[65535]; 111 | end; 112 | subgraph IRan; 113 | A1[443] --> B1; 114 | A2[444] --> B2; 115 | A3[...] --> B3; 116 | A4[65535] --> B4; 117 | end; 118 | ``` 119 | 120 | ```json 121 | { 122 | "name": "simple_multiport", 123 | "nodes": [ 124 | { 125 | "name": "input", 126 | "type": "TcpListener", 127 | "settings": { 128 | "address": "0.0.0.0", 129 | "port": [23, 65535], 130 | "nodelay": true 131 | }, 132 | "next": "output" 133 | }, 134 | { 135 | "name": "output", 136 | "type": "TcpConnector", 137 | "settings": { 138 | "nodelay": true, 139 | "address": "1.1.1.1", 140 | // use the same source port 141 | "port": "src_context->port" 142 | } 143 | } 144 | ] 145 | } 146 | ``` 147 | 148 | ## تک پورت به تک پورت مجزا (Single Port to Separate Single Port) 149 | 150 | اگر بخواهیم علاوه بر پورت 443، پورت‌های دیگری مانند 2083 را نیز به صورت جداگانه هدایت کنیم، می‌توانیم از پیکربندی زیر استفاده کنیم: 151 | 152 | ```mermaid 153 | flowchart LR; 154 | subgraph Kharej; 155 | B1[443]; 156 | B2[2083]; 157 | end; 158 | subgraph IRan; 159 | A1[443] --> B1; 160 | A2[2083] --> B2; 161 | end; 162 | ``` 163 | 164 | ```json 165 | { 166 | "name": "simple_port_to_port_x2", 167 | "nodes": [ 168 | { 169 | "name": "input1", 170 | "type": "TcpListener", 171 | "settings": { 172 | "address": "0.0.0.0", 173 | "port": 443, 174 | "nodelay": true 175 | }, 176 | "next": "output1" 177 | }, 178 | { 179 | "name": "output1", 180 | "type": "TcpConnector", 181 | "settings": { 182 | "nodelay": true, 183 | "address": "1.1.1.1", 184 | "port": 443 185 | } 186 | }, 187 | { 188 | "name": "input2", 189 | "type": "TcpListener", 190 | "settings": { 191 | "address": "0.0.0.0", 192 | "port": 2083, 193 | "nodelay": true 194 | }, 195 | "next": "output2" 196 | }, 197 | { 198 | "name": "output2", 199 | "type": "TcpConnector", 200 | "settings": { 201 | "nodelay": true, 202 | "address": "1.1.1.1", 203 | "port": 2083 204 | } 205 | } 206 | ] 207 | } 208 | ``` 209 | 210 | همچنین می‌توانیم بخشی از این پیکربندی را در یک فایل JSON جداگانه قرار دهیم و آن را به core.json معرفی کنیم. 211 | 212 | این موارد تنها بخش کوچکی از قابلیت‌های گره‌ها (Nodes) در WaterWall بودند. گره‌های مختلفی برای کارهای متنوعی مانند رمزنگاری، اتصال از پیش هند شیک شده (Pre-handshake Connection)، اتصال معکوس (Reverse Connection)، Mux و غیره وجود دارند که در روش‌های بعدی به تدریج به آن‌ها خواهیم پرداخت. 213 | 214 | جهت کسب اطلاعات بیشتر درباره انواع گره‌ها، به بخش دانشنامه مراجعه کنید: 215 | 216 | - TcpListener Node 217 | - TcpConnector Node 218 | -------------------------------------------------------------------------------- /docs/manually/tunnels/pre-connect.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Pre Connect 6 | 7 | PreConnect یک node است که کارش به این صورت است که قبل از اینکه کاربر کانکشن را هندشیک کند، آن را چک می‌کند و به اصطلاح داخل آب نمک می‌گذارد. 8 | 9 | استفاده از این node باعث می‌شود هندشیک تایم روی تونل کاهش یابد، حتی تا نصف حالتی که این node در کانفیگ نیست. 10 | 11 | **نکات مهم:** 12 | 13 | - این node را در کانفیگ‌های ریورس استفاده نکنید چون `reverse client` درون خودش این قابلیت را دارد و استفاده از آن بی‌تاثیر خواهد بود. 14 | - برای استفاده از `preconnect` باید آن را در کانفیگ سرور ایران اضافه کنید. 15 | - پیدا کردن جای مناسب برای این node مهم است و اگر جای مناسب را پیدا کنید، بیشترین کاهش هندشیک تایم را به شما می‌دهد. 16 | - این node پارامتر `minimum-unused` را دارد که بهتر است آن را بسته به تعداد کاربرها بین 1 تا 16 تنظیم کنید. اما دقت کنید اگر این مقدار را خیلی زیاد تنظیم کنید، خوب نیست زیرا فایروال ایران اگر ببیند کانکشن برای مدت طولانی ول مانده، روی آن اختلال می‌اندازد. 17 | - اگر از مالتی‌پورت استفاده می‌کنید، این node را بعد از header قرار دهید وگرنه مالتی‌پورت کار نخواهد کرد. 18 | - `preConnectClient` مثل بقیه node‌ها جفت `preConnectServer` است. با اینکه اگر سمت سرور خارج جفتش را قرار دهید چیز خوبی است، ولی این node به صورت استثنا نیازی به جفت ندارد. 19 | 20 | ## مثال 1: پورت فوروارد 21 | 22 | در حالت پورت فوروارد، ما فقط سرور ایران را کانفیگ می‌کنیم و کلاً 2 تا node داریم. پس جایگاه این node وسط است و باید بین 2 تا node قرار بگیرد. 23 | 24 | ```mermaid 25 | sequenceDiagram; 26 | participant A as User; 27 | participant B as IRan; 28 | participant C as Kharej; 29 | B->>C: connect; 30 | activate B; 31 | A->>B: connect; 32 | deactivate B; 33 | ``` 34 | 35 | ```json 36 | { 37 | "name": "simple_port_to_port_with_preconnect", 38 | "nodes": [ 39 | { 40 | "name": "input", 41 | "type": "TcpListener", 42 | "settings": { 43 | "address": "0.0.0.0", 44 | "port": 443, 45 | "nodelay": true 46 | }, 47 | "next": "precon_client" 48 | }, 49 | { 50 | "name": "precon_client", 51 | "type": "PreConnectClient", 52 | "settings": { 53 | "minimum-unused": 1 54 | }, 55 | "next": "output" 56 | }, 57 | { 58 | "name": "output", 59 | "type": "TcpConnector", 60 | "settings": { 61 | "nodelay": true, 62 | "address": "1.1.1.1", 63 | "port": 443 64 | } 65 | } 66 | ] 67 | } 68 | ``` 69 | 70 | این کار باعث می‌شود که هندشیک TCP پیش از اتصال کاربر انجام شود. 71 | 72 | ## مثال 2: تونل TLS 73 | 74 | اهمیت این node در کانفیگ تونل TLS بیشتر است. این مثال را بررسی می‌کنیم: 75 | 76 | ```mermaid 77 | sequenceDiagram; 78 | participant A as User; 79 | participant B as IRan; 80 | participant C as Kharej; 81 | B->>C: connect (TLS + TCP handshake); 82 | activate B; 83 | A->>B: connect; 84 | deactivate B; 85 | ``` 86 | 87 | ```json 88 | { 89 | "name": "tls_port_to_port_preconnect", 90 | "nodes": [ 91 | { 92 | "name": "input", 93 | "type": "TcpListener", 94 | "settings": { 95 | "address": "0.0.0.0", 96 | "port": 443, 97 | "nodelay": true 98 | }, 99 | "next": "precon_client" 100 | }, 101 | { 102 | "name": "precon_client", 103 | "type": "PreConnectClient", 104 | "settings": { 105 | "minimum-unused": 1 106 | }, 107 | "next": "mysslclient" 108 | }, 109 | { 110 | "name": "mysslclient", 111 | "type": "OpenSSLClient", 112 | "settings": { 113 | "sni": "mydomain.ir", 114 | "verify": true, 115 | "alpn": "http/1.1" 116 | }, 117 | "next": "output" 118 | }, 119 | { 120 | "name": "output", 121 | "type": "TcpConnector", 122 | "settings": { 123 | "nodelay": true, 124 | "address": "1.1.1.1", 125 | "port": 443 126 | } 127 | } 128 | ] 129 | } 130 | ``` 131 | 132 | در اینجا حضور preconnect باعث می‌شود هندشیک TLS + TCP قبل از اتصال کاربر تکمیل شود و شاید 300 میلی‌ثانیه یا بیشتر صرفه‌جویی شود. 133 | 134 | #### دانشنامه 135 | 136 | - PreConnect: یک node در WaterWall که قبل از اتصال کاربر، کانکشن را هندشیک می‌کند تا هندشیک تایم کاهش یابد. 137 | - minimum-unused: پارامتری در تنظیمات PreConnectClient که تعداد کانکشن‌های ذخیره‌سازی شده را مشخص می‌کند. 138 | -------------------------------------------------------------------------------- /docs/manually/tunnels/reality-direct-tunnel.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 6 3 | --- 4 | 5 | import YouTube from 'react-youtube' 6 | 7 | # Reality Tunnel Direct 8 | 9 | Reality Tunnel یک روش شناخته شده و پرکاربرد برای برقراری ارتباط امن است. نسخه 10 | پیاده‌سازی شده در WaterWall با سایر پیاده‌سازی‌ها تفاوت‌هایی دارد، اما در نهایت 11 | همگی به یک هدف می‌رسند. 12 | 13 | Reality Tunnel به شما اجازه می‌دهد handshake را با دامنه دلخواه تکمیل کنید و در 14 | صورت عدم احراز کانکشن، به سادگی به سایت `destination` فالبک شود. در واقع سرور 15 | شما گویی با `iptables` به `destination` متصل شده است و به همین دلیل تشخیص آن 16 | توسط فایروال بسیار دشوار است. 17 | 18 | Reality Tunnel در WaterWall رمزنگاری نیز دارد. اگرچه برای تونل، رمزنگاری کامل و 19 | سنگین مانند AES ضروری نیست، اما در حال حاضر WaterWall تنها از این الگوریتم 20 | پشتیبانی می‌کند. این رمزنگاری به صورت سخت‌افزاری توسط OpenSSL پیاده‌سازی شده و 21 | ممکن است تأثیر چندانی بر کارایی نداشته باشد. 22 | 23 | پیاده‌سازی Reality Tunnel در WaterWall ساده است، اما تا جایی که اطلاع دارم، نکات 24 | لازم در آن رعایت شده است. شما تنها به یک رمز عبور مشترک و یک SNI دلخواه نیاز 25 | دارید. 26 | 27 | با وجود استفاده از یک رمز عبور مشترک، داده‌های ارسالی کاملاً شبیه‌سازی شده با 28 | TLS هستند. تمام بسته‌ها با کمک IV تصادفی ارسال می‌شوند و داده‌های هیچ نمونه‌ای 29 | تکرار نمی‌شوند. همچنین امضای HMAC نیز انجام می‌شود تا هکرها نتوانند اطلاعات با 30 | ارزش شما و دامنه مورد نظر کاربر را پیدا کنند. 31 | 32 | امیدوارم این توضیحات کافی باشد. برای اطمینان از امنیت، بررسی کد توسط چند متخصص 33 | امنیت ضروری است. اگر کسی را می‌شناسید یا خودتان در این زمینه فعال هستید، خوشحال 34 | می‌شوم کد را بررسی کنید و نقاط ضعف احتمالی را به من اطلاع دهید. 35 | 36 | این نکات امنیتی مربوط به الگوریتم AES بود. در آینده قصد دارم الگوریتم مورد علاقه 37 | خودم یعنی XOR را نیز اضافه کنم که اگرچه این جزئیات امنیتی در آن رعایت نمی‌شود، 38 | اما کارایی بهتری خواهد داشت. 39 | 40 | ## ویدیو های آموزشی 41 | 42 | #### آموزش تانل DIRECT REALITY با هسته ی واتروال روی پنل مرزبان 43 | 44 | 45 | 46 | ### فلوچارت Reality Tunnel Direct 47 | 48 | ```mermaid 49 | flowchart LR; 50 | user1 -- "Config Tunnel" --> A1; 51 | user2 -- "Config Tunnel" --> A2; 52 | user3 -- "Config Tunnel" --> A3; 53 | user4 -- "Config Tunnel" --> A4; 54 | subgraph Kharej; 55 | B1[443 Waterwall] --> B2 & B3 & B4 & B5; 56 | B2[2053 Xray]; 57 | B3[2083 Xray]; 58 | B4[... Xray]; 59 | B5[65535 Xray]; 60 | end; 61 | subgraph IRan; 62 | A1[2053] -- "Reality Handshake With SNI" --> B1; 63 | A2[2083] -- "Reality Handshake With SNI" --> B1; 64 | A3[...] -- "Reality Handshake With SNI" --> B1; 65 | A4[65535] -- "Reality Handshake With SNI" --> B1; 66 | end; 67 | ``` 68 | 69 | :::note برای تونل مستقیم ریلیتی از این مثال می‌توان استفاده کرد: 70 | 71 | آی‌پی سرور خارج: 1.1.1.1 رمز: passwd SNI: i.stack.imgur.com پورت‌های چندگانه: 72 | 443 - 65535 73 | ::: 74 | 75 | ```json title="سرور ایران" 76 | { 77 | "name": "reality_client_multiport", 78 | "nodes": [ 79 | { 80 | "name": "users_inbound", 81 | "type": "TcpListener", 82 | "settings": { 83 | "address": "0.0.0.0", 84 | "port": [443, 65535], 85 | "nodelay": true 86 | }, 87 | "next": "header" 88 | }, 89 | { 90 | "name": "header", 91 | "type": "HeaderClient", 92 | "settings": { 93 | "data": "src_context->port" 94 | }, 95 | "next": "my_reality_client" 96 | }, 97 | { 98 | "name": "my_reality_client", 99 | "type": "RealityClient", 100 | "settings": { 101 | "sni": "i.stack.imgur.com", 102 | "password": "passwd" 103 | }, 104 | "next": "outbound_to_kharej" 105 | }, 106 | 107 | { 108 | "name": "outbound_to_kharej", 109 | "type": "TcpConnector", 110 | "settings": { 111 | "nodelay": true, 112 | "address": "1.1.1.1", 113 | "port": 443 114 | } 115 | } 116 | ] 117 | } 118 | ``` 119 | 120 | ```json title="سرور خارج" 121 | { 122 | "name": "reality_server_multiport", 123 | "nodes": [ 124 | { 125 | "name": "main_inbound", 126 | "type": "TcpListener", 127 | "settings": { 128 | "address": "0.0.0.0", 129 | "port": 443, 130 | "nodelay": true 131 | }, 132 | "next": "my_reality_server" 133 | }, 134 | 135 | { 136 | "name": "my_reality_server", 137 | "type": "RealityServer", 138 | "settings": { 139 | "destination": "reality_dest_node", 140 | "password": "passwd" 141 | }, 142 | "next": "header_server" 143 | }, 144 | 145 | { 146 | "name": "header_server", 147 | "type": "HeaderServer", 148 | "settings": { 149 | "override": "dest_context->port" 150 | }, 151 | "next": "final_outbound" 152 | }, 153 | 154 | { 155 | "name": "final_outbound", 156 | "type": "TcpConnector", 157 | "settings": { 158 | "nodelay": true, 159 | "address": "127.0.0.1", 160 | "port": "dest_context->port" 161 | } 162 | }, 163 | 164 | { 165 | "name": "reality_dest_node", 166 | "type": "TcpConnector", 167 | "settings": { 168 | "nodelay": true, 169 | "address": "i.stack.imgur.com", 170 | "port": 443 171 | } 172 | } 173 | ] 174 | } 175 | ``` 176 | 177 | **Reality Tunnel - دانشنامه** 178 | 179 | Reality Tunnel روشی برای برقراری ارتباط امن بین دو نقطه است. برخی از ویژگی‌های 180 | آن عبارتند از: 181 | 182 | - استفاده از رمزنگاری AES (در حال حاضر در WaterWall) برای امنیت داده‌ها 183 | - شبیه‌سازی TLS برای مخفی کردن ماهیت ترافیک 184 | - استفاده از IV تصادفی برای جلوگیری از تکرار الگوهای داده 185 | - امضای HMAC برای تأیید صحت و جلوگیری از دستکاری داده‌ها 186 | - امکان استفاده از دامنه و SNI دلخواه برای فریب فایروال 187 | - قابلیت فالبک به سایت مقصد در صورت عدم برقراری کانکشن موفق 188 | 189 | برای راه‌اندازی Reality Tunnel در WaterWall، شما به موارد زیر نیاز دارید: 190 | 191 | - یک سرور در خارج از کشور با آی‌پی عمومی (مثلاً `1.1.1.1`) 192 | - یک رمز عبور مشترک بین کلاینت و سرور (مثلاً `passwd`) 193 | - یک دامنه یا SNI دلخواه (مثلاً `i.stack.imgur.com`) 194 | - تعیین پورت یا محدوده پورت برای کانکشن‌ها (مثلاً `443` یا `443-65535`) 195 | 196 | سپس با تنظیم فایل‌های کانفیگ JSON مطابق نمونه‌های ارائه شده برای سرور ایران و 197 | سرور خارج، می‌توانید Reality Tunnel را فعال کنید. دقت کنید که آی‌پی، رمز، SNI و 198 | پورت‌ها را مطابق با نیاز خود تغییر دهید. 199 | 200 | امنیت و کارایی Reality Tunnel به پیاده‌سازی آن بستگی دارد. بررسی دقیق کد توسط 201 | متخصصان امنیتی برای اطمینان از عدم وجود نقاط ضعف، بسیار مهم است. همچنین استفاده 202 | از الگوریتم‌های رمزنگاری سبک‌تر مانند XOR می‌تواند کارایی را بهبود بخشد، البته 203 | به قیمت امنیت کمتر. 204 | -------------------------------------------------------------------------------- /docs/manually/tunnels/reality-reverse-tunnel.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 7 3 | --- 4 | 5 | # Reverse Reality Tunnel 6 | 7 | Reverse Reality Tunnel یک نسخه پیشرفته از تونل RTT است که عملکرد بهتری را ارائه می‌دهد. برخلاف RTT، این تونل روی دیوار آتش (Firewall) دچار اختلالات جزئی نمی‌شود و قادر است از تمام هسته‌های پردازنده سرور استفاده کند، در حالی که RTT تنها از یک ترد پشتیبانی می‌کرد. 8 | 9 | بر اساس دانش فعلی، این تونل حتی بدون استفاده از مالتی‌پلکسینگ (Multiplexing) نیز فیلتر نمی‌شود، اما برای بهبود عملکرد، می‌توان به راحتی آن را با پروتکل HTTP/2 ترکیب کرد. 10 | 11 | برای پیاده‌سازی Reverse Reality Tunnel، می‌توان از پیکربندی زیر استفاده کرد: 12 | 13 | - آدرس IP سرور در ایران: `1.1.1.1` 14 | - آدرس IP سرور در خارج از کشور: `2.2.2.2` 15 | - رمز عبور: `passwd` 16 | - نام سرور مجازی (SNI): `matrix.snapp.ir` 17 | - پورت‌های چندگانه: (`443 - 65535`) 18 | 19 | ### فلوچارت Reverse Reality Tunnel 20 | 21 | ```mermaid 22 | flowchart LR; 23 | subgraph خارج; 24 | B1[443]; 25 | B2[444]; 26 | B3[...]; 27 | B4[65535]; 28 | W_K[دیوار آتش] --> B1 & B2 & B3 & B4 29 | end; 30 | subgraph ایران; 31 | A1[443] --> W_I; 32 | A2[444] --> W_I; 33 | A3[...] --> W_I; 34 | A4[65535] --> W_I; 35 | W_I[دیوار آتش] <-- "Reality reverse Handshake SNI"--> W_K 36 | W_I[دیوار آتش] <-- "Reality reverse Handshake SNI"--> W_K 37 | W_I[دیوار آتش] <-- "Reality reverse Handshake SNI"--> W_K 38 | W_I[دیوار آتش] <-- "Reality reverse Handshake SNI"--> W_K 39 | end; 40 | ``` 41 | 42 | ```json title="سرور ایران" 43 | { 44 | "name": "reverse_reality_server_multiport", 45 | "nodes": [ 46 | { 47 | "name": "users_inbound", 48 | "type": "TcpListener", 49 | "settings": { 50 | "address": "0.0.0.0", 51 | "port": [443, 65535], 52 | "nodelay": true 53 | }, 54 | "next": "header" 55 | }, 56 | { 57 | "name": "header", 58 | "type": "HeaderClient", 59 | "settings": { 60 | "data": "src_context->port" 61 | }, 62 | "next": "bridge2" 63 | }, 64 | { 65 | "name": "bridge2", 66 | "type": "Bridge", 67 | "settings": { 68 | "pair": "bridge1" 69 | } 70 | }, 71 | { 72 | "name": "bridge1", 73 | "type": "Bridge", 74 | "settings": { 75 | "pair": "bridge2" 76 | } 77 | }, 78 | { 79 | "name": "reverse_server", 80 | "type": "ReverseServer", 81 | "settings": {}, 82 | "next": "bridge1" 83 | }, 84 | { 85 | "name": "reality_server", 86 | "type": "RealityServer", 87 | "settings": { 88 | "destination": "reality_dest", 89 | "password": "passwd" 90 | }, 91 | "next": "reverse_server" 92 | }, 93 | { 94 | "name": "kharej_inbound", 95 | "type": "TcpListener", 96 | "settings": { 97 | "address": "0.0.0.0", 98 | "port": 443, 99 | "nodelay": true, 100 | "whitelist": ["2.2.2.2/32"] 101 | }, 102 | "next": "reality_server" 103 | }, 104 | { 105 | "name": "reality_dest", 106 | "type": "TcpConnector", 107 | "settings": { 108 | "nodelay": true, 109 | "address": "matrix.snapp.ir", 110 | "port": 443 111 | } 112 | } 113 | ] 114 | } 115 | ``` 116 | 117 | ```json title="سرور خارج" 118 | { 119 | "name": "reverse_reality_client_multiport", 120 | "nodes": [ 121 | { 122 | "name": "outbound_to_core", 123 | "type": "TcpConnector", 124 | "settings": { 125 | "nodelay": true, 126 | "address": "127.0.0.1", 127 | "port": "dest_context->port" 128 | } 129 | }, 130 | { 131 | "name": "header", 132 | "type": "HeaderServer", 133 | "settings": { 134 | "override": "dest_context->port" 135 | }, 136 | "next": "outbound_to_core" 137 | }, 138 | { 139 | "name": "bridge1", 140 | "type": "Bridge", 141 | "settings": { 142 | "pair": "bridge2" 143 | }, 144 | "next": "header" 145 | }, 146 | { 147 | "name": "bridge2", 148 | "type": "Bridge", 149 | "settings": { 150 | "pair": "bridge1" 151 | }, 152 | "next": "reverse_client" 153 | }, 154 | { 155 | "name": "reverse_client", 156 | "type": "ReverseClient", 157 | "settings": { 158 | "minimum-unused": 16 159 | }, 160 | "next": "reality_client" 161 | }, 162 | { 163 | "name": "reality_client", 164 | "type": "RealityClient", 165 | "settings": { 166 | "sni": "matrix.snapp.ir", 167 | "password": "passwd" 168 | }, 169 | "next": "outbound_to_iran" 170 | }, 171 | { 172 | "name": "outbound_to_iran", 173 | "type": "TcpConnector", 174 | "settings": { 175 | "nodelay": true, 176 | "address": "1.1.1.1", 177 | "port": 443 178 | } 179 | } 180 | ] 181 | } 182 | ``` 183 | 184 | :::tip 185 | برای ترکیب Reverse Reality Tunnel با مالتی‌پلکسینگ، می‌توان از پروتکل HTTP/2 و gRPC استفاده کرد: 186 | 187 | توجه: در صورت مشاهده تأخیر پینگ بالا روی سرور مکس، ممکن است سیستم فیلترینگ اختلال ایجاد کند. در این صورت، باید از Half-duplex استفاده کنید که مستندات آن در ویکی موجود است. 188 | ::: 189 | 190 | ## پیکربندی سرور در ایران (با HTTP/2 و gRPC) 191 | 192 | ### فلوچارت 193 | 194 | ```mermaid 195 | flowchart LR; 196 | subgraph خارج; 197 | B1[443]; 198 | B2[444]; 199 | B3[...]; 200 | B4[65535]; 201 | W_K[دیوار آتش H2Mux] --> B1 & B2 & B3 & B4 202 | end; 203 | subgraph ایران; 204 | A1[443] --> W_I; 205 | A2[444] --> W_I; 206 | A3[...] --> W_I; 207 | A4[65535] --> W_I; 208 | W_I[دیوار آتش H2Mux] <-- "Reality reverse Handshake SNI"--> W_K 209 | end; 210 | ``` 211 | 212 | ```json title="سرور ایران" 213 | { 214 | "name": "reverse_reality_grpc_server_multiport", 215 | "nodes": [ 216 | { 217 | "name": "users_inbound", 218 | "type": "TcpListener", 219 | "settings": { 220 | "address": "0.0.0.0", 221 | "port": [443, 65535], 222 | "nodelay": true 223 | }, 224 | "next": "header" 225 | }, 226 | { 227 | "name": "header", 228 | "type": "HeaderClient", 229 | "settings": { 230 | "data": "src_context->port" 231 | }, 232 | "next": "bridge2" 233 | }, 234 | { 235 | "name": "bridge2", 236 | "type": "Bridge", 237 | "settings": { 238 | "pair": "bridge1" 239 | } 240 | }, 241 | { 242 | "name": "bridge1", 243 | "type": "Bridge", 244 | "settings": { 245 | "pair": "bridge2" 246 | } 247 | }, 248 | { 249 | "name": "reverse_server", 250 | "type": "ReverseServer", 251 | "settings": {}, 252 | "next": "bridge1" 253 | }, 254 | { 255 | "name": "pbserver", 256 | "type": "ProtoBufServer", 257 | "settings": {}, 258 | "next": "reverse_server" 259 | }, 260 | { 261 | "name": "h2server", 262 | "type": "Http2Server", 263 | "settings": {}, 264 | "next": "pbserver" 265 | }, 266 | { 267 | "name": "reality_server", 268 | "type": "RealityServer", 269 | "settings": { 270 | "destination": "reality_dest", 271 | "password": "passwd" 272 | }, 273 | "next": "h2server" 274 | }, 275 | { 276 | "name": "kharej_inbound", 277 | "type": "TcpListener", 278 | "settings": { 279 | "address": "0.0.0.0", 280 | "port": 443, 281 | "nodelay": true, 282 | "whitelist": ["2.2.2.2/32"] 283 | }, 284 | "next": "reality_server" 285 | }, 286 | { 287 | "name": "reality_dest", 288 | "type": "TcpConnector", 289 | "settings": { 290 | "nodelay": true, 291 | "address": "matrix.snapp.ir", 292 | "port": 443 293 | } 294 | } 295 | ] 296 | } 297 | ``` 298 | 299 | ```json title="سرور خارج" 300 | { 301 | "name": "reverse_reality_grpc_client_multiport", 302 | "nodes": [ 303 | { 304 | "name": "outbound_to_core", 305 | "type": "TcpConnector", 306 | "settings": { 307 | "nodelay": true, 308 | "address": "127.0.0.1", 309 | "port": "dest_context->port" 310 | } 311 | }, 312 | { 313 | "name": "header", 314 | "type": "HeaderServer", 315 | "settings": { 316 | "override": "dest_context->port" 317 | }, 318 | "next": "outbound_to_core" 319 | }, 320 | { 321 | "name": "bridge1", 322 | "type": "Bridge", 323 | "settings": { 324 | "pair": "bridge2" 325 | }, 326 | "next": "header" 327 | }, 328 | { 329 | "name": "bridge2", 330 | "type": "Bridge", 331 | "settings": { 332 | "pair": "bridge1" 333 | }, 334 | "next": "reverse_client" 335 | }, 336 | { 337 | "name": "reverse_client", 338 | "type": "ReverseClient", 339 | "settings": { 340 | "minimum-unused": 8 341 | }, 342 | "next": "pbclient" 343 | }, 344 | { 345 | "name": "pbclient", 346 | "type": "ProtoBufClient", 347 | "settings": {}, 348 | "next": "h2client" 349 | }, 350 | { 351 | "name": "h2client", 352 | "type": "Http2Client", 353 | "settings": { 354 | "host": "matrix.snapp.ir", 355 | "port": 443, 356 | "path": "/", 357 | "content-type": "application/grpc" 358 | }, 359 | "next": "reality_client" 360 | }, 361 | { 362 | "name": "reality_client", 363 | "type": "RealityClient", 364 | "settings": { 365 | "sni": "matrix.snapp.ir", 366 | "password": "passwd" 367 | }, 368 | "next": "outbound_to_iran" 369 | }, 370 | { 371 | "name": "outbound_to_iran", 372 | "type": "TcpConnector", 373 | "settings": { 374 | "nodelay": true, 375 | "address": "1.1.1.1", 376 | "port": 443 377 | } 378 | } 379 | ] 380 | } 381 | ``` 382 | 383 | :::info 384 | با این پیکربندی، Reverse Reality Tunnel با استفاده از مالتی‌پلکسینگ HTTP/2 و gRPC پیاده‌سازی می‌شود و عملکرد بهینه‌تری را ارائه می‌دهد. 385 | ::: 386 | 387 | ## دانشنامه Reverse Reality Tunnel 388 | 389 | - پایداری بالا: بر خلاف تونل RTT، این تونل روی فایروال دچار اختلالات جزئی نمی‌شود و به صورت پایدار کار می‌کند. 390 | - بهره‌مندی از چند هسته: قادر است از تمام هسته‌های پردازنده سرور استفاده کند، در حالی که RTT فقط از یک ترد پشتیبانی می‌کرد. 391 | - مقاومت در برابر فیلترینگ: حتی بدون استفاده از مالتی‌پلکسینگ نیز توسط سیستم‌های فیلترینگ شناسایی و مسدود نمی‌شود. 392 | - قابلیت بهینه‌سازی با HTTP/2: برای بهبود عملکرد، می‌توان این تونل را به راحتی با پروتکل HTTP/2 ترکیب کرد. 393 | - ارتباط معکوس: با استفاده از دست‌دهی معکوس (Reverse Handshake) و SNI، ارتباطی امن و مقاوم برقرار می‌کند. 394 | - مالتی‌پلکسینگ: از طریق HTTP/2 و gRPC، قابلیت مالتی‌پلکسینگ را برای افزایش کارایی فراهم می‌نماید. 395 | -------------------------------------------------------------------------------- /docs/manually/tunnels/reset-tunnel.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 14 3 | --- 4 | 5 | # Reset Tunnel 6 | 7 | 8 | مدت ها بود که می خواستم رفتار فایروال رو برسی کنم وقتی که پکت در لایه های پایین تر تغییر پیدا کنه . 9 | 10 | نود های کار با پکت های لایه ۳ بالاخره روی واتروال پیاده سازی شد. 11 | 12 | تغییر پکت ها روی لایه های ۳ و ۴ به ما امکان اینو میده که ۱۰ ها روش تونل جدید درست کنیم ؛ روش هایی که هرکودم شکل خودشون برای ارسال دیتا رو پیاده می کنن 13 | و دیگه محدود به قوانینی که سیستم عامل قرار داده نیستن ؛ مثلا دیگه میشه به جای tcp / udp اومد و دیتا رو بر روی پروتکل هایی مثل icmp / appletalk / NetBios رد کرد . 14 | 15 | و همچنین میشه همه این پروتکل هارو به صورت بی قاعده تغییر داد و به حداکثر flexibility در اجرای پروتکل دست یافت. 16 | 17 | لیست پروتکل های لایه ۴ در این لینک هستن. 18 | 19 | https://en.wikipedia.org/wiki/Transport_layer 20 | 21 | و لیست پروتکل های لایه ۳ در این لینک. 22 | 23 | https://en.wikipedia.org/wiki/Network_layer 24 | 25 | که ما همه این هارو در ًاختیار خواهیم داشت و آروم آروم سراغشون خواهیم رفتار. 26 | 27 | --- 28 | 29 | ## نتیجه تست ها بر روی آیپی های مختلف 30 | 31 | 32 | از ماه ها قبل شاهد این بودیم که سرعت دانلود روی ایپی های هتزنر خیلی کم شده بود و این تانل معکوس هم اذیت می کرد؛ نمی دونستیم که دقیقا چه محدودیتی گذاشتن. 33 | 34 | تست هایی که زدیم فهمیدیم که به sni ربطی نداره ؛ سرعت توی لایه های پایین تر لیمیت شده. 35 | 36 | 37 | سپس به ۲ فرضیه رسیدیم ؛ یا سرعت و اختلال روی ایپی های هتزنر در لایه ۴ اتفاق افتاده یا در لایه ۳ . 38 | 39 | بعداز اینکه ریست تانل تکمیل شد و تستش کردیم ؛ به جواب سوالمون رسیدیم که این لیمیت ها روی لایه ۳ بودن. 40 | 41 | که درکل یعنی الان ریست تانل این نتایج رو به شما میده روی ایپی های مختلف: 42 | 43 | 44 | 1- اگه ایپی کاملا کثیف باشه و بلاک شده باشه که یعنی اگه نتونید ایپی رو پینگ کنید ؛ ریست تانل هم کارساز نیست و تونلتون وصل نمی شه. 45 | 46 | 47 | 2- اگه ایپی نیمه کثیف باشه ؛ معمولا ۷۰ درصد ایپی های هتزنر اینجورین ؛ اون وقت شما یه لیمیت سرعت خواهید داشت که ریست تانل هم توانایی دور زدن این لیمیت را نداره . 48 | 49 | چون که رسما رو لایه ایپی محدودیت گذاشته شده ؛ اینجوری بگم که فیلتر چی ترتیب اون ایپی رو داده و روشی نیست که بشه لیمیتش رو دور زد 50 | 51 | مگه اینکه تغییرات در لایه ایپی (لایه ۳) بدهیم. 52 | 53 | 54 | در روش ریست تانل تغییرات روی لایه ۴ انجام می شود ؛ روشی که لایه ایپی رو تغییر بده هم میشه پیاده کرد و همین الان هم نودهای واتروال ساپورت می کنن ولی مشکل اینه که هم دیتا سنتر ایران 55 | و هم دیتا سنتر خارج پکت هاشو دراپ می کنن ؛ اگه ایپی پکت جعل بشه پکت دراپ میشه (البته یکی دو حالت برای دور زدن این هست ؛ که به محض اینکه تحقیقاتم تموم شه و نتیجه بگیرم روش تونلشو میزارم). 56 | 57 | 58 | 3- در حالت سوم که ایپی مشکلی نداشته باشه این تانل با سرعت بسیار بالا کار خواهد کرد و فایروال نمی تواند پکت هاشو نگه داره و اختلالی از نوع پینگ توش ایجاد کنه 59 | 60 | چون پکت هاش بی معنی هستن ؛ اینجا دیگه اصلا sni و چیز های دیگه معنی نداره و نیازی هم بهش نیست و ما عادی پورت فوروارد می کنیم روی این روش، 61 | 62 | طبق تست هایی که این چند روز زدم ؛ فعلا که ایپی بلاک نشد یا سرورم اکسس نشد ولی خوب تست ها باید طولانی مدت زده بشه تا واقعا متوجه بشیم بلاک میشه یا نه 63 | 64 | حدس من اینه که فعلا این روش بلاک نمی شه چون تشخیصش هم خیلی سخته هم ما کلی حالت ایجاد می کنیم و خواهیم کرد ؛ همیشه یک حالت نیستیم که ساده تشخیص داده بشه. 65 | 66 | 67 | --- 68 | 69 | ## برسی ایده کارکرد این روش 70 | 71 | 72 | ریست تانل اولین روشی هست که با دستکاری توی لایه های زیری شبکه ایجاد می کنیم ؛ تمام ایده این روش اینه که پروتکل tcp عادی رد و بدل میشه منتهی با یک تغییر؛ . 73 | 74 | در پروتکل tcp فلگ های مختلفی داریم که لیستش اینجا هست. 75 | 76 | 77 | ![TcpSegment](../../../static/img/tcp.png) 78 | 79 | 80 | 81 | ما با هر تغییری توی این ساختار می توانیم دیتا رو از استاندارد خارج کنیم ؛ اینطوری دیگه شخص میانی توانایی باز خوانی پکت ها و به اصطلاح reassembly را نخواهد داشت 82 | 83 | در روش reset tunnel تغییری که اینجا شکل گرفته این هست که ؛ در تمام پکت های tcp فلگ reset ست میشه . 84 | 85 | اینجوری پکت ها همه از نوع reset حساب میشن که کاربرد این فلگ برای این هست که کانکشن ها بسته بشه. 86 | 87 | ولی خوب ما وقتی پکت رو دریافت می کنیم ؛ اگه از ایپی سرور تونل ما بود ؛ بیت رو دستی خاموش می کنیم و پکت اصلاح شده رو تحویل سیستم عامل می دهیم تا اتصال درست برقرار بشه. 88 | 89 | 90 | همچنین این اتفاق توی دیتا برگشتی هم میفته تا کاملا تمام پکت ها به این شکل دستکاری شده باشن؛ دیتای ارسال از سیستم عامل دریافت میشه و پکت تغییر می کنه. 91 | 92 | که در اینجا یعنی بیت ریست ست میشه ؛ سپس پکت به اصطلاح inject میشه به شبکه. 93 | 94 | 95 | این شاید ساده ترین تونلیه که میشه زد و در آینده node هایی میارم که بیت هارو با هم جا به جا کنیم ؛ مثلا جای بیت fin با init عوض بشه. 96 | 97 | و کلی حالت های دیگه که فقط میشه روی Tcp زد و سایر پرتوکل های لایه ۳و ۴ هم داریم که خیلی حالت میشه. 98 | 99 | --- 100 | 101 | ## اجرای تونل 102 | 103 | :::warning 104 | 105 | قبل از هرچیزی ؛ باید بگم کسی که این روش رو اجرا می کنه باید ریست کردن ایپی تیبل رو بلد باشه. 106 | 107 | از این مجموعه دستورات برای ریست کردن ایپی تیبل استفاده کنید. 108 | 109 | ```sh 110 | 111 | sudo iptables -P INPUT ACCEPT 112 | sudo iptables -P FORWARD ACCEPT 113 | sudo iptables -P OUTPUT ACCEPT 114 | 115 | # Flush All Iptables Chains/Firewall rules # 116 | sudo iptables -F 117 | 118 | # Delete all Iptables Chains # 119 | sudo iptables -X 120 | 121 | # Flush all counters too # 122 | sudo iptables -Z 123 | # Flush and delete all nat and mangle # 124 | sudo iptables -t nat -F 125 | sudo iptables -t nat -X 126 | sudo iptables -t mangle -F 127 | sudo iptables -t mangle -X 128 | sudo iptables -t raw -F 129 | sudo iptables -t raw -X 130 | 131 | ``` 132 | 133 | 134 | وقتی با واتروال تونل های این مدلی میزنید ؛ واتروال روتینگ سیستم عامل رو دستکاری می کنه. 135 | 136 | 137 | و این یعنی چند دستور ایپی تیبل هم ست می کنه ؛ که خوب وقتی واتروال بسته بشه هم تمام دستورات رو خودش تمیز میکنه. 138 | 139 | اما 140 | 141 | در دو حالت واتروال نمی تونه دستورات رو تمیز کنه ؛ حالت اول اینه که کرش کنه و حالت دوم هم اینه که hard kill بشه. 142 | 143 | و اگه اینجوری شد باید ایپی تیبل رو خودتون حتما ریست کنید ؛ ریست کردن اش یا با ری استارت ماشین مجازی یا با همین دستوراتی که گفتم انجام میشه. 144 | 145 | اگه ایپی تیبل ریست نشه در این حالت ؛ دیگه نه با واتروال و نه با هیچ روش تانل دیگه ای به ایپی سرور خارج ارتباط نخواهید داشت. 146 | 147 | پس از این نظر مهمه که بلد باشید ایپی تیبل رو ریست کنید. 148 | 149 | 150 | من خودم همیشه قبل از اجرای واتروال یه بار ریست رو انجام می دهم. 151 | 152 | ::: 153 | 154 | 155 | :::warning 156 | 157 | حتما چک کنید ufw خاموش باشه 158 | 159 | ```sh 160 | sudo ufw disable 161 | ``` 162 | 163 | 164 | ::: 165 | 166 | 167 | برای اجرای ریست تانل این مثال رو برسی می کنیم ؛ این مثال تمام پورت های 23 به بالا را تونل می کنه 168 | 169 | فایل json در این روش یک مقداری طولانی ممکنه بشه ؛ لطفا با دقت مقادیر را جای گذاری کنید 170 | 171 | 172 | --- 173 | 174 | ## سرور ایران 175 | 176 | 177 | :::info 178 | 179 | ایپی سرور ایران 7.7.7.7 فرض شده و یک بار در json آمده 180 | 181 | ایپی سرور خارج 9.9.9.9 فرض شده و دو بار در json آمده 182 | 183 | ::: 184 | 185 | پس در این فایل جای این دو باید ایپی خودتون رو بزارید 186 | 187 | تنها چیزی هم که باید عوض کنید همین ایپی ایران و خارج هست 188 | 189 | :::warning 190 | 191 | به چیز دیگه ای دست نزنید بخصوص ایپی هایی که با عدد 10 شروع شدن 192 | 193 | ::: 194 | 195 | 196 | ```json title="سرور ایران" 197 | 198 | { 199 | "name": "reset_tunnel_iran", 200 | "nodes": [ 201 | { 202 | "name": "input", 203 | "type": "TcpListener", 204 | "settings": { 205 | "address": "0.0.0.0", 206 | "port": [23, 65535], 207 | "nodelay": true 208 | }, 209 | "next": "output" 210 | }, 211 | { 212 | "name": "output", 213 | "type": "TcpConnector", 214 | "settings": { 215 | "nodelay": true, 216 | "address": "10.0.0.2", 217 | "port": "src_context->port" 218 | } 219 | }, 220 | 221 | 222 | { 223 | "name": "tdev", 224 | "type": "TunDevice", 225 | "settings": { 226 | "device-name": "tun0", 227 | "device-ip": "10.0.0.1/24" 228 | } 229 | }, 230 | { 231 | "name": "rdev", 232 | "type": "RawDevice", 233 | "settings": { 234 | "mode": "injector" 235 | } 236 | }, 237 | { 238 | "name": "cdev", 239 | "type": "CaptureDevice", 240 | "settings": { 241 | "direction": "incoming", 242 | "filter-mode": "source-ip", 243 | "ip": "9.9.9.9/32" 244 | } 245 | }, 246 | 247 | 248 | 249 | 250 | { 251 | "name": "route1_receiver", 252 | "type": "Layer3Receiver", 253 | "settings": { 254 | "device": "tdev" 255 | }, 256 | "next": "route1_source_changer" 257 | }, 258 | { 259 | "name": "route1_source_changer", 260 | "type": "Layer3IpOverrider", 261 | "settings": { 262 | "mode": "source-ip", 263 | "ipv4": "7.7.7.7" 264 | }, 265 | "next": "tcp_reset_on" 266 | }, 267 | { 268 | "name": "tcp_reset_on", 269 | "type": "Layer3TcpManipulator", 270 | "settings": { 271 | "bit-reset": "on" 272 | }, 273 | "next": "route1_dest_setter" 274 | }, 275 | { 276 | "name": "route1_dest_setter", 277 | "type": "Layer3IpOverrider", 278 | "settings": { 279 | "mode": "dest-ip", 280 | "ipv4": "9.9.9.9" 281 | }, 282 | "next": "route1_writer" 283 | }, 284 | { 285 | "name": "route1_writer", 286 | "type": "Layer3Sender", 287 | "settings": { 288 | "device": "rdev" 289 | } 290 | }, 291 | 292 | 293 | 294 | { 295 | "name": "route2_receiver", 296 | "type": "Layer3Receiver", 297 | "settings": { 298 | "device": "cdev" 299 | }, 300 | "next": "route2_source_changer" 301 | }, 302 | { 303 | "name": "route2_source_changer", 304 | "type": "Layer3IpOverrider", 305 | "settings": { 306 | "mode": "source-ip", 307 | "ipv4": "10.0.0.2" 308 | }, 309 | "next": "tcp_reset_off" 310 | }, 311 | { 312 | "name": "tcp_reset_off", 313 | "type": "Layer3TcpManipulator", 314 | "settings": { 315 | "bit-reset": "off" 316 | }, 317 | "next": "route2_dest_setter" 318 | }, 319 | { 320 | "name": "route2_dest_setter", 321 | "type": "Layer3IpOverrider", 322 | "settings": { 323 | "mode": "dest-ip", 324 | "ipv4": "10.0.0.1" 325 | }, 326 | "next": "route2_writer" 327 | }, 328 | { 329 | "name": "route2_writer", 330 | "type": "Layer3Sender", 331 | "settings": { 332 | "device": "tdev" 333 | } 334 | } 335 | ] 336 | } 337 | 338 | ``` 339 | 340 | همین کافیه و برنامه در سرور ایران با این کانفیگ قابل اجرا هست 341 | 342 | --- 343 | 344 | ## سرور خارج 345 | 346 | :::info 347 | 348 | ایپی سرور ایران .7.7.7.7 فرض شده و دو بار در json آمده 349 | 350 | ایپی سرور خارج 9.9.9.9 فرض شده و یک بار در json آمده 351 | 352 | مثل سرور ایران ؛ فقط همین ایپی هارو جا گذاری کنید 353 | 354 | ::: 355 | 356 | 357 | ```json title="سرور خارج" 358 | { 359 | "name": "reset_tunnel_kharej", 360 | "nodes": [ 361 | 362 | { 363 | "name": "tdev", 364 | "type": "TunDevice", 365 | "settings": { 366 | "device-name": "tun0", 367 | "device-ip": "10.0.0.1/24" 368 | } 369 | }, 370 | { 371 | "name": "rdev", 372 | "type": "RawDevice", 373 | "settings": { 374 | "mode": "injector" 375 | } 376 | }, 377 | { 378 | "name": "cdev", 379 | "type": "CaptureDevice", 380 | "settings": { 381 | "direction": "incoming", 382 | "filter-mode": "source-ip", 383 | "ip": "7.7.7.7/32" 384 | } 385 | }, 386 | 387 | 388 | 389 | { 390 | "name": "route1_receiver", 391 | "type": "Layer3Receiver", 392 | "settings": { 393 | "device": "tdev" 394 | }, 395 | "next": "route1_source_changer" 396 | }, 397 | { 398 | "name": "route1_source_changer", 399 | "type": "Layer3IpOverrider", 400 | "settings": { 401 | "mode": "source-ip", 402 | "ipv4": "9.9.9.9" 403 | }, 404 | "next": "tcp_reset_on" 405 | }, 406 | { 407 | "name": "tcp_reset_on", 408 | "type": "Layer3TcpManipulator", 409 | "settings": { 410 | "bit-reset": "on" 411 | }, 412 | "next": "route1_dest_setter" 413 | }, 414 | { 415 | "name": "route1_dest_setter", 416 | "type": "Layer3IpOverrider", 417 | "settings": { 418 | "mode": "dest-ip", 419 | "ipv4": "7.7.7.7" 420 | }, 421 | "next": "route1_writer" 422 | }, 423 | { 424 | "name": "route1_writer", 425 | "type": "Layer3Sender", 426 | "settings": { 427 | "device": "rdev" 428 | } 429 | }, 430 | 431 | 432 | { 433 | "name": "route2_receiver", 434 | "type": "Layer3Receiver", 435 | "settings": { 436 | "device": "cdev" 437 | }, 438 | "next": "route2_source_changer" 439 | }, 440 | { 441 | "name": "route2_source_changer", 442 | "type": "Layer3IpOverrider", 443 | "settings": { 444 | "mode": "source-ip", 445 | "ipv4": "10.0.0.2" 446 | }, 447 | "next": "tcp_reset_off" 448 | }, 449 | { 450 | "name": "tcp_reset_off", 451 | "type": "Layer3TcpManipulator", 452 | "settings": { 453 | "bit-reset": "off" 454 | }, 455 | "next": "route2_dest_setter" 456 | }, 457 | { 458 | "name": "route2_dest_setter", 459 | "type": "Layer3IpOverrider", 460 | "settings": { 461 | "mode": "dest-ip", 462 | "ipv4": "10.0.0.1" 463 | }, 464 | "next": "route2_writer" 465 | }, 466 | { 467 | "name": "route2_writer", 468 | "type": "Layer3Sender", 469 | "settings": { 470 | "device": "tdev" 471 | } 472 | } 473 | ] 474 | } 475 | 476 | ``` 477 | 478 | 479 | اگه درست اجرا کرده باشین باید تانل برقرار بشه ؛ شما می توانید دریافت پکت های تغییر یافته رو با این دستور دیباگ کنید 480 | و چک کنید چی ارسال دریافت می شه 481 | 482 | ```sh 483 | sudo tcpdump -i eth0 src 1.1.1.1 and tcp 484 | ``` 485 | 486 | 487 | --- 488 | ## سرور خارج واسطه 489 | 490 | اگه شما نمی خواهید تونل رو مستقیما بین سرور ایران و خارجتون برقرار کنید ؛ مثلا میخواید یه سرور خارج جدید بگیرید 491 | 492 | و اینطوری تانل کنید که سرور ایران به سرور خارج جدید وصل بشه با ریست تانل و سپس از سرور خارج جدید وصل بشه به سرور اصلی 493 | 494 | لازمه کانفیگ فایل سرور خارج رو تغییر بدید 495 | 496 | این دوتا node را به کانفیگ سرور خارج اضافه کنید 497 | 498 | ایپی سرور خارج اصلی 5.5.5.5 فرض شده 499 | 500 | این کانفیگ در سرور خارج جدید ران میشه ؛ که بهش میگیم وصل بشه به سرور خارج اصلی 501 | 502 | ```json title="443 تک پورت" 503 | 504 | { 505 | "name": "input", 506 | "type": "TcpListener", 507 | "settings": { 508 | "address": "0.0.0.0", 509 | "port": 443, 510 | "nodelay": true 511 | }, 512 | "next": "output" 513 | }, 514 | { 515 | "name": "output", 516 | "type": "TcpConnector", 517 | "settings": { 518 | "nodelay": true, 519 | "address": "5.5.5.5", 520 | "port": 443 521 | } 522 | } 523 | 524 | ``` 525 | 526 | 527 | 528 | ```json title="مالتی پورت" 529 | 530 | { 531 | "name": "input", 532 | "type": "TcpListener", 533 | "settings": { 534 | "address": "0.0.0.0", 535 | "port": [23, 65535], 536 | "nodelay": true 537 | }, 538 | "next": "output" 539 | }, 540 | { 541 | "name": "output", 542 | "type": "TcpConnector", 543 | "settings": { 544 | "nodelay": true, 545 | "address": "5.5.5.5", 546 | "port": "src_context->port" 547 | } 548 | } 549 | 550 | ``` 551 | 552 | هم تک پورت رو گذاشتم هم مالتی پورت 553 | -------------------------------------------------------------------------------- /docs/manually/tunnels/reverse-tunnel.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | --- 4 | 5 | # Reverse Tunnel 6 | 7 | روش تونل معکوس (Reverse Tunnel) یک راه حل قدرتمند برای دور زدن سیستم های فیلترینگ و سانسور است. در این روش، به جای اینکه کاربر مستقیماً به سرور خارج وصل شود، ابتدا سرور خارج مانند یک کاربر خارجی به سرور ایران متصل می شود و منتظر می ماند. سپس کاربر ایرانی به سرور ایران وصل می شود و سرور ایران اتصال کاربر ایرانی و سرور خارج را به هم پیوند می دهد. به این ترتیب یک ارتباط بین کاربر ایرانی و سرور خارج برقرار می شود. 8 | 9 | جلوگیری از این نوع اتصال برای سیستم های فیلترینگ و سانسور دشوار است. با این حال، سیستم فیلترینگ ایران اخیراً تلاش هایی برای مقابله با این روش انجام داده است: 10 | 11 | 1. برخی آی پی های خارجی، به ویژه از هتزنر، ممکن است سرعت مناسبی نداشته باشند. البته این مورد اکنون کمتر دیده می شود. 12 | 13 | 2. دامنه ای که سرور خارج با آن به ایران وصل می شود، تأثیر زیادی بر کیفیت اتصال و پینگ دارد. بهتر است از دامنه ای استفاده شود که کمتر استفاده شده و فیلتر نشده باشد. 14 | 15 | ## روش ساده (Simple) 16 | 17 | ساده ترین نوع تونل معکوس، اتصال TCP است. در این روش، کاربران به پورت `443` سرور ایران وصل می شوند و در نهایت به پورت `443` سرور خارج متصل می شوند. 18 | 19 | ### فلوچارت Simple 20 | 21 | ```mermaid 22 | flowchart LR; 23 | subgraph User; 24 | end; 25 | subgraph IRan; 26 | A[443]; 27 | end; 28 | subgraph Kharej; 29 | B[443]; 30 | B1[Waterwall]; 31 | end; 32 | User --> A 33 | A <--> B1 34 | B1 --> B 35 | ``` 36 | 37 | ```json title="سرور ایران" 38 | { 39 | "name": "myconf", 40 | "nodes": [ 41 | { 42 | "name": "users_inbound", 43 | "type": "TcpListener", 44 | "settings": { 45 | "address": "0.0.0.0", 46 | "port": 443, 47 | "nodelay": true 48 | }, 49 | "next": "bridge2" 50 | }, 51 | 52 | { 53 | "name": "bridge2", 54 | "type": "Bridge", 55 | "settings": { 56 | "pair": "bridge1" 57 | } 58 | }, 59 | { 60 | "name": "bridge1", 61 | "type": "Bridge", 62 | "settings": { 63 | "pair": "bridge2" 64 | } 65 | }, 66 | { 67 | "name": "reverse_server", 68 | "type": "ReverseServer", 69 | "settings": {}, 70 | "next": "bridge1" 71 | }, 72 | { 73 | "name": "kharej_inbound", 74 | "type": "TcpListener", 75 | "settings": { 76 | "address": "0.0.0.0", 77 | "port": 443, 78 | "nodelay": true, 79 | "whitelist": ["2.2.2.2/32"] 80 | }, 81 | "next": "reverse_server" 82 | } 83 | ] 84 | } 85 | ``` 86 | 87 | ```json title="سرور خارج" 88 | { 89 | "name": "reverse_simple", 90 | "nodes": [ 91 | { 92 | "name": "outbound_to_core", 93 | "type": "TcpConnector", 94 | "settings": { 95 | "nodelay": true, 96 | "address": "127.0.0.1", 97 | "port": 443 98 | } 99 | }, 100 | 101 | { 102 | "name": "bridge1", 103 | "type": "Bridge", 104 | "settings": { 105 | "pair": "bridge2" 106 | }, 107 | "next": "outbound_to_core" 108 | }, 109 | { 110 | "name": "bridge2", 111 | "type": "Bridge", 112 | "settings": { 113 | "pair": "bridge1" 114 | }, 115 | "next": "reverse_client" 116 | }, 117 | 118 | { 119 | "name": "reverse_client", 120 | "type": "ReverseClient", 121 | "settings": { 122 | "minimum-unused": 16 123 | }, 124 | "next": "outbound_to_iran" 125 | }, 126 | { 127 | "name": "outbound_to_iran", 128 | "type": "TcpConnector", 129 | "settings": { 130 | "nodelay": true, 131 | "address": "1.1.1.1", 132 | "port": 443 133 | } 134 | } 135 | ] 136 | } 137 | ``` 138 | 139 | :::tip نکته 140 | این نوع تونل معکوس سبک و سریع است، اما فاقد رمزنگاری قوی و محدودیت تعداد اتصالات است. سرور خارج باید به تعداد کل کاربران به سرور ایران اتصال برقرار کند که ممکن است توسط فایروال ایران بلاک شود. 141 | ::: 142 | 143 | ## TLS و HTTP/2 144 | 145 | استفاده از TLS و HTTP/2 تونل معکوس را تکمیل می کند و سرعت و امنیت بالایی فراهم می کند. کیفیت اتصال به دامنه مورد استفاده بستگی دارد. در صورت نیاز می توان از Reality استفاده کرد. 146 | 147 | ### فلوچارت TLS و HTTP/2 148 | 149 | ```mermaid 150 | flowchart LR; 151 | subgraph User1; 152 | end; 153 | subgraph User2; 154 | end; 155 | subgraph User3; 156 | end; 157 | subgraph IRan; 158 | A[443]; 159 | A1[Waterwall Http2 Mux]; 160 | end; 161 | subgraph Kharej; 162 | B[Waterwall Http2 Mux]; 163 | B1[443 Xray] 164 | end; 165 | B --> B1; 166 | B --> B1; 167 | B --> B1; 168 | B --> B1; 169 | linkStyle 0 display:none; 170 | User1 --> A --> A1; 171 | User2 --> A --> A1; 172 | User3 --> A --> A1; 173 | A1 <-- "reverse" --> B; 174 | ``` 175 | 176 | ```json title="سرور ایران" 177 | { 178 | "name": "reverse_tls_h2_multi_iran", 179 | "nodes": [ 180 | { 181 | "name": "inbound_users", 182 | "type": "TcpListener", 183 | "settings": { 184 | "address": "0.0.0.0", 185 | "port": [80, 65535], 186 | "nodelay": true 187 | }, 188 | "next": "header" 189 | }, 190 | { 191 | "name": "header", 192 | "type": "HeaderClient", 193 | "settings": { 194 | "data": "src_context->port" 195 | }, 196 | "next": "bridge2" 197 | }, 198 | { 199 | "name": "bridge2", 200 | "type": "Bridge", 201 | "settings": { 202 | "pair": "bridge1" 203 | } 204 | }, 205 | { 206 | "name": "bridge1", 207 | "type": "Bridge", 208 | "settings": { 209 | "pair": "bridge2" 210 | } 211 | }, 212 | { 213 | "name": "reverse_server", 214 | "type": "ReverseServer", 215 | "settings": {}, 216 | "next": "bridge1" 217 | }, 218 | { 219 | "name": "pbserver", 220 | "type": "ProtoBufServer", 221 | "settings": {}, 222 | "next": "reverse_server" 223 | }, 224 | { 225 | "name": "h2server", 226 | "type": "Http2Server", 227 | "settings": {}, 228 | "next": "pbserver" 229 | }, 230 | { 231 | "name": "sslserver", 232 | "type": "OpenSSLServer", 233 | "settings": { 234 | "cert-file": "fullchain.pem", 235 | "key-file": "privkey.pem", 236 | "alpns": [ 237 | { 238 | "value": "h2", 239 | "next": "node>next" 240 | }, 241 | { 242 | "value": "http/1.1", 243 | "next": "node>next" 244 | } 245 | ], 246 | "fallbackintencedelay": 0 247 | }, 248 | "next": "h2server" 249 | }, 250 | { 251 | "name": "inbound_server_kharej", 252 | "type": "TcpListener", 253 | "settings": { 254 | "address": "0.0.0.0", 255 | "port": 443, 256 | "nodelay": true, 257 | "whitlelist": ["2.2.2.2/32"] 258 | }, 259 | "next": "sslserver" 260 | } 261 | ] 262 | } 263 | ``` 264 | 265 | ```json title="سرور خارج" 266 | { 267 | "name": "reverse_tls_h2_multi_kharej", 268 | "nodes": [ 269 | { 270 | "name": "core_outbound", 271 | "type": "TcpConnector", 272 | "settings": { 273 | "nodelay": true, 274 | "address": "127.0.0.1", 275 | "port": "dest_context->port" 276 | } 277 | }, 278 | { 279 | "name": "header", 280 | "type": "HeaderServer", 281 | "settings": { 282 | "override": "dest_context->port" 283 | }, 284 | "next": "core_outbound" 285 | }, 286 | { 287 | "name": "bridge1", 288 | "type": "Bridge", 289 | "settings": { 290 | "pair": "bridge2" 291 | }, 292 | "next": "header" 293 | }, 294 | { 295 | "name": "bridge2", 296 | "type": "Bridge", 297 | "settings": { 298 | "pair": "bridge1" 299 | }, 300 | "next": "reverse_client" 301 | }, 302 | { 303 | "name": "reverse_client", 304 | "type": "ReverseClient", 305 | "settings": { 306 | "minimum-unused": 16 307 | }, 308 | "next": "pbclient" 309 | }, 310 | { 311 | "name": "pbclient", 312 | "type": "ProtoBufClient", 313 | "settings": {}, 314 | "next": "h2client" 315 | }, 316 | { 317 | "name": "h2client", 318 | "type": "Http2Client", 319 | "settings": { 320 | "host": "mydomain.ir", 321 | "port": 443, 322 | "path": "/", 323 | "content-type": "application/grpc" 324 | }, 325 | "next": "sslclient" 326 | }, 327 | { 328 | "name": "sslclient", 329 | "type": "OpenSSLClient", 330 | "settings": { 331 | "sni": "mydomain.ir", 332 | "verify": true, 333 | "alpn": "h2" 334 | }, 335 | "next": "iran_outbound" 336 | }, 337 | { 338 | "name": "iran_outbound", 339 | "type": "TcpConnector", 340 | "settings": { 341 | "nodelay": true, 342 | "address": "1.1.1.1", 343 | "port": 443 344 | } 345 | } 346 | ] 347 | } 348 | ``` 349 | -------------------------------------------------------------------------------- /docs/manually/tunnels/tls-tunnel.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # TLS Tunnel 6 | 7 | در این بخش، به بررسی تونل TLS می‌پردازیم که یک روش پیشرفته‌تر و امن‌تر نسبت به تونل پورت به پورت است. تونل TLS با استفاده از پروتکل امنیتی TLS، ارتباط رمزگذاری شده‌ای را بین سرور ایران و سرور خارج برقرار می‌کند. 8 | 9 | ## مزایای استفاده از تونل TLS 10 | 11 | - مناسب برای بهبود سرعت در سرورهای خارجی مانند هتزنر که با تونل‌های معکوس مشکل سرعت دارند. 12 | - در صورت استفاده ساده، ممکن است توسط فایروال ایران فیلتر شود. اما با اقداماتی مانند استفاده از ماکس و فعال‌سازی `anti-tls-in-tls`، می‌توان احتمال فیلتر شدن را به حداقل رساند. 13 | - برای کاهش زمان هندشیک، بهتر است با `preconnect` ترکیب شود. 14 | 15 | ### نیازمندی‌ها 16 | 17 | 1. **دامنه**: برای برقراری تونل TLS، نیاز به یک دامنه است. دامنه‌های `.ir` ارزان‌ترین گزینه هستند و استفاده از آنها نگرانی خاصی ندارد. 18 | 19 | 2. **گواهینامه امنیتی (Certificate)**: برای دامنه، باید یک گواهینامه امنیتی دریافت شود. این کار را می‌توان با ابزار `certbot` انجام داد. دستورات نصب و درخواست گواهینامه به شرح زیر هستند: 20 | ```sh 21 | apt-get install certbot 22 | ``` 23 | 24 | ```sh 25 | sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email emaileshoma@gmail.com -d sub.mydomain.ir 26 | ``` 27 | 28 | پس از اجرای دستورات، گواهینامه‌ها در قالب دو فایل fullchain.pem و privkey.pem ذخیره می‌شوند. 29 | 30 | # حالت‌های مختلف تونل TLS 31 | 32 | ## حالت تک پورت و جدا 33 | 34 | در این حالت، فرض می‌شود که همه کاربران روی یک پورت (مثلاً 2083) ساخته شده‌اند و پنل روی سرور خارج در حال اجراست. 35 | 36 | ### فلوچارت حالت تک پورت و جدا 37 | 38 | ```mermaid 39 | flowchart LR; 40 | user1 --> A1; 41 | user2 --> A1; 42 | user3 --> A1; 43 | subgraph Kharej; 44 | B1[443 Waterwall] --> B2; 45 | B2[2083 Xray]; 46 | end; 47 | subgraph IRan; 48 | A1[2083 Waterwall] -- "TLS Handshake" --> B1; 49 | end; 50 | ``` 51 | 52 | ```json title="سرور ایران" 53 | { 54 | "name": "tls_port_to_port", 55 | "nodes": [ 56 | { 57 | "name": "input", 58 | "type": "TcpListener", 59 | "settings": { 60 | "address": "0.0.0.0", 61 | "port": 2083, 62 | "nodelay": true 63 | }, 64 | "next": "mysslclient" 65 | }, 66 | { 67 | "name": "mysslclient", 68 | "type": "OpenSSLClient", 69 | "settings": { 70 | "sni": "mydomain.ir", 71 | "verify": true, 72 | "alpn": "http/1.1" 73 | }, 74 | "next": "output" 75 | }, 76 | { 77 | "name": "output", 78 | "type": "TcpConnector", 79 | "settings": { 80 | "nodelay": true, 81 | "address": "1.1.1.1", 82 | "port": 443 83 | } 84 | } 85 | ] 86 | } 87 | ``` 88 | 89 | ```json title="سرور خارج" 90 | { 91 | "name": "tls_port_to_port_kharej", 92 | "nodes": [ 93 | { 94 | "name": "input", 95 | "type": "TcpListener", 96 | "settings": { 97 | "address": "0.0.0.0", 98 | "port": 443, 99 | "nodelay": true 100 | }, 101 | "next": "mysslserver" 102 | }, 103 | { 104 | "name": "mysslserver", 105 | "type": "OpenSSLServer", 106 | "settings": { 107 | "cert-file": "fullchain.pem", 108 | "key-file": "privkey.pem", 109 | "alpns": [ 110 | { 111 | "value": "h2", 112 | "next": "node->next" 113 | }, 114 | { 115 | "value": "http/1.1", 116 | "next": "node->next" 117 | } 118 | ] 119 | }, 120 | "next": "output" 121 | }, 122 | { 123 | "name": "output", 124 | "type": "TcpConnector", 125 | "settings": { 126 | "nodelay": true, 127 | "address": "127.0.0.1", 128 | "port": 2083 129 | } 130 | } 131 | ] 132 | } 133 | ``` 134 | 135 | ## استفاده بهینه از پورت 443 136 | 137 | برای استفاده بهینه از پورت 443 هم برای کاربران مستقیم و هم برای تونل، می‌توان کانفیگ را به شکل زیر تغییر داد: 138 | 139 | ### فلوچارت استفاده بهینه از پورت 443 140 | 141 | ```mermaid 142 | flowchart LR; 143 | user1 -- "Config Tunnel" --> A1; 144 | user2 -- "Config Tunnel" --> A1; 145 | user3 -- "Config Tunnel" --> A1; 146 | user4 -- "Config Direct" --> B1; 147 | user5 -- "Config Direct" --> B1; 148 | subgraph Kharej; 149 | B1[443 Waterwall] --> B2; 150 | B2[2083 Xray]; 151 | end; 152 | subgraph IRan; 153 | A1[443] -- "TLS Handshake" --> B1; 154 | end; 155 | ``` 156 | 157 | ```json title="سرور ایران" 158 | { 159 | "name": "tls_port_to_port_iran", 160 | "nodes": [ 161 | { 162 | "name": "input", 163 | "type": "TcpListener", 164 | "settings": { 165 | "address": "0.0.0.0", 166 | "port": 443, 167 | "nodelay": true 168 | }, 169 | "next": "mysslclient" 170 | }, 171 | { 172 | "name": "mysslclient", 173 | "type": "OpenSSLClient", 174 | "settings": { 175 | "sni": "mydomain.ir", 176 | "verify": true, 177 | "alpn": "http/1.1" 178 | }, 179 | "next": "output" 180 | }, 181 | { 182 | "name": "output", 183 | "type": "TcpConnector", 184 | "settings": { 185 | "nodelay": true, 186 | "address": "1.1.1.1", 187 | "port": 443 188 | } 189 | } 190 | ] 191 | } 192 | ``` 193 | 194 | ```json title="سرور خارج" 195 | { 196 | "name": "tls_port_to_port_kharej", 197 | "nodes": [ 198 | { 199 | "name": "input_direct_users", 200 | "type": "TcpListener", 201 | "settings": { 202 | "address": "0.0.0.0", 203 | "port": 443, 204 | "nodelay": true 205 | }, 206 | "next": "output_direct_users" 207 | }, 208 | { 209 | "name": "output_direct_users", 210 | "type": "TcpConnector", 211 | "settings": { 212 | "nodelay": true, 213 | "address": "127.0.0.1", 214 | "port": 2083 215 | } 216 | }, 217 | { 218 | "name": "input_tunnel", 219 | "type": "TcpListener", 220 | "settings": { 221 | "address": "0.0.0.0", 222 | "port": 443, 223 | "nodelay": true, 224 | "whitelist": ["2.2.2.2/32"] 225 | }, 226 | "next": "mysslserver" 227 | }, 228 | { 229 | "name": "mysslserver", 230 | "type": "OpenSSLServer", 231 | "settings": { 232 | "cert-file": "fullchain.pem", 233 | "key-file": "privkey.pem", 234 | "alpns": [ 235 | { 236 | "value": "h2", 237 | "next": "node->next" 238 | }, 239 | { 240 | "value": "http/1.1", 241 | "next": "node->next" 242 | } 243 | ] 244 | }, 245 | "next": "output_tunnel" 246 | }, 247 | { 248 | "name": "output_tunnel", 249 | "type": "TcpConnector", 250 | "settings": { 251 | "nodelay": true, 252 | "address": "127.0.0.1", 253 | "port": 2083 254 | } 255 | } 256 | ] 257 | } 258 | ``` 259 | 260 | ## حالت مالتی پورت 261 | 262 | در این حالت، کاربر به هر پورتی که روی سرور ایران وصل شود، به همان پورت روی سرور خارج وصل می‌شود. تبادل اطلاعات از طریق کانکشن TLS بین Waterwall سرور ایران و پورت 443 سرور خارج انجام می‌شود. 263 | 264 | ### فلوچارت حالت مالتی پورت 265 | 266 | ```mermaid 267 | flowchart LR; 268 | user1 -- "Config Tunnel" --> A1; 269 | user2 -- "Config Tunnel" --> A2; 270 | user3 -- "Config Tunnel" --> A3; 271 | user4 -- "Config Tunnel" --> A4; 272 | subgraph Kharej; 273 | B1[443 Waterwall] --> B2 & B3 & B4 & B5; 274 | B2[2053 Xray]; 275 | B3[2083 Xray]; 276 | B4[... Xray]; 277 | B5[65535 Xray]; 278 | end; 279 | subgraph IRan; 280 | A1[2053] -- "TLS Handshake" --> B1; 281 | A2[2083] -- "TLS Handshake" --> B1; 282 | A3[...] -- "TLS Handshake" --> B1; 283 | A4[65535] -- "TLS Handshake" --> B1; 284 | end; 285 | ``` 286 | 287 | ```json title="سرور ایران" 288 | { 289 | "name": "tls_multiport_iran", 290 | "nodes": [ 291 | { 292 | "name": "input", 293 | "type": "TcpListener", 294 | "settings": { 295 | "address": "0.0.0.0", 296 | "port": [23, 65535], 297 | "nodelay": true 298 | }, 299 | "next": "port_header" 300 | }, 301 | { 302 | "name": "port_header", 303 | "type": "HeaderClient", 304 | "settings": { 305 | "data": "src_context->port" 306 | }, 307 | "next": "sslclient" 308 | }, 309 | { 310 | "name": "sslclient", 311 | "type": "OpenSSLClient", 312 | "settings": { 313 | "sni": "mydomain.ir", 314 | "verify": true, 315 | "alpn": "http/1.1" 316 | }, 317 | "next": "output" 318 | }, 319 | { 320 | "name": "output", 321 | "type": "TcpConnector", 322 | "settings": { 323 | "nodelay": true, 324 | "address": "1.1.1.1", 325 | "port": 443 326 | } 327 | } 328 | ] 329 | } 330 | ``` 331 | 332 | ```json title="سرور خارج" 333 | { 334 | "name": "tls_multiport_kharej", 335 | "nodes": [ 336 | { 337 | "name": "input", 338 | "type": "TcpListener", 339 | "settings": { 340 | "address": "0.0.0.0", 341 | "port": 443, 342 | "nodelay": true 343 | }, 344 | "next": "sslserver" 345 | }, 346 | { 347 | "name": "sslserver", 348 | "type": "OpenSSLServer", 349 | "settings": { 350 | "cert-file": "fullchain.pem", 351 | "key-file": "privkey.pem", 352 | "alpns": [ 353 | { 354 | "value": "h2", 355 | "next": "node->next" 356 | }, 357 | { 358 | "value": "http/1.1", 359 | "next": "node->next" 360 | } 361 | ], 362 | "fallback-intence-delay": 0 363 | }, 364 | "next": "port_header" 365 | }, 366 | { 367 | "name": "port_header", 368 | "type": "HeaderServer", 369 | "settings": { 370 | "override": "dest_context->port" 371 | }, 372 | "next": "output" 373 | }, 374 | { 375 | "name": "output", 376 | "type": "TcpConnector", 377 | "settings": { 378 | "nodelay": true, 379 | "address": "127.0.0.1", 380 | "port": "dest_context->port" 381 | } 382 | } 383 | ] 384 | } 385 | ``` 386 | 387 | ### دانشنامه اصطلاحات 388 | 389 | - TLS (Transport Layer Security): پروتکل امنیتی که ارتباطات رمزگذاری شده را در اینترنت فراهم می‌کند. 390 | - گواهینامه SSL/TLS (SSL/TLS Certificate): فایلی دیجیتالی که صحت هویت وب‌سایت را تأیید می‌کند و ارتباط امن بین کاربر و سرور را ممکن می‌سازد. 391 | - Certbot: ابزاری برای دریافت و نصب خودکار گواهینامه‌های SSL/TLS از Let's Encrypt. 392 | - SNI (Server Name Indication): فناوری که به کاربر اجازه می‌دهد نام دامنه مورد نظر را در درخواست SSL/TLS مشخص کند تا سرور بتواند گواهینامه مناسب را ارائه دهد. 393 | - ALPN (Application-Layer Protocol Negotiation): پروتکلی که به کاربر و سرور اجازه می‌دهد تا پروتکل لایه کاربردی مورد استفاده (مانند HTTP/2) را مذاکره کنند. 394 | -------------------------------------------------------------------------------- /docs/scripts.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # اسکریپت های پیکربندی و نصب خودکار 6 | 7 | اسکریپت های نصب و اجرای خودکار که توسط توسعه دهندگاه دیگه طراحی شده اند تا 8 | فرایند نصب و کانفیگ را ساده و سریع تر کنند در این صفحه قرار خواهد گرفت 9 | 10 | دقت کنید که سورس کد این اسکریپت ها باز هست و توسط سازنده اسکریپت آپدیت خواهد شد 11 | 12 | ## اسکریپت Ptechgithub 13 | 14 | ```bash 15 | bash <(curl -fsSL https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/main/install.sh) 16 | ``` 17 | 18 | ![31](../static/img/ptechgithub-script.jpg) 19 | 20 | > - [Ptech Github](https://github.com/Ptechgithub) 21 | > - [Code Repo](https://github.com/Ptechgithub/WaterWall-Docs) 22 | 23 | --- 24 | -------------------------------------------------------------------------------- /docusaurus.config.ts: -------------------------------------------------------------------------------- 1 | import {themes as prismThemes} from 'prism-react-renderer' 2 | import type {Config} from '@docusaurus/types' 3 | import type * as Preset from '@docusaurus/preset-classic' 4 | 5 | const config: Config = { 6 | title: 'WaterWall', 7 | tagline: 'WaterWall tunneling solutions', 8 | favicon: 'img/favicon.ico', 9 | 10 | // Set the production url of your site here 11 | url: 'https://radkesvat.github.io', 12 | // Set the // pathname under which your site is served 13 | // For GitHub pages deployment, it is often '//' 14 | baseUrl: '/WaterWall-Docs', 15 | 16 | // GitHub pages deployment config. 17 | // If you aren't using GitHub pages, you don't need these. 18 | organizationName: 'radkesvat', // Usually your GitHub org/user name. 19 | projectName: 'radkesvat.github.io', // Usually your repo name. 20 | deploymentBranch: 'main', 21 | trailingSlash: false, 22 | 23 | onBrokenLinks: 'throw', 24 | onBrokenMarkdownLinks: 'warn', 25 | 26 | markdown: { 27 | mermaid: true, 28 | }, 29 | themes: ['@docusaurus/theme-mermaid'], 30 | 31 | // Even if you don't use internationalization, you can use this field to set 32 | // useful metadata like html lang. For example, if your site is Chinese, you 33 | // may want to replace "en" with "zh-Hans". 34 | i18n: { 35 | defaultLocale: 'fa', 36 | locales: ['fa'], 37 | }, 38 | 39 | presets: [ 40 | [ 41 | 'classic', 42 | { 43 | docs: { 44 | sidebarPath: './sidebars.ts', 45 | // Please change this to your repo. 46 | // Remove this to remove the "edit this page" links. 47 | 48 | // editUrl: 49 | // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', 50 | }, 51 | // blog: { 52 | // showReadingTime: true, 53 | // // Please change this to your repo. 54 | // // Remove this to remove the "edit this page" links. 55 | // editUrl: 56 | // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', 57 | // }, 58 | theme: { 59 | customCss: './src/css/custom.css', 60 | }, 61 | } satisfies Preset.Options, 62 | ], 63 | ], 64 | 65 | themeConfig: { 66 | // Replace with your project's social card 67 | image: 'img/docusaurus-social-card.jpg', 68 | navbar: { 69 | title: 'WaterWall', 70 | logo: { 71 | alt: 'WaterWall Logo', 72 | src: 'img/logo.svg', 73 | }, 74 | items: [ 75 | { 76 | type: 'docSidebar', 77 | sidebarId: 'tutorialSidebar', 78 | position: 'left', 79 | label: 'Docs', 80 | }, 81 | // {to: '/blog', label: 'Blog', position: 'left'}, 82 | { 83 | href: 'https://github.com/facebook/docusaurus', 84 | label: 'GitHub', 85 | position: 'right', 86 | }, 87 | ], 88 | }, 89 | footer: { 90 | style: 'dark', 91 | links: [ 92 | { 93 | title: 'Docs', 94 | items: [ 95 | { 96 | label: 'Tutorial', 97 | to: '/docs/intro', 98 | }, 99 | ], 100 | }, 101 | // { 102 | // title: 'Community', 103 | // items: [ 104 | // { 105 | // label: 'Stack Overflow', 106 | // href: 'https://stackoverflow.com/questions/tagged/docusaurus', 107 | // }, 108 | // { 109 | // label: 'Discord', 110 | // href: 'https://discordapp.com/invite/docusaurus', 111 | // }, 112 | // { 113 | // label: 'Twitter', 114 | // href: 'https://twitter.com/docusaurus', 115 | // }, 116 | // ], 117 | // }, 118 | { 119 | title: 'More', 120 | items: [ 121 | // { 122 | // label: 'Blog', 123 | // to: '/blog', 124 | // }, 125 | { 126 | label: 'GitHub', 127 | href: 'https://github.com/radkesvat/WaterWall/', 128 | }, 129 | ], 130 | }, 131 | ], 132 | copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, 133 | }, 134 | prism: { 135 | theme: prismThemes.github, 136 | darkTheme: prismThemes.dracula, 137 | }, 138 | } satisfies Preset.ThemeConfig, 139 | } 140 | 141 | export default config 142 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "water-wall-docs", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids", 15 | "typecheck": "tsc" 16 | }, 17 | "dependencies": { 18 | "@docusaurus/core": "3.4.0", 19 | "@docusaurus/preset-classic": "3.4.0", 20 | "@docusaurus/theme-mermaid": "^3.4.0", 21 | "@mdx-js/react": "^3.0.0", 22 | "clsx": "^2.0.0", 23 | "prism-react-renderer": "^2.3.0", 24 | "react": "^18.0.0", 25 | "react-dom": "^18.0.0", 26 | "react-youtube": "^10.1.0" 27 | }, 28 | "devDependencies": { 29 | "@docusaurus/module-type-aliases": "3.4.0", 30 | "@docusaurus/tsconfig": "3.4.0", 31 | "@docusaurus/types": "3.4.0", 32 | "typescript": "~5.2.2" 33 | }, 34 | "browserslist": { 35 | "production": [ 36 | ">0.5%", 37 | "not dead", 38 | "not op_mini all" 39 | ], 40 | "development": [ 41 | "last 3 chrome version", 42 | "last 3 firefox version", 43 | "last 5 safari version" 44 | ] 45 | }, 46 | "engines": { 47 | "node": ">=18.0" 48 | } 49 | } -------------------------------------------------------------------------------- /sidebars.ts: -------------------------------------------------------------------------------- 1 | import type {SidebarsConfig} from '@docusaurus/plugin-content-docs' 2 | 3 | /** 4 | * Creating a sidebar enables you to: 5 | - create an ordered group of docs 6 | - render a sidebar for each doc of that group 7 | - provide next/previous navigation 8 | 9 | The sidebars can be generated from the filesystem, or explicitly defined here. 10 | 11 | Create as many sidebars as you want. 12 | */ 13 | const sidebars: SidebarsConfig = { 14 | // By default, Docusaurus generates a sidebar from the docs folder structure 15 | tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], 16 | 17 | // But you can create a sidebar manually 18 | /* 19 | tutorialSidebar: [ 20 | 'intro', 21 | 'hello', 22 | { 23 | type: 'category', 24 | label: 'Tutorial', 25 | items: ['tutorial-basics/create-a-document'], 26 | }, 27 | ], 28 | */ 29 | } 30 | 31 | export default sidebars 32 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Heading from '@theme/Heading'; 3 | import styles from './styles.module.css'; 4 | 5 | type FeatureItem = { 6 | title: string; 7 | Svg: React.ComponentType>; 8 | description: JSX.Element; 9 | }; 10 | 11 | const FeatureList: FeatureItem[] = [ 12 | { 13 | title: 'Easy to Use', 14 | Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, 15 | description: ( 16 | <> 17 | Docusaurus was designed from the ground up to be easily installed and 18 | used to get your website up and running quickly. 19 | 20 | ), 21 | }, 22 | { 23 | title: 'Focus on What Matters', 24 | Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, 25 | description: ( 26 | <> 27 | Docusaurus lets you focus on your docs, and we'll do the chores. Go 28 | ahead and move your docs into the docs directory. 29 | 30 | ), 31 | }, 32 | { 33 | title: 'Powered by React', 34 | Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, 35 | description: ( 36 | <> 37 | Extend or customize your website layout by reusing React. Docusaurus can 38 | be extended while reusing the same header and footer. 39 | 40 | ), 41 | }, 42 | ]; 43 | 44 | function Feature({title, Svg, description}: FeatureItem) { 45 | return ( 46 |
47 |
48 | 49 |
50 |
51 | {title} 52 |

{description}

53 |
54 |
55 | ); 56 | } 57 | 58 | export default function HomepageFeatures(): JSX.Element { 59 | return ( 60 |
61 |
62 |
63 | {FeatureList.map((props, idx) => ( 64 | 65 | ))} 66 |
67 |
68 |
69 | ); 70 | } 71 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | align-items: center; 4 | padding: 2rem 0; 5 | width: 100%; 6 | } 7 | 8 | .featureSvg { 9 | height: 200px; 10 | width: 200px; 11 | } 12 | -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Any CSS included here will be global. The classic template 3 | * bundles Infima by default. Infima is a CSS framework designed to 4 | * work well for content-centric websites. 5 | */ 6 | 7 | @font-face { 8 | font-family: 'Vazirmatn'; 9 | src: url('/fonts/webfonts/Vazirmatn[wght].woff2') 10 | format('woff2 supports variations'), 11 | url('/fonts/webfonts/Vazirmatn[wght].woff2') format('woff2-variations'); 12 | font-weight: 100 900; 13 | font-style: normal; 14 | font-display: swap; 15 | } 16 | 17 | @font-face { 18 | font-family: Vazirmatn; 19 | src: url('/fonts/webfonts/Vazirmatn-Thin.woff2') format('woff2'); 20 | font-weight: 100; 21 | font-style: normal; 22 | font-display: swap; 23 | } 24 | 25 | @font-face { 26 | font-family: Vazirmatn; 27 | src: url('/fonts/webfonts/Vazirmatn-ExtraLight.woff2') format('woff2'); 28 | font-weight: 200; 29 | font-style: normal; 30 | font-display: swap; 31 | } 32 | 33 | @font-face { 34 | font-family: Vazirmatn; 35 | src: url('/fonts/webfonts/Vazirmatn-Light.woff2') format('woff2'); 36 | font-weight: 300; 37 | font-style: normal; 38 | font-display: swap; 39 | } 40 | 41 | @font-face { 42 | font-family: Vazirmatn; 43 | src: url('/fonts/webfonts/Vazirmatn-Regular.woff2') format('woff2'); 44 | font-weight: 400; 45 | font-style: normal; 46 | font-display: swap; 47 | } 48 | 49 | @font-face { 50 | font-family: Vazirmatn; 51 | src: url('/fonts/webfonts/Vazirmatn-Medium.woff2') format('woff2'); 52 | font-weight: 500; 53 | font-style: normal; 54 | font-display: swap; 55 | } 56 | 57 | @font-face { 58 | font-family: Vazirmatn; 59 | src: url('/fonts/webfonts/Vazirmatn-SemiBold.woff2') format('woff2'); 60 | font-weight: 600; 61 | font-style: normal; 62 | font-display: swap; 63 | } 64 | 65 | @font-face { 66 | font-family: Vazirmatn; 67 | src: url('/fonts/webfonts/Vazirmatn-Bold.woff2') format('woff2'); 68 | font-weight: 700; 69 | font-style: normal; 70 | font-display: swap; 71 | } 72 | 73 | @font-face { 74 | font-family: Vazirmatn; 75 | src: url('/fonts/webfonts/Vazirmatn-ExtraBold.woff2') format('woff2'); 76 | font-weight: 800; 77 | font-style: normal; 78 | font-display: swap; 79 | } 80 | 81 | @font-face { 82 | font-family: Vazirmatn; 83 | src: url('/fonts/webfonts/Vazirmatn-Black.woff2') format('woff2'); 84 | font-weight: 900; 85 | font-style: normal; 86 | font-display: swap; 87 | } 88 | 89 | /* You can override the default Infima variables here. */ 90 | :root { 91 | --ifm-font-family-base: Vazirmatn, system-ui, -apple-system, Segoe UI, Roboto, 92 | Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, 'Segoe UI', 93 | Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 94 | 'Segoe UI Symbol'; 95 | 96 | --ifm-color-primary: #2e8555; 97 | --ifm-color-primary-dark: #29784c; 98 | --ifm-color-primary-darker: #277148; 99 | --ifm-color-primary-darkest: #205d3b; 100 | --ifm-color-primary-light: #33925d; 101 | --ifm-color-primary-lighter: #359962; 102 | --ifm-color-primary-lightest: #3cad6e; 103 | --ifm-code-font-size: 95%; 104 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); 105 | } 106 | 107 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 108 | [data-theme='dark'] { 109 | --ifm-color-primary: #25c2a0; 110 | --ifm-color-primary-dark: #21af90; 111 | --ifm-color-primary-darker: #1fa588; 112 | --ifm-color-primary-darkest: #1a8870; 113 | --ifm-color-primary-light: #29d5b0; 114 | --ifm-color-primary-lighter: #32d8b4; 115 | --ifm-color-primary-lightest: #4fddbf; 116 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); 117 | } 118 | -------------------------------------------------------------------------------- /src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * CSS files with the .module.css suffix will be treated as CSS modules 3 | * and scoped locally. 4 | */ 5 | 6 | .heroBanner { 7 | padding: 4rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | } 12 | 13 | @media screen and (max-width: 996px) { 14 | .heroBanner { 15 | padding: 2rem; 16 | } 17 | } 18 | 19 | .buttons { 20 | display: flex; 21 | align-items: center; 22 | justify-content: center; 23 | } 24 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Link from '@docusaurus/Link'; 3 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 4 | import Layout from '@theme/Layout'; 5 | import HomepageFeatures from '@site/src/components/HomepageFeatures'; 6 | import Heading from '@theme/Heading'; 7 | 8 | import styles from './index.module.css'; 9 | 10 | function HomepageHeader() { 11 | const {siteConfig} = useDocusaurusContext(); 12 | return ( 13 |
14 |
15 | 16 | {siteConfig.title} 17 | 18 |

{siteConfig.tagline}

19 |
20 | 23 | شروع کنید 24 | 25 |
26 |
27 |
28 | ); 29 | } 30 | 31 | export default function Home(): JSX.Element { 32 | const {siteConfig} = useDocusaurusContext(); 33 | return ( 34 | 37 | 38 | {/*
39 | 40 |
*/} 41 |
42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /src/pages/markdown-page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Markdown page example 3 | --- 4 | 5 | # Markdown page example 6 | 7 | You don't need React to write simple standalone pages. 8 | -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/.nojekyll -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-Black.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-Bold.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-ExtraBold.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-ExtraLight.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-Light.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-Medium.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-Regular.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-SemiBold.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn-Thin.woff2 -------------------------------------------------------------------------------- /static/fonts/webfonts/Vazirmatn[wght].woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/fonts/webfonts/Vazirmatn[wght].woff2 -------------------------------------------------------------------------------- /static/img/docusaurus-social-card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/img/docusaurus-social-card.jpg -------------------------------------------------------------------------------- /static/img/docusaurus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/img/docusaurus.png -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/ptechgithub-script.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/img/ptechgithub-script.jpg -------------------------------------------------------------------------------- /static/img/tcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ptechgithub/WaterWall-Docs/8156b14d16045636db711396d1539f3cb3259a1c/static/img/tcp.png -------------------------------------------------------------------------------- /static/img/undraw_docusaurus_mountain.svg: -------------------------------------------------------------------------------- 1 | 2 | Easy to Use 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /static/img/undraw_docusaurus_tree.svg: -------------------------------------------------------------------------------- 1 | 2 | Focus on What Matters 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@docusaurus/tsconfig", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | } 7 | } 8 | --------------------------------------------------------------------------------