Chuyển tiếp tệp cục bộ hoặc tệp ổ cắm sang tệp ổ cắm từ xa


24

Câu hỏi nhanh - Tôi chạy hai hộp linux, một máy tính để bàn của riêng tôi và cái còn lại là VPS của tôi. Vì lý do bảo mật ở cuối VPS, tôi đã chọn kết nối ổ cắm với MySQL ( /var/run/mysqld/mysql.sock). Tôi biết tôi có thể tạo đường hầm như thế này: ssh -L 3307:127.0.0.1:3306 user@site.comnếu tôi thiết lập máy chủ sql từ xa để nghe trên một số cổng, nhưng điều tôi muốn biết là tôi có thể làm gì đó như: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sockqua đường hầm hai ổ cắm, trái ngược với hai cổng không?

Một giải pháp hoàn toàn có thể chấp nhận được cũng là chuyển tiếp một cổng cục bộ sang tệp ổ cắm từ xa, nhưng nếu có thể tôi đang cố gắng không để máy chủ tcp chạy trên hộp từ xa.

(và vâng, tôi biết tcp sẽ dễ dàng hơn).


Nếu lý do bạn không muốn sử dụng TCP trên hộp myQuery là vì các vấn đề bảo mật (ví dụ như các cuộc tấn công từ xa, v.v.), bạn có thể sử dụng tường lửa cho nó và nếu điều đó không đủ tốt, hãy làm cho myQuery chỉ nghe 127.0.0.1 đối với các kết nối TCP của nó, sau đó bạn có thể chuyển qua SSH dễ dàng. Nếu không, tôi ủng hộ giải pháp socat dưới đây.
Mattias Ahnberg

lwn.net/Articles/609321 OpenSSH 6.7 sẽ mang lại chuyển tiếp ổ cắm
Hubbitus

@Hubbitus là tính năng này hiện có sẵn, nếu vậy, bạn có thể cung cấp một câu trả lời ví dụ không?
CMCDragonkai

Nhận xét đó ở dạng câu trả lời, nhưng được ai đó chuyển đổi thành nhận xét. Và tôi thấy bây giờ bạn đã đề nghị câu trả lời dưới đây.
Hubbitus

Câu trả lời:


35

Chuyển tiếp một ổ cắm cục bộ theo yêu cầu

  • Thiết lập xác thực khóa công khai SSH
  • Cài đặt socatở cả hai đầu
  • tạo một thư mục cục bộ cho ổ cắm của bạn, không thể truy cập được cho người dùng khác.
export SOCKET_DIR=~/.remote-sockets
mkdir -p $SOCKET_DIR
socat "UNIX-LISTEN:$SOCKET_DIR/mysqld.sock,reuseaddr,fork" \
EXEC:'ssh user@server socat STDIO UNIX-CONNECT\:/var/run/mysqld/mysqld.sock'

sau đó

mysql -S $SOCKET_DIR/mysqld.sock -u mysqluser -p

bị đánh cắp từ chuyển tiếp ổ cắm tên miền unix với ssh và socat


Điều này là tuyệt vời và nên được trả lời chấp nhận.
John Smith Tùy chọn

32

Rõ ràng trong thời gian, khi câu hỏi được hỏi, nó thực sự là không thể, nhưng ngày nay nó có thể.

Bạn có thể cả hai: UNIX => TCP và UNIX => Chuyển tiếp UNIX.

Ví dụ:

ssh \
  -R/var/run/mysql.sock:/var/run/mysql.sock \
  -R127.0.0.1:3306:/var/run/mysql.sock \
  somehost

Có thể kể từ OpenSSH 6.7.


1
Tôi đã quản lý để chuyển tiếp ổ cắm cục bộ của mình sang ổ cắm máy chủ từ xa bằng cách sử dụng máy khách docker từ xa (có thể được thực hiện bằng ssh trực tiếp, nhưng đâu là niềm vui trong đó :)ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
sdkks

11

Tôi chưa làm điều này, nhưng tôi sẽ thử với socat . có thể một cái gì đó như:

ssh xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:localhost:9999 UNIX-CONNECT:/var/run/mysqld/mysql.sock"
socat UNIX-LISTEN:/path/to/local/socket TCP:localhost:9999

một lần nữa, tôi chưa bao giờ làm bất cứ điều gì như thế này


Tôi sẽ cho nó đi và cho bạn biết làm thế nào nó đi. Tôi đã sử dụng triển khai dựa trên tcp.

Tôi không thể làm cho nó hoạt động vào lúc này nhưng dù sao +1 cho ý tưởng, tôi thích nó. Tôi sẽ cho bạn biết nếu tôi sửa nó.

+1 trông giống như một tiện ích hữu ích.
Warner

5

Không cần socat nữa kể từ ssh 6.7. Bạn có thể chuyển tiếp ổ cắm tên miền unix trực tiếp như:

ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote

Thông tin thêm: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160


Tôi cũng thấy điều này hữu ích cho việc kết nối với một ổ cắm cục bộ như một người dùng khác. Điều này cho phép tôi chạy các chương trình máy khách dựa trên quy trình máy chủ ngắt kết nối một số ID người dùng nhất định (các kết nối đến từ người chạy công việc của chính nó).
Warbo

Chuyển tiếp một ổ cắm đến cùng một máy, nhưng thư mục khác nhau được kiểm soát bởi một người dùng khác, sử dụng sshd để xác thực quyền truy cập? Usecase của bạn là gì?
CMCDragonkai

Quyền truy cập / quyền truy cập không phải là vấn đề. Thay vào đó, một trình nền cụ thể sẽ loại bỏ mọi nỗ lực kết nối được thực hiện bởi người dùng trong một nhóm nhất định (được cho là để ngăn người mới bị nhầm lẫn). Sử dụng ssh cho phép những người dùng đó kết nối (thông qua ổ cắm được điều chỉnh) như thể họ là người dùng không thuộc nhóm đó và do đó không bị ngắt kết nối.
Warbo

Thật thú vị, thật buồn cười khi bạn muốn nói đến nix-daemon, tôi cũng đang xử lý các vấn đề liên quan đến điều đó. Tôi đang tự hỏi tại sao nix-daemon lại mất kết nối với người dùng trong một nhóm nhất định? Đây có phải là một điều cấu hình bảo mật? Hoặc liên quan đến: nixos.org/nix/manual/#idm140737318362784 ?
CMCDragonkai

Theo thông điệp cam kết, đó là để ngăn chặn việc sử dụng "tình cờ". Tôi đã mang nó lên đây
Warbo 14/07/18

2

Một sửa đổi khác của câu trả lời của @mpontes '/ @ javier

ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

Sạch hơn

ssh user@remoteserver -L 9999:localhost:9999 '
  socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
  pid=$!
  trap "kill $pid" 0
  while echo -ne " \b"; do
    sleep 5
  done
'

PROS

  1. Hoạt động trên openssh sớm hơn 6,7 (như CentOS 7)
  2. Giết socat khi chấm dứt ssh thay vì phải re-ssh vào máy chủ từ xa
  3. Cho phép đăng nhập ssh không công khai (không giống như giải pháp ijk)

Đặc tính

  1. -ftùy chọn này không được sử dụng, bạn có thể sử dụng khóa chung và chạy trong nền thông qua &hoặc bạn có thể đăng nhập tương tác và sử dụng Ctrl + Z và sử dụng tương tự $!để lưu trữ pid.

TIÊU DÙNG

  1. Không thể dễ dàng sử dụng -ftùy chọn ssh, vì bạn sẽ mất pid của ssh theo cách đó. Phương pháp này dựa vào việc chạy ở nền trước và Ctrl + C để tiêu diệt.
  2. Phức tạp hơn nhiều

Giải trình

  • socat ...& - chạy socat trong nền trên máy chủ từ xa
  • pid=$! - lưu trữ pid
  • trap kill\ $pid 0- chạy kill $pidtrên chấm dứt bash
  • while :; sleep... - ngồi trong một vòng lặp vô hạn
  • echo -ne \ \b- Echo không gian theo sau là backspace. Điều này không thành công ngay khi ssh bị ngắt kết nối. Với a sleep 5, điều này có nghĩa là socatcó thể chạy tới 5 giây sau ssh

Lưu ý: Trên thực tế thử nghiệm sử dụng Docker, cổng 2375, /var/run/docker.sockvà biến môi trường DOCKER_HOST='tcp://localhost:2375', nhưng nên làm việc cho mysql tất cả cùng

Cập nhật

Sử dụng Điều khiển SSH , bạn có thể sử dụng -fcờ theo cách của tôi, chỉ cần thêm các cờ sau

-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto

Và bạn sẽ nhận được

ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

Bây giờ bạn có thể chấm dứt tất cả các phiên được kiểm soát bằng cách sử dụng

ssh -o ControlPath=~/.ssh/%C -O exit remoteserver

Các -otùy chọn có thể được lưu trong .ssh/configtệp của bạn hoặc bạn có thể sử dụng -S thay thế (nhưng bạn vẫn cần -o ControlMaster)


Tôi đang sử dụng các tập lệnh bên trong bộ chứa Docker để triển khai mã đến các máy chủ khác. Logic kết nối của bạn là tuyệt vời nhưng kết thúc khi phiên bash kết thúc. Điều này ngăn tôi gọi docker run ... connect.shđể thiết lập đường hầm theo sau docker run ... deploy.sh. Tôi đã cố gắng nohup, &disownhọ dường như phá vỡ socatbằng cách đóng stdoutvà kích hoạt kill. Bất kỳ ý tưởng nào cho các tinh chỉnh để hỗ trợ cho trường hợp này (tức là vẫn đóng khi SSH thực hiện nhưng vẫn tồn tại một sự cố)?
claytond

ĐƯỢC. Điều này thực sự hoạt động tốt (w / -f& disown) trong một thiết bị đầu cuối. Rõ ràng vấn đề được tạo ra bởi kịch bản "trình bao bọc". Tôi hoan nghênh đầu vào nhưng hiện đang xem xét Hỏi & Đáp thích hợp hơn.
đất sét

@claytond Không chắc chắn chính xác những gì bạn đang làm, nhưng vâng, tất cả các lệnh khác bị chấm dứt khi pid 1 của container kết thúc. Tôi thường làm gì trong kịch bản triển khai kịch bản của bạn là sử dụng lệnh "triển khai" và viết một điểm truy cập cho vùng chứa của tôi hình ảnh sẽ nói "if $ 1 (lệnh) == deploay then" chạy các lệnh ssh và các lệnh triển khai, sau đó kết thúc, sẽ đóng kết nối ssh. Bạn cũng có thể docker run ... connect.sh, và docker exec {container name/id} deploy.sh, để họ chơi cùng nhau.
Andy

Bạn đúng. Tôi thực sự đang sử dụng exectrên một runcontainer đã có và đường ống SSH vẫn không tồn tại sau khi execkết thúc. Tôi đã làm rõ rằng đó là do một sự châm biếm với cách các kịch bản được thực thi. Nếu tôi chuyển cuộc gọi sang kịch bản của chính nó và được gọi nohup <script.sh> & disown, nó sẽ sống sót sau khi hoàn thành exec.
claytond

1

Xây dựng câu trả lời của Javier, điều này hiệu quả với tôi:

ssh -f xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"

Bạn cần forkđể có thể kết nối nhiều lần mà không bị chết xã hội khi bạn đóng kết nối đầu tiên. Ngoài ra, cách socat cho phép bạn chỉ định một địa chỉ để liên kết là thông qua bindtùy chọn, không phải là một địa chỉ trước cổng.

Sau này, chỉ cần kết nối với localhost:9999bình thường như bạn muốn. Sau đó để phá bỏ đường hầm:

ssh -f xxx@yyy.zzz "killall socat"

(hoặc một cái gì đó tương tự, bạn có thể làm những điều phức tạp hơn liên quan đến việc giữ cho PID của socat)


1

Vâng, bạn có thể sử dụng socat.

Đầu tiên làm đường hầm TCP với SSH. Sau đó sử dụng socat như thế này:

socat unix-lắng nghe: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306

Sau đó cấp quyền cho ổ cắm được tạo mới (có thể là chmod 777)


Điều này là có thể kể từ OpenSSH 6.6.
ysdx

3
chmod 777: không không không không không! Không bao giờ chạy chmod 777. Đó là thực tế không bao giờ cần thiết! Thậm chí không phải vì "mục đích thử nghiệm". Nếu tập tin có thể đọc được thì nó có thể đọc được. Nếu nó có thể ghi bởi userhoặc groupcần phải viết cho nó, thì nó có thể ghi được. Hoàn toàn không cần phải cung cấp cho tất cả mọi người quyền viết và quên chmodnó trở lại một cái gì đó lành mạnh chính xác là cách các công ty đa quốc gia bị hack. Đừng làm điều đó. Không bao giờ. Tôi đã viết một bài giới thiệu về quyền hạn Unix . Xin vui lòng đọc nó!
Martin Tournoij
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.