ฉันจะรู้ได้อย่างไรว่าอุโมงค์ ssh ของฉันสร้างเสร็จเรียบร้อยแล้ว?


21

ฉันพึ่งพาสคริปต์ต่อไปนี้ที่tunnel.shเขียนโดยผู้อื่นเพื่อให้อุโมงค์ ssh ยังมีชีวิตอยู่:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

เพื่อสร้างอุโมงค์ SSH tunnel.shถาวรฉันเพียงแค่ออก อุโมงค์จะไม่ถูกปิดจนกว่าฉันจะออกtunnel.shอีกครั้ง

ฉันสงสัยว่าฉันจะตรวจสอบได้อย่างไรว่าอุโมงค์ ssh นั้นสร้างเสร็จเรียบร้อยหรือไม่?

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

ฉันคิดว่าเนื่องจากตอนนี้ฉันอยู่ใน LAN ต้องขอบคุณช่องสัญญาณ IP ภายนอกของฉันควรเหมือนกับของเซิร์ฟเวอร์ แต่ที่จริงแล้วพวกเขาไม่เหมือนกัน (ฉันพบพวกเขาโดยwget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//') ฉันสงสัยว่าทำไม? เมื่อฉันเชื่อมต่อกับเว็บไซต์บางแห่งบนอินเทอร์เน็ตที่มีอุโมงค์อยู่เซิร์ฟเวอร์ไม่ได้เป็นจุดกึ่งกลางระหว่างฉันและเว็บไซต์อินเทอร์เน็ตในการเชื่อมต่อเนื่องจากอุโมงค์ระหว่างฉันและเซิร์ฟเวอร์

คำตอบ:


25

มันซับซ้อนกว่าที่คิด :-)

เริ่มอุโมงค์:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

หยุดอุโมงค์:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

.

นั่นคือทั้งหมดที่คุณต้องทำ หากคุณต้องการรายละเอียดข้ามไปด้านล่าง

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

คำอธิบาย SSH
เกิดจากการเริ่มต้นอุโมงค์
-f:: บอก ssh ให้พื้นหลังตัวเอง มันจะพื้นหลังตัวเองหากมันเริ่มต้นขึ้นเรียบร้อยแล้ว (ร่วมมือกับ-oอาร์กิวเมนต์ด้านล่าง)
-o ExitOnForwardFailure=yes: สิ่งนี้จะบอกให้ ssh ออกหากไม่สามารถตั้งค่าพร็อกซี SOCKS ได้
-N: อย่าเรียกใช้คำสั่ง เราแค่ต้องการทำทันเนลไม่ทำอะไรกับรีโมตโฮสต์
-D 9999: SOCKS proxy ของคุณ
-M: สิ่งนี้จำเป็นสำหรับอาร์กิวเมนต์ -S เพื่อทำงานที่นี่
-S /tmp/ssh_tunnel_%h.sock: สิ่งนี้บอกให้ใช้ /tmp/ssh_tunnel_HOSTNAME.sock สำหรับซ็อกเก็ตการควบคุม -Mตัวเลือกที่จะบอกว่าความต้องการ SSH เพื่อตั้งซ็อกเก็ตนี้ขึ้นและไม่ได้ออกคำสั่งไปยัง SSH อีกแล้วฟังบนซ็อกเก็ต คุณสามารถใช้ซ็อกเก็ตนี้เพื่อตั้งค่าอุโมงค์เพิ่มเติมหลังจากที่ ssh ทำงานอยู่แล้ว %h ใช้ชื่อโฮสต์ของโฮสต์ระยะไกลเป็นส่วนหนึ่งของชื่อไฟล์

Args สำหรับการหยุดอุโมงค์
-S /tmp/ssh_tunnel_%h.sock:: นี่ควรจะชัดเจน อย่างไรก็ตามเนื่องจากเราไม่ได้ใช้ -M นั่นหมายความว่า ssh ควรเชื่อมต่อกับซ็อกเก็ตที่มีอยู่แล้วและบอกว่าจะทำอย่างไรแทนที่จะทำอะไรเอง
-O exit: -Sนี่เป็นส่วนหนึ่งของ เราบอกให้ ssh ฟังบนซ็อกเก็ตเพื่อออก ยังคงจำเป็นต้องใช้ที่นี่ แม้ว่าคุณจะต้องระบุพา ธ ซ็อกเก็ตแบบสัมบูรณ์โดยไม่ต้องใช้ในชื่อไฟล์ ssh จะยังคงต้องการระบุโฮสต์ระยะไกล นี่คือเหตุผลที่ฉันใส่ในข้อโต้แย้ง อาจใช้มันเช่นกันหาก ssh กำลังจะขอโฮสต์และมันยังคงจัดระเบียบ
$SSH_HOST%h%h


5

อุโมงค์ประเภทนี้ไม่ได้เปลี่ยนข้อมูลที่อยู่ IP ของคุณ ทั้งหมดก็แค่บอกให้คอมพิวเตอร์ของคุณเปิดพอร์ต 9999 และส่งต่อการเชื่อมต่อไปยังพอร์ตนั้นไปยังเครื่องระยะไกล (เซิร์ฟเวอร์ tim @) ผ่านการเชื่อมต่อ ssh ของคุณ วิธีที่ง่ายที่สุดในการทดสอบว่าการเชื่อมต่อหมดคือ telnet ไปยังพอร์ตที่สร้างไปข้างหน้า (ในตัวอย่าง 9999 ของคุณ):

$ telnet localhost 9999
กำลังลองเซิร์ฟเวอร์ ...
เชื่อมต่อกับเซิร์ฟเวอร์
ตัวละคร Escape คือ '^]'

หากคุณได้รับ "เชื่อมต่อกับเซิร์ฟเวอร์" ข้อความนั่นหมายความว่าอุโมงค์ของคุณทำงานแล้ว หากคุณได้รับ: "ไม่สามารถเชื่อมต่อกับโฮสต์ระยะไกล: การเชื่อมต่อถูกปฏิเสธ" อุโมงค์ของคุณไม่ทำงาน

สำหรับคำถามที่สองสำหรับเบราว์เซอร์เบราว์เซอร์ของคุณจะไม่ใช้อุโมงค์เว้นแต่คุณจะแจ้งให้ทราบ ในการตั้งค่าเครือข่ายของเบราว์เซอร์คุณสามารถกำหนดการตั้งค่าพร็อกซีและระบุ localhost: 9999 เป็นพร็อกซี socks5 จากนั้นการเชื่อมต่อเว็บของคุณควรใช้ ssh tunnel และปรากฏว่ามาจากที่อยู่ IP ของเซิร์ฟเวอร์


+1 ขอบคุณ! (1) เมื่อฉันพิมพ์ไปยังเครื่องพิมพ์ใน LAN จะทราบได้อย่างไรว่าไปที่พอร์ต 9999 เช่นใช้อุโมงค์ ไม่มีอะไรอีกหรือ (2) มีอุโมงค์ประเภทใดบ้างที่เปลี่ยนแปลงข้อมูลที่อยู่ IP ของฉัน
ทิม

@ เป็นไปได้ว่าเครื่องพิมพ์นั้นได้รับการกำหนดค่าให้พิมพ์ไปยังที่อยู่ IP และพอร์ตเฉพาะ ขึ้นอยู่กับการตั้งค่าเครื่องพิมพ์ของคุณ โดยปกติแล้วคุณสามารถระบุทั้งสองอย่างเมื่อคุณกำหนดเครื่องพิมพ์ ใช่มีอุโมงค์หลายประเภทที่จะมีข้อมูล IP ของตัวเองเชื่อมโยงอยู่ โดยทั่วไปสำหรับสิ่งเหล่านี้คุณสร้างแยก / ประปาแยกen.wikipedia.org/wiki/TUN/TAPส่วนต่อประสานซึ่งจะมีที่อยู่ IP ของตัวเองติดอยู่และปริมาณการใช้งานทั้งหมดที่ไปจากที่อยู่นั้นจะมาจากเครือข่ายอื่น .
เกบ

ขอบคุณ! ในการตั้งค่า Firefox ของฉันในขั้นสูง -> การเชื่อมต่อ -> การตั้งค่าฉันเลือกการกำหนดค่าพร็อกซีด้วยตนเองและพิมพ์ "localhost" สำหรับ HTTP Proxy และ "9999" สำหรับพอร์ต หลังจากนั้นฉันไม่สามารถเชื่อมต่อกับเว็บไซต์ใด ๆ ใน Firefox ฉันสงสัยว่าทำไม?
ทิม

@ เวลามันสับสนเล็กน้อย ... สิ่งที่ควรตั้ง: SOCKS Host ไม่ใช่พร็อกซี HTTP ฉันมีปัญหาเดียวกันนี้ในครั้งแรกที่ฉันลอง
เกบ

1

ในกรณีของฉัน (Google Chrome บน Ubuntu 14.10) ที่อยู่ภายนอกของฉันจะเปลี่ยนแปลงอย่างน้อยภายในเบราว์เซอร์ แค่ google "ที่อยู่ IP ของฉันคืออะไร" มีและไม่มีการเชื่อมต่อพร็อกซี

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

อีกวิธีหนึ่งหลังจากการขุดอุโมงค์ไปยังพื้นที่ห่างไกลสร้างเซสชัน SSH tcpdump -A dst port 80ใหม่และการทำงาน จากนั้นเรียกดูบางหน้าและคุณควรเห็นการรับส่งข้อมูลที่เกี่ยวข้องในเทอร์มินัล

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