{"id":51038947,"url":"https://github.com/ipmartnetwork/ssh-tunnel","last_synced_at":"2026-06-22T09:01:26.353Z","repository":{"id":239423850,"uuid":"799493196","full_name":"iPmartNetwork/SSH-Tunnel","owner":"iPmartNetwork","description":"تانل معکوس بین 2 سرور","archived":false,"fork":false,"pushed_at":"2024-05-12T10:27:18.000Z","size":43,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-29T01:25:04.601Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iPmartNetwork.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-12T10:15:39.000Z","updated_at":"2026-01-29T13:08:54.000Z","dependencies_parsed_at":"2024-05-12T11:27:38.760Z","dependency_job_id":"de3e45c1-bd57-44c6-a092-e1f41a63a4a1","html_url":"https://github.com/iPmartNetwork/SSH-Tunnel","commit_stats":null,"previous_names":["ipmartnetwork/ssh-tunnel"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/iPmartNetwork/SSH-Tunnel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iPmartNetwork%2FSSH-Tunnel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iPmartNetwork%2FSSH-Tunnel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iPmartNetwork%2FSSH-Tunnel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iPmartNetwork%2FSSH-Tunnel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iPmartNetwork","download_url":"https://codeload.github.com/iPmartNetwork/SSH-Tunnel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iPmartNetwork%2FSSH-Tunnel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34641636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-22T09:01:25.425Z","updated_at":"2026-06-22T09:01:26.344Z","avatar_url":"https://github.com/iPmartNetwork.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cpicture\u003e\n\u003cimg width=\"160\" height=\"160\"  alt=\"XPanel\" src=\"https://github.com/iPmartNetwork/iPmart-SSH/blob/main/images/logo.png\"\u003e\n\u003c/picture\u003e\n  \u003c/p\u003e \n\u003cp align=\"center\"\u003e\n\u003ch1 align=\"center\"/\u003eSSH-Tunnel\u003c/h1\u003e\n\u003ch6 align=\"center\"\u003eتانل معکوس بین 2 سرور\n\u003ch6\u003e\n\u003c/p\u003e\n\n\n\n\n\u003ch1 id=\"rtl-markdown\" dir=\"rtl\"\u003eآموزش راه اندازی تونل معکوس بین 2 سرور با استفاده از SSH و اتوماسیون با systemd\u003c/h1\u003e\n\nاین نوع تونل اصولا در شرایطی استفاده میشود که سرور مد نظر ما پشت firewall بسته و یا NAT باشد\nشرایط لازم این است که سرور شما پورت های ورودی tcp آن توسط یکی از مواردی که گفته شد بسته شده باشن، اما پورت های خروجی tcp آن باز باشند.\nمفهوم انجام این نوع تونل بدین شرح است که ما از طریق سرور فیلتر شده به سرور آزاد ارتباط SSH برقرار میکنیم، سپس با استفاده از همین ارتباط پایدار به صورت معکوس پورت tcp مورد نظر را از سرور آزاد به پورت tcp سرور فیلتر شده هدایت میکنیم (port forwarding)، در نتیجه کاربرات با استفاده از پورت tcp هدایت شده از سرور آزاد میتوانند به سرور فیلتر شده دسترسی داشته باشن.\n\n\n\n**تصویر مفهومی برای توضیح بهتر این نوع تونل:**\n\u003cp dir=\"rtl\"\u003eclient = سرور فیلتر\u003c/p\u003e\n\u003cp dir=\"rtl\"\u003egateway = سرور آزاد\u003c/p\u003e\n\u003cp dir=\"rtl\"\u003eprecious resource = سرویس مورد نظر\u003c/p\u003e\n\n\u003cp\u003e\u003c/p\u003e\n\n\u003ch4 dir=\"rtl\"\u003eتوجه داشته باشید که تمام فرمان ها در این آموزش باید با یوزر root اجرا شوند\nاگر دسترسی روت ندارید میتونید با اجرای فرمان زیر به یوزر روت سوییچ کنید سپس به اجرای فرمان ها بپردازید.\u003c/h4\u003e\n\n```bash\nsudo -i\n```\n\nاما واجب هست که روی سرور ایران، امکان لاگین کردن به یوزر روت از SSH با پسورد را داشته باشید، برای مثال اگر از سرویس های ابرک آروان استفاده میکنید لازم هست که این دستورات را اجرا کنید تا امکان لاگین روت از ssh فراهم شود:\n```bash\nsudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \u0026\u0026 sudo systemctl restart ssh\n```\n\n\u003ch2 dir=\"rtl\"\u003e1. آماده سازی سرور آزاد\u003c/h2\u003e\n\u003cp dir=\"rtl\"\u003eتوجه: این مرحله روی سرور آزاد انجام میشود\u003c/p\u003e\n\nفرمان زیر امکان گوش دادن به درخواست های ورودی به سرور آزاد را توسط پورت های فوروارد شده از طریق تونل باز میکند:\n\n```bash\nsudo sed -i 's/#GatewayPorts no/GatewayPorts yes/' /etc/ssh/sshd_config\n```\n\nسپس برای اعمال تغییری که تو تنظیمات sshd دادید این فرمان رو اجرا کنید:\n\n```bash\nsystemctl restart sshd.service\n```\n\n\n\u003ch2 dir=\"rtl\"\u003e2. تهیه کلید SSH درون سرور فیلتر شده و شناخت آن به سرور آزاد\u003c/h2\u003e\n\u003cp dir=\"rtl\"\u003eتوجه: این مرحله روی سرور فیلتر انجام میشود\u003c/p\u003e\n\n(در اکثر مواقع برای دسترسی به سرور فیلتر شده شما نمیتونید ssh مستقیم بزنید تا فرمان های لازم رااجرا کنید، مگر این که به طریقی شما بتونید دسترسی داشته باشید بهش که معمولا مجبور هستید از صفحه Console در پنل تهیه کننده هاست استفاده کنید که اگر قبلا با آن کار کرده باشید میدانید که paste کردن فرمان ها در آن ممکن نیست، در نتیجه پیشنهاد میشود از نرم افزار \u003ca href=\"https://github.com/Collective-Software/ClickPaste\"\u003eClickpaste\u003c/a\u003e استفاده کنید که متن یا فرمان کپی شده را با 2 کلیک ساده برای شما به جای paste کردن **تایپ** میکند)\n\nبا فرمان زیر یک کلید جفتی ssh از نوع rsa تولید میکنیم:\n\n```bash\nssh-keygen -t rsa\n```\n\n\nدر خصوص آدرس و نام برای ثبت کلید چیزی ننویسید و خالی کلید Enter را بزنید، همچنین برای Passphrase درخواستی هم خالی کلید Enter را بزنید.\nدر انتها کلید جفتی با اسامی پیشفرض id_rsa و id_rsa.pub در مسیر root/.ssh/ ساخته میشه.\n\n(فایل id_rsa کلید خصوصی شما و id_rsa.pub کلید عمومی شما میباشد، شما با قرار دادن محتویات داخلی کلید عمومیتان در هر سروری میتوانید با استفاده از کلید خصوصی خود بدون نیاز به پسورد و با ایمنی تمام ارتباط ssh برقرار کنید)\n\nحال با فرمان زیر کلید عمومی ساخته شده در سرور آزاد کپی میشود:\n\n```bash\nssh-copy-id -i ~/.ssh/id_rsa.pub root@آی.پی.سرور.آزاد\n```\n\n\nاز این رو که اولین باری هست که سرور فیلتر به سرور آزاد ارتباط ssh ایجاد میکند از شما درباره اعتماد به فینگرپرینت سرور آزاد سوال میشود که باید جواب دهید:\n\n```bash\nyes\n```\n\nسپس با وارد کردن پسورد سرور آزاد، این روند تکمیل میشود که در نتیجه دفعات بعدی شما میتوانید بدون استفاده از پسورد از درون سرور فیلتر به سرور آزاد دسترسی داشته باشید\n\nدر حال حاضر متوجه شدید که بعد از انجام عملیات کپی کلید، وارد سرور آزاد شده و داره بهتون شل سرور آزاد رو نشون میده، ما باقی مراحلمونم هنوز رو سرور فیلتر باید انجام بشه پس بنویسید exit و از سرور آزاد خارج بشید که برگرده رو سرور فیلتر تا ادامه بدیم.\n\n\u003cp dir=\"rtl\"\u003e*نکته، محض اطلاع: این روند به صورت اتوماتیک انجام میشود، مقصد کپی کردن کلید در سرور آزاد  فایل ذکر شده میباشد:*\n\n/root/.ssh/authorized_keys\u003c/p\u003e\n\n\u003ch2 dir=\"rtl\"\u003e3. ساخت فایل سرویس systemd و ایجاد تونل\u003c/h2\u003e\n\u003cp dir=\"rtl\"\u003eتوجه: این مرحله روی سرور فیلتر انجام میشود\u003c/p\u003e\n\n\nساخت جاب برای systemd: (توجه کنید که اسم رو دقیق درست وارد کنید، خصوصا @ بسیار بسیار مهم هست در اسم این فایل)\n\n```bash\nnano /etc/systemd/system/reverse@.service\n```\n\nسپس داخل آن مشابه زیر سرویس را بسازید:\n(توجه کنید که در این روش از متغیر استفاده شده، نقش حروف i% هر جای این متن که بیاید تعیین متغیر هست، برای مثال ما جای پورت هامون i% وارد کردیم و وقتی که سرویس را با اعلام عدد پورت اجرا کنیم، اون عدد جایگزین متغیر شده و اجرا میشود) \n\n\n```bash\n[Unit]\nDescription=Reverse SSH Tunnel Port %I\nAfter=network-online.target\n\n[Service]\nType=simple\nExecStart=ssh -N -R 0.0.0.0:%i:localhost:%i root@آی.پی.سرور.آزاد\nRestart=on-failure\nRestartSec=10\n\n[Install]\nWantedBy=multi-user.target\n```\n\nبرای پیاده سازی این روش در دیستروی CentOS لازم هست فایل اجرایی ssh را با مسیر محض آن تنظیم کنید که معمولا در usr/bin/ ذخیره شده. (اگر هنوزم مشکل در رابطه با Absolute Path دریافت کردید، فرمان \"which ssh\" را اجرا کنید تا مسیر محض ssh را به شما اعلام کند)\nدر نتیجه باید خط فرمان زیر را جایگزین فرمان اجرایی در تنظیمات فایل سرویس کنید.\nیعنی باید ssh در دستور اجرا بشود\n/usr/bin/ssh\n\n\n ------------------------------------------------------\n \u003cdiv align=\"right\"\u003e\n  \u003cdetails\u003e\n    \u003csummary\u003e\u003cstrong\u003eتوضیحات\u003c/strong\u003e\u003c/summary\u003e\n  \n------------------------------------ \n\n\u003cp\u003eاینجا من کامند sshی که استفاده شده رو براتون یه توضیحی میدم فقط محض رفع شک و شبهه ها\u003c/p\u003e\n\u003cp\u003essh -N -R 0.0.0.0:پورت:localhost:پورت root@آی.پی.سرور.آزاد\u003c/p\u003e\n\u003cp\u003eاین کامند رو به 2 قسمت براتون تقسیم میکنم\u003c/p\u003e\n\u003cp\u003eقسمت فاقد دستور تونل میشه\u003c/p\u003e\n\u003cp\u003eاول این قسمت اجرا میشه\u003c/p\u003e\n\u003cp\u003essh -N root@آی.پی.سرور.آزاد\u003c/p\u003e\n\u003cp\u003eوقتی کهssh کامل وصل شد به سرور مد نظر\u003c/p\u003e\n\u003cp\u003eسپس قسمت دستور تونل اجرا میشه\u003c/p\u003e\n\u003cp\u003e-R 0.0.0.0:99:localhost:99\u003c/p\u003e\n\u003cp\u003eکه تایین میکنه تونل از کجا برقرار بشه و به کجا برسه\u003c/p\u003e\n\u003cp\u003eدر اینجا 0.0.0.0:99 روی سرور آزاد تنظیم میشه که تایین میکنه از تمام ای پی های ممکن (0.0.0.0 تنها و تنها به معنی تمام ای پی ها هست، هیچ معنی دیگری ندارد) روی پورت 99 درخواست ها رو قبل کن و هدایت کن به سرور خودمون\u003c/p\u003e\n\u003cp\u003eدر اصل به localhost:99 سرویسیه که رو پورت 99 رو سرور فیلتر شده داره کار میکنه و به درخواست هایی که بهش هدایت میشن جواب میده.\u003c/p\u003e\n  \n  \u003c/details\u003e\n\u003c/div\u003e\n\n\n\u003cp\u003eبعد از ذخیره فایل برای بازخوانی جاب های جدید در systemd از این فرمان استفاده کنید:\u003c/p\u003e\n\n```bash\nsystemctl daemon-reload\n```\n\nبرای راه اندازی اولیه/مجدد سرویسی که ذخیره کردیم با پورت دلبخواه systemd:\n\n```bash\nsystemctl start reverse@پورت\n```\n\nبرای مشاهده وضعیت سرویس فعال در systemd:\n\n```bash\nsystemctl status reverse@پورت\n```\n\nبرای فعال کردن سرویس مورد نظر برای استارتاپ در systemd:\n```bash\nsystemctl enable reverse@پورت\n```\n\nچون در این روش لازم نیست برای هر پورت یک فایل مجزا بسازیم، و داریم پورت مورد نظر را در دستور تعیین میکنیم، در نتیجه میتوانیم چند سرویس مختلف با پورتای مختلف اجرا کنیم\nبه شرح زیر برای مثال برای پورت های 55 و 56 و 57 و 58: (این دستور چندین سرویس/پورتی برای crontab بسیار به کار می آید)\n```bash\nsystemctl restart reverse@55 reverse@56 reverse@57 reverse@58\n```\nهمچنین این اجرای چند سرویس را هم توی دستور enable هم حتی میتوانیم استفاده کنیم.\n\n\n\n\u003ch2 dir=\"rtl\"\u003e4. ایجاد اتوماسیون برای systemctl restart و نکات مهم برای پایداری بیشتر\u003c/h2\u003e\n\u003cp dir=\"rtl\"\u003eتوجه: این مرحله روی سرور فیلتر انجام میشود\u003c/p\u003e\n\nاگر تونل برای شما پایدار نیست و بعد چند ساعت قطع میشه و باید بیاید دستی ریستارت کنید تونل رو، \nبا این روش میتونید فرمان ریستارت سرویس هاتون رو هر 1 ساعت به صورت اتوماتیک اجرا کنید: \n\n ابتدا مطمئن شوید که crontab روی سیستم شما نصب هست:\n\n```bash\napt update \u0026\u0026 apt-get install cron -y\n```\n\nسپس با اجرای این فرمان تنظیمات جاب های crontab را باز کنید:\n\n```bash\ncrontab -e\n```\n\nدر این مرحله از شما میپرسد کدام تکست ادیتور را برای مشاهده فایل ترجیح میدهید، \nبرای سهولت امر از nano که معمولا گزینه 1 هست استفاده کنید\n(اگر از CentOS استفاده میکنید، حتما مطمئن شوید که nano نصب هست، در غیر این صورت با تکست ادیتور vi فایل کرون تب را برایتان باز میکند)\n\nحالا در انتهای فایل باز شده این خط را اضافه کنید:\n(این نمونه ای که نوشتم، برای پورت های 55 تا 58 هست، شما میتونید پورتای دلبخواهتون رو تا هر تعدادی که بخواید، start, enable, disble, restart کنید)\n\n```bash\n0 */1 * * * systemctl restart reverse@55 reverse@56 reverse@57 reverse@58\n```\n\n\u003cb\u003eتوجه: برای جلوگیری از هنگ کردن و قطعی تونل، از استفاده از پروتکل های cleartext مثل vless خودداری نمایید، اگر حتما لازم هست vless استفاده کنید، حتما با reality یا tls بسازید. که ارتباط انکریپت شود و از اورلود کردن تونل ssh جلوگیری شود،\u003c/b\u003e\n\u003cp\u003eبرای دوستانی که vless خالی را برای همراه اول لازم میدانند، پروتکل trojan پیشنهاد میشود، خصوصا با ترانسپورت ws ساخته شود، اگر مشکل ارتباط با این پروتکل دارند، لازم هست که انتهای هر لینک کپی شده برای هر کلاینت قبل از کرکتر # که نام کانفیگ را مشخص میکند، متن زیر را اضافه کنید:\u003c/p\u003e\n\n```bash\n\u0026security=none\n```\n\n\u003cp\u003eلینک نمونه که از پنل کپی میشود:\u003c/p\u003e\n\n\u003ccode\u003etrojan://gy7PCiGHoC@1.1.1.1:99?type=ws\u0026path=%2F#Config_name\u003c/code\u003e\n\u003cp\u003e↓\u003c/p\u003e\n\u003ccode\u003etrojan://gy7PCiGHoC@1.1.1.1:99?type=ws\u0026path=%2F\u003cدقیقا اینجا\u003e#Config_name\u003c/code\u003e\n\u003cp\u003e↓\u003c/p\u003e\n\u003ccode\u003etrojan://gy7PCiGHoC@1.1.1.1:99?type=ws\u0026path=%2F\u0026security=none#Config_name\u003c/code\u003e\n\n\u003ch2 dir=\"rtl\"\u003e5. تست کردن وضعیت تونل روی سرور آزاد\u003c/h2\u003e\n\u003cp dir=\"rtl\"\u003eتوجه: این مرحله روی سرور آزاد انجام میشود\u003c/p\u003e\n\u003cp dir=\"rtl\"\u003eمهم ترین تست اینه که رو سرور آزاد باید بتونید با وارد کردن فرمان زیر:\u003c/p\u003e\n\n```bash\nlsof -i -P -n | grep LISTEN\n```\n\n\n\u003cp dir=\"rtl\"\u003eتمام پورت هایی که روی سرور آزاد در حال listen شدن هستن رو مشاهده کنید\u003c/p\u003e\n\n\u003cp dir=\"rtl\"\u003eکه لازمه برای موفقیت آمیز بودن تونل معکوسمون این پورت به این شکل 99:* باز باشه (* = 0.0.0.0 = \"هر ای پی ای\")\u003c/p\u003e\n\n\u003cp dir=\"rtl\"\u003eچیزی مشابه خط زیر رو باید بتونید ببینید:\u003c/p\u003e\n\nsshd   1111 root  10u IPv4 2222   0t0 TCP *:99 (LISTEN)\n\n\n\u003cp dir=\"rtl\"\u003eدر نهایت هم یادتون باشه همیشه ریبوت کردن سرور آزاد میتونه مشکلات قطعی تونل رو حل کنه\u003c/p\u003e\n\u003cp dir=\"rtl\"\u003eبرای ریبوت کردن هر سیستم لینوکسی فرمان زیر را استفاده کنید:\u003c/p\u003e\n\n```bash\nreboot\n```\n\n\n\n# تلگرام\n\n[@ipmart_network](https://t.me/ipmart_network)\n\n[@iPmart Group](https://t.me/ipmartnetwork_gp)\n\n\n\n\n # حمایت از ما :hearts:\nحمایت های شما برای ما دلگرمی بزرگی است\u003cbr\u003e \n\u003cp align=\"left\"\u003e\n\u003ca href=\"https://plisio.net/donate/kB7QU7f7\" target=\"_blank\"\u003e\u003cimg src=\"https://plisio.net/img/donate/donate_light_icons_mono.png\" alt=\"Donate Crypto on Plisio\" width=\"240\" height=\"80\" /\u003e\u003c/a\u003e\u003cbr\u003e\n\t\n|                    TRX                   |                       BNB                         |                    Litecoin                       |\n| ---------------------------------------- |:-------------------------------------------------:| -------------------------------------------------:|\n| ```TJbTYV1fFo2485sYMyajxGPLFzxmNmPrNA``` |  ```0x4af3de9b303a8d43105e284823d95b4c600961a3``` | ```MPrkzFiNtw4Rg67bbZB6gCxa9LV87orABM``` |\t\n\n\u003c/p\u003e\t\n\n\n\n\n\u003cp align=\"center\"\u003e\n\u003cpicture\u003e\n\u003cimg width=\"160\" height=\"160\"  alt=\"XPanel\" src=\"https://github.com/iPmartNetwork/iPmart-SSH/blob/main/images/logo.png\"\u003e\n\u003c/picture\u003e\n  \u003c/p\u003e \n\n  \n  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipmartnetwork%2Fssh-tunnel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fipmartnetwork%2Fssh-tunnel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipmartnetwork%2Fssh-tunnel/lists"}