Truy cập SSH vào máy chủ văn phòng phía sau bộ định tuyến NAT


33

Tôi muốn truy cập cổng ssh của máy chủ linux văn phòng của tôi từ nhà. Thật không may, máy chủ được đặt phía sau một bộ định tuyến NAT. Vì vậy, địa chỉ IP không có sẵn công khai. Tuy nhiên, có quyền truy cập vào một máy chủ internet khác (Máy chủ) không may chỉ truy cập không root. Sau một thời gian tìm kiếm tôi không tìm thấy giải pháp phù hợp.

Thiết lập sau:

  • Office PC (linux, truy cập root) phía sau NAT (IP không công khai) nhưng truy cập Internet đầy đủ.
  • Máy chủ PC (linux, không có quyền truy cập root) IP tĩnh và công cộng và truy cập Internet đầy đủ.
  • PC tại nhà (linux, truy cập root) phía sau NAT (IP không công khai) nhưng truy cập Internet đầy đủ.

Các kết nối có thể có: PC Office -> Máy chủ <- PC tại nhà

Không thể: PC Office <-X- Server -X-> PC tại nhà

Cả PC gia đình lẫn máy chủ đều không thể bắt đầu truy cập vào PC Office. Nhưng cả PC Office và PC gia đình đều có thể khởi tạo kết nối với Máy chủ.

Không thể đảo ngược đường hầm SSH: Tôi đã thử một phương pháp gọi là đường hầm ngược ssh. Thật không may, điều này yêu cầu GatewayPorts trên Máy chủ được đặt thành "có" trong / etc / ssh / sshd_config, nơi tôi không có quyền truy cập root.

Về nguyên tắc nên có thể:

0) Trên Máy chủ, tôi khởi động chương trình không gian người dùng nghe trên 2 cổng (1 đến, 1 đi)

1) Trên PC văn phòng của tôi, tôi chạy một chương trình khác giúp kết nối TCP mở tới cổng ra trên máy chủ.

2) Từ nhà tôi kết nối với cổng đến của Máy chủ.

Cần có một giải pháp tiêu chuẩn cho việc này.

Giải pháp nhanh nhất và sạch nhất để giải quyết điều này là gì?

Frank


1
PC làm việc có thể kết nối với nhà để thiết lập một đường hầm ssh không? en.gentoo-wiki.com/wiki/Autossh

Bạn có thể sử dụng FileZilla với sftp và chuyển tiếp cổng. Kiểm tra: superuser.com/a/1286681/141314
Noam Manos

Câu trả lời:


31
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

Một lát sau:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

Những gì bạn có thể làm là thế này: ở bước 1 chuyển tiếp một cổng từ xa từ PC văn phòng đến máy chủ ( 12345được sử dụng làm ví dụ, bất kỳ cổng nào> 1024 nên làm). Bây giờ kết nối với 12345 trên máy chủ sẽ kết nối bạn với cổng 22 trên officepc.

Ở bước 2, chuyển tiếp cổng 23456 từ máy chủ của bạn sang 12345 trên máy chủ (từ đó nó được chuyển tiếp đến officepc: 22, như được thiết lập ở bước 1)

Ở bước 3, bạn kết nối với cổng cục bộ 23456 bằng thông tin đăng nhập PC văn phòng của bạn . Điều này được chuyển tiếp từ bước 2 đến cổng 12345 trên máy chủ của bạn và bước 1 đến PC văn phòng của bạn.

Lưu ý rằng tôi đang sử dụng autossh cho các chuyển tiếp, vì nó là một trình bao bọc ssh tự động kết nối lại đường hầm nếu nó bị ngắt kết nối; tuy nhiên ssh bình thường cũng sẽ hoạt động, miễn là kết nối không bị rớt.

Có một lỗ hổng có thể xảy ra: bất kỳ ai có thể kết nối với localhost: 12345 trên serverpc giờ đây có thể kết nối với officepc: 22 và cố gắng hack vào nó. (Lưu ý rằng nếu bạn đang chạy máy chủ SSH, dù sao bạn cũng nên bảo mật nó trên các biện pháp bảo vệ cơ bản được bật theo mặc định; tôi khuyên bạn ít nhất nên vô hiệu hóa đăng nhập gốc và vô hiệu hóa xác thực mật khẩu - xem ví dụ này )

Chỉnh sửa : Tôi đã xác minh điều này với cùng một cấu hình, và nó hoạt động. GatewayPorts nochỉ ảnh hưởng đến các cảng mở ra thế giới tại các đường hầm lớn chứ không phải địa phương. Đây là những gì các cổng chuyển tiếp là:

homepc:
  outgoing ssh to serverpc:22
  listening localhost:23456 forwarded through ssh tunnel
serverpc:
  listening ssh at *:22
  incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
  listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
  outgoing ssh to serverpc:22
  incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22

Vì vậy, liên quan đến ngăn xếp mạng, tất cả lưu lượng truy cập cục bộ trên các giao diện loopback tương ứng (cộng với các kết nối ssh với serverpc); do đó, GatewayPortskhông được kiểm tra

Tuy nhiên, có chỉ thị AllowTcpForwarding: nếu đó là no, thiết lập này sẽ thất bại vì không được phép chuyển tiếp, thậm chí không qua giao diện loopback.

Hãy cẩn thận :

  • nếu sử dụng autossh và ssh gần đây, bạn có thể muốn sử dụng ssh's ServerAliveIntervalServerAliveCountMaxđể giữ cho đường hầm lên. Autossh có một kiểm tra tích hợp, nhưng rõ ràng nó có một số vấn đề trên Fedora. -M0vô hiệu hóa điều đó và -oServerAliveInterval=20 -oServerAliveCountMax=3kiểm tra xem có kết nối không - thử mỗi 20 giây, nếu nó bị lỗi 3x liên tiếp, dừng ssh (và autossh tạo một kết nối mới):

    autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
    autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
  • Có thể hữu ích để khởi động lại đường hầm ssh nếu chuyển tiếp không thành công, bằng cách sử dụng -oExitOnForwardFailure=yes- nếu cổng đã bị ràng buộc, bạn có thể nhận được kết nối SSH đang hoạt động, nhưng không có đường hầm chuyển tiếp.

  • ~/.ssh/configNên sử dụng cho các tùy chọn (và cổng), nếu không thì các dòng lệnh quá dài dòng. Ví dụ:

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

Sau đó, bạn có thể sử dụng chỉ bí danh máy chủ:

    autossh -M0 fwdserverpc

Tôi tin rằng phương pháp này bạn đang giả sử được gọi là "đường hầm ssh ngược". Thật không may, điều này đòi hỏi GatewayPorts trên Máy chủ được đặt thành "có" trong / etc / ssh / sshd_config. Máy chủ này không có cổng cổng cho phép và tôi không có quyền truy cập root ở đó.

3
@Frank: Thật ra, tôi không nghĩ vậy: GatewayPorts nohạn chế các cổng đã mở chỉ có thể truy cập trên giao diện loopback; lưu ý rằng trong bước 2 bạn đang chuyển tiếp trên giao diện loopback (trên thực tế, cả hai chuyển tiếp đều là "chỉ localhost"), vì vậy điều này có thể hoạt động ( AllowTcpForwarding notrong cấu hình sshd sẽ phá vỡ điều này).
Piskvor

3
@Frank: Yup, đã xác nhận. Điều này hoạt động ngay cả với GatewayPorts no; chỉnh sửa câu trả lời. Lưu ý rằng có các chỉ thị khác (chẳng hạn như PermitOpenAllowTcpForwarding) có thể phá vỡ thiết lập này: manpagez.com/man/5/sshd_config
Piskvor

1
Câu trả lời tuyệt vời! Nó hoạt động, bạn đã lưu cuối tuần của tôi! Cảm ơn nhiều!!

1
phiên bản autossh của tôi (Fedora Core) không thể chạy từ thiết bị đầu cuối mà không có -M. Tôi cũng đã liên kết với một người khác có kinh nghiệm đó. Bạn đúng rằng trong hướng dẫn sử dụng, nó được đánh dấu là một đối số tùy chọn. Tốt nếu nó làm việc cho nhiều người, đáng tiếc rằng không phải cho tất cả.
Yar Tư Nikitenko

4

Nếu bạn có thể ssh đến máy chủ nội bộ từ nhà và từ máy chủ nội bộ đến máy Linux văn phòng của bạn, thì từ nhà bạn có thể sử dụng ssh ProxyCommandđể âm thầm thoát qua máy chủ đến máy bên trong thông qua nc(netcat)

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p

Sau đó, bạn chỉ ssh user@internalpcvà bạn đang âm thầm chuyển tiếp qua máy chủ, không cần mở cổng hoặc đường hầm ở hai đầu.


1
Cảm ơn câu trả lời của bạn. Thật không may, cả PC gia đình lẫn máy chủ đều không thể bắt đầu truy cập vào PC Office. Nhưng cả PC Office và PC gia đình đều có thể khởi tạo kết nối với Máy chủ.

4

Cài đặt Robo-TiTO trong máy tính mà bạn muốn truy cập SSH từ xa.

  • Điều này sẽ cho phép bạn truy cập SSH bằng cách sử dụng từ Ứng dụng khách Google Talk ở bất cứ đâu.
  • Không cần địa chỉ IP công cộng hoặc cài đặt đặc biệt.
  • Đó là mã nguồn mở và miễn phí, không phải trả bất kỳ dịch vụ ứng dụng nào nữa.
  • Không cần mở cổng SSH (giữ máy tính của bạn an toàn).
  • Không cần phải mở bất kỳ đường hầm nào (ví dụ: VPN hoặc một cái gì đó tương tự)

Các hướng dẫn cài đặt sau đây đã lỗi thời, vì trang web đã di chuyển. URL mới là https://github.com/formigarafa/robotito

Tôi đã tạo một tập lệnh (đã được thử nghiệm trên Hệ điều hành Raspbian của tôi trong Raspberry Pi) để bạn có thể dễ dàng cài đặt Robo-TiTO trên Raspberry Pi, Debian hoặc Ubuntu Box (phân phối gói Debian). đây là các bước để làm cho hộp Linux của bạn có thể xóa được:

  1. Mở Shell Command hoặc bạn có thể gọi nó là Terminal, vào thư mục nhà của bạn, Tải xuống tập lệnh cài đặt bằng lệnh:

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. sau đó chạy tập lệnh bằng cách nhập lệnh:

    $ sudo ./robotito
    
  3. và sau đó bạn có thể chỉnh sửa tệp credentials.rbtừ thư mục cấu hình của Robo-TiTO bằng tài khoản GTalk của bạn và lưu nó bằng cách nhấn Ctrl+ XY. Mặc định là sử dụng trình soạn thảo nano.

  4. chạy Robo-TiTO từ thư mục Robo-TiTO bằng lệnh

    $ cd robotito
    $ ./jabbershd start
    
  5. Bây giờ điều này đã được thực hiện, bạn có thể sử dụng SSH từ bất kỳ ứng dụng khách Google talk nào. Đừng quên thêm tài khoản Robo-TiTO GTalk vào tài khoản Google talk của bạn và kiểm tra nó bằng cách trò chuyện với nhau trước khi sử dụng tài khoản.


5
Tôi gặp một vấn đề nghiêm trọng với "Không cần mở cổng SSH (giữ cho máy tính của bạn tiết kiệm )" - bot shell-over-jabber mà bạn đề xuất được bảo mật bằng, trích dẫn CLIENT_PASSPHRASE = "logmein", trong bản rõ . Đó thực sự là bảo mật bằng không - bạn đang tạo ra một lỗ có kích thước xe tải cho bất kỳ ai đi vào. Tương phản với xác thực khóa công khai SSH: Tôi đang xác thực qua một kênh bảo mật , sử dụng thông tin đăng nhập thậm chí không bao giờ vượt qua giới hạn. Ai đang giữ máy tính của họ an toàn?
Piskvor

@Piskvor, robotito sẽ chỉ chạy các lệnh từ danh bạ trong danh sách trắng. github.com/formigarafa/robotito/blob/master/config/ từ
formigaraha 17/2/2016

Tôi không bao giờ gặp phải bất kỳ rắc rối nào vì xác thực dựa trên danh sách trắng. Nếu tôi không sai, việc chuyển tin nhắn được mã hóa khi sử dụng với GTalk. Bằng cách này hay cách khác, tôi đã thay đổi nó gần đây và bây giờ nó sử dụng Mật khẩu một lần từ một công cụ như Google Authenticator hoặc tương tự để cho phép truy cập.
formigarafa

1
@formigarafa: (1) Nếu bạn đang hoặc đã tham gia vào việc phát triển sản phẩm này, bạn phải nói một cách rõ ràng. Sử dụng cùng tên là không đủ; hầu hết mọi người sẽ không nhận thấy điều đó. (Bạn có thể đề cập đến nó trong hồ sơ của bạn .) (2) Khi bạn chỉnh sửa một bài đăng, bạn nên sửa nó nhiều nhất có thể. Ví dụ: hãy thử bắt các lỗi chính tả như Trực tiếp. Và, nếu một liên kết bị hỏng, đừng chỉ gắn nhãn đó là một liên kết chết; đặt URL mới vào bài viết . Mọi người không nên tìm hiểu các ý kiến ​​để tìm thông tin chính xác.
G-Man nói 'Phục hồi Monica'

@ G-Man, Câu trả lời ban đầu và chỉnh sửa không phải của tôi. Và tôi chưa bao giờ có ý định làm cho nó trông giống như của tôi. Tôi nhận thấy một liên kết chết trên câu trả lời, tôi cũng không tạo liên kết. Tôi thực sự muốn xem nội dung của nó và cố gắng theo dõi nó. Thật không may, tôi không thể tìm thấy tài nguyên. Tôi đã đánh dấu là một liên kết chết với hy vọng rằng bất cứ ai viết câu trả lời sẽ được thông báo bằng thay đổi và cố gắng sửa nó.
formigarafa

3

Giải pháp của Piskvor hoạt động tốt và tốt đẹp. Tuy nhiên, nó giữ cho các thiết bị đầu cuối treo lủng lẳng với vỏ đăng nhập treo. Không tuyệt lắm.

Tôi đã luôn sử dụng tập lệnh nhỏ này mà tôi đã viết để kết nối với máy chủ và giữ cho nó được kết nối bằng cách chạy nó trong cron:

#!/bin/bash
TARGET_HOST=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"

#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
    grep "ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
    grep -v grep | \
    wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
    echo "`date` : establishing connection to $TARGET_HOST on port $TARGET_PORT"
    screen -m -d ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi

Tôi cá là chúng ta có thể sửa giải pháp của Piskvor bằng cách sử dụng tính năng tự động thanh lịch hơn bên cạnh màn hình có thể tách rời hoặc sử dụng các đối số -NT ssh để duy trì kết nối ở chế độ nền.


Cảm ơn bạn đã khen ngợi :) Đối với các trường hợp sử dụng của tôi, tôi thường xuyên cần quyền truy cập shell, cũng như các chuyển tiếp; Thêm vào đó, tôi đã cố gắng hiển thị trường hợp tối thiểu ở đây (có thể đơn giản hóa các lệnh trên thành hai lệnh với bước nhảy máy chủ SSH trong suốt, nhưng điều đó sẽ yêu cầu cấu hình bổ sung trên homepcmáy tính).
Piskvor

2

Đối với tôi, có vẻ như, thay vì một đường hầm SSH, bạn nên thử VPN: loại hoạt động bằng cách sử dụng máy chủ ở bên ngoài để ủy quyền thông qua, chẳng hạn như Hamachi . Có những phần mềm miễn phí khác như cái này, nhưng Hamachi là fav của tôi.


1
Bây giờ, 5.0.0.0/8mạng thực sự có các địa chỉ IPv4 công cộng được gán, Hamachi đang gặp sự cố (nếu Hamachi đang chạy, bạn không thể truy cập một phần hơi ngẫu nhiên của internet). Ngoài ra, Hamachi không còn miễn phí sử dụng.
Piskvor
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.