การเชื่อมต่อ SSH พื้นหลังถาวรเพื่อสร้างอุโมงค์ย้อนกลับ: วิธีที่ถูกต้องคืออะไร?


41

คำถามที่เกี่ยวข้อง: เริ่มการเชื่อมต่อ ssh จากเซิร์ฟเวอร์ไปยังไคลเอนต์

คำตอบจากที่นั่นช่วยฉันได้มากคำสั่งนี้ทำในสิ่งที่ฉันต้องการ:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

ดังนั้นฉันจึงเขียนสคริปต์เพื่อเชื่อมต่อใหม่ตลอดเวลา:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

/etc/crontabและเพิ่มความมันไป แต่ฉันพบว่าใช้งานได้ถ้าเพียงฉันรัน "ด้วยมือ" จากเปลือก แต่ถ้ามันถูกเรียกโดย cron, ssh เชื่อมต่อและเสร็จสิ้นทันที (ดังนั้นสคริปต์ด้านบนจะเชื่อมต่อใหม่ตลอดเวลา)

จากman sshฉันพบว่าสำหรับการเชื่อมต่อพื้นหลังฉันควรโทรด้วย-nกุญแจ แต่มันไม่ได้ช่วย จากนั้นฉันแค่มองไปรอบ ๆ เพื่อหาสคริปต์ที่คล้ายกันและฉันพบว่ามันใช้งานได้ถ้าฉันเรียกtail -f somethingเช่นคำสั่ง "ไม่สิ้นสุด" ดังนั้นฉันเพิ่งสร้างไฟล์เปล่า/tmp/dummy_fileและตอนนี้คำสั่ง ssh ของฉันมีลักษณะดังนี้:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

มันใช้งานได้แล้ว! แต่วิธีนี้ดูเหมือนจะน่าเกลียดนิดหน่อยบวกกับฉันไม่เข้าใจเหตุผลที่แท้จริงของพฤติกรรมนั้น บังเอิญฉันพยายามโทรbashแทนtail -f( bashดูเหมือนว่าฉันจะสั่ง "ไม่รู้จักจบ" ด้วย) แต่มันก็ใช้ไม่ได้

ดังนั้นใครก็ได้โปรดอธิบายพฤติกรรมนี้และวิธีที่ถูกต้องในการสร้างการเชื่อมต่อ ssh พื้นหลังเพื่อให้อุโมงค์ย้อนกลับ ssh ขึ้นได้อย่างไร


สิ่งที่เกี่ยวกับการใช้&ที่ส่วนท้ายของคำสั่ง ssh ของคุณ:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

แต่แล้วwhileลูปของฉันก็จะทำงานซ้ำแล้วซ้ำอีกเริ่มsshการเชื่อมต่อพื้นหลังใหม่ทุก 5 วินาทีใช่ไหม นี่ไม่ใช่สิ่งที่ฉันต้องการ
Dmitry Frank

คำตอบ:


37

ดูเหมือนคุณต้องการให้-Nตัวเลือก ssh

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

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

ตัวอย่างเช่นหากคุณอยู่บน Ubuntu คุณสามารถค้นหาเว็บautossh upstartเพื่อค้นหาตัวอย่างที่มีประโยชน์เกี่ยวกับวิธีกำหนดค่า Ubuntu เพื่อให้อุโมงค์ถูกรักษาไว้อย่างต่อเนื่อง

ฉันใช้สิ่งนี้เพื่อให้การเชื่อมต่อแบบช่องสัญญาณเปิดให้เซิร์ฟเวอร์ของฉันตลอดเวลาสำหรับบริการบางอย่าง


ฉันลองautosshแล้วฉันอ่านบทความนี้แล้ว: goo.gl/jVuuSRแต่ใช้งานได้สำหรับฉันถ้าฉันมีการเชื่อมต่ออินเทอร์เน็ตทันทีที่บูตเครื่อง แต่ถ้าการเชื่อมต่อถูกสร้างขึ้นในภายหลังมันไม่ทำงาน ไม่แน่ใจฉันอาจจะทำสิ่งผิดพลาด แต่แม้ในผู้เขียนบทความนี้จะมีsleep 10ในของเขา/etc/rc.localเพื่อให้แน่ใจว่าการเชื่อมต่ออินเทอร์เน็ตพร้อมอยู่แล้วเมื่อมีการเรียกใช้การสอบถามอัตโนมัติ
Dmitry Frank

2
@DmitryFrank: ชนิดของความไม่ยุติธรรมที่จะไม่พูดถึงในคำถามของคุณถ้าคุณได้ลอง ฉันยังคงแนะนำ ด้วยupstartและการแทนที่ init อื่น ๆ คุณสามารถผูกจุดเริ่มต้นของ tunnel กับอุปกรณ์เครือข่ายตั้งแต่หนึ่งตัวขึ้นไป โซลูชั่นที่ดีที่สุด (IMO) บนเว็บคืออันนี้: erik.torgesta.com/tag/ssh-upstart ... และsleep 10ไม่ช่วยอะไรเลยในบางกรณี
0xC0000022L

ฉันขอโทษที่ไม่ได้พูดถึงว่าจะซื่อสัตย์เมื่อมันไม่ได้ผลสำหรับฉันฉันตัดสินใจที่จะทำเช่นนั้นเพียง "ด้วยมือ" และลืมเกี่ยวกับการรอคอยอย่างสมบูรณ์ ขอบคุณสำหรับssh-upstartฉันจะดูมัน!
Dmitry Frank

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

@DeveloperChris: อืมฉันใช้สถานการณ์นี้อย่างแน่นอน - และเชื่อถือได้ ยกเว้นว่าเซิร์ฟเวอร์ระยะไกลปิดตัวลงอย่างแท้จริงและคุณต้องเปิดใช้งานอีกครั้งอุโมงค์จะถูกสร้างขึ้นใหม่เสมอ บางทีคุณควรเขียนคำถามของคุณเองและให้รายละเอียด แน่นอนว่าสิ่งนี้สามารถทำได้ ฉันใช้มันเพื่อแก้ไขปัญหา VPN เป็นเวลาหลายเดือน
0xC0000022L

9

ฉันจะแนะนำ@ 0xC0000022Lที่สองและใช้autosshเช่นกัน ฉันใช้มันเพื่อรักษาการเชื่อมต่อ SSH จากแล็ปท็อปของฉันในขณะที่ฉันนำติดตัวไปทุกที่และใช้งานได้ ฉันใช้การเชื่อมต่อนี้กับช่องสัญญาณด้านหลังพอร์ต 25 และ 2143 สำหรับเข้าถึงเซิร์ฟเวอร์ SMTP และ IMAP ส่วนตัวของฉัน

นี่คือสคริปต์ที่ฉันใช้:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

จากนั้นผมก็รักษาHostรายการในของฉันไฟล์สำหรับโฮสต์$HOME/.ssh/configimap-o

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

autossh_mail.shสคริปต์จะดำเนินการเป็นส่วนหนึ่งของสก์ท็อปของฉันเมื่อฉันเข้าสู่ระบบ. gnome-session-propertiesคุณสามารถเข้าถึงได้ผ่านทาง

       เอสเอส # 1

                                          เอสเอส # 2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.