Hotline : 07 088 44444
Thích
Chia sẻ

IPTABLES MODULES connlimit - Giới hạn số lượng kết nối đồng thời

21/02/2021

Module connlimit cho phép quản lí giới hạn số lượng kết nối đồng thời (concurrent connections) đến server hoặc rời đi từ server.

Để xem các options có thể sử dụng:

<blockquote><pre># iptables -m connlimit --help
...
connlimit match options:
  --connlimit-upto n     match if the number of existing connections is 0..n
  --connlimit-above n    match if the number of existing connections is &gt;n
  --connlimit-mask n     group hosts using prefix length (default: max len)
  --connlimit-saddr      select source address for grouping
  --connlimit-daddr      select destination addresses for grouping</pre></blockquote>

Mô hình demo

giới hạn số lượng kết nối đồng thời

, trong đó:

  • Server: có IP 10.10.10.100
  • Client1: có IP 10.10.10.200
  • Client2: có IP 10.10.10.250

Để demo, tại Server tôi sử dụng socat để tạo listening socket đóng vai trò như một ứng dụng chấp nhận kết nối trên port 2001:

<blockquote><pre>socat TCP-LISTEN:2001,bind=10.10.10.100,fork,reuseaddr SYSTEM:'while true; do echo port 2001 - connected...; sleep 1 ; done'</pre></blockquote>

Từ client sử dụng nc (netcat) hoặc telnet kết nối đến port 2001:

<blockquote><pre>telnet 10.10.10.100 2001</pre></blockquote>
IPTABLES MODULES

Kết quả khi client có thể mở kết nối đến server:

Sau đó, có thể Ctrl + c để ngắt kết nối, hoàn tất việc chuẩn bị.

Giới hạn số lượng kết nối đồng thời

Trên Server, mở 3 ports 2001-2003:

<blockquote><pre>socat TCP-LISTEN:2001,bind=10.10.10.100,fork,reuseaddr SYSTEM:'while true; do echo port 2001 - connected...; sleep 1 ; done' &amp;
socat TCP-LISTEN:2002,bind=10.10.10.100,fork,reuseaddr SYSTEM:'while true; do echo port 2002 - connected...; sleep 1 ; done' &amp;
socat TCP-LISTEN:2003,bind=10.10.10.100,fork,reuseaddr SYSTEM:'while true; do echo port 2003 - connected...; sleep 1 ; done' &amp;</pre></blockquote>
IPTABLES MODULES connlimit

Server đã sẵn sàng kết nối trên 3 ports:

Giả sử tôi phải thực hiện các yêu cầu sau:

  • Yêu cầu 1: Port 2001, mỗi client được phép mở tối đa 1 kết nối cùng lúc
  • Yêu cầu 2: Port 2002, mỗi client được phép mở tối đa 2 kết nối cùng lúc
  • Yêu cầu 3: Port 2003, tại một thời điểm server chấp nhận 3 kết nối từ clients

Tôi bắt đầu phần tích và viết iptabes rule cho từng yêu cầu một.

* Yêu cầu 1: Port 2001, mỗi client được phép mở tối đa 1 kết nối cùng lúc, ta cần phân tích:
  • Xét những gói tin mở kết nối tcp đến server: -t raw PREROUTING -d 10.10.10.100/32 -p tcp –syn
  • Xét trên port 2001: –dport 2001
  • Xét những gói tin đến Server, mỗi source IP có tối đa 1 kết nối: -m connlimit –connlimit-above 1 –connlimit-mask 32 –connlimit-saddr -j DROP

Chạy lệnh trên Server:

iptables -t raw -A PREROUTING -d 10.10.10.100/32 -p tcp --syn --dport 2001 -m connlimit --connlimit-above 1 --connlimit-mask 32 --connlimit-saddr -j DROP

Kiểm chứng:

Client1 chỉ có thể mở một kết nối, kết nối thứ hai không thành công:

Client2, tương tự chỉ có thể mở một kết nối:

Giới hạn 1 kết nối chỉ áp dụng với port 2001 và không ảnh hưởng các port khác. Ví dụ client2 có thể mở thêm kết nối đến port 2002:

* Yêu cầu 2: Port 2002, mỗi client được phép mở tối đa 2 kết nối cùng lúc
  • Xét những gói tin mở kết nối tcp đến server: -t raw PREROUTING -d 10.10.10.100/32 -p tcp –syn
  • Chỉ áp dụng đối với port 2002: –dport 2001
  • Xét những gói tin đến Server, mỗi source IP có tối đa 1 kết nối: -m connlimit –connlimit-above 2 –connlimit-mask 32 –connlimit-saddr -j DROP

Chạy lệnh trên Server:

<blockquote><pre>iptables -t raw -A PREROUTING -d 10.10.10.100/32 -p tcp --syn --dport 2002 -m connlimit --connlimit-above 2 --connlimit-mask 32 --connlimit-saddr -j DROP</pre></blockquote>

Kiểm chứng:

  • Một client chỉ được mở tối đa 2 kết nối cùng lúc:
  • Giới hạn 2 kết nối chỉ áp dụng với port 2002.
* Yêu cầu 3: Port 2003, tại một thời điểm server chấp nhận 3 kết nối từ clients
  • Chỉ áp dụng đối với port 2003: –dport 2001
  • Xét những gói tin đến Server, server chỉ chấp nhận 2 kết nối từ client bất kì, vì thế tôi cần giới hạn trên destination IP sử dụng –connlimit-daddr mode : -m connlimit –connlimit-above 3 –connlimit-mask 32 –connlimit-daddr -j DROP

Chạy lệnh trên Server:

<blockquote><pre>iptables -t raw -A PREROUTING -d 10.10.10.100/32 -p tcp --syn --dport 2003 -m connlimit --connlimit-above 3 --connlimit-mask 32 --connlimit-daddr -j DROP</pre></blockquote>

Kiểm chứng:

Client1 mở 2 kết nối thành công, Client2 mở thêm kết nối thứ thứ 3 thành công. Sau đó, Server bắt đầu từ chối kết nối thứ tư:

Ứng dụng khác

Vì lí do độ dài, một số lưu ý và kinh nghiệm khác không được đề cập. Đọc giả có thể tham khảo thêm và vận dụng:

  • Tôi chỉ demo giới hạn các gói tin đến Server, trường hợp khác đọc giả vẫn có thể sử dụng module connlimit để giới hạn kết nối chiều OUT từ Server ra ngoài.
  • Tôi dùng –connlimit-above và target -j DROP, đọc giả có thể sử dụng –connlimit-upto tùy vào bối cảnh. Ví dụ, yêu cầu số 2 tôi viết lại với policy DROP:
<blockquote><pre>iptables -t raw -A PREROUTING -d 10.10.10.100/32 -p tcp --syn --dport 2002 -m connlimit --connlimit-upto 2 --connlimit-mask 32 --connlimit-saddr -j ACCEPT
iptables -t raw -A PREROUTING -d 10.10.10.100/32 -p tcp --dport 2002 -j DROP</pre></blockquote>
  • Mặc định, option –connlimit-mask 32 sẽ áp dụng giới hạn cho một IP, bạn có thể áp dụng giới hạn cho cả một network. Ví dụ, yêu cầu số 1 được viết lại:
<blockquote><pre>iptables -t raw -A PREROUTING -d 10.10.10.100/32 -p tcp --syn --dport 2001 -m connlimit --connlimit-above 1 --connlimit-mask 24 --connlimit-daddr -j DROP</pre></blockquote>

Khi IP bất kì 192.168.1.5 kết nối đến Server, giới hạn sẽ apply cho cả network 192.168.1.0/24, các IP trong range này sẽ không thể mở kết nối thứ hai.

Thông qua các ví dụ, hi vọng đọc giả cảm thấy thoải mái hơn khi ứng dụng của module connlimit để đáp ứng các nhu cầu riêng trong quản trị.

Nếu bạn có thắc mắc hay có vấn đề cần hỗ trợ, bạn có thể liên hệ trực tiếp với Vietnix thông qua các kênh sau:
  • Hotline: 1800 1093 - 07 088 44444
  • Email: support@vietnix.vn
  • Hoặc chat trực tiếp với Vietnix thông qua biểu tượng Livechat ở góc phải màn hình. Đội ngũ chuyên viên của chúng tôi luôn sẵn sàng tư vấn và hỗ trợ bạn 24/7.
Vietnix hiện đang có chương trình khuyến mãi lớn nhất trong năm, giảm giá TRỌN ĐỜI: Đăng ký dùng thử ngay và Vietnix sẽ hoàn tiền 100% nếu quý khách không hài lòng với chất lượng sản phẩm, dịch vụ!
Mình là Bo - admin của Quản Trị Linux. Mình đã có 10 năm làm việc trong mảng System, Network, Security và đã trải nghiệm qua các chứng chỉ như CCNP, CISSP, CISA, đặc biệt là chống tấn công DDoS. Gần đây mình trải nghiệm thêm Digital Marketing và đã hòan thành chứng chỉ CDMP của PersonVUE. Mình rất thích được chia sẻ và hỗ trợ cho mọi người, nhất là các bạn sinh viên. Hãy kết nối với mình nhé!
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments