Cách tạo đường hầm qua SSH

Cách tạo đường hầm qua SSH

Refer this post for more concise and straightforward explanation.

Câu chuyện là hôm rồi nói chuyện với thằng bạn làm CTO. Thằng này rất giỏi, hồi học ĐH hay được hội bạn gọi là 4, bây giờ thành đạt làm CTO rồi nên là ... nhưng mà lũ bạn vẫn gọi là 4` (đen =)) )

Thằng bạn làm CTO có cái máy ở nhà dùng để đặt lệnh cho cá ăn

Cho cá ăn

Thi thoảng lên công ty mặc dù làm CTO công việc bận sấp mặt hồ nhưng vẫn phải truy cập vào cái máy ở nhà, đặt lệnh cho máy để máy điểu khiển cần gạt cho cá ăn.

  • Giải pháp 1: cài teamviewer rồi điều khiển trực tiếp. Nhưng cái máy điều khiển cần gạt là bộ Raspberry Pi, có phải chạy window hay Ubuntu đâu nên giải pháp không hợp lý
  • Giải pháp 2: SSH từ máy công ty vào máy ở nhà rồi gửi lệnh

Giải pháp 2 nghe vẻ hợp lý nhưng IP của máy ở nhà bị ISP (nhà cung cấp mạng) thay đổi liên tục nếu trong vòng 30 phút (lượng thời gian có thể khác) liên tục không có truy cập mạng.

Giải pháp mình đề cập là SSH tunnel (đường hầm SSH)


Đường hầm SSH là gì?

Đường hầm SSH là liên kết giữa 2 máy để khi mọi truy/xuất ở 1 cổng nhất định ở máy này sẽ tương tự như truy/xuất ở 1 cổng nhất định khác ở 1 máy khác. Giống như teleport.

Bằng cách chạy lệnh ssh -R <port a>:localhost:<port b> PC_A ở trên máy PC_B. Sau đó mọi truy xuất vào PC-A tại cổng a sẽ có kết qủa trả về như truy xuất vào localhost:<port b> (máy localhost, cổng b) từ máy PC-B

Áp dụng gỉa sử có 1 máy chủ cố định là remote-pc. Từ máy ở nhà (máy điều khiển cho cá ăn) gõ lệnh ssh -R 2222:localhost:22 remote-pc. Sau đó ở 1 máy khác, vd như máy ở công ty, truy cập vào remote-pc cổng 2222 sẽ kết nối trực tiếp với máy ở nhà qua cổng 22.

Ứng dụng khác là chẳng hạn như 1 vài chỗ không cho phép kết nối từ xa đến máy tính trong cơ quan. Lúc đó chỉ cần có 1 máy chủ bên ngoài bất kì cho phép ssh là đã có thể thiết lập đường hầm teleport qua SSH và truy cập vào máy trong cơ qua bất kì lúc nào.

Ngược lại với cờ -R là cờ -L , tương tự như ảnh ở trên nhưng với mũi tên ngược lại.

Bằng lệnh ssh -L <port-a>:pc_c:<port-b> pc_btừ máy PC-A.

Sau đó mọi truy cập vào port-a từ máy PC-A tương tự như truy cập vào PC-C port b từ máy PC-B. Lưu ý PC-C có thể là localhost  hoặc là địa chỉ LAN (địa chỉ nội bộ) được xem từ máy PC-B

Cách làm này có lợi khi bạn chỉ có thể truy cập vào một máy nội bộ C khi ngồi ở máy nội bộ khác B, và máy B được công khai và truy cập từ địa chỉ bất kì. Trường hợp máy B không thể được truy cập công khai, mà bạn lại có thể chạy lệnh tùy ý từ B, bạn có thể tạo một teleport ngược thông qua một máy công khai khác như hướng dẫn ở phần trước với cờ -R.

Ví dụ khác: một vài phần mềm hoặc trang web bản quyền bắt buộc phải máy truy cập phải từ 1 nhóm IP cố định mới được cấp phép cho xem, cách làm này cũng có thể được áp dụng.

Thật ra với truy cập web, có cách dễ dàng hơn để tạo cổng truy xuất thông qua máy khác

Một vài cờ được khuyến khích khi dùng ssh trong những trường hợp này

  • -f: chạy ssh background
  • -N: mở SSH nhưng không chạy lệnh
  • -T: không khởi tạo psudo-tty mở máy được truy cập SSH. Tiết kiệm chút bộ nhớ

Tham khảo: https://askubuntu.com/a/50075/254900


Full example to open SSH tunnel, make it available to public.

Situation: there are 3 machines, Home PC (dynamic IP), remote PC (static IP 1.2.3.4, accessible via user name root) and work PC (dynamic IP)

Step 1: from home PC

  • Create ssh user via adduser remote-user
  • Start sshd if it is not running via sudo systemctl start sshd
  • Open SSH tunnel via ssh -R \*:2222:localhost:22 -NT root@1.2.3.4.
    Add -f option next to -NT to run background.
    Note that \*: is required for the tunnel to be public accessible. Otherwise, port forward will be available in loopback interface only
  • To run this command for long time. Install autossh package and execute, instead
autossh -o "ServerAliveInterval 30" -o "ServerAliveCountMax 100" -R *:2222:localhost:22 -NT root@1.2.3.4

Add -f flag to run in background
Some command lines shells (e.g. zsh) recognize the * character as especial character, you need to escape it to make sense with \*.

Step 2: from remote PC

  • Allow port forwarding. Edit /etc/ssh/sshd_config, append the following content
Match User root
   GatewayPorts yes
   AllowTcpForwarding yes
  • Restart sshd via sudo systemctl restart sshd
  • Disable firewall at port 2222/TCP via ufw allow 2222/tcp && ufw reload

Now, the remote PC is open on port 2222, all access to port 2222 is forward to port 22 of the home PC

Step 3: from work PC

  • Test SSH access via ssh remote-user@1.2.3.4 -p 2222
Buy Me A Coffee