ทำให้การเชื่อมต่อ SSH แบบย้อนกลับอัตโนมัติตอนบูต


9

ฉันมีพีซีที่อยู่เบื้องหลัง NAT ซึ่งทำให้การเชื่อมต่อ SSH แบบย้อนกลับกับ Digitalocean VPC ของฉัน ฉันใช้การเชื่อมต่อ SSH แบบย้อนกลับนี้จากที่บ้านเพื่อลงชื่อเข้าใช้พีซีในสำนักงานของฉัน (ฉันได้รับอนุญาตให้ทำ) และคัดลอกไฟล์และทำสิ่งสำคัญอื่น ๆ

แม้ว่าจะไม่บ่อยนักฉันสังเกตว่า PC office ของฉันรีสตาร์ท (เนื่องจากไฟฟ้าขัดข้อง ฯลฯ ) และหยุดการเชื่อมต่อ SSH ที่กลับด้านที่ทำกับ VPC ของฉัน ในกรณีเหล่านี้ฉันไม่สามารถเชื่อมต่อจากพีซีที่บ้านของฉันกับพีซีในสำนักงานของฉันได้

ฉันเรียกใช้สคริปต์ต่อไปนี้เพื่อให้การเชื่อมต่อกลับ + พร็อกซีแบบไดนามิกกลับไปยังไม่ระบุชื่อการรับส่งข้อมูลของฉัน (เนื่องจากฉันไม่ต้องการแบ่งปันข้อมูลการท่องเว็บ) ที่สร้างขึ้นที่พีซีในสำนักงาน

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

ไม่มีทางที่ฉันจะสามารถเรียกใช้สคริปต์ thsi อีกครั้งบนพีซีของฉันเมื่อรีสตาร์ทเนื่องจากฉันไม่ได้อยู่ที่นั่น เพื่อที่จะแก้ปัญหานี้ฉันติดตั้ง crontab ต่อไปนี้

หมายเหตุ: rev.shไฟล์มีบรรทัดข้างต้น ใบรับรอง "DigitalOcean" และ rev.sh Ubuntu homeตั้งอยู่ใน ดังนั้นเมื่อฉันรัน./rev.shในเทอร์มินัล Ubuntu ของฉันฉันจะได้รับพรอกซีแบบไดนามิกและเข้าถึงเซิร์ฟเวอร์ ym DigitalOcean วิธีนี้ใช้ได้ผล 100%

อย่างไรก็ตามเมื่อฉันติดตั้ง chrontab ในวิธีการต่อไปนี้ ubuntu PC ของฉันจะไม่ทำ Dynamic proxy ฉันเห็นสิ่งนี้เพราะเมื่อฉันตรวจสอบพร็อกซีนี้จาก Google Chrome จะแจ้งว่าพร็อกซีกำลังปฏิเสธการเชื่อมต่อ

นี่คือ cronejobs ที่ฉันพยายามใช้เป็น root cronejobs ฉันยังลองใช้สิ่งเหล่านี้ในฐานะผู้ใช้ปกติ แต่ก็ยังใช้งานไม่ได้

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

ฉันติดตั้ง chrontab หลายนาทีก่อนเวลาปัจจุบันและรอให้ดำเนินการ

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

สิ่งเหล่านี้ไม่ได้ดำเนินการอย่างใดอย่างหนึ่ง

กรุณาใจดีพอที่จะช่วยให้ฉันเห็นข้อผิดพลาดของฉัน มีคำถามที่คล้ายกันมากมายในเว็บไซต์นี้เกี่ยวกับปัญหาของฉัน ฉันได้อ้างอิงคำตอบมากมาย แต่ดูเหมือนว่าไม่มีใครช่วย


ฉันไม่แน่ใจว่าสิ่งที่เป็นปัญหาของคุณที่นี่ มัน cron ไม่ได้เริ่มงานใด ๆ ? หรือสคริปต์ไม่ทำงาน ด้วยปัญหาทั้งสองโปรดปรึกษาบันทึก Cron /var/log/cron*ควรจะเขียนบางที่จะ เพื่อจุดประสงค์ในการทดสอบคุณสามารถเขียนสิ่งที่ชอบได้*/2 * * * * /path/to/script- มันจะเรียกใช้สคริปต์ทุก 2 นาที ตรวจสอบเมลสำหรับผู้ใช้ cron ด้วย มันเป็นรากหรือไม่ ใช้mailคำสั่ง โอ้ฉันเห็นว่าคุณกำลังใช้คีย์ ssh อยู่หรือไม่ ฉันสงสัยว่างาน cron จะสามารถค้นหาได้ถ้าคุณจะไม่ให้เส้นทางแบบเต็มหลังจาก-iสลับ
Kalavan

คำตอบ:


8

ฉันไม่แน่ใจว่าหากใช้cronเพื่อเรียกใช้สคริปต์เมื่อเริ่มต้นเป็นความคิดที่ดี ทางเลือกที่ผมเห็นมากขึ้นพอดีคือการสร้างบริการ SystemD ตามที่อธิบายไว้ที่นี่ สร้างไฟล์ชื่อ/etc/systemd/system/autossh.service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

จากนั้นรันคำสั่งต่อไปนี้ในฐานะรูท:

systemctl enable autossh.service

1

สองสิ่งที่คุณลองได้:

chmod +x rev.sh

บางครั้งเส้นทางของคุณไม่ได้ตั้งค่าอย่างสมบูรณ์ในเวลาบูตหรือผ่าน cronjobs ดังนั้นให้แทนที่ autossh ด้วยเส้นทางแบบเต็มในระบบของฉัน

/usr/bin/autossh

@reboot motif ขึ้นอยู่กับเวลาเริ่มต้น cron daemon ดังนั้นจึงอาจถูกเรียกใช้ก่อนที่ระบบย่อยอื่น (เครือข่าย?) จะเริ่มทำงาน

และตัวอย่าง crontab ของคุณ:

24 12 8 * * * bash /home/user/rev.sh

จะเรียกใช้ในวันที่ 8 ของทุกเดือนเท่านั้น และมันมีสนามพิเศษ ลอง

24 12 * * * /home/user/rev.sh

ขออภัยมันเป็นความผิดพลาด ฉันลอง '24 12 * * * /home/user/rev.sh 'แต่ก็ยังใช้งานไม่ได้ ฉันประหลาดใจที่ไม่แม้แต่จะ '24 12 * * * รีบูต 'ทำงาน
เดนิส

1
การรีบูตอย่างแน่นอนจะไม่ทำงานเว้นแต่คุณจะเรียกใช้เป็นรูต
slowko

ฉันพยายามเพิ่ม / usr / bin / autossh มันไม่ได้ผล.
เดนิส

ฉันลอง 24 12 8 * * * รีบูทในราก crontab มันไม่ได้ผล. มันทำงานกับคุณหรือไม่
เดนิส

/usr/binอยู่ในค่าเริ่มต้นเสมอPATHสำหรับcron
roaima

1

ดูเหมือนว่าเมื่อสคริปต์ถูกเรียกใช้ผ่าน crontab จะไม่พบใบรับรองของคุณ

เมื่อคุณในฐานะผู้ใช้งานสคริปต์มันจะใช้ใบรับรองจาก /home/ubuntu-user/.ssh / ... อย่างไรก็ตามเมื่อสคริปต์ถูกเรียกใช้จาก crontab มันจะทำงานเป็นรูท รูทนำใบรับรองไปใช้จาก /root/.ssh

ดังนั้นคุณมีหลายวิธีที่จะทำให้มันใช้งานได้ แต่ฉันคิดว่าการรันสคริปต์ในฐานะผู้ใช้อูบุนตูใน crontabก็ทำได้

แก้ไข:

ตรวจสอบให้แน่ใจว่าได้ระบุเส้นทางแบบเต็มสำหรับใบรับรอง



0

เนื่องจากคำถามมีข้อมูลไม่มากฉันจะเริ่มจากศูนย์ด้วยสิ่งที่ฉันจะทำ

ฉันจะกำหนดค่าทั้งหมดใน / etc / ssh / ssh_config:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

ฉันจะใส่กุญแจ /etc/ssh/mytunnel_key

แล้วฉันจะลองกับรายการ cron (บริการพุ่งพรวด / systemd จะดีกว่า) เช่นนี้

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel

0

คุณต้องใช้-fและเรียกใช้คำสั่งเมื่อคุณรันโดยไม่มีเทอร์มินัล ดังนั้นนี่คือตัวอย่าง:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

- วางไว้ในพื้นหลัง แต่วางไว้ในพื้นหลังหมายความว่า ssh จะเชื่อมต่อจากนั้นยกเลิกการเชื่อมต่อทันทีที่เสร็จสิ้นภารกิจ ดังนั้นคุณต้องการงาน

sleep 31536000 บอก ssh ให้รัน "sleep" เป็นเวลา 1 ปีหลังจากเชื่อมต่อ ในช่วงเวลานี้อุโมงค์ของคุณจะยังคงอยู่

หากคุณไม่ได้รันคำสั่ง ssh จะเชื่อมต่อตั้งค่าอุโมงค์ย้อนกลับที่พอร์ต 2205 และเมื่อดำเนินการเสร็จแล้วมันจะจบการทำงาน การใช้การตรวจสอบอัตโนมัติหากการเชื่อมต่อล้มเหลวระบบจะทำการเชื่อมต่อใหม่และเริ่มการสลีปอีกครั้ง แม้จะมีการเชื่อมต่ออินเทอร์เน็ตที่เสถียรจริงๆฉันก็สงสัยว่าเป็นไปได้หนึ่งปี

BTW - ไม่เหมือนนักเลงอื่น ๆ ฉันรู้ว่างานนี้เนื่องจากฉันทดสอบจริง ๆ เพราะแน่นอนว่าฉันทำอะไรที่คล้ายกันและเนื่องจากฉันทำงานตอนนี้อย่างน่าเชื่อถือมากฉันสามารถให้คำตอบที่ถูกต้อง

-f และ "คำสั่ง"

นั่นคือสิ่งที่คุณขาดหายไป


1
ฉันไม่คิดว่าเราต้องเรียกชื่อคนอื่นที่นี่
Jeff Schaller

1
ฉันไม่ได้เรียกชื่อคนอื่น ฉันกำลังชี้ให้เห็นวิธีการแก้ปัญหาที่แนะนำก่อนหน้านี้ไม่เคยลองโดยคนที่แนะนำพวกเขา ไม่เชื่อฉัน ลองพวกเขา
Jimminy Doe

1
ผมไม่คิดว่าคุณได้รับการแก้ไขจุดของคำถามอย่างใดอย่างหนึ่ง - OP อ้างว่าวิธีนี้ได้ผล 100% ฉันเชื่อว่าศูนย์คำถามของพวกเขาเกี่ยวกับการเรียกใช้สคริปต์ด้วยวิธีอัตโนมัติหลังจากที่พีซีรีสตาร์ท
Jeff Schaller

1
ถ้าเขาอยู่ในที่ทำงานเขาสามารถตั้งค่าอุโมงค์กลับไปที่บ้านได้เพราะ OP กำลังทำงานในสถานี - นั่นใช้งานได้ 100% ของเวลา โปรแกรม ssh (และ autossh) ทำหน้าที่แตกต่างกันหากไม่มีเทอร์มินัลที่เชื่อมโยงกับกระบวนการ เขามีปัญหาในการ crontab (ซึ่งทำงานโดยไม่มี terminal) เชื่อมต่ออุโมงค์อีกครั้งอย่างแม่นยำเพราะเขาไม่ได้ใช้ -f และแม้ว่าเขาจะเป็น ssh จะออกจากเมื่ออุโมงค์ถูกตั้งค่าโดยไม่ต้องทำงานอะไร - ในกรณีของฉันฉันไป นอนหลับเป็นเวลาหนึ่งปี ในสคริปต์ -f ต้องใช้กับคำสั่งที่ป้องกัน SSH ไม่ให้ออก นั่นคือปัญหาของเขา
Jimminy Doe

1
ฉันคิดว่าเป็นคุณ Jeff Schaller ที่ให้ downvote ให้ฉันเพื่อให้ทางออกที่ถูกต้องและทดสอบจริง ๆ โดยทั่วไปแล้วฉันกำลังทำการติดตั้งที่แน่นอนยกเว้นว่าฉันตั้งค่า PI เพื่อให้ผ่านไฟร์วอลล์และเริ่มการทำงาน rdesktop และมอบให้ผู้จัดการสำนักงานของเราที่ไม่รู้เรื่องเกี่ยวกับ Linux เพื่อใช้งาน . ค่อนข้างแน่ใจว่าฉันมีวิธีแก้ปัญหากระสุนเพราะฉันใช้ตอนนี้และฉันรีบูตทั้ง pi ของฉันจากระยะไกลและเคเบิลโมเด็มท้องถิ่นของฉัน - เพื่อความปลอดภัย .. แต่ห่าอย่าให้คำตอบที่ถูกต้องเข้ามา วิธีการของการ overblown, unearned, อัตตา
Jimminy Doe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.