Skip to content

Instantly share code, notes, and snippets.

@mahmoud-eskandari
Last active April 18, 2023 06:01
Show Gist options
  • Star 25 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save mahmoud-eskandari/f2f3433bfa9f4025fea29d0c1c40c08a to your computer and use it in GitHub Desktop.
Save mahmoud-eskandari/f2f3433bfa9f4025fea29d0c1c40c08a to your computer and use it in GitHub Desktop.
SSH Tunnel as systemd service

${LOCAL_ADDR IP:PORT}

یعنی سرور ایرانتون و پورت داخلی که میخواهید روش ساکس داشته باشید و باید با این جایگزین بشود.

مثال:

10.10.10.10:9090

و قسمت پایین هم یوزر سرور خارجتون و آدرس IP سرور خارجیتونه که باید جایگزین کنید تو خط 7 فایل ssh-tunnel-as-systemd.sh

${REMOTE_USER}@${REMOTE_ADDRESS}

مثال:

ubuntu@156.70.70.70

مراحل کار:

اول

تو سرور ایرانتون یه SSH Key میسازید که دیگه هربار برای ارتباط با خارج دستی پسورد نخواد رد و بدل شه. ssh-keygen یک کلید میسازه بعد با دستور زیر کلید پابلیک سرور ایران رو میفرستید رو سرور خارجتون و بعد پسورد سرور خارج رو میزنید تا کلید سرور ایران بشینه روی سرور خارجی ssh-copy-id ${REMOTE_USER}@${REMOTE_ADDRESS}

بعدش هم فایل ssh-tunnel-as-systemd.sh line:7 که در بالا توضیحات جایگزین کردن مشخصات سرورهاتون رو توش نوشتم رو اجرا کنید داخل ترمینال که سرویس ssht ساخته بشه و به راحتی بتونید هر دفعه ریستارتش کنید.

اگر ورژن ssh ی که دارید از دستوری مثل -o ServerAliveInterval=60 پشتیبانی نمیکنه و خطا میده

از کجا بفهمیم پشتیبانی نمیکنه؟ همون خط 7 فایل ssh-tunnel-as-systemd.sh رو از بعد = یکبار دستی اجرا کنید ببینید به درستی کار میکنه یا نه چون اگر کار نکنه عملا کارهای شما بیفایده است برای ساخت یک سرویس.

اگر دیدید خطا داد و گیرداد به یه چیزی مثل ServerAliveInterval=60 اون قسمت -o ServerAliveInterval=60 رو پاک کنید. چون اینها برای استیبل کردن کانکشن استفاده شده و آپشنال هستند.

همچنین در ایران به خاطر اذیت کردن این پروتکلهای انکریپت شده نیاز هست هر چند دقیقه یکبار این سرویس ریستارت بشود که با زدن crontab -e و باز کردن فایل کرون‌جاب

یه خط به آخرش اضافه کنید */5 * * * * systemctl restart ssht

که این سرویس به طور خودکار هر ۵ دقیقه ریستارت شود.

برای اتصال به پروکسی ایجاد شده کافیه در برنامه هایی مثل تلگرام پروتکل Socks5 Proxy رو انتخاب کنید و IP:PORT سرور ایران رو وارد کنید.

systemctl enable ssht
systemctl start ssht
# Status
systemctl status ssht
cat <<'EOF' > /etc/systemd/system/ssht.service
[Unit]
Description=Setup a dynamic tunnel
After=network.target
[Service]
ExecStart=/usr/bin/ssh -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -nNT -D ${LOCAL_ADDR IP:PORT} ${REMOTE_USER}@${REMOTE_ADDRESS}
RestartSec=15
Restart=always
KillMode=mixed
[Install]
WantedBy=multi-user.target
EOF
@mahmoud-eskandari
Copy link
Author

mahmoud-eskandari commented May 27, 2020

ssh-keygen
ssh-copy-id ${REMOTE_USER}@${REMOTE_ADDRESS}

Install ssh key on remote host for first time

Run these commands on internal server

@matinzd
Copy link

matinzd commented Sep 22, 2022

توی ویندز 11 جطور میشه socks5 زد؟ من گزینه پیدا نکردم توی همون setup proxy زدم ولی ارور ERR_EMPTY_RESPONSE میداد. فکرکنم پروتکل دیفالت پروکسی ویندوزhttp عه.

@mahmoud-eskandari
Copy link
Author

توی ویندز 11 جطور میشه socks5 زد؟ من گزینه پیدا نکردم توی همون setup proxy زدم ولی ارور ERR_EMPTY_RESPONSE میداد. فکرکنم پروتکل دیفالت پروکسی ویندوزhttp عه.

نمیدونم چطور کل ویندوز رو درست میشه وصل کرد ولی بروزرهایی مثل کروم و فایرفاکس مستقیما ساکس پروکسی توی ستینگشون دارن.
من روی لینوکس و مک مشکلی ندارم باهاش

@matinzd
Copy link

matinzd commented Sep 22, 2022

توی ویندز 11 جطور میشه socks5 زد؟ من گزینه پیدا نکردم توی همون setup proxy زدم ولی ارور ERR_EMPTY_RESPONSE میداد. فکرکنم پروتکل دیفالت پروکسی ویندوزhttp عه.

نمیدونم چطور کل ویندوز رو درست میشه وصل کرد ولی بروزرهایی مثل کروم و فایرفاکس مستقیما ساکس پروکسی توی ستینگشون دارن. من روی لینوکس و مک مشکلی ندارم باهاش

تونستم پیدا کنم. باید رفت داخل Internet Options توی Control Panel.
منم خودم خیلی وقته استفاده نکرده بودم توی ویندوز ۱۱ کلا عوض شده. آره مک و غیره که راحته.

@aminsaedi
Copy link

aminsaedi commented Sep 22, 2022

من الان روی سرور ایرانم وقتی این کامند رو میزنم ssh -D 1080 -N caServer روی خود سرور ی پروکسی روی پورت ۱۰۸۰ اجرا میشه. تا اینجا اوکیه. ولی نمیتونم از بیرون سرور ایران بهش وصل بشم. باید قاعدتا الان بتونم از کامپیوتر خونه این رو ران بکنم curl --socks5 iranIp:1080 google.com دیگه؟ ولی نمیشه. راه حل موقتی که براش زدم این بود ssh -L 1080:127.0.0.1:1080 -N irServer. الان پورت ۱۰۸۰ کامپیوتر خونه رو اینجوری تونستم وصل کنم به ۱۰۸۰ سرور ایران. ولی نمیتونم ی پروکسی ساده بسازم که بدم دوستام و توی تلگرام بزنن به همون دلیلی که اون curl ه کار نمیکنه و نمیتونم مستقیم وصل بشم به ۱۰۸۰ سرور ایرانم. مشکل فایروال هم نیست. ایده ای دارین؟ ممنون

@mahmoud-eskandari
Copy link
Author

من الان روی سرور ایرانم وقتی این کامند رو میزنم ssh -D 1080 -N caServer روی خود سرور ی پروکسی روی پورت ۱۰۸۰ اجرا میشه. تا اینجا اوکیه. ولی نمیتونم از بیرون سرور ایران بهش وصل بشم. باید قاعدتا الان بتونم از کامپیوتر خونه این رو ران بکنم curl --socks5 iranIp:1080 google.com دیگه؟ ولی نمیشه. راه حل موقتی که براش زدم این بود ssh -L 1080:127.0.0.1:1080 -N irServer. الان پورت ۱۰۸۰ کامپیوتر خونه رو اینجوری تونستم وصل کنم به ۱۰۸۰ سرور ایران. ولی نمیتونم ی پروکسی ساده بسازم که بدم دوستام و توی تلگرام بزنن به همون دلیلی که اون curl ه کار نمیکنه و نمیتونم مستقیم وصل بشم به ۱۰۸۰ سرور ایرانم. مشکل فایروال هم نیست. ایده ای دارین؟ ممنون

ssh -D 0.0.0.0:1080 رو تست کنید
تا پورت اکسپوز بشه تو نتورک خارجی

@mehranrasa
Copy link

متاسفانه کار نمیکنه. بعد از اجرای ssh همینطوری میمونه.

@mahmoud-eskandari
Copy link
Author

متاسفانه کار نمیکنه. بعد از اجرای ssh همینطوری میمونه.

یعنی چی؟ نکنه IP سمپلی که گذاشتم رو داری میزنی؟ اونا الکین ها باید خودتون سرور تهیه کنید

@h4med
Copy link

h4med commented Oct 3, 2022

آقا ممنون من اینو راه‌اندازی کردم. از لحاظ امنیت چطور هست؟ آیا ارتباط ما با سرور داخلی رمز شده است؟

@mehranrasa
Copy link

mehranrasa commented Oct 3, 2022

متاسفانه کار نمیکنه. بعد از اجرای ssh همینطوری میمونه.

یعنی چی؟ نکنه IP سمپلی که گذاشتم رو داری میزنی؟ اونا الکین ها باید خودتون سرور تهیه کنید

فکر کنم دیتاسنتری که ازش استفاده میکنم یه چیزاییو اون وسط بلاک کرده.

@h4med
Copy link

h4med commented Oct 4, 2022

متاسفانه کار نمیکنه. بعد از اجرای ssh همینطوری میمونه.

یعنی چی؟ نکنه IP سمپلی که گذاشتم رو داری میزنی؟ اونا الکین ها باید خودتون سرور تهیه کنید

فکر کنم دیتاسنتری که ازش استفاده میکنم یه چیزاییو اون وسط بلاک کرده.

منم وقتی فقط دستور خط ۷ رو اجرا کردم پاسخی نداد و بنظر رسید که گیر کرده ولی سرویس راه افتاد و با چندین کلاینت موبایل و PC بهش وصل شدم. توی این راهنما چندتا نکته دیگه هم باید گفته بشه:

  • دستورات حتما با دسترسی root در سرور داخلی اجرا بشه
  • اگر پورت ssh سرور خارجی دیفالت نیست حتما با -p به خط ۷ اضافه بشه

@asapouya
Copy link

سلام سرور ایران از کجا بگیرم که مشکلی پیش نیاد و خودتون تست کرده باشین؟

@aminsaedi
Copy link

سلام سرور ایران از کجا بگیرم که مشکلی پیش نیاد و خودتون تست کرده باشین؟

من از آروان گرفتم روی سنتر بامداد اوکیه

@mrmmg
Copy link

mrmmg commented Nov 7, 2022

توی ویندز 11 جطور میشه socks5 زد؟ من گزینه پیدا نکردم توی همون setup proxy زدم ولی ارور ERR_EMPTY_RESPONSE میداد. فکرکنم پروتکل دیفالت پروکسی ویندوزhttp عه.

نمیدونم چطور کل ویندوز رو درست میشه وصل کرد ولی بروزرهایی مثل کروم و فایرفاکس مستقیما ساکس پروکسی توی ستینگشون دارن. من روی لینوکس و مک مشکلی ندارم باهاش

سلام
چطوری میشه روی این روش احراز هویت user password اضافه کرد؟

@arandomgstring
Copy link

Remember:
If you use "ssh -D 1080 -N caServer" on IR VPS, your connection from IR VPS to caServer would be encrypted, meaning no one can see what you are sending from IR server to caServer. However, if you connect to IR server from your home PC WITHOUT using ssh encryption, IR server can see what kind of website you are browsing from incoming connections (outgoing connections are encrypted). Follow the third option from https://superuser.com/questions/96489/an-ssh-tunnel-via-multiple-hops for more security; also use wireshark to see what kind of data you are sending to your servers.

@matinzd
Copy link

matinzd commented Nov 9, 2022

Remember: If you use "ssh -D 1080 -N caServer" on IR VPS, your connection from IR VPS to caServer would be encrypted, meaning no one can see what you are sending from IR server to caServer. However, if you connect to IR server from your home PC WITHOUT using ssh encryption, IR server can see what kind of website you are browsing from incoming connections (outgoing connections are encrypted). Follow the third option from https://superuser.com/questions/96489/an-ssh-tunnel-via-multiple-hops for more security; also use wireshark to see what kind of data you are sending to your servers.

The link you sent is so useful. The best possible solution for those who have both servers and they want to be always secure.

  1. Tunnel from localhost to host1 and from host1 to host2:
 ssh -L 9999:localhost:9999 host1 ssh -L 9999:localhost:1234 -N host2

This will open a tunnel from localhost to host1 and another tunnel from host1 to host2. However the port 9999 to host2:1234 can be used by anyone on host1. This may or may not be a problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment