Cách sử dụng đục lỗ UDP cho đường hầm / phiên SSH


21

Tôi muốn triển khai một Raspberry Pi trong ngôi nhà cuối tuần của tôi. Raspberry Pi có mặt để ghi lại nhiệt độ và gửi chúng đến một máy chủ từ xa có ip cố định, lưu dữ liệu và hiển thị nó trên một trang web đơn giản.

Tuy nhiên, tình huống có thể phát sinh là tôi muốn thay đổi thứ gì đó trên Raspberry Pi. Ví dụ: cập nhật hệ thống hoặc thay đổi chương trình gửi dữ liệu đến máy chủ hoặc bất cứ điều gì.

Với thiết lập được đề xuất, tôi sẽ không thể kết nối với Raspberry Pi từ bên ngoài mạng LAN.

LƯU Ý: Tôi không muốn thay đổi mạng và bộ định tuyến hiện tại không có khả năng chuyển tiếp cổng, dynDNS hoặc VPN.

Gần đây tôi đã đọc về cú đấm lỗ UDP. Ý tưởng cơ bản là, máy khách gửi Gói UDP đến địa chỉ máy chủ đã biết (nghĩa là đã bật IP công khai hoặc dynDNS). Máy khách B muốn kết nối với máy khách A yêu cầu máy chủ cung cấp IP công cộng và số cổng của khách hàng A.

Sau đó, nó có thể kết nối trực tiếp với máy khách A trên IP công cộng và cổng động. Do máy khách A được kết nối lần đầu với máy chủ trên cổng hiện được sử dụng, NAT sẽ chuyển tiếp các gói tới máy khách A.

Tôi hy vọng tôi đã tóm tắt ý tưởng một cách chính xác, ít nhiều

Tất cả điều này nghe có vẻ hay, nhưng vấn đề là, điều này không được cách ly để hoạt động với kết nối TCP, vì bộ định tuyến có thể hiểu được cái bắt tay của kết nối TCP và nếu nó không được xây dựng chính xác, nó sẽ không chuyển tiếp các kiện hàng.

Vậy, làm cách nào tôi có thể mở Phiên SSH từ máy khách B sang máy khách A mà không cần máy khách A ngồi sau bộ định tuyến với dynDNS, IP công cộng sửa chữa hoặc khả năng chuyển tiếp cổng? Việc sử dụng một máy chủ trung tâm với một tên miền công cộng, sửa chữa có thể khó khăn.


Bạn có một thiết bị phải đối mặt với internet có khả năng bấm lỗ UDP nhưng không phải TCP? Nhận một thiết bị NAT tốt hơn.
cpt_fink 4/03/2015

Tôi không thực hiện ssh với udp nhưng đây là một liên kết trên đó zarb.org/~gc/html/udp-in-ssh-tunneling.html
barlop 17/03/2015

Tôi không biết nhưng tôi đã hỏi một ssh guru, họ nói ssh có thể chuyển tiếp udp, nhưng chỉ khi nó hoạt động như một vpn, và có một công tắc cho nó, anh ta nói -wnhưng anh ta nói udp qua tcp (có lẽ bởi anh ta bao gồm mọi nỗ lực để chuyển tiếp udp với ssh), liên quan đến các vấn đề như độ trễ cao và truyền lại những thứ bạn không muốn nữa. Tôi đoán nó vẫn là một điều thú vị để thử mặc dù. Tôi thấy vpn này qua ssh và -w cũng được đề cập ở đây wiki.archlinux.org/index.php/VPN_over_SSH
barlop

Tôi tò mò về lý do tại sao bạn không muốn mở một cổng vào? - điều này không giống như một kịch bản đòi hỏi bảo mật siêu tuyệt vời ... Ngoài ra, bạn có thể có ứng dụng khách A duy trì kết nối SSH bên ngoài với cổng ngược liên kết với máy chủ mà khách hàng B có quyền truy cập. Bằng cách đó bạn có thể kết nối thông qua máy chủ trung gian. Tuy nhiên, các kiểu sắp xếp này dễ bị thất bại và do đó khá không mong muốn khi có quyền truy cập vật lý hạn chế để sắp xếp nó khi nó gặp trục trặc.
kabadisha

Câu trả lời:


8

pwnat


".. đó không phải là chuyện nhỏ để bắt đầu một kết nối với một người ngang hàng đằng sau NAT. "

".. tối đa tất cả các triển khai NAT từ chối chuyển tiếp lưu lượng truy cập trong nước không tương ứng với yêu cầu gửi đi phù hợp gần đây. "


" ..The pwnatcông cụ là một GNU / Linux chỉ, độc lập thực hiện NAT traversal tự trị. Sau khi liên lạc với máy chủ phía sau NAT, nó thiết lập một kênh với ngữ nghĩa TCP, sử dụng các gói tin UDP. Nó hỗ trợ cả client và server đằng sau NAT (nếu một trong các NAT cho phép các tin nhắn ICMP [tùy chỉnh] giả mạo được truyền đi). Việc triển khai này nhắm đến người dùng cuối. "


  
cách sử dụng: ./pwnat <-s | -c> <args>

  -c chế độ máy khách
    <args>: [ip cục bộ] <cổng cục bộ> <máy chủ proxy> [cổng proxy (def: 2222)] <máy chủ từ xa> <cổng từ xa>

  -s chế độ máy chủ
    <args>: [ip cục bộ] [cổng proxy (def: 2222)] [[máy chủ được phép]: [cổng được phép] ...]

  -6 sử dụng IPv6  
  -v hiển thị đầu ra gỡ lỗi (tối đa 2)  
  -h hiển thị trợ giúp và thoát  

Ví dụ:  

    Phía máy chủ cho phép mọi người ủy quyền:
      ./pwnat -s

    Khách hàng muốn kết nối với google.com:80:
      ./pwnat -c 8000 <pwnat.server.com> google.com 80
    Sau đó, duyệt đến http: // localhost: 8000 để truy cập google!  


pwnat;  biểu đồ luồng tín hiệu mạng


"Ý tưởng quan trọng cho phép các máy chủ để học hỏi địa chỉ IP của khách hàng là dành cho các máy chủ để định kỳ gửi một thông điệp tới một địa chỉ IP được biết đến cố định. Phương pháp đơn giản nhất sử dụng các thông điệp ICMP Echo request đến một địa chỉ IP chưa phân bổ, chẳng hạn như 1.2.3.4 Vì 1.2.3.4 không được phân bổ, ICMP REQUEST sẽ không được định tuyến bởi các bộ định tuyến mà không có tuyến mặc định. "

"Do kết quả của các tin nhắn được gửi đến 1.2.3.4, NAT sẽ cho phép định tuyến trả lời, đáp ứng yêu cầu này. Máy khách kết nối sau đó sẽ giả mạo một câu trả lời như vậy. Cụ thể, khách hàng sẽ truyền thông báo ICMP cho biết TTL_EXPIRED. tin nhắn có thể được truyền một cách hợp pháp bởi bất kỳ bộ định tuyến Internet nào và địa chỉ người gửi dự kiến ​​sẽ không khớp với IP mục tiêu của máy chủ. "

" Máy chủ lắng nghe trả lời ICMP (giả)khi nhận được, bắt đầu kết nối với IP người gửi được chỉ định trong trả lời ICMP. Nếu khách hàng đang sử dụng địa chỉ IP có thể định tuyến toàn cầu, điều này hoàn toàn không có vấn đề gì và cả TCP hoặc UDP đều có thể được sử dụng để thiết lập kết nối hai chiều nếu khách hàng lắng nghe trên một cổng trước đã đồng ý. "

"(Trong trường hợp không có cổng được thỏa thuận trước, trong hầu hết các trường hợp , số cổng có thể được truyền đạt như một phần của trọng tải của ICMP ECHO RESPONSE)."


Nguồn: http://samy.pl/pwnat.pdf
https://github.com/samyk/pwnat


pwnat hầu như không hoạt động đối với các kết nối localhost đến localhost. Tôi có thể gửi và nhận một số gói, nhưng để thiết lập các kết nối mạnh mẽ, nó không hữu ích lắm.
Scott

@Scott Vâng, đó là một hack thú vị, nhưng nó thực sự chỉ là một bằng chứng về khái niệm dựa trên việc lạm dụng và lạm dụng các giao thức mạng như ICMP. Tôi sẽ không dựa vào nó. Nó cũ và không rõ ràng và tôi không khuyên bạn nên sử dụng nó. Tôi thậm chí sẽ không đề cập đến nó nếu câu hỏi không quy định cụ thể về UDP. Nếu bạn muốn đáng tin cậy, hãy nối một đường hầm VPN.
lên tiếng

Tôi không phàn nàn, nhưng tôi nghĩ rằng "giải pháp này không được sử dụng trong môi trường sản xuất" là thông tin hữu ích cho bất kỳ ai đến đây đang tìm kiếm một giải pháp có khả năng ổn định.
Scott

@Scott Không phải, không được sử dụng trong một môi trường như vậy và như vậy. Rất nhiều sản phẩm độc quyền sử dụng các kỹ thuật Thesez. Dù sao, có đủ thông tin ở đây để mọi người tự đưa ra quyết định. Tôi không khuyên bạn nên nó. Nhưng tôi sử dụng đường hầm VPN. Mặt khác, một số mạng lọc lưu lượng VPN, do đó bạn phải thực hiện mọi việc theo từng trường hợp. Bạn có cần giúp đỡ để vượt qua một bộ định tuyến NAT?
lên tiếng

Tôi có một giải pháp khả thi hiện tại bằng cách sử dụng các đường hầm ssh ngược để liên kết hai máy NAT. Tuy nhiên, nó yêu cầu một máy "trung gian" có IP tĩnh hoặc tôi có thể định cấu hình chuyển tiếp cổng trên bộ định tuyến. Điều này sẽ cho phép tôi loại bỏ người trung gian đó. Ồ tốt
Scott


0

Đó là một giải pháp hơi bẩn nhưng dễ dàng, nhưng sử dụng netcat thì sao? Trên Raspberry Pi, bạn có thể tạo một tập lệnh lặp vòng lệnh:

nc <public_ip> <port1> | sh | nc <public_ip> <port2>  

Trên máy chủ địa phương của bạn, làm:

nc -l <port1>

Và:

nc -l <port2>  

Bạn sẽ có thể gõ một lệnh trong trường hợp đầu tiên và xem phản hồi trong lần thứ hai.


Làm thế nào điều này liên quan đến "đục lỗ UDP" ?
tiếng nói

? Làm thế nào để vượt qua NAT ??
ZEE
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.