Trang chủTin tứcBảng NAT trong IPTABLES - Hướng dẫn thao tác chi tiết
Bảng NAT trong IPTABLES - Hướng dẫn thao tác chi tiết

Bảng NAT trong IPTABLES là một phần quan trọng của hệ thống tường lửa Linux. Bài viết sẽ hướng dẫn các thao tác với bảng NAT trong IPTABLES chi tiết nhất.

Trong những bài trước ta đã tìm hiểu về bảng Filter trong IPTABLES, đến với bài viết này ta sẽ tìm hiểu về cách sử dụng bảng NAT trong IPTABLES. Bài viết này sẽ hướng dẫn các bạn chi tiết nhất cách mà các gói tin hoạt động khi đến với IPTABLES cũng như cách cấu hình của nó ra sao.

1. Lý thuyết cần tìm hiểu trước

Bảng NAT (Network Address Translation) trong iptables là một phần quan trọng của hệ thống tường lửa Linux, cho phép thay đổi địa chỉ IP và cổng của gói tin khi chúng đi qua tường lửa. Về cơ bản ta có thể hiểu bảng NAT có vai trò điều hướng gói tin sao cho đúng với mục đích của chúng ta như chuyển đổi các IP nguồn đích của gói tin hay có thể là một cầu nối trung gian để các gói tin đi qua nhằm đảm bảo tính bảo mật.

Bảng NAT trong iptables là một phần quan trọng của hệ thống tường lửa Linux
Bảng NAT trong iptables là một phần quan trọng của hệ thống tường lửa Linux

Bảng NAT trong IPTABLES có 3 chain chính được sử dụng.

PREROUTING (Pre-routing):

  • Chain này được kích hoạt trước khi gói tin vào bảng router và trước khi gói tin được định tuyến.
  • Chủ yếu được sử dụng để thay đổi địa chỉ đích của gói tin (Destination NAT - DNAT).
  • Thường được sử dụng để chuyển hướng các yêu cầu đến một địa chỉ IP hoặc cổng đích khác.

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

POSTROUTING (Post-routing):

  • Chain này được kích hoạt sau khi gói tin đã đi qua tất cả các quyết định định tuyến.
  • Chủ yếu được sử dụng để thay đổi địa chỉ nguồn của gói tin (Source NAT - SNAT).
  • Thường được sử dụng để chuyển đổi địa chỉ nguồn của gói tin để xuất ra Internet hoặc mạng ngoại vi.

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

OUTPUT:

  • Chain này được kích hoạt khi gói tin được tạo ra bởi chính hệ thống đó.
  • Chủ yếu được sử dụng để thay đổi địa chỉ nguồn của gói tin (Source NAT - SNAT) cho các gói tin tạo ra từ hệ thống đó.

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

2. Mô hình thực hành

Mô hình thực hành
Mô hình thực hành

Trong bài lab này mình sẽ sử dụng máy centos 7 cài đặt iptables làm firewall dùng để điều hướng các request liên quan đến trang web chuyển hướng đến máy centos 8 chứa trang web. Yêu cầu là phải giấu được IP của máy Centos 8. Tất cả các request liên quan đến web thì đều phải thông qua iptables trên máy Centos 7 xử lý.

quy trình các bước
quy trình các bước 

Quy trình xử lý gói tin đối với các gói tin liên quan đến bảng NAT trong IPTABLES:

  • Đầu tiên ta sẽ lên trình duyệt và gõ tên miền khuongquang.com nó sẽ gửi request đến máy Centos 7.
  • Khi đến máy Centos 7 thì các gói tin liên quan đến trang web vẫn có đích là IP của máy Centos 7 và được đẩy qua chain PREROUTING bảng NAT để thay đổi đích là IP của máy Centos 8.
  • Tiếp theo gói tin sẽ được đưa đến chain FORWARD của bảng Filter kiểm tra xem có cho phép chuyển gói tin đến máy khác không.
  • Tiếp theo gói tin sẽ sẽ được đưa đến bảng POSTROUTING để tiếp tục thay đổi nguồn của gói tin thành IP của máy Centos 7 rồi chuyển gói tin về máy Centos 8.
  • Máy Centos 8 sau khi nhận được request sẽ tiến hành trả lời và đưa ra gói tin trả lời đến máy Centos 7.
  • Ở trên máy Centos 7 thì chain POSTROUTING lại tiếp tục thay đổi nguồn và đích rồi sau đó gói tin được trả về ngược lại cho trình duyệt.
  • Lúc này trình duyệt tiến hành phân giải gói tin và nhận được kết quả, nhưng trình duyệt sẽ hiểu rằng máy Centos 7 là máy chứa trang web chứ không phải Centos 8.

3. Thực hành thao tác với bảng NAT trong IPTABLES

Ở phần thực hành này mình sẽ hướng dẫn các bạn từng bước và giải thích chi tiết các bước ra nhưng khi làm theo từng bước sẽ gặp một vấn đề là khi xóa các cấu hình có sẵn thì sẽ không thể SSH được. Nên các bạn chỉ được chi tiết các bước để tham khảo thôi nhé, còn việc chính của các bạn sẽ là viết script chứa tất cả các câu lệnh rồi chạy thôi.

Thực hành thao tác với bảng NAT trong IPTABLES
Thực hành thao tác với bảng NAT trong IPTABLES

3.1 step by step

Ở các bài trước khi hướng dẫn về Nginx mình đã hướng dẫn các bạn về cài đặt virtual host cho trang web rồi nên bây giờ mình sẽ không hướng dẫn nữa và chỉ giả sử rằng mình đã cài đặt virtual host khuongquang.com trên máy Centos 8.

Cho phép tính năng chuyển tiếp gói tin linux

echo 1 > /proc/sys/net/ipv4/ip_forward

Xóa hết các rule đã thiết lập sẵn ở các bảng đi.

iptables -F

iptables -t nat -F

iptables -X

service iptables save

service iptables restart

Lúc này ta không thể SSH được do đã xóa hết các rule đi rồi.

Cho phép các thiết lập đang hoạt động và cho phép ssh vào tagert ACCPET.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Sử dụng chain forward để cho phép chuyển tiếp gói tin đến máy web.

  • Cho phép forward gói tin có nguồn từ dải ip 192.168.20.0/24 đi từ card ens36 ra ens33

iptables -A FORWARD -s 192.168.20.0/24 -i ens36 -o ens33 -j ACCEPT

  • Cho phép forward gói tin có nguồn 192.168.20.14/32 với port 80

iptables -A FORWARD -d 192.168.20.14/32 -p tcp -m tcp --dport 80 -j ACCEPT

Thao tác với bảng NAT để có thể thay đổi nguồn và đích

  • Những gói tin có đích là 192.168.10.21 port 80 sẽ chuyển thành đich 192.168.20.14

iptables -t nat -A PREROUTING -d 192.168.10.21/32 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.14:80

  • Những gói tin nào có nguồn từ dải 192.168.20.0/24 với output là ens33 sẽ được chuyển thành ip của ens33

iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens33 -j MASQUERADE

  • Những gói tin nào có đích là 192.168.20.14 sẽ đổi nguồn thành 192.168.20.13

iptables -t nat -A POSTROUTING -d 192.168.20.14/32 -p tcp --dport 80 -j SNAT --to-source 192.168.20.13

Bây giờ tất cả các thiết lập đã xong, chúng ta cần lưu lại cấu hình và tiến hành restart.

service iptables save

service iptables restart

3.2 bash script

Ta hãy tạo một bash script bằng lệnh vi.

vi ~/nat.sh

Thêm nội dung sau vào file.

#!/bin/bash

# cho phép chuyển tiếp gói tin

echo 1 > /proc/sys/net/ipv4/ip_forward

# xóa các thiết lập cũ

iptables -F

iptables -t nat -F

iptables -X

service iptables save

service iptables restart

# Thao tác forward với bảng filter

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

iptables -A FORWARD -s 192.168.20.0/24 -i ens36 -o ens33 -j ACCEPT

iptables -A FORWARD -d 192.168.20.14/32 -p tcp -m tcp --dport 80 -j ACCEPT

# Thao tác forward với bảng NAT

iptables -t nat -A PREROUTING -d 192.168.10.21/32 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.14:80

iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens33 -j MASQUERADE

iptables -t nat -A POSTROUTING -d 192.168.20.14/32 -p tcp --dport 80 -j SNAT --to-source 192.168.20.13

# Lưu lại cấu hình và chạy lại dịch vụ

service iptables save

service iptables restart

Tiến hành lưu file và cấp quyền thực thi cho file.

chmod +x ~/nat.sh

Tiến hành chạy file.

. ~/nat.sh

Kiểm tra lại các bảng bằng lệnh:

iptables -L

iptables -L -t nat

Kiểm tra kết quả
Kiểm tra kết quả

Ta tiến hành chỉnh sửa file host trên máy windows với đường dẫn “C:\Windows\System32\drivers\etc\hosts”

Thêm vào dòng sau:

192.168.10.21 khuongquang.com

Tiến hành lưu và thoát.

Bây giờ ta lên trình duyệt gõ tên miền.

Kết quả thành công
Kết quả thành công

Đến đây là ta đã hoàn thành bài lab rồi. Chúc các bạn thành công!

4. Một số các lệnh bổ trợ khác về bảng NAT trong IPTABLES

Một số lệnh bổ trợ bảng NAT trong IPTABLES
Một số lệnh bổ trợ

Mặc định iptables chúng ta nên để từ chối tất cả INPUT, không cho phép FORWARD và cho phép tất cả OUTPUT. Tất cả các rule này ta nên thêm vào trong default. Chỉ khi có những rule bổ trợ khác thỏa mãn mới là ngoại lệ.

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP

Khi ta thiết lập cấu hình theo bash script trên thì sẽ không cho phép ta sử dụng lệnh ping. Để có thể sử dụng ta cần thêm rule mới vào iptables.

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Chặn các kết nối SSH đa nhập từ cùng một IP.

# Thiết lập giới hạn kết nối từ một địa chỉ IP cụ thể

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH


# Kiểm tra nếu địa chỉ IP đã có 2 kết nối, thì từ chối thêm kết nối mới

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j DROP


# Cho phép kết nối mới nếu chưa đạt đến giới hạn

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

Câu hỏi đặt ra nếu chúng ta muốn khi ta lên trình duyệt gõ khuongquang.com:90 mà muốn tất cả các gói tin đi qua iptables sẽ chuyển từ port 90 sang 80 thì phải làm sao? Việc này rất đơn giản ta chỉ việc thay thế câu lệnh ở chain PREROUTING  bảng NAT thành như này.

iptables -t nat -A PREROUTING -d 192.168.10.21/32 -p tcp --dport 90 -j DNAT --to-destination 192.168.20.14:80

Hãy sửa lại cấu hình , lưu lại và reload lại cấu hình sau đó lên trình duyệt gõ thử khuongquang.com:90

Hiển thị kết quả thành công
Hiển thị kết quả thành công

Đến đây là đã hết phần hướng dẫn của mình rồi.

5. Tổng kết

Bảng NAT trong IPTABLES là một bảng cực kỳ quan trọng. IPTABLES hơn các firewall khác chính vì bảng NAT này. IPTABLES có thể can thiệp trực tiếp vào gói tin để sửa nguồn và đích. Đây là điểm lợi hại mà ít các firewall miễn phí có thể làm được. Chính vì nó quan trọng như thế bạn cần chắc chắn phải nắm vững về nó nhé. Nếu có gì khó hiểu thì bạn hãy đọc lại thật kỹ nội dung mình hướng dẫn, đặc biệt là phân tích quá trình chuyển tiếp gói tin. Hoặc liên hệ với chúng tôi để nhận được sự tư vấn, hỗ trợ sớm nhất nhé!

>>> Xem thêm: IPTABLES là gì? Cấu trúc thành phần của IPTABLES và cách sử dụng

Tác giả:
author avatar
Mình là Huy, hiện mình đang là kỹ sư hệ thống tại SunCloud. Mình có nhiều năm kinh nghiệm, kiến thức chuyên môn về mạng, hệ thống, điện toán mây và an ninh bảo mật. Mình đã triển khai và vận hành rất nhiều dự án thực tế cho doanh nghiệp, cơ quan. Mình đã đạt được một số chứng chỉ quốc tế như CCNP, LPI, VCP, đồng thời mình vẫn đang tiếp tục học tập để trau dồi kiến thức mỗi ngày. Mình rất yêu thích công nghệ, đam mê chia sẻ những kiến thức, thông tin hữu ích cho mọi người.

Tin tức nổi bật