ipset
iptables -A INPUT -s 1.1.1.1 -j DROP iptables -A INPUT -s 2.2.2.2 -j DROP
Điều kiện match ở đây -s 1.1.1.1 có nghĩa là các packet có địa chỉ nguồn là 1.1.1.1. Để chặn cả 1.1.1.1 và 2.2.2.2, bạn phải sử dụng 2 rule riêng biệt trong iptables. Bạn hoàn toàn có thể sử dụng ipset để đạt được mục đích tương tự với cách thực hiện như sau:
ipset -N myset iphash ipset -A myset 1.1.1.1 ipset -A myset 2.2.2.2 iptables -A INPUT -m set --set myset src -j DROP
Set types
Mỗi set khi tạo ra sẽ thuộc 1 type xác định, đây là cách để xác định loại giá trị được lưu trữ trong set (IP address, network, port …) và cũng như xác định phần nào của gói tin sẽ được kiểm tra để match với set. Ngoài kiểm tra địa chỉ IP được minh họa ở trên, ipset cũng có thể kiểm tra port, IP Port và cả địa chỉ MAC IP của gói tin. Hai dạng linh động nhất thường được sử dụng trong ipsetlà iphash (lưu trữ danh sách các địa chỉ IP) và nethash (lưu trữ danh sách mạng (IP/mask)). Về các set type bạn có thể tham khảo thêm tại ipset man page.
Lợi ích của ipset
iptables -A INPUT -s ! 1.1.1.1 -g continue iptables -A INPUT -s ! 2.2.2.2 -g continue
Cấu hình như trên có hoạt động không ? Tất nhiên là không. Nếu gói tin có địa chỉ nguồn là 1.1.1.1, nó sẽ không match với rule đầu tiên, nhưng gói tin này sẽ match với rule thứ 2 (bởi vì địa chỉ nguồn của nó không phải là 2.2.2.2) nên vẫn được chuyển tới chain “continue”. Đây là một ví dụ đơn giản, nhưng nó cũng minh chứng lợi ích của việc đạt được yêu cầu trong một rule duy nhất. Thực tế các rule của iptables là độc lập với nhau nhưng việc kết hợp, sắp xếp và tối ưu các rule để đạt được những yêu cầu cho trước không phải lúc nào cũng đơn giản, đặc biệt là việc kết hợp các rule bình thường và các rule có điều kiện đảo ngược. ipset sẽ làm cho mọi thứ dễ dàng hơn trong những trường hợp như thế.
ipset -N myset iphash ipset -A myset 1.1.1.1 ipset -A myset 2.2.2.2 iptables -A INPUT -m set ! --set myset src -g continue
Nếu gói tin đi đến có địa chỉ nguồn là 1.1.1.1 hay 2.2.2.2 cũng không thể match với rule (iptables -A INPUT -m set ! –set myset src -g continue ), do đó sẽ không được xử lý tiếp bởi chain “continue”.
Một lợi ích khác của ipset là bạn có thể thay đổi danh sách địa chỉ của set một cách độc lập với iptables. Đối với iptables, thứ tự các rule là một điểm rất quan trọng, do đó việc sửa đổi các rule hay sắp xếp thứ tự sẽ có ảnh hưởng lớn. Ngược lại, ipset lưu trữ các giá trị trên một mặt phẳng, không đòi hỏi thứ tự nên việc thêm, xóa, sửa đổi không mất nhiều thời gian cân nhắc, suy nghĩ.
Giới hạn truy cập
ipset -N limited_hosts iphash ipset -A limited_hosts 10.0.0.5 ipset -A limited_hosts 10.0.0.6 ipset -A limited_hosts 10.0.0.7 ipset -N allowed_sites iphash ipset -A allowed_sites worksite1.com ipset -A allowed_sites worksite2.com ipset -A allowed_sites worksite3.com iptables -I FORWARD -m set --set limited_hosts src -m set ! --set allowed_sites dst -j DROP
Ví dụ này sử dụng match cả hai set trong cùng 1 rule. Nếu packet đến có địa chỉ nguồn match với limited_hosts
và địa chỉ đích không match vớiallowed_sites
, gói tin sẽ bị DROP.
Vậy trong tình huống ngược lại, boss muốn chặn truy cập tới một số trang web trên tất cả các host trên mạng LAN, trừ PC của boss và trợ lý. Cách thực hiện sẽ như sau:
ipset -N blocked_sites iphash ipset -A blocked_sites badsite1.com ipset -A blocked_sites badsite2.com ipset -A blocked_sites badsite3.com ipset -N allowed_hosts iphash ipset -A allowed_hosts 10.0.0.5 ipset -A allowed_hosts 10.0.0.6 iptables -I FORWARD -m set --set ! allowed_hosts src -m set --set blocked_sites dst -j DROP
Lưu ý rằng trong nhiều trường hợp, giải pháp này sẽ không hiệu quả đối với nhiều website. Chẳng hạn bạn muốn chặn truy cập vào facebook.com, thực tế là domain này sẽ được phân giải ra rất nhiều IP, mà iptables/ipset chỉ hỗ trợ hostname nếu chúng được phân giải ra một địa chỉ IP duy nhất . Việc phân giải tên miền cũng chỉ xảy ra lúc thực hiện lệnh, sau đó nếu địa chỉ IP thay đổi, iptables cũng không cập nhật sự thay đổi này. Vì những lý do đó, cách tốt nhất để áp dụng chính sách truy cập Web là sử dụng các giải pháp về HTTP Proxy như Squid.
Tự động chặn các truy cập không mong muốn
ipset -N banned_hosts iphash iptables -A INPUT -p tcp --dport 25 -j SET --add-set banned_hosts src iptables -A INPUT -m set --set banned_hosts src -j DROP
Nếu gói tin có destination port là 25, địa chỉ nguồn của nó sẽ được thêm vào banned_hosts
, sau đó ta sẽ thêm một rule để chặn các gói tin có địa chỉ nguồn nằm trong banned_hosts
.
ipset trong OpenStack
-A neutron-openvswi-i9f5f8a14-e -m state --state INVALID -j DROP -A neutron-openvswi-i9f5f8a14-e -m state --state RELATED,ESTABLISHED -j RETURN -A neutron-openvswi-i9f5f8a14-e -s 10.3.25.3/32 -p udp -m udp --sport 67 --dport 68 -j RETURN -A neutron-openvswi-i9f5f8a14-e -p tcp -m tcp --dport 22 -s 10.3.25.57/32 -j RETURN -A neutron-openvswi-i9f5f8a14-e -p tcp -m tcp --dport 22 -s 10.3.25.58/32 -j RETURN
Khi sử dụng “iptables ipset”, các rule đối với instance C sẽ như sau:
-A neutron-openvswi-i9f5f8a14-e -m state --state INVALID -j DROP -A neutron-openvswi-i9f5f8a14-e -m state --state RELATED,ESTABLISHED -j RETURN -A neutron-openvswi-i9f5f8a14-e -s 10.3.25.3/32 -p udp -m udp --sport 67 --dport 68 -j RETURN -A neutron-openvswi-i9f5f8a14-e -p tcp -m tcp --dport 22 -m set --match-set IPv49ba654b2-a3a4-49f8-8 src -j RETURN -A neutron-openvswi-i9f5f8a14-e -j neutron-openvswi-sg-fallback
ipset chain sẽ chứa địa chỉ IP của các instance thuộc SECGROUP1
# ipset list IPv49ba654b2-a3a4-49f8-8 Name: IPv49ba654b2-a3a4-49f8-8 Type: hash:ip Revision: 2 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16536 References: 1 Members: 10.3.25.57 10.3.25.58
Bằng cách này, thời gian iptables-save/iptables-load sẽ gỉam đi đáng kể khi chỉ cần chỉnh sửa các ipset trong trường hợp có sự thay đổi về Security Group.
ipset không chỉ cung cấp thêm một phương thức cấu hình mới cho iptables, nó còn hỗ trợ đơn giản hóa nhiều kịch bản mà nếu chỉ sử dụng iptables sẽ gặp khó khăn hoặc kém hiệu quả. Bạn cũng có thể kết hợp ipset với một số tính năng khác của iptables, chẳng hạn như packet marking, để thực hiện các chính sách về network. Bất cứ lúc nào bạn muốn thiết lập các rule firewall áp dụng cho một nhóm host hoặc nhiều địa chỉ cùng một lúc, bạn nên cân nhắc tới việc kết hợp cùng ipset.