Làm thế nào để đảo ngược SSH đường hầm hoạt động?


350

Theo tôi hiểu điều này, tường lửa (giả sử cài đặt mặc định) từ chối tất cả lưu lượng truy cập đến không có lưu lượng đi tương ứng trước đó.

Dựa trên việc đảo ngược kết nối sshSSH Tunneling Made Easy , đường hầm SSH ngược có thể được sử dụng để khắc phục các hạn chế tường lửa phiền phức.

Tôi muốn thực hiện các lệnh shell trên một máy từ xa. Máy từ xa có tường lửa riêng và đứng sau một tường lửa (bộ định tuyến) bổ sung. Nó có một địa chỉ IP như 192.168.1.126 (hoặc một cái gì đó tương tự). Tôi không đứng sau tường lửa và tôi biết địa chỉ IP của máy từ xa được nhìn thấy từ Internet (không phải địa chỉ 192.168.1.126). Ngoài ra, tôi có thể yêu cầu một ai đó để thực hiện ssh (something)như là người chủ trên máy từ xa đầu tiên.

Ai đó có thể giải thích cho tôi, từng bước một, cách hoạt động của đường hầm SSH ngược để đi xung quanh tường lửa (tường lửa của máy cục bộ và từ xa và tường lửa bổ sung giữa chúng) không?

Vai trò của thiết bị chuyển mạch (là gì -R, -f, -L, -N)?


Câu trả lời:


402

Tôi thích giải thích loại điều này thông qua hình dung. :-)

Hãy nghĩ về các kết nối SSH của bạn như các ống. Ống lớn. Thông thường, bạn sẽ với tay qua các ống này để chạy vỏ trên máy tính từ xa. Shell chạy trong một thiết bị đầu cuối ảo (tty). Nhưng bạn đã biết phần này rồi.

Hãy nghĩ về đường hầm của bạn như một ống trong một ống. Bạn vẫn có kết nối SSH lớn, nhưng tùy chọn -L hoặc -R cho phép bạn thiết lập một ống nhỏ hơn bên trong nó.

Mỗi ống có một khởi đầu và kết thúc. Ống lớn, kết nối SSH của bạn, bắt đầu với máy khách SSH của bạn và kết thúc tại máy chủ SSH mà bạn đã kết nối. Tất cả các ống nhỏ hơn có cùng một điểm cuối, ngoại trừ vai trò của "bắt đầu" hoặc "kết thúc" được xác định bởi việc bạn đã sử dụng -Lhoặc -R(tương ứng) để tạo ra chúng.

(Bạn chưa nói, nhưng tôi sẽ giả sử rằng máy "từ xa" mà bạn đã đề cập, máy đứng sau tường lửa, có thể truy cập Internet bằng Dịch thuật Địa chỉ Mạng (NAT). Đây là loại quan trọng, vì vậy vui lòng sửa lại giả định này nếu nó sai.)

Khi bạn tạo một đường hầm, bạn chỉ định một địa chỉ và cổng mà nó sẽ trả lời, và một địa chỉ và cổng mà nó sẽ được gửi đến. Các -Ltùy chọn cho đường hầm để trả lời ở phía địa phương của đường hầm (máy chủ chạy khách hàng của bạn). Các -Rtùy chọn cho đường hầm để trả lời ở phía xa (máy chủ SSH).

hướng đường hầm ssh

Vì vậy, ... Để có thể SSH từ Internet vào một máy phía sau tường lửa, bạn cần có máy được đề cập để mở kết nối SSH với thế giới bên ngoài và bao gồm một -Rđường hầm có điểm "nhập" là phía "từ xa" của kết nối của mình.

Trong hai mô hình được hiển thị ở trên, bạn muốn cái ở bên phải.

Từ máy chủ được tường lửa:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Điều này nói với khách hàng của bạn để thiết lập một đường hầm với một -Rđiểm nhập emote. Bất cứ thứ gì gắn vào cổng 22222 ở phía xa của đường hầm sẽ thực sự đạt đến "localhost port 22", trong đó "localhost" là từ góc độ của điểm thoát của đường hầm (tức là máy khách ssh của bạn).

Các tùy chọn khác là:

  • -f nói với ssh để nền chính nó sau khi nó xác thực, vì vậy bạn không phải ngồi chạy một cái gì đó trên máy chủ từ xa để đường hầm vẫn còn sống.
  • -Nnói rằng bạn muốn có kết nối SSH, nhưng thực tế bạn không muốn chạy bất kỳ lệnh từ xa nào. Nếu tất cả những gì bạn đang tạo là một đường hầm, thì bao gồm tùy chọn này sẽ tiết kiệm tài nguyên.
  • -T vô hiệu hóa phân bổ giả, phù hợp vì bạn không cố tạo vỏ tương tác.

Sẽ có một thách thức về mật khẩu trừ khi bạn đã thiết lập khóa DSA hoặc RSA để đăng nhập không cần mật khẩu.

Lưu ý rằng chúng tôi khuyên bạn nên sử dụng tài khoản vứt đi (không phải thông tin đăng nhập của riêng bạn) mà bạn đã thiết lập cho đường hầm / khách hàng / máy chủ này.

Bây giờ, từ shell của bạn trên yourpublichost , hãy thiết lập kết nối đến máy chủ được tường lửa thông qua đường hầm:

ssh -p 22222 username@localhost

Bạn sẽ nhận được một thử thách chính về máy chủ, vì có lẽ bạn chưa bao giờ đánh máy chủ này trước đây. Sau đó, bạn sẽ nhận được một thử thách mật khẩu cho usernametài khoản (trừ khi bạn đã thiết lập khóa để đăng nhập không cần mật khẩu).

Nếu bạn thường xuyên truy cập máy chủ này, bạn cũng có thể đơn giản hóa việc truy cập bằng cách thêm một vài dòng vào ~/.ssh/configtệp của mình :

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Điều chỉnh remotehostnameremoteusernamecho phù hợp. Các remoteusernametrường phải phù hợp với tên người dùng trên máy chủ từ xa, nhưng remotehostnamecó thể là bất kỳ tên máy phù hợp với bạn, nó không nhất thiết phải phù hợp với bất cứ điều gì được giải quyết.

(Để hiển thị điểm cuối đảo ngược trên IP không phải localhost , hãy xem bài đăng này )


2
còn ssh -D. Hãy giải thích bằng cách sử dụng cùng một phương pháp.
BigSack

6
Proxy SOCKS không giống như đường hầm. Nếu bạn có một câu hỏi về cách sử dụng chúng, xin vui lòng hỏi nó .
ghoti

12
Tôi đang có một thời gian rất khó khăn để làm theo lời giải thích này do việc sử dụng các thuật ngữ lỏng lẻo: máy chủ, máy khách, máy cục bộ, máy từ xa, máy chủ, yourpublichost, localhost, remotehostname. Với tất cả các thuật ngữ lỏng lẻo và không xác định này, có thể giả định rằng ai đó sẽ cần tới 8 máy tính để thiết lập điều này. Tôi nói điều này bởi vì trong tất cả các khía cạnh khác, nó có vẻ là một lời giải thích rất tốt. Vui lòng giảm và xác định các điều khoản.
Rucent88

4
@ Rucent88, tôi không chắc có thể giảm được. Một khách hàng thiết lập kết nối đến một máy chủ. Đó là thuật ngữ phổ biến trên toàn thế giới của mạng. Máy móc địa phương và từ xa có vẻ khá rõ ràng. Nếu bạn bối rối về SSH hoặc thuật ngữ unix chung sau khi đọc tài liệu, tôi chắc chắn bạn sẽ không gặp khó khăn gì khi tìm người ở đây rất sẵn lòng trả lời bất kỳ câu hỏi nào bạn có thể có.
ghoti

9
@ghoti Thật sự khó hiểu, bởi vì các máy cục bộ và từ xa là tương đối. Khi tôi ngồi ở nơi làm việc, máy tính ở nhà của tôi là điều khiển từ xa, khi tôi ngồi ở nhà, máy tính ở nơi làm việc là điều khiển từ xa. Máy chủ và máy khách cũng khó hiểu khi nói về đường hầm. Ví dụ: Nếu tôi kết nối đến nhà từ cơ quan với ssh -R. Tôi kết nối với công việc của tôi từ máy tính ở nhà bằng cách kết nối localhost. Vì vậy, từ quan điểm ổ cắm, máy chủ là máy tính ở nhà. Nhưng theo logic tôi đã kết nối với máy tính làm việc của tôi. Điều đó thật khó hiểu.
Calmarius

357

Tôi đã vẽ một số bản phác thảo

Máy, nơi lệnh ssh đường hầm được gõ được gọi là »máy chủ của bạn« .

đường hầm ssh bắt đầu từ địa phương


đường hầm ssh bắt đầu từ xa

Giới thiệu

  1. địa phương: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHostcó nghĩa là: kết nối với ssh đến connectToHostvà chuyển tiếp tất cả các nỗ lực kết nối đến cổng cục bộ trên máy được gọi , có thể đạt được từ máy.sourcePortonPortforwardToHostconnectToHost

  2. xa: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHostcó nghĩa là: kết nối với ssh đến connectToHostvà chuyển tiếp tất cả các nỗ lực kết nối đến điều khiển từ xa sourcePort đến cổng onPorttrên máy được gọi forwardToHost, có thể đạt được từ máy cục bộ của bạn.

Tùy chọn bổ sung

  • -f nói với ssh để nền chính nó sau khi nó xác thực, vì vậy bạn không phải ngồi chạy một cái gì đó trên máy chủ từ xa để đường hầm vẫn còn sống.
  • -Nnói rằng bạn muốn có kết nối SSH, nhưng thực tế bạn không muốn chạy bất kỳ lệnh từ xa nào. Nếu tất cả những gì bạn đang tạo là một đường hầm, thì bao gồm tùy chọn này sẽ tiết kiệm tài nguyên.
  • -T vô hiệu hóa phân bổ giả, phù hợp vì bạn không cố tạo vỏ tương tác.

Ví dụ của bạn

Hình ảnh thứ ba đại diện cho đường hầm này. Nhưng máy tính màu xanh có tên »máy chủ của bạn« đại diện cho máy tính nơi ai đó khởi động đường hầm ssh, trong trường hợp này là máy được tường lửa.

Vì vậy, hãy nhờ ai đó bắt đầu kết nối đường hầm ssh với máy của bạn. Lệnh về cơ bản sẽ trông giống như

ssh -R 12345:localhost:22 YOURIP

Bây giờ đường hầm được mở. Bây giờ bạn có thể kết nối qua ssh với máy được tường lửa thông qua đường hầm bằng lệnh

ssh -p 12345 localhost

sẽ kết nối với localhostcổng của bạn (máy của bạn) trên cổng 12345, nhưng cổng 12345được chuyển tiếp qua đường hầm đến cổng 22 của localhost của máy tính được tường lửa (tức là chính máy tính được tường lửa).


9
Câu trả lời chính xác! Sẽ được sử dụng này trong một bài thuyết trình.
Ê-sai Turner

4
Cảm ơn bạn. Không có gì. Nếu bạn muốn hình ảnh vector (svg hoặc pdf) viết cho tôi một tin nhắn.
erik

1
@erik, bạn đã vẽ những hình ảnh này như thế nào?
Pacerier

31
oh, tôi muốn các trang người đàn ông có thể có lời giải thích như thế này! cảm ơn!
Lucas Pottersky

30
Bạn biết gì ? Tôi thậm chí không phải đọc lời giải thích văn bản. Công việc tuyệt vời
deppfx

21

ssh đường hầm hoạt động bằng cách sử dụng kết nối ssh đã được thiết lập để gửi lưu lượng bổ sung.

Khi bạn kết nối với một máy chủ từ xa, bạn thường chỉ có 1 kênh cho tương tác người dùng thông thường (hoặc 3 kênh nếu bạn xem xét riêng STDIN / STDOUT / STDERR). Bất cứ lúc nào, quá trình ssh cục bộ hoặc từ xa có thể mở các kênh bổ sung trên kết nối hiện có. Các kênh này sau đó gửi / nhận lưu lượng đường hầm. Khi gửi hoặc nhận bất kỳ lưu lượng truy cập nào, quy trình ssh chỉ cần nói "lưu lượng này dành cho kênh foobar".

Về cơ bản nó hoạt động như thế này:

  1. Bạn nói với ssh để bắt đầu nghe trên cổng XXXX và rằng bất kỳ lưu lượng truy cập nào nhận được sẽ được tạo đường hầm, sau đó được đặt thành YYYY trên cổng ZZZZ.
  2. Ssh cục bộ bắt đầu nghe trên cổng XXXX (thường là trên 127.0.0.1, nhưng có thể thay đổi).
  3. Một số ứng dụng mở kết nối tới cổng XXXX trên máy cục bộ.
  4. Ssh cục bộ mở một kênh đến ssh từ xa và nói "mọi lưu lượng truy cập trên kênh này sẽ đến YYYY: ZZZZ
  5. Ssh từ xa kết nối với YYYY: ZZZZ và gửi lại "OK, kênh đang mở"
  6. Bây giờ, bất kỳ lưu lượng nào được gửi dọc theo kết nối tới cổng XXXX trên máy cục bộ đều được ủy quyền bởi ssh tới YYYY: ZZZZ.

Quá trình này hoàn toàn giống nhau cho cả đường hầm thuận và ngược (chỉ cần hoán đổi các từ 'cục bộ' và 'từ xa' trong quy trình trên). Một trong hai bên có thể bắt đầu đường hầm. Nó thậm chí không phải là khi bạn bắt đầu ssh. Bạn có thể mở các đường hầm trong khi ssh đang chạy (xem ESCAPE CHARACTERS, cụ thể ~C).

Với vai diễn -R, -f, -L, và -N, bạn thực sự chỉ nên tham khảo man page, nó mang lại cho bạn những lời giải thích tốt nhất có thể. Nhưng tôi sẽ đề cập đến -R-L.
-Rnói với ssh từ xa lắng nghe các kết nối và ssh cục bộ sẽ kết nối với đích thực. -Lnói với ssh cục bộ lắng nghe các kết nối và ssh từ xa sẽ kết nối với đích thực.

Lưu ý, đây là một mô tả rất thô thiển, nhưng nó sẽ cung cấp cho bạn đủ thông tin để biết chuyện gì đang xảy ra


16

Điều này được giải thích trong hướng dẫn SSH, đặc biệt là sự khác biệt giữa -L(cục bộ) và -R(từ xa).


-L

-L [bind_address:]port:host:hostport

Chỉ định rằng cổng đã cho trên máy chủ cục bộ (máy khách) sẽ được chuyển tiếp đến máy chủ và cổng đã cho ở phía xa .

Điều này hoạt động bằng cách phân bổ một ổ cắm để nghe cổng ở phía cục bộ, tùy chọn ràng buộc với bind_address được chỉ định.

Bất cứ khi nào kết nối được thực hiện với cổng này, kết nối sẽ được chuyển tiếp qua kênh bảo mật và kết nối được thực hiện với hostcổng hostporttừ máy từ xa .

Ví dụ sau đây đào một phiên IRC từ máy khách 127.0.0.1( localhost) bằng cổng 1234 đến máy chủ từ xa server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Lưu ý: Hình -fnền tùy chọn ssh và lệnh từ xa sleep 10được chỉ định để cho phép một lượng thời gian để bắt đầu dịch vụ được điều chỉnh.

Thí dụ:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N Sau khi bạn kết nối, chỉ cần treo ở đó (bạn sẽ không nhận được dấu nhắc shell)

    Không thực hiện một lệnh từ xa.

  • -L 22000Kết nối sẽ bắt nguồn từ cổng 22000 của máy cá nhân, L ocal của bạn

  • localhost:11000- remote.server.comsẽ đảm bảo rằng đầu kia của đường hầm là localhost, cổng11000

ssh -N -L 22000: 192.168.1.2: 11000 remote.server.com

Nguồn: Một hướng dẫn minh họa, hướng dẫn, cách làm, trên đường hầm ssh .


-R

-R [bind_address:]port:host:hostport

Chỉ định rằng cổng đã cho trên máy chủ (máy chủ) từ xa sẽ được chuyển tiếp đến máy chủ và cổng đã cho ở phía cục bộ .

Điều này hoạt động bằng cách phân bổ một ổ cắm để nghe portở phía xa và bất cứ khi nào kết nối được thực hiện với cổng này, kết nối được chuyển tiếp qua kênh bảo mật và kết nối được thực hiện với hostcổng hostporttừ máy cục bộ .

Thí dụ:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N Sau khi bạn kết nối, chỉ cần treo ở đó (bạn sẽ không nhận được dấu nhắc shell)

    Không thực hiện một lệnh từ xa.

  • -R22000 Kết nối sẽ bắt nguồn từ cổng 22000 của máy tính emote R (trong trường hợp này là remote.server.com)

  • localhost:11000máy tính cá nhân, cục bộ của bạn sẽ đảm bảo rằng đầu kia của đường hầm là localhostcổng11000

ssh -N -R 22000: localhost: 11000 remote.server.com

Nguồn: Một hướng dẫn minh họa, hướng dẫn, cách làm, trên đường hầm ssh .


6
tai và miệng làm cho rõ ràng người đang nói và người đang lắng nghe!
Thufir

1
Tôi thích minh họa của bạn!
mcantsin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.