Để có thể truy cập vào server đặt trong homelab tại nhà từ Internet, chúng ta có thể sử dụng 2 cách:
- Kết nối thông qua VPN vào mạng nội bộ tại nhà. Tham khảo cách thiết lập WireGuard VPN.
- Cấu hình NAT Port (Destination NAT) trên Router chính để truy cập thông qua địa chỉ IP Public.
Với cách 2, bạn có thể thiết lập thêm Dynamic DNS để có thể truy cập vào server bằng cách sử dụng tên miền, khỏi phải nhớ địa chỉ IP Public.
Tuy nhiên có một hạn chế là bạn không thể truy cập vào server thông qua IP Public hoặc tên miền nếu đang ở nhà, nằm chung mạng LAN với Server. Bạn chỉ có thể truy cập server từ mạng Internet bên ngoài (không cùng mạng LAN với server)
Để giải quyết vấn đề này, bắt buộc bạn phải cấu hình thêm Hairpin NAT cho router. Trong bài viết này mình sẽ chia sẻ cách thiết lập Hairpin NAT trên router Mikrotik để có thể truy cập vào dịch vụ mạng trong nhà bằng tên miền, khỏi phải gõ địa chỉ IP của server.
Mục Lục
I. NAT là gì? Destination NAT là gì? Hairpin NAT là gì?
1. NAT là gì?
NAT (Network Address Translation) là một tiêu chuẩn mạng cho phép các thiết bị trong mạng nội bộ có thể giao tiếp với nhau thông qua nhóm IP nội mạng và giao tiếp với mạng bên ngoài thông qua một hay nhiều IP ngoại mạng. NAT được thực hiện trên Gateway Router, thiết bị kết nối giữa mạng LAN nội bộ và mạng WAN bên ngoài.
Hai hình thức NAT phổ biến nhất là Source NAT và Destination NAT. Ngoài ra còn có thêm Hairpin NAT ít người biết đến (hoặc ít có nhu cầu dùng đến)
2. Source NAT
Source NAT hay còn gọi là NAT truy cập Internet là hình thức NAT phổ biến nhất, được thực hiện trên mọi Router để giúp mạng LAN có thể truy cập Internet thông qua cổng WAN trên Router.
Cái này chắc khỏi cần phải hướng dẫn vì ai cũng phải biết làm thì mới truy cập Internet được.
3. Destination NAT
Destination NAT hay còn gọi là NAT port được dùng để truy cập vào máy tính trong mạng nội bộ từ Internet thông qua địa chỉ IP Public của Router. Đây là hình thức NAT bắt buộc phải thiết lập nếu bạn muốn truy cập vào mạng ở nhà khi đang sử dụng Internet bên ngoài.
4. Hairpin NAT
Hairpin NAT hay còn gọi là NAT Loopback là hình thức Source NAT đặc biệt, cho phép các thiết bị trong mạng LAN có thể truy cập đến server trong cùng mạng LAN thông qua địa chỉ Public IP của Router hoặc thông qua tên miền (đã được trỏ về Public IP).
Dưới đây là ví dụ về Destination NAT và Hairpin NAT để mọi người dễ hiểu hơn
Trong sơ đồ trên, chúng ta có 4 thiết bị:
- WORK PC: nằm ngoài mạng LAN, có Public IP là
192.168.88.1
- Router có Public IP là 172.16.16.1 và LAN IP là
192.168.0.1
- Home PC: nằm trong LAN, có LAN IP là
192.168.0.100
- Server: nằm trong LAN có LAN IP là
192.168.0.30
Khi sử dụng WORK PC để truy cập đến Server, Router sẽ thực hiện Destination NAT như sau:
- WORK PC gửi gói tin với Source IP Address là
192.168.88.1
và Destination IP Address là172.16.16.1
trên cổng 443 để yêu cầu gửi dữ liệu từ Server. - Router sẽ thực hiện NAT và chuyển đổi Destination IP Address thành
192.168.0.30
(LAN IP của server). Source IP Address vẫn giữ nguyên là192.168.88.1
- Server nhận được và phản hồi lại gói tin với Source IP Address là
192.168.0.30
và Destination IP Address là192.168.88.1
. - Router nhận được gói tin từ Server và nhận ra gói tin này là một phần của chuỗi kết nối trước đó nên sẽ đảo ngược chu trình NAT, thay thế Source IP Address thành
172.16.16.1
. Destination IP Address vẫn giữ nguyên là192.168.88.1
. - WORK PC được gói tin mà nó đang đợi. Quá trình kết nối được thiết lập giữa WORK PC và Server.
Vấn đề nảy sinh khi Home PC muốn truy cập đến Server (cả hai nằm trong cùng mạng LAN) thông qua Public IP của Router, kết nối sẽ bị lỗi.
- Home PC gửi gói tin với Source IP Address là
192.168.0.100
và Destination IP Address là172.16.1.1
trên cổng 443 để yêu cầu gửi dữ liệu từ Server. - Router sẽ thực hiện NAT và chuyển đổi Destination IP Address thành
192.168.0.30
(LAN IP của server). Source IP Address vẫn giữ nguyên là192.168.0.100
- Server phản hồi gói tin với Destination IP Address là
192.168.0.100
và Source IP Address là192.168.0.30
. Tuy nhiên gói tin nó sẽ gửi thẳng đến Home PC chứ không được xử lý bởi Router vì hai địa chỉ này nằm cùng mạng LAN. - Home PC nhận được gói tin từ Server nhưng nó sẽ tự động huỷ do nó đang đợi gói tin được gửi từ Source IP Address
172.16.1.1
, chứ không phải từ192.168.0.30
- Kết nối vì thế không thể thiết lập. Truy cập từ Home PC đến Server sẽ báo lỗi không truy cập được.
Để giải quyết vấn đề này, chúng ta cần thiết lập Hairpin NAT trên Router.
II. Cấu hình Destination NAT & Hairpin NAT trên router Mikrotik
Có nhiều phương pháp cấu hình Destination NAT và Hairpin NAT trên Mikrotik. Dưới đây là cách thiết lập mình đang sử dụng cho combo Destination NAT và Harpin NAT.
1. Tạo WAN-IP Address List
Trước tiên mình sẽ tạo 1 Address List đại diên cho Public IP của WAN để có thể sử dụng khi tạo NAT.
Truy cập vào Router Mikrotik bằng Winbox. Sau đó truy cập vào IP -> Firewall -> Address Lists. Bấm + để thêm Address List mới.
- Ô Name: Điền WAN-IP
- Address: nhập vào DNS Name của Router Mikrotik. Xem lại bài Hướng dẫn cấu hình Dynamic DNS trên Router Mikrotik để biết cách cấu hình Dynamic DNS trên Mikrotik.
- Bấm OK để lưu lại.
2. Cấu hình Destination NAT
Mình sẽ cấu hình NAT port cho hai cổng 80 và 43 chuyển hướng về LAN IP 192.168.0.30
của server đang cài Nginx Proxy Manager.
Vẫn trong cửa sổ Firewall, bấm chọn tab NAT và bấm dấu + để thêm NAT Rule mới
- Chain: chọn dstnat
- Protocol: chọn 6 (tcp)
- Dst. Port: 80,443
Chuyển qua tab Advanced
- Dst. Address List: mở ra chọn WAN-IP (đã tạo ở bước 1 trước đó)
Chuyển qua tab Action
- Action: chọn dst-nat
- To Addresses:
192.168.0.30
Bấm Apply và OK để lưu lại.
Sau khi thiết lập thành công, mỗi khi sử dụng mạng Internet bên ngoài, mỗi lần mình truy cập vào địa chỉ https://alibaba.thuanbui.me
(đã được trỏ về Public IP của Router), Router sẽ tự động chuyển hướng truy cập về server NPM ở địa chỉ 192.168.0.30
4. Cấu hình Hairpin NAT
Để có thể truy cập vào server trong cùng mạng LAN bằng cách gõ tên miền hay Public IP, mình thiết lập thêm Hairpin NAT.
Tạo NAT Rule mới trong cửa sổ Firewall -> NAT
- Chain: srcnat
- Src. Address: 192.168.0.0/24 (địa chỉ IP của mạng LAN nội bộ)
- Dst. Address: 192.168.0.0/24 (địa chỉ IP của mạng LAN nội bộ)
Chuyển qua tab Action
- Action: chọn masquerade
Bấm vào nút Comment, nhập vào HAIRPIN NAT để sau này dễ nhớ. Bấm OK.
Bấm tiếp Apply và OK để lưu lại.
Tiếp theo mình giữ chuột và kéo NAT Rule HAIRPIN NAT lên trên cùng, chỉ nằm sau dòng NAT Rule dùng để truy cập Internet và NAT Rule của WireGuard (nếu có).
III. Kiểm tra kết nối
Sau khi thiết lập Hairpin NAT thành công, quy trình kết nối từ Home PC đến Server sử dụng Public IP 172.16.16.1
sẽ diễn ra như sau:
- Home PC gửi gói tin với Source IP Address là
192.168.0.100
và Destination IP Address là 172.16.1.1 trên cổng 443 để yêu cầu gửi dữ liệu từ Server. - Router sẽ thực hiện Destination NAT và chuyển đổi Destination IP Address thành
192.168.0.30
(Local IP của server). Router đồng thời thực hiện Hairpin NAT, thay thế Source IP Address của gói tin192.168.0.100
thành IP address của LAN Interface192.168.0.1
. Gói tin sau khi được xử lý sẽ có Destination IP Address là192.168.0.30
và Source IP Address là192.168.0.1
- Server phản hồi gói tin với Destination IP Address là
192.168.0.1
và Source IP Address là192.168.0.30
. - Router nhận ra gói tin này thuộc chuỗi kết nối trước đó nên sẽ đảo ngược chu trình Destination NAT và Hairpin NAT trước đó. Source IP Address được đổi thành
172.16.1.1
và Destination IP Address được đổi thành192.168.0.100
- Home PC nhận được đúng gói tin phản hồi nó mà nó đang đợi. Quá trình kết nối được thiết lập thành công giữa Home và Server.
Kết hợp Destination NAT, Hairpin NAT, Nginx Proxy Manager và Dynamic DNS, mình có thể tạo các tên miền phụ dạng aaa.thuanbui.me
hay xxx.thuanbui.me
để sử dụng cho từng dịch vụ mạng khác nhau được thiết lập trong Homelab. Mình có thể truy cập vào các dịch vụ này thông qua tên miền ở bất cứ đâu, khi dùng mạng ở nhà hay dùng mạng ở quán cafe. Việc quản lý trở nên đơn giản và tinh gọn hơn rất nhiều.
Hướng dẫn Hairpin NAT đến đây là hết. Chúc bạn thực hiện thành công!
Hi Anh. Ảnh mô hình mạng anh vẽ trên phần mềm nào vậy, có gì chỉ cho em với. Em cám ơn anh nhiều.
Mình dùng Draw.io nhé. Miễn phí 100%
Hi anh,
Hiện tại em có 2 dãi ip 1 dãy từ 192.168.10.30-254 chạy qua wireguard còn 1 dãy từ .10.1-.10.29 không qua wireguard. Nhưng khi tiến hành harpin nat thì chỉ những dãy ip không qua wireguard mới truy cập được tên miền qua hairpin nat còn dãy đi qua wireguard thì không. Không biết có cách cấu hình nào để cho dãy qua wireguard truy cập được không ạ. Mong anh hướng dẫn.
Cám ơn anh!
Dãy IP chạy qua WireGuard thì nó không còn đi theo hướng Public IP của Router nữa nên Hairpin NAT không có tác dụng rồi. Mình chưa hiểu rõ sơ đồ mạng của bạn ra sao nên không biết hướng dẫn sao cho đúng.
Mình ko muốn cho mạng nội bộ có internet thì vào đâu bạn nhỉ
Bạn cần chỉnh lại trong NAT Rule, bỏ cái Rule srcnat để ngắt kết nối Internet của mạng nội bộ.
Cám ơn bạn. Mình làm được rồi.
Cảm ơn Thuận Bùi!
Mình đóng góp thêm 1 cách cấu hình nhanh, gọn và lẹ hơn:
Vào Winbox, vào tiếp New Terminal, và dán đoạn code này vào là sẽ NAT được:
/ip firewall address-list
add address=xxxxxx.sn.mynetname.net list=WANDDNS
/ip firewall nat
add action=masquerade chain=srcnat comment=”HAIRPIN NAT 1″ dst-address=\
192.168.1.0/24 src-address=192.168.1.0/24
add action=dst-nat chain=dstnat comment=”NAT Port 14542″ dst-address-list=WANDDNS dst-port=14542 \
protocol=tcp to-addresses=192.168.1.242 to-ports=14542
Trong đó 14542 là port cần NAT, 192.168.1.242 là địa chỉ IP của server hoặc đầu ghi camera, và xxxxxx.sn.mynetname.net là DDNS của Mikrotik xem trong mục IP-> Cloud.
Cảm ơn đã đọc!
Bạn cho mình hỏi mình có mạng lan với dải ip từ 192.168.1.21-192.168.1.255 đi qua wireguard và 1 con nas synology ở địa chỉ 192.168.1.5. Hiện tại thì nếu set hairpin nat như hướng dẫn thì mình ko truy cập được vào con nas bằng tên miền được trong mạng nội bộ với dải ip đi qua wireguard. Có cách nào giải quyết vấn đề này không bạn?
Dải IP khi đi qua WireGuard rồi truy cập vào tên miền của NAS thì coi như là đang truy cập từ bên ngoài (từ Server cài WireGuard) vào mạng nội bộ của bạn, không liên quan đến Hairpin NAT nữa. Nếu tên miền của NAS public thì đúng ra bạn phải truy cập được bình thường. Mình đã thử cấu hình y chang bạn nói và thấy truy cập bình thường.
Có cần tắt rule hairpin nat hay không bạn, mình cài đặt giống bạn hướng dẫn nhưng lại không vào được từ local
Anh có vẻ quên chưa giải thích là hệ thống a thiết kế đang có nat overload. Nên cả src và đặt đều bị Nat
Em làm y chang vậy nhưng apply mạng ở nhà có 2 line PPPoE nên đang vẫn fail ạ. Cần điều chỉnh thêm phần nào không a. Phần LAN to LAN cần setting thêm Out Interface không ạ?
Mình không có 2 line PPPoE nên chưa thử bao giờ. Chắc bạn cần mò thêm phần cấu hình lại cho hợp lý.
Cảm ơn anh đã chia sẻ!!!!
E mới mua một con Mikrotik RB760IGS
Cho em hỏi chút, trước e dùng thẳng cục M5 của TPLINK thì có cái cấp phát một địa chỉ LAN tĩnh dành cho NAS sử dụng. Không biết với mikrotik thì làm nó ở đâu, mong anh hướng dẫn
Static IP thì cấu hình trên con NAS sẽ tót hơn nhé. Còn làm trên Mikrotik thì em tham khảo cái này: https://www.shellhacks.com/mikrotik-set-static-ip-for-dhcp-client/
Dear anh!
Anh làm ở chỉ dùm em cấu hình mở cổng để truy cập vào proxy server với, em đã cấu hình như sau:
General Tab:
– Chain: dstnat
– Protocol: tcp (udp)
– Dst. Port: 80 (443 đã mở cả tcp và udp)
Action Tab:
– Action: dst-nat
– To Addresses: 192.168.1.85
– To Ports: 8880 (4443 đã mở cả tcp và udp)
P/S: Đã chỉnh lại Caddyfile về IP 192.168.1.85 nhưng không hoạt động, check open port thì thấy đã mở 80 và 443
Hướng dẫn NAT cho Mikrotik google ra nhiều lắm nha e: https://cnttshop.vn/blogs/chuyen-muc-ve-mikrotik/cau-hinh-nat-port-tren-mikrotik-voi-ip-wan-dong-hoac-tinh
Cảm ơn a đã trả lời!!!
Tất cả các bài trên mạng đều bỏ qua bước tạo Address List từ DDNS có sẵn của mikrotik nên em làm chưa cái nào thành công, tới khi nhận được bài viết này của anh thì làm phát được ngay.
Một chút thắc mắc của em là trước đó mà không có dịch vụ Cloud DDNS của Mikrotik hoạt động thì phải cập nhật IP bằng tay ạ 🙁
Có nhiều cách để cấu hình NAT trên mikrotik. Ngoài cách dùng Dst. Address thì có thể thay bằng In. Interface và chọn WAN / PPPoE Interface, như hướng dẫn ở đây: https://blog.shaharia.com/mikrotik-nat-port-forwarding-access-local-pc-from-internet
Cho e hỏi chút nữa!!!
1. Sau khi làm theo bài của a thì đã thành công truy cập vào các dịch vụ thông qua caddy server (vì dùng caddy server trên nas synology nên buộc phải chuyển cổng thành 8880:80 và 4443:443) tuy nhiên chính dịch vụ ddns của mikrotik thì lại không thể truy cập được nữa cứ truy cập vào là bị báo ERR_SSL_PROTOCOL_ERROR, mong a chỉ cách sửa (tắt thử các rule đã NAT thì truy cập vào lại bình thường).
2. Em tự dưng bị xuống role admin nên không truy cập được vào terminal nữa (báo lỗi terminal (9) ), có cách nào sửa sang role full mà không phải reset router không ạ
1. Mọi truy cập vào WAN IP (DDNS) đều chuyển về Caddy sau khi thiết lập NAT. Nên nếu chưa khai báo DDNS của Mikrotik trong Caddyfile thì nó báo lỗi ERR_SSL_PROTOCOL_ERROR là đúng rồi.
2. A ko biết nhé
Bài viết chi tiết, rõ ràng và mình đã hiểu. Đội ơn bạn
Hi anh cho em hỏi. Nếu như Lan IP của Sever khác lớp mạng với của Router, cụ thể là:
Server: 192.168.31.1
Router: 192.168.1.1
Thì không biết cấu hình Hairpin Nat như thế nào để có thể truy cập được khi đang trong mạng nội bộ vậy ạ
Server khác subnet với mạng nội bộ thì cần cấu hình thêm Routing Table nhé.
Em có con web cài ubuntu wordpress dựng trên local host, ip động. Mà muốn Nat Port 80,443 ra internet qua con Mirotik. Làm các port khác Nat bình thường.
Có 80,443 cứ check canyouseeme, là cứ báo closed. Chán 🙁