Đảo ngược đường hầm SSH: làm cách nào tôi có thể gửi số cổng của mình đến máy chủ?


12

Tôi có hai máy, Client và Server.

Máy khách (người đứng sau tường lửa công ty) mở đường hầm SSH ngược tới Máy chủ, có địa chỉ IP có thể truy cập công khai, sử dụng lệnh này:

ssh -nNT -R0: localhost: 2222 insecure@server.example.com

Trong OpenSSH 5.3+, việc 0xảy ra ngay sau -Rphương tiện "chọn một cổng khả dụng" thay vì gọi một cách rõ ràng cho một cổng. Lý do tôi làm điều này là vì tôi không muốn chọn một cổng đã được sử dụng. Trong thực tế, có rất nhiều Khách hàng ngoài kia cần thiết lập các đường hầm tương tự.

Vấn đề ở thời điểm này là máy chủ không biết Client nào là cái nào. Nếu chúng tôi muốn kết nối lại với một trong những Khách hàng này (thông qua localhost) thì làm sao chúng tôi biết cổng nào đề cập đến khách hàng nào?

Tôi biết rằng ssh báo cáo số cổng cho dòng lệnh khi được sử dụng theo cách trên. Tuy nhiên, tôi cũng muốn sử dụng autossh để duy trì các phiên hoạt động. autossh chạy tiến trình con của nó thông qua fork / exec, có lẽ, do đó đầu ra của lệnh ssh thực tế bị mất trong ether.

Hơn nữa, tôi không thể nghĩ ra bất kỳ cách nào khác để có được cổng từ xa từ Máy khách. Vì vậy, tôi tự hỏi nếu có một cách để xác định cổng này trên Máy chủ.

Một ý tưởng tôi có là bằng cách nào đó sử dụng / etc / sshrc, được cho là một tập lệnh chạy cho mọi kết nối. Tuy nhiên, tôi không biết làm thế nào một người có được thông tin thích hợp ở đây (có lẽ là PID của quy trình sshd cụ thể xử lý kết nối đó?) Tôi thích một số gợi ý.

Cảm ơn!


2
VPN sẽ không phù hợp hơn? OpenVPN là siêu đơn giản để cấu hình.
Ben Lessani - Sonassi

Nghe có vẻ thú vị. Tôi không biết nhiều về VPN. Đây có phải là thứ có thể hoạt động ngay cả khi máy Client được cấu hình để sử dụng DHCP không?
Tom

1
Có, nó chạy một giao diện TUN / TAP khác, vì vậy các giao diện khác không liên quan.
Ben Lessani - Sonassi

@sonassi, có vẻ như điều VPN này sẽ thực hiện thủ thuật. Cảm ơn bạn về thông tin.
Tom

Tôi đã thêm một câu trả lời dưới đây cụ thể hướng dẫn bạn về quy trình VPN với OpenVPN (dựa trên Debian / Ubuntu)
Ben Lessani - Sonassi

Câu trả lời:


4

VPN sẽ không phù hợp hơn? OpenVPN là siêu đơn giản để cấu hình. Dưới đây là cấu hình mẫu và một số liên kết để hướng dẫn bạn trong quá trình tạo chứng chỉ:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

Sau đó tạo một tệp mới /etc/openvpn/client_server.confvà đặt các mục sau vào đó, thay đổi tệp SERVER_IP_ADDRESSphù hợp

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

Sau đó, tạo một khóa cho mỗi người dùng sẽ kết nối và tạo tệp cấu hình trong thư mục ccd

./build-key-pkcs12 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

Địa chỉ IP PHẢI phù hợp với / 30 mạng con (xem http://www.subnet-calculator.com/cidr.php ), vì chỉ có 2 địa chỉ khả dụng (máy chủ và máy khách) cho mỗi kết nối. Vì vậy, IP khách hàng khả dụng tiếp theo của bạn sẽ là 192.168.100.6, v.v.

Sau đó, bạn có IP tĩnh cho mỗi người dùng kết nối.

Sau đó cung cấp the user1@domain.com.p12tệp cho người dùng cuối và sử dụng tệp cấu hình sau

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

Cảm ơn câu trả lời thấu đáo! Tôi có hai câu hỏi về điều này, mặc dù. A) Chỉ định 255.255.255.0 cho dòng ifconfig-push của máy khách dường như không hoạt động, nhưng nó hoạt động nếu tôi chỉ định địa chỉ IP thứ hai. Tại sao lại thế này? Và B) phương pháp này có nghĩa là 4 địa chỉ IP được sử dụng cho mỗi kết nối?
Tom

Trên một số hệ thống Linux, cú pháp cho dòng ifconfig-push là khác nhau. Ví dụ. ifconfig-push 192.168.100.2 192.168.100.3- Tôi không biết tại sao nó khác trên nền tảng. Và vâng, điều đó có nghĩa là 4 IP được sử dụng cho mỗi khách hàng (lãng phí, nhưng bản chất của con thú).
Ben Lessani - Sonassi

3

Nếu mỗi máy khách có tên người dùng khác nhau, bạn có thể sử dụng netstatđể tìm hiểu sshdquá trình người dùng đang nghe cổng nào . Ví dụ:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

3

Bạn có thể thay đổi phạm vi cổng phù du ( /proc/sys/net/ipv4/ip_local_port_rangeđối với Linux) và sau đó sử dụng các cổng được phân bổ tĩnh ngoài phạm vi đó.


Không cần phải thay đổi phạm vi phù du cho điều đó. Theo mặc định, phạm vi phù du kết thúc ở 61000, do đó, có hàng ngàn số cổng có sẵn ở trên đó. Tôi thường sử dụng echo $[61002+RANDOM%4532]để chọn một số cổng trong phạm vi đó.
kasperd

2

Tôi muốn thiết lập giống như bạn, tôi đã tăng mức độ nhật ký của máy chủ SSH lên DEBUG và nó hiển thị trong nhật ký cổng cục bộ của máy khách là gì

ví dụ:

lệnh khách hàng: ssh -N -R0:127.0.0.1:5522 connector@example.com

Nhật ký máy chủ:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

ở đó bạn thấy số cổng


0

Bạn sẽ có thể trích xuất thông tin liên quan từ đầu ra của:

lsof -i tcp

Chạy như root.


0

Chạy đoạn script này trên máy chủ:

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

Bạn có thể hoặc không cần hai sudo. Xóa nếu bạn không.

PS - Đây là phiên bản sửa đổi của một giải pháp tôi tìm thấy ở nơi khác một thời gian trước. Tôi nghĩ rằng nó có thể đến từ StackOverflow, nhưng tôi không thể tìm thấy tài liệu tham khảo ban đầu.

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.