ฉันจะขุดอุโมงค์การรับส่งข้อมูลเครือข่ายทั้งหมดผ่าน SSH ได้อย่างไร


117

เมื่อใดก็ตามที่ฉันใช้อินเทอร์เน็ตจากสถานที่ที่ไม่ปลอดภัย (เช่น wifi สาธารณะ) ฉันชอบใช้อุโมงค์ ssh ( ssh -D port host) เพื่อให้แน่ใจว่าการจราจรของฉันไม่สามารถดมกลิ่นได้ น่าเสียดายที่ดูเหมือนจะมีแอปพลิเคชั่นมากมายที่ไม่ได้ให้วิธีการระบุพร็อกซี (Flash เป็นหนึ่งในตัวอย่างหลัก)

รู้สึกเหมือนมีวิธีใช้อุโมงค์สำหรับการรับส่งข้อมูลเครือข่ายทั้งหมดจากคอมพิวเตอร์ของฉัน แต่ฉันไม่รู้วิธีการทำเช่นนี้ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.


16
แน่นอนว่าคุณไม่สามารถเจาะอุโมงค์ปริมาณการใช้ข้อมูลทั้งหมดของคุณผ่าน ssh ได้อย่างแท้จริงเพราะนั่นหมายถึงการขุดอุโมงค์ด้วยตัวเอง แต่เรารู้ว่าคุณหมายถึงอะไร :)
CarlF

1
นี่เป็นความคิดที่ดี แต่คุณได้รับการปกป้องระหว่างคอมพิวเตอร์และจุดสิ้นสุด ssh ของคุณเท่านั้น หลังจากนั้นปริมาณการใช้งานของคุณจะชัดเจน (เว้นแต่จะได้รับการป้องกันเป็นอย่างอื่นเช่น SSL) ได้รับมีแนวโน้มที่จะเป็นสายมากกว่า แต่ยัง ... คุณไม่สามารถเชื่อถือสายจริง ๆ ที่คุณไม่ได้ควบคุม
ต้มตุ๋น Quixote

6
แต่เมื่อคุณออกจากอินเทอร์เน็ตกว้างคุณมีความปลอดภัยในการเป็นเพียงหนึ่งในพันของแพ็คเก็ตใช่มั้ย เมื่อคุณเชื่อมต่อกับ Wi-Fi สาธารณะคุณอาจเป็นหนึ่งในสามคนที่เชื่อมต่อกับเครือข่ายคุณสามารถระบุตัวบุคคลได้ ฯลฯ
endolith

คำตอบ:


62

ทำในสิ่งที่คุณต้องการผมขอแนะนำให้sshuttle

คุณใช้มันแบบนี้:

./sshuttle -r username@sshserver 0.0.0.0/0 -vv

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

หากคุณต้องการโปรแกรมเฉพาะอุโมงค์ฉันจะแนะนำproxychains

เมื่อติดตั้งแล้วให้เริ่มต้นพร็อกซี ssh socks ของคุณเช่นนี้:

ssh -fND 127.0.0.1:<local port> username@sshserver

สิ่งนี้จะเริ่มต้นพร็อกซี "SOCKS" การฟังบน <โลคัลพอร์ต>

จากนั้นแก้ไข /etc/proxychains.conf ให้ชี้ไปที่พอร์ตเดียวกันกับ <local port>

สุดท้ายเริ่มโปรแกรมของคุณที่คุณต้องการ proxy-ed ดังนี้:

proxychains <program name>

มันควรจะทำงาน อย่างไรก็ตามบางโปรแกรมจะมีปัญหาในการทำงานกับ Proxy Chains โปรดจำไว้ว่าด้วย Firefox คุณต้องเปลี่ยนรายการเพิ่มเติมภายใต้ about: config เพื่อบังคับให้ทำการค้นหา DNS ผ่านพร็อกซีแทนที่จะข้ามไป

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

แก้ไข 3/29/16

เนื่องจากโพสต์นี้ยังเห็น upvotes อยู่ฉันคิดว่าฉันจะอัปเดต Proxychains ยังคงอยู่ใน repos Linux ส่วนใหญ่และยังคงทำงานบน Linux อย่างไรก็ตามโครงการถูกยกเลิกอย่างมีประสิทธิภาพและไม่ทำงานบน OSX สำหรับ Linux หรือ OSX ฉันขอแนะนำให้อัพเกรดเป็นทางแยกที่ยังคงได้รับการดูแล: proxychains-ng: https://github.com/rofl0r/proxychains-ng

นอกเหนือจากการทำงานในทั้ง Linux และ OSX มันเป็นเรื่องง่ายที่จะรวบรวมและยังรองรับ DNS tunneling ได้ดีกว่ามาก

ฉันควรพูดถึงตัวเลือกอื่นซึ่งก็คือ redsocks มันทำงานคล้ายกับ proxychains (-ng) และยังเป็นไปได้ใน repo ของคุณ: https://github.com/darkk/redsocks


หมายเหตุสำหรับระบบ Linux รุ่นใหม่ที่ใช้ sshuttle: ในขณะที่เขียนมีข้อผิดพลาดเคอร์เนลที่จะทำให้คุณเสียท่อ ในกรณีนี้ให้ใช้:sshuttle -r root@host -x host 0/0
รวม

49

man sshให้ตัวอย่างของสิ่งนี้ VPN ตาม ssh:

SSH-BASED VIRTUAL PRIVATE NETWORKS
     ssh contains support for Virtual Private Network (VPN) tunnelling using
     the tun(4) network pseudo-device, allowing two networks to be joined
     securely.  The sshd_config(5) configuration option PermitTunnel controls
     whether the server supports this, and at what level (layer 2 or 3 traf-
     fic).

     The following example would connect client network 10.0.50.0/24 with
     remote network 10.0.99.0/24, provided that the SSH server running on the
     gateway to the remote network, at 192.168.1.15, allows it:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252

~~ snip ~~

     Since a SSH-based setup entails a fair amount of overhead, it may be more
     suited to temporary setups, such as for wireless VPNs.  More permanent
     VPNs are better provided by tools such as ipsecctl(8) and isakmpd(8).

เมื่อคุณมีอินเทอร์เฟซใหม่นั้นแล้วคุณจะต้องทำให้มันเป็นเส้นทางเริ่มต้นซึ่งเป็นคำถามที่แตกต่าง


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

6

ค้นหาตัวเลือก "อุโมงค์" ใน ssh สิ่งนี้จะสร้างอุปกรณ์ช่องสัญญาณที่คุณสามารถกำหนดที่อยู่ IP ให้จากนั้นคุณเปลี่ยนเส้นทางเริ่มต้นเพื่อใช้ช่องสัญญาณนั้น


4

ฉันได้พัฒนาซอฟต์แวร์ที่ช่วยให้คุณสามารถส่งต่อ TCP ทั้งหมดและเลือก UDP ผ่านพร็อกซี SOCKS5 ทั่วทั้งระบบ

http://code.google.com/p/badvpn/wiki/tun2socks

มันยังสามารถติดตั้งบนเราเตอร์เพื่อส่งต่อการเชื่อมต่อทั้งหมดจากคอมพิวเตอร์บน LAN


0

SSH-VED VIRTUAL PRIVATE NETWORKS ssh มีการสนับสนุนสำหรับการอุโมงค์เสมือนเครือข่ายส่วนตัว (VPN) โดยใช้อุปกรณ์หลอกเครือข่าย tun (4) ช่วยให้สองเครือข่ายเข้าร่วมอย่างปลอดภัย ตัวเลือกการกำหนดค่า sshd_config (5) PermitTunnel ควบคุมว่าเซิร์ฟเวอร์รองรับสิ่งนี้หรือไม่และอยู่ที่ระดับใด (การจราจรเลเยอร์ 2 หรือ 3)

 The following example would connect client network 10.0.50.0/24 with
 remote network 10.0.99.0/24 using a point-to-point connection from
 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway
 to the remote network, at 192.168.1.15, allows it.

 On the client:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252
       # route add 10.0.99.0/24 10.1.1.2

 On the server:

       # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252
       # route add 10.0.50.0/24 10.1.1.1

 Client access may be more finely tuned via the /root/.ssh/authorized_keys
 file (see below) and the PermitRootLogin server option.  The following
 entry would permit connections on tun(4) device 1 from user “jane” and on
 tun device 2 from user “john”, if PermitRootLogin is set to
 “forced-commands-only”:

   tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane
   tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

 Since an SSH-based setup entails a fair amount of overhead, it may be
 more suited to temporary setups, such as for wireless VPNs.  More perma‐
 nent VPNs are better provided by tools such as ipsecctl(8) and
 isakmpd(8).

1
โปรดเพิ่มแหล่งที่มาสำหรับข้อมูลของคุณ หมายเหตุ: นี่เป็นคำถามเก่า
Lorenzo Von Matterhorn

-2

แค่อยากจะเคลียร์ว่า (ssh -D พอร์ตโฮสต์) ไม่ใช่วิธีที่ปลอดภัย 100% สำหรับทราฟฟิกที่จะไม่ถูกสูดดม การเพิ่ม (ssh -D -c โฮสต์ของพอร์ตปักเป้า) จะเป็นทางเลือกที่ดีกว่าเพราะคุณเพิ่มการเข้ารหัสในเซสชันของคุณ มีตัวเลือกเพิ่มเติมที่คุณสามารถเพิ่มได้ แต่มันง่ายพอที่จะพิมพ์ "man ssh" ในเทอร์มินัลของคุณหรือ Google สำหรับรายชื่อที่สมบูรณ์

ตัวเลือกที่ฉันคิดว่าคุณกำลังมองหาคือการตั้งค่า VPN (เครือข่ายส่วนตัวเสมือน)

ดูบทความนี้เพื่อทำความเข้าใจความแตกต่างระหว่างสอง ( SSH กับ VPN ) หรือรุ่นสรุปที่ดีก่อนที่คุณจะเล่นงานตั้งค่า VPN ของคุณเอง หากคุณตัดสินใจที่จะใช้เส้นทาง VPN ฉันแนะนำOpenVPNเอกสารและการสนับสนุนฟรีมากมาย


6
คำแนะนำที่ไม่ดี "blowfish" เป็นรหัส SSH-1 มันเร็วคิดว่าปลอดภัย (ตั้งแต่ปี 1999: unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 ) แต่ก็ยัง คุณอาจต้องการssh -2 -C -D [...](SSH2 แรงอัดใช้งาน) -cและวาง ตามระบบของฉันman sshรายการตัวเลขใน SSH2 aes128-cbc,3des-cbc,blowfish-cbc,[etc]ค่าเริ่มต้น ประเด็นของฉันคือถ้าคุณขอให้-c blowfishคุณอาจท้ายด้วย SSH1 ซึ่งมีความปลอดภัยน้อยกว่า SSH2
ต้มตุ๋น Quixote

2
จริง แต่ Jeremy อยู่ภายใต้ความประทับใจว่าการเชื่อมต่อนั้นปลอดภัยด้วย -D 8080 ฉันแค่บอกว่ามันดีกว่าสิ่งที่เขาใช้ คุณสร้างจุดที่ถูกต้องและนั่นคือเหตุผลที่ฉันพูดถึงคู่มือสำหรับตัวเลือกเพิ่มเติม
ricbax

บางทีคุณควรเปลี่ยนคำตอบของคุณเนื่องจากเป็นประโยชน์
endolith

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

9
WTF ไม่ใช่ SSH โดยใช้การเข้ารหัสตามค่าเริ่มต้นหรือไม่
LatinSuD

-3

ใช้ตัวอย่างเหล่านี้:

  • ส่งต่อพอร์ต 80 จากรีโมตโฮสต์ไปยัง 8888 บนโลคัลโฮสต์ของคุณ

    ssh -fnN -L8888: localhost: 80 user @ เซิร์ฟเวอร์

    ใช้สิ่งนี้เพื่อเข้าถึงบริการบนโฮสต์ระยะไกลที่มีให้บริการที่นั่นเท่านั้น

  • ส่งต่อพอร์ต 80 จาก yourlocalhost ไปที่ 8888 บนรีโมตโฮสต์

    ssh -fnN -R8888: localhost: 80 user @ เซิร์ฟเวอร์

    ใช้สิ่งนี้เพื่อให้ผู้ใช้สามารถเข้าถึงบริการของคุณ: เว็บเซิร์ฟเวอร์หรืออะไรก็ตาม

ไชโย! :)


ความคิดเห็นดี แต่ไม่เกี่ยวข้องกับสิ่งที่เรากำลังพูดถึงที่นี่ Reverse ssh อนุญาตให้ SERVER ร้องขอให้เส้นทางของลูกค้าหนึ่งพอร์ตของทราฟฟิกนั้น จำเป็นต้องกำหนดค่าเพิ่มเติมเพื่อกำหนดเส้นทางการรับส่งข้อมูลไปยังอินเทอร์เน็ต คุณจะต้องตั้งค่าอุโมงค์ SSH สำหรับแต่ละพอร์ต และจะต้องมีการเริ่มต้นจากเซิร์ฟเวอร์ไม่ใช่ไคลเอนต์ - ซึ่งทำไมคุณจะทำเช่นนั้นจนกว่าคุณจะต้อง?
Beachhouse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.