ProxyCommand có điều kiện trong ~ / .ssh / config?


14

Tôi đã ~/.ssh/configcấu hình với nhiều máy chủ khác nhau có thể truy cập được trong khi trên VPN công ty của chúng tôi hoặc thông qua máy chủ proxy SSH.

Hiện tại tôi chỉ có

Host internal-server
    ProxyCommand ssh -W internal.ip:22 external-server

Tuy nhiên, nếu tôi ở trong mạng nội bộ, tôi có thể truy cập trực tiếp vào ip nội bộ, do đó, việc ủy ​​quyền qua máy chủ bên ngoài chỉ cần thêm độ trễ để kết nối.

Có cách nào để tôi có thể ủy quyền tạm thời nếu ip nội bộ không truy cập được và kết nối trực tiếp bằng cách khác không?

Câu trả lời:


8

Tôi thường thiết lập một cái gì đó như thế này. Nó giả định máy chủ trung gian sẽ có thể phân giải tên.

Host *%homeproxy
    ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

Vì vậy, tôi sẽ kết nối để thích ssh blah%homeproxy.


Google-fu của tôi đang làm tôi thất bại Bạn có thể giải thích điều này nhiều hơn? Tôi chưa bao giờ thấy cú pháp *% này trước đây.
fukawi2

3
Không có gì đặc biệt về %nhân vật. Bạn có thể sử dụng bất cứ thứ gì thực sự. Phần trăm được sử dụng vì nó không hợp lệ trong tên máy chủ hoặc tên người dùng. Các cutlệnh withing các ProxyCommand sử dụng %như một dấu phân cách để kéo ra tên máy.
Zoredache

1
Điều này là tốt, tuy nhiên điều đó có nghĩa là tôi phải đánh vần tên máy chủ đầy đủ thay vì bí danh ssh.
alt

@mobiusnz Điều đó thực sự có nghĩa đơn giản là bạn cần một tên khác nhau cho mỗi phương tiện kết nối khác nhau . Trong trường hợp của tôi, ví dụ, nếu tôi ở nhà, tôi sử dụng ssh targetH, nghĩa là mục tiêu từ nhà . Nếu trong một mạng cục bộ để nhắm mục tiêu, đơn giản ssh target. Mặc dù vậy, thật tuyệt khi câu nói này được nói thẳng hơn trong câu trả lời.
Rubens

4

Tôi sử dụng một phương pháp khác bằng cách sử dụng Match. Trong trường hợp của tôi, tôi muốn sử dụng proxy cục bộ nếu nó đang chạy hoặc không, nếu không. Chỉ thị sau đây thực hiện điều này độc đáo:

Match Exec "nc -z 127.0.0.1 1086"
    ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p

Nó phù hợp với mọi lần thử ssh và thực hiện kiểm tra nhanh bằng cách sử dụng ncxem proxy của tôi có hoạt động không và chạy trên 1086 (trong trường hợp đó, ncthoát không có lỗi). Nếu điều đó xảy ra, nó sẽ đặt ProxyCommand.


2

Một thập kỷ trước tôi đã viết một lệnh proxy cho loại kịch bản này. Trong trường hợp sử dụng của bạn, lệnh proxy của tôi có thể được sử dụng như thế này:

Host internal-server
    ProxyCommand ssh-multipath-proxy %h:%p -- ssh -W %h:%p external-server

Một vài lưu ý: Tôi hơi xấu hổ khi thừa nhận rằng nó không xử lý IPv6 và nó sẽ chỉ thử một địa chỉ IP duy nhất cho mỗi tên máy chủ. Ngoài ra, nó sẽ không chuyển biểu ngữ máy khách đến máy chủ trước khi biểu ngữ máy chủ được gửi. Nhưng điều đó không có khả năng gây ra vấn đề.


2

Cảm ơn câu trả lời của @ Until , nó đã truyền cảm hứng cho tôi rất nhiều.

Tôi thấy rằng bạn có thể buộc chuyển hướng kết nối của bạn với ProxyCommand nc dst dst-port.

Ví dụ, trên thực tế bạn sẽ kết nối với B.comnếu bạn sử dụng

ssh A.com -o ProxyCommand="nc B.com 22"

Nhưng UserKnownHostsFilevẫn sẽ ghi làA.com

Vì vậy, bạn có thể thêm một tên miền "tự động" vào ssh_config

Host auto.internal-server
  Hostname {internal-server ip or domain}
  ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'

Tôi đã thay thế nc -w 1 %h %pbằng (timeout 0.1 nc -z %h %p) && nc %h %p, nó sẽ nhanh hơn nếu bạn có thể truy cập máy chủ nội bộ ít hơn 100ms.

Hoặc bạn có thể thay thế bằng ping, nhưng nó có thể chỉ ra thông tin xấu nếu bạn sử dụng proxy dựa trên TCP như proxychains, hoặc máy chủ không cho phép tiếng vang ICMP.

Host auto.internal-server
  Hostname {internal-server ip or domain}
  ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'

Bạn có thể thay thế (timeout 0.1 nc -z %h %p)bằng bất cứ thứ gì phát hiện xem bạn có ở trong máy chủ nội bộ hay không.

Nếu bạn có nhiều IP ứng cử viên, thậm chí bạn có thể sử dụng điều này:

Host auto.internal-server
  Hostname {internal-server ip or domain}
  ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'

Nó sẽ cố gắng kết nối 1.1.1.1, nếu thất bại hãy thử kết nối 2.2.2.2, và sau đó 3.3.3.3.


0

Điều này hoạt động tự động hơn một chút với độ trễ 1 giây nhỏ hơn nếu bạn không đứng sau tường lửa và tường lửa không từ chối:

Host proxyhost.example.com
ProxyCommand none

Host *.example.com
ProxyCommand sh -c "nc -w 1 %h %p || ssh -W  %h:%p proxyhost.example.com"

0

Tôi thường sẽ tạo một mục khác như thế này -

Host myVM
    ProxyCommand ssh -W internal.ip:22 external-server
    User ubuntu

Host myVM-np
    User ubuntu

Sau đó, chỉ cần gọi cái bạn muốn, tùy thuộc vào môi trường proxy hiện tại của bạn ..

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.