Wednesday, November 21, 2018

Tạo SSH Tunnel và Tự Khởi Động Khi Reboot (Part 2)

Như mình đã giới thiệu sơ sơ qua ở Part 1. Hôm nay mình xin giới thiệu đến part 2 là SSH Tunnel để giải quyết một bài toán đại loại như tạo một Tunnel (đường hầm) trên tại máy của mình luôn luôn kết nối với máy đích. Mình và máy tính này sẽ luôn kết nối với nhau. Mình chẵng cần phải đi đâu xa cả, vì mình đã NAT nó vào localhost port của mình.

Việc làm làm cho mình lưu thông dễ dàng, không bị cản trở bởi firewall các thứ. Thông một lần là mấy lần sau thoáng. Let's go!

Hiện tại mình có mô hình như sau:

Server này qua rất nhiều lớp firewall, mình đã rất mệt khi đã NAT từ lớp này đến lớp khác để có thể đến được máy đích trong local.

MỤC TIÊU

NAT được port 9100 (port mặc định của Node Exporter ai theo dỗi chuỗi Series của mình về Monitoring sẽ rõ) đến con Prometheus. Để Prometheus dễ dàng lấy metrics từ thằng này một cách trơn tuột.

Nói thêm: Thật ra thì nó có thể lấy metrics thông qua HTTP nginx reverse proxy các thứ. mà HTTP giả sử nó bị hết SSL hoặc là nginx tạch thì đâm ra không thể collect metrics. Nên mình đã chọn cách tạo tunnel trên localhost cho dễ dàng hơn.

THỰC HIỆN

Trên con server chứa node exporter (gọi là máy đích vậy).
tcp6       0      0 :::9100                 :::*                    LISTEN      11487/node_exporter

 OK sau khi NAT port 6009 từ ngoài Internet vào Public IP của mình. Để xem public IP hiện tại của mình thì có thể vào đây nha.

Vậy chỉ cần ai sử dụng lệnh: ssh h6009@yourpublic_ip -p 6009 thì có thể SSH vào con máy chủ này nhé. Xong, ở yên đây nhé.

Trên con server local (prometheus) muốn tạo tunnel SSH

Đầu tiên mình sẽ kiếm một port nào chưa sử dụng > 1024 nha. Vì mấy port kia toàn là port mặc định nên mình sẽ hên xui chọn đại 1 port cao cao. Khuyến khích càng cao càng tốt. Khi rãnh mình sẽ viết 1 cái tool python để có thể tự động làm cái việc mở tunnel tự động. Hãy theo dỗi Blog mình nha.

Tuy nhiên giờ mình sẽ làm bằng tay để các bạn có thể hiểu được nguồn góc của nó như thế nào.

Úm ba la xì bùa chọn đại: 60009. à rồi. Port này sẽ làm port để NAT vào localhost nha.

Kiểm tra xem có ai sử dụng cái này chưa đã: netstat -nltp | grep 60009 mình xài Ubuntu, bạn nào xài Windows thì netstat -an để kiểm tra tất cả các port đang dùng hay sao ý. Nếu mà grep không ra gì hết là OK. Xài được.

Chúng ta sẽ sử dụng lệnh quan trọng của bài học này đó chính là:

/usr/bin/autossh -vvv -M 0 -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -p 6009 -l h6009 IP_cuamaydich -L 60009:localhost:9100
Như các bạn đã biết, mình có nói đến cách xem khi một lệnh mình không biết nó là gì. Đúng rồi! man autossh. Cũng có bạn hỏi mình sự khác biệt của SSH và AUTOSSH nên mình cũng làm cho cả 2 thằng trên luôn. Còn so sánh thì tự sử dụng man sshman autossh so sánh nha.

OK giờ mình sẽ giải thích cái nào quan trọng thôi, còn không quan trọng mình không giải thích dài dòng. Tuy nhiên ai thích tìm hiểu thì cứ vào man ssh.

-vvv : Như mình đã nói ở Part 1 phía trên. Đây là Verbose. Không biết xem lại past 1 nha. Không thích thì xóa đi sẽ ngắn gọn hơn. Nhưng mình lại thích để. Để để một lát còn dùng systemctl status xem nó chạy như thế nào. Tiêu đề mình có ghi là Tự Khởi Động Khi Reboot

-p : Port number. Như part 1. Chẵng có gì hot. Tuy nhiên mình phải chọn đúng port để ssh đến. Nên đối với mình là quan trọng và cần nhắc lại rõ ràng cho các bạn biết.

 -l <h6009 - username trên máy đích> <ip máy đích>
-L : <Port trên localmachine>:<ip_hoặc_localhost>:<port cần nat trên máy đích>

Quan trọng: bạn muốn NAT bao nhiêu port thì hãy -L bấy nhiêu lần nhé. Nếu NAT một port thôi thì chỉ cần -L một lần. 
Giả sử may này cần NAT thêm 1 port nữa thì chỉ cần vô chỉnh thêm cái -L nữa là OK.

À tuy nhiên nếu bạn đã xem qua bài một ở nội dung CONFIG thì bạn có thể làm cái lệnh trên cực ngắn lại và dễ dàng dễ đọc hơn nhiều.

SSH cũng làm được, lệnh cũng tương tự các bạn có thể tham khảo thêm:

/usr/bin/ssh -N -q -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -p 6622 -l h6009 -L 60009:localhost:9876 -L 31022:localhost:9100 -i /home/h6009/.ssh/id_ed25519 hacker6009.blogspot.com

KẾT QUẢ CỦA SSH TUNNEL


Nếu bạn nhìn thấy port như thế này là OK
Để kiểm tra kết quả, ta có thể sử dụng lệnh netstat -nltp | grep 60009 - Nếu bạn thấy port này đã xuất hiện trên local của bạn. Thì bạn có thể curl nó trên local để xem có quả curl localhost:60009

Note: 
- Warning: exporter_tunnel-bla-bla.service changed on disk. Run 'systemctl daemon-reload' to reload units. thì hãy gõ lệnh như nó hướng dẫn rồi start lại các thứ nhé.


- Mình setup cùng Prometheus chung với Grafana luôn, mình giải đáp vậy nếu các bạn có thắc mắc.

LUÔN KHỞI ĐỘNG (STARTUP) KHI REBOOT
Bạn thấy đó, khi bạn thoát khỏi terminal, tunnel cũng biến mất theo. Không lẽ bạn treo terminal luôn sao?

Có một số bạn bảo mình dùng screen đi (ai chưa biết dùng screen thì đợi hướng dẫn tiếp theo của mình nha). Screen để nó chạy ngầm cũng OK. Nhưng khi reboot lại thì mất ý.

Nên mình sẽ hướng dẫn dùng systemd cho các bản Ubuntu 14.04 trở lên. Các phiên bản thấp hơn thì chưa hỗ trợ systemctl thì phải dùng /etc/init.d/ thì các bạn tự tìm hiểu nha.

Ta sẽ tạo một file service ở /etc/systemd/systemd/exporter_tunnel-publicIPlabla.service:

[Unit]
Description=canifa-staging tunnel
After=network-online.target
[Service]
Environment="AUTOSSH_GATETIME=0"
User=trobz
ExecStart=/usr/bin/ssh -N -q -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -p 6622 -l h6009 -L 60009:localhost:9876 -L 31022:localhost:9100 -i /home/h6009/.ssh/id_ed25519 hacker6009.blogspot.com
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target


LỜI KẾT
Khi đọc hãy cố gắng tìm hiểu. Kiến thức không phải tự nhiên mà có được. Bạn hãy có gắng đọc đi đọc lại vài lần là sẽ hiểu.

No comments:

Post a Comment