Làm cách nào tôi có thể thiết lập một cổng từ xa chuyển tiếp trên cổng 80 sang localhost của mình với sự trợ giúp của setcap?


11

Tôi muốn chấp nhận kết nối nhanh chóng để phát triển khi tôi bị NAT, và vì vậy tôi đang cố gắng thực hiện điều này:

$ ssh ubuntu@example.org -R 80:localhost:80

Thất bại khi tôi cố gắng liên kết một cổng ở mức thấp:

Warning: remote port forwarding failed for listen port 80

Vì vậy, tôi đã phát hiện ra rằng tôi có thể làm gì setcap 'cap_net_bind_service=+ep' /my/applicationđể cho phép nó nghe các cổng thấp hơn 1024. Vì vậy, tôi đã nhận được điều này trong suders crontab của mình:

@reboot setcap 'cap_net_bind_service=+ep' /usr/sbin/sshd

Nhưng nó vẫn không cho phép tôi ràng buộc trên cổng 80. Tôi đang làm gì sai? Tôi sẽ chỉ sử dụng nginx để proxy đến 8080 hoặc iptables hoặc một cái gì đó thay vào đó, nhưng tôi vẫn tò mò tại sao những gì tôi đã cố gắng làm không hiệu quả.


Bạn đang sử dụng hệ thống tập tin nào? Không phải tất cả các hệ thống tập tin hỗ trợ setcap.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi đang sử dụng ext4, đó là hình ảnh Ubuntu mặc định tắt AWS và tôi chưa làm được điều gì lạ mắt với nó.
Kit Sunde

Nghe có vẻ như bạn đang root trên hộp. Có lẽ tôi không biết gì nhưng không nên thực hiện dòng đầu tiên như root giải quyết vấn đề của bạn?
Christian

@Christian Bạn không thể liên kết trên <1024 mà không sudotheo thiết kế. Giống như cách bạn không thể làm apt-get install foomà không làm trước sudo.
Kit Sunde

@KitSunde Vâng, root là một cách nói không phải của Ubuntu sudo. Đó là người dùng có tất cả các đặc quyền mà người dùng bình thường chỉ có được khi thực hiện sudo. root cũng đôi khi được gọi là superuser. Vì vậy, về cơ bản câu hỏi của tôi cho bạn là: Bạn dường như có thể làm sudotrên hộp, tại sao bạn không thể trong trường hợp này?
Christian

Câu trả lời:


13

OpenSSH sẽ từ chối liên kết với các cổng đặc quyền trừ khi id người dùng của người dùng đã đăng nhập là 0 (root). Các dòng mã liên quan là:

if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0) ||
    (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");

Nguồn: http://www.openssh.com/cgi-bin/cvsweb/src/usr.bin/ssh/serverloop.c?annotate=1.162 dòng 1092-1098

Nếu bạn tò mò, pwthuộc loại struct passwd *và trên linux được xác định trong/usr/include/pwd.h


Ồ tôi không mong đợi điều đó, điều này chắc chắn sẽ trả lời câu hỏi của tôi.
Kit Sunde

2

Tôi gặp vấn đề tương tự, vì vậy giải pháp tôi đã kết thúc là thêm DNATquy tắc vào OUTPUTchuỗi natbảng:

iptables -t nat -A OUTPUT -d 127.0.0.0/8 -p tcp --dport 80 \
-j DNAT --to-destination :8080

Quy tắc này thay thế hiệu quả cổng đích 80 bằng 8080 cho tất cả các gói tcp được tạo cục bộ.

Nếu bạn muốn cho phép bất kỳ kết nối đến nào cũng được chuyển tiếp thì hãy thêm một quy tắc bổ sung vào PREROUTING natchuỗi:

iptables -t nat -A PREROUTING -d 10.0.0.200 -p tcp --dport 80 \
-j REDIRECT --to-port 8080

nơi 10.0.0.200là địa chỉ IP của giao diện mà nên được chuyển tiếp kết nối đến dịch vụ web của bạn


1

Từ đầu máy khách, bạn có thể chạy ssh qua sudo:

sudo ssh -L 80:127.0.0.1:80 myuser@myhost.com

Nó hoạt động, mặc dù tôi thừa nhận không chắc chắn về ý nghĩa bảo mật cho hệ thống địa phương của bạn.


1

Đây là một trường hợp sử dụng tuyệt vời cho socat.

Đầu tiên, thực hiện chuyển tiếp từ xa tới cổng 8080(hoặc bất kỳ cổng được phép nào khác) của máy từ xa:

ssh ubuntu@example.org -R 8080:localhost:80

Sau đó trên máy từ xa, ánh xạ cổng 80tới cổng 8080:

sudo socat TCP-LISTEN:80,fork TCP:localhost:8080

Ghi chú:

Theo đề xuất của Dirk Hoffman, hai lệnh này có thể được kết hợp thành một dòng duy nhất:

ssh -t ubuntu@example.org -R 8080:localhost:80 sudo socat TCP-LISTEN:80,fork TCP:localhost:8080

(Điều -tnày là cần thiết trong trường hợp bạn cần một thiết bị đầu cuối tương tác để nhập sudomật khẩu của bạn .)


xuất sắc! yêu nó!
Dirk Hoffmann

cũng có thể thực thi cả hai trong một lệnh như vậy: ssh -t -i ~ / .ssh / id_rsa -R 0.0.0.0:8080 0.0.0.0:8080 user @ remoteMachine - "sudo socat TCP-LISTEN: 80, fork TCP: localhost: 8080 "
Dirk Hoffmann

0

Bạn cũng có thể chỉ cần thêm khóa công khai của mình vào danh sách /root/.ssh/authorized_keys. Nếu bạn bị hoang tưởng thì bạn sẽ muốn cấm chạy bất kỳ lệnh nào dưới dạng root như:

no-pty,no-agent-forwarding,no-X11-forwarding,command="/bin/noshell" ssh-rsa YOUR_PUBLIC_KEY 

Lưu ý rằng đăng nhập với quyền root có thể yêu cầu thêm "PermitRootLogin không có mật khẩu" trong / etc / ssh / sshd_config.


0

Xây dựng đề xuất giải pháp của Ben Mares ở trên,

dưới đây là một lớp lót:

mở hai cổng từ xa về phía trước:
1. cổng từ xa 8888 đến cổng cục bộ 80
2. cổng từ xa 8443 đến cổng cục bộ 443

trên máy xã hội từ xa kết nối mọi thứ
1. đến cổng 80 để được truyền đến cổng 8888
   , sau đó được chuyển đến cổng máy chủ cục bộ 80
2. đến cổng 443 để được chuyển đến cổng 8443
   , sau đó được chuyển đến cổng máy chủ cục bộ 443

ssh -t -i ~/.ssh/id_rsa \
    -R 0.0.0.0:8888:0.0.0.0:80 \
    -R 0.0.0.0:8443:0.0.0.0:443 \
    remoteUser@remoteMachine \
    -- "(sudo socat TCP-LISTEN:80,fork TCP:localhost:8888) & \
        sudo socat TCP-LISTEN:443,fork TCP:localhost:8443"

vì vậy, nếu bạn thực thi lệnh, bạn phải cung cấp mật khẩu gốc của máy từ xa (để có thể liệt kê trên các cổng 80/443) và sau đó (miễn là đường hầm được thiết lập) bất cứ thứ gì đến trên cổng 80 hoặc 443 của máy chủ từ xa, sẽ được chuyển đến các cổng máy cục bộ của bạn tương ứng 80 hoặc 443 ...

nhớ lại!!

để có thể liên kết trên tất cả các giao diện mạng (0.0.0.0), bạn phải chỉnh sửa các máy từ xa của mình /etc/ssh/sshd_configvà đặt GatewayPorts clientspecifiedhoặcGatewayPorts yes

bạn có thể kiểm tra điều này trên máy từ xa netstat -tlpn | grep -E '8888|8443'sẽ hiển thị:

tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      -

và không

tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               LISTEN      -
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.