Powered by Blogger.

CĂN BẢN IPTABLES


GIT – Iptables là một package firewall/NAT được sử dụng rộng rãi nhất hiện nay và được tích hợp sẵn hay cài đặt sử dụng trên các hệ điều hành linux.

Trước đây, package tường lửa/NAT phổ biến nhất chạy trên Linux là ipchains. Tuy nhiên, theo thời gian, ipchains có một số nhược điểm nên đã được Netfilter thay bằng iptables, với các improvement sau đây:
– Tích hợp tốt hơn với nhân của hệ điều hành Linux.

– Cho phép load tốt hơn các modules đặc biệt của iptables giúp cho việc cái thiện độ tin cậy và tốc độ xử lý.

– Là một statefull firewall.

– Filter packet dựa trên địa chỉ MAC và các cờ của TCP header.

– NAT tốt hơn.

– Hỗ trợ việc tích hợp một cách trong suốt với các chương trình như Web proxy: Squid.

– Một số thông số limit có thể được sử dụng trong iptables giúp cho việc ngăn chặn được các cuộc tấn công DOS.

Các tùy chọn để chỉ định thông số

– chỉ định tên table: -t , ví dụ -t filter, -t nat, .. nếu không chỉ định table, giá trị mặc định là filter

– chỉ đinh loại giao thức: -p , ví dụ -p tcp, -p udp hoặc -p ! udp để chỉ định các giao thức không phải là udp

– chỉ định card mạng vào: -i , ví dụ: -i eth0, -i lo

– chỉ định card mạng ra: -o , ví dụ: -o eth0, -o pp0

– chỉ định địa chỉ IP nguồn: -s <địa_chỉ_ip_nguồn>, ví dụ: -s 192.168.0.0/24 (mạng 192.168.0 với 24 bít mạng), -s 192.168.0.1-192.168.0.3 (các IP 192.168.0.1, 192.168.0.2, 192.168.0.3).

– chỉ định địa chỉ IP đích: -d <địa_chỉ_ip_đích>, tương tự như -s

– chỉ định cổng nguồn: –sport , ví dụ: –sport 21 (cổng 21), –sport 22:88 (các cổng 22 .. 88), –sport 0 (các cổng <=80), –sport 22: (các cổng >=22)

– chỉ định cổng đích: –dport , tương tự như –sport

Các tùy chọn để thao tác với chain

– tạo chain mới: iptables -N

– xóa hết các luật đã tạo trong chain: iptables -X

– đặt chính sách cho các chain `built-in` (INPUT, OUTPUT & FORWARD): iptables -P , ví dụ: iptables -P INPUT ACCEPT để chấp nhận các packet vào chain INPUT

– liệt kê các luật có trong chain: iptables -L

– xóa các luật có trong chain (flush chain): iptables -F

– reset bộ đếm packet về 0: iptables -Z

Các tùy chọn để thao tác với luật

– thêm luật: -A (append)

– xóa luật: -D (delete)

– thay thế luật: -R (replace)

– chèn thêm luật: -I (insert)

Phân biệt giữa ACCEPT, DROP và REJECT packet

– ACCEPT: chấp nhận packet

– DROP: thả packet (không hồi âm cho client)

– REJECT: loại bỏ packet (hồi âm cho client bằng một packet khác)

Ví dụ:

# iptables -A INPUT -i eth0 –dport 80 -j ACCEPT chấp nhận các packet vào cổng 80 trên card mạng eth0

# iptables -A INPUT -i eth0 -p tcp –dport 23 -j DROP thả các packet đến cổng 23 dùng giao thức TCP trên card mạng eth0

# iptables -A INPUT -i eth1 -s ! 10.0.0.1-10.0.0.5 –dport 22 -j REJECT –reject-with tcp-reset gởi gói TCP với cờ RST=1 cho các kết nối không đến từ dãy địa chỉ IP 10.0.0.1..5 trên cổng 22, card mạng eth1

# iptables -A INPUT -p udp –dport 139 -j REJECT –reject-with icmp-port-unreachable gởi gói ICMP `port-unreachable` cho các kết nối đến cổng 139, dùng giao thức UDP

Phân biệt giữa NEW, ESTABLISHED và RELATED

– NEW: mở kết nối mới

– ESTABLISHED: đã thiết lập kết nối

– RELATED: mở một kết nối mới trong kết nối hiện tại

Ví dụ:

# iptables -P INPUT DROP đặt chính sách cho chain INPUT là DROP

# iptables -A INPUT -p tcp –syn -m state –state NEW -j ACCEPT chỉ chấp nhận các gói TCP mở kết nối đã set cờ SYN=1

# iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT không đóng các kết nối đang được thiết lập, đồng thời cũng cho phép mở các kết nối mới trong kết nối được thiết lập

# iptables -A INPUT -p tcp -j DROP các gói TCP còn lại đều bị DROP

Tùy chọn –limit, –limit-burst

–limit-burst: mức đỉnh, tính bằng số packet

–limit: tốc độ khi chạm mức đỉnh, tính bằng số packet/s(giây), m(phút), d(giờ) hoặc h(ngày)

Mình lấy ví dụ cụ thể để bạn dễ hiểu:

# iptables -N test
# iptables -A test -m limit –limit-burst 5 –limit 2/m -j RETURN
# iptables -A test -j DROP
# iptables -A INPUT -i lo -p icmp –icmp-type echo-request -j test

Đầu tiên lệnh iptables -N test để tạo một chain mới tên là test (table mặc định là filter). Tùy chọn -A test (append) để thêm luật mới vào chain test. Đối với chain test, mình giới hạn limit-burst ở mức 5 gói, limit là 2 gói/phút, nếu thỏa luật sẽ trở về (RETURN) còn không sẽ bị DROP. Sau đó mình nối thêm chain test vào chain INPUT với tùy chọn card mạng vào là lo, giao thức icmp, loại icmp là echo-request. Luật này sẽ giới hạn các gói PING tới lo là 2 gói/phút sau khi đã đạt tới 5 gói.

Bạn thử ping đến localhost xem sao?

$ ping -c 10 localhost

Chỉ 5 gói đầu trong phút đầu tiên được chấp nhận, thỏa luật RETURN đó. Bây giờ đã đạt đến mức đỉnh là 5 gói, lập tức Iptables sẽ giới hạn PING tới lo là 2 gói trên mỗi phút bất chấp có bao nhiêu gói được PING tới lo đi nữa. Nếu trong phút tới không có gói nào PING tới, Iptables sẽ giảm limit đi 2 gói tức là tốc độ đang là 2 gói/phút sẽ tăng lên 4 gói/phút. Nếu trong phút nữa không có gói đến, limit sẽ giảm đi 2 nữa là trở về lại trạng thái cũ chưa đạt đến mức đỉnh 5 gói. Quá trình cứ tiếp tục như vậy. Bạn chỉ cần nhớ đơn giản là khi đã đạt tới mức đỉnh, tốc độ sẽ bị giới hạn bởi tham số–limit. Nếu trong một đơn vị thời gian tới không có gói đến, tốc độ sẽ tăng lên đúng bằng –limit đến khi trở lại trạng thái chưa đạt mức –limit-burst thì thôi.

Để xem các luật trong Iptables bạn gõ lệnh $ iptables -L -nv (-L tất cả các luật trong tất cả các chain, table mặc định là filter, -n liệt kê ở dạng số, v để xem chi tiết)

# iptables -L -nv
Chain INPUT (policy ACCEPT 10 packets, 840 bytes)
pkts bytes target prot opt in out source destination
10 840 test icmp — lo * 0.0.0.0/0 0.0.0.0/0 icmp type 8

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 15 packets, 1260 bytes)
pkts bytes target prot opt in out source destination

Chain test (1 references)
pkts bytes target prot opt in out source destination
5 420 RETURN all — * * 0.0.0.0/0 0.0.0.0/0 limit: avg 2/min burst 5
5 420 DROP all — * * 0.0.0.0/0 0.0.0.0/0
# iptables -Z reset counter
# iptables -F flush luật
# iptables -X xóa chain đã tạo

Redirect cổng

Iptables hổ trợ tùy chọn -j REDIRECT cho phép bạn đổi hướng cổng một cách dễ dàng. Ví dụ như SQUID đang listen trên cổng 3128/tcp. Để redirect cổng 80 đến cổng 3128 này bạn làm như sau:

# iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 3128

Lưu ý: tùy chọn -j REDIRECT cho có trong chain PREROUTING
    Blogger Comment
    Facebook Comment