[Question] Vài câu hỏi về Null routing |
27/12/2008 13:27:04 (+0700) | #1 | 164100 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Chào mọi người,
Hiện tại server mình đang quản lí bị ddos rất nặng nề, mặc dù đã cản lọc bằng iptables và nhiều giải pháp khác, tuy nhiên có vẻ không mấy khả thi, hoặc do mình chưa đủ kinh nghiệm đối với dạng DDOS từ rất nhiều nguồn như thế này. Mình đang nghĩ đến giải pháp null routing, nhưng nếu ngồi xem log để tìm ra IP nào đang DDOS rồi add route thì không khả quan lắm, vì IP DDOS đến từ nhiều nguồn khác nhau, và thay đổi liên tục.
Câu hỏi của mình: Ta đặt ra một giới hạn nào đó cho các cú request, kiểu như vượt quá số request này trên 1s thì đặt ra một biến blacklist. Sau đó add route cho biến này
Code:
# route add $blacklist gw 127.0.0.1 lo
và định một khoảng thời gian nào đó thì delete route này đi.
Làm sao ta đếm và tạo biến, kiểu như tao một recent list và deny list này, hoặc cho vào blackhole, hay một private service nào đó như trong bài kí sự DDOS của anh conmale chẳng hạn, request này không thể chặn như chặn các gói tin UDP được, dùng iptables chặn thì mỗi cái rule làm việc cũng đủ làm server load cao và sụm (Hoặc bão hoà đường truyền).
Xin mọi người giúp đỡ.
Cám ơn! |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
27/12/2008 16:01:59 (+0700) | #2 | 164115 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Xin lỗi, mình hỏi thêm trong topic này: Hiện tại mình dùng iptables để match string nhưng vẫn không lọc được các request mang các string "lạ", ví dụ mình dùng:
Code:
iptables -A INPUT -p tcp --dport 80 -m string --string "string" -j DROP --algo bm
Nhưng các request với dấu hiệu trên vẫn vô tư vào tới apache mà không hề bị cản lọc. Mình đã kiểm tra modprobe ipt_string và nó đã được tự động loaded.
Vậy xin cho hỏi lí do vì sao iptables ko match được string trên? Liệu ipt_string của mình có quá cũ (Centos 5.2, Kernel 2.6.18-92.1.22.el5-x86_64).
Chân thành cảm ơn. |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
27/12/2008 21:00:58 (+0700) | #3 | 164119 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
mR.Bi wrote:
Xin lỗi, mình hỏi thêm trong topic này: Hiện tại mình dùng iptables để match string nhưng vẫn không lọc được các request mang các string "lạ", ví dụ mình dùng:
Code:
iptables -A INPUT -p tcp --dport 80 -m string --string "string" -j DROP --algo bm
Nhưng các request với dấu hiệu trên vẫn vô tư vào tới apache mà không hề bị cản lọc. Mình đã kiểm tra modprobe ipt_string và nó đã được tự động loaded.
Vậy xin cho hỏi lí do vì sao iptables ko match được string trên? Liệu ipt_string của mình có quá cũ (Centos 5.2, Kernel 2.6.18-92.1.22.el5-x86_64).
Chân thành cảm ơn.
Thử nghĩ xem, dòng luật này khác dòng luật trên ở điểm nào? Lý do tạo sao?
iptables -t nat -A PREROUTING -p tcp --dport 80 -m string --string "string" --algo bm -j REDIRECT --to-ports 9
|
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
28/12/2008 10:09:06 (+0700) | #4 | 164136 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Anh,
Dòng luật của em:
Code:
iptables -A INPUT -p tcp --dport 80 -m string --string "string" -j DROP --algo bm
Sẽ đặt một luật vào bảng Filter chỉ định: bất cứ gói tin nào đi vào cổng 80, mà request có mang theo string "string" thì lập tức bị drop.
Dòng luật của anh
Code:
iptables -t nat -A PREROUTING -p tcp --dport 80 -m string --string "string" --algo bm -j REDIRECT --to-ports 9
Sẽ đặt một luật vào bảng Nat định cơ chế Prerouting, tất cả các gói tin nhắm vào cổng 80, mà request có mang theo string "string" sẽ wwwect đến port 9 (discard service) và throws away nó
Còn câu hỏi tại sao là em đang thắc mắc muốn hỏi anh đó? Theo em nghĩ nếu dòng luật của em không match được string bên trên thì dòng luật của anh cũng vậy, hoặc có lí do nào khác mà em không biết đến, anh giải thích dùm em. Để em thử áp dụng luật trên với discard service xem kết quả thế nào.
Mặc dù rule này giải quyết được cả bài toán, nhưng em vẫn muốn anh trả lời câu hỏi trên cùng .
Cám ơn anh! |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
28/12/2008 14:40:31 (+0700) | #5 | 164200 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Lí thú thật, sao rule của anh match được string mà rule của em nó cho qua tất, em thật sự chưa rõ chỗ này, tìm lên tìm xuống, mãi chẳng ra lí do
Cho em hỏi thêm: iptables có lúc nào bặt "hụt" không? Vì em theo dõi thì lâu lâu cũng có request mang string đã bị em match lọt vào được?
Cám ơn anh nhiều. |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
28/12/2008 15:40:51 (+0700) | #6 | 164205 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
mR.Bi wrote:
Xin lỗi, mình hỏi thêm trong topic này: Hiện tại mình dùng iptables để match string nhưng vẫn không lọc được các request mang các string "lạ", ví dụ mình dùng:
Code:
iptables -A INPUT -p tcp --dport 80 -m string --string "string" -j DROP --algo bm
Nhưng các request với dấu hiệu trên vẫn vô tư vào tới apache mà không hề bị cản lọc. Mình đã kiểm tra modprobe ipt_string và nó đã được tự động loaded.
Vậy xin cho hỏi lí do vì sao iptables ko match được string trên? Liệu ipt_string của mình có quá cũ (Centos 5.2, Kernel 2.6.18-92.1.22.el5-x86_64).
Chân thành cảm ơn.
bạn có thể cho mình hỏi là có phải bạn đặt iptables và web server trên cùng một host không ? hay là bạn muốn dùng iptables để lọc cho một host khác ? |
|
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
28/12/2008 16:57:01 (+0700) | #7 | 164210 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Hi Secmask,
Mình chỉ được quản lí một server thôi , chắc bạn thắc mắc vì thấy iptables không match được string, và trong rule mình không chỉ định Destination IP.
Sau khi sử dụng discard service, dùng rule của anh conmale, kết quả:
Code:
# iptables -t nat -L -v -n
Chain PREROUTING (policy ACCEPT 661K packets, 33M bytes)
pkts bytes target prot opt in out source destination
661K 33M REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "muviet" ALGO name bm TO 65535 www ports 9
........
........
String mà mình match là muviet
Khá là hoàn hảo. |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
28/12/2008 17:59:34 (+0700) | #8 | 164211 |
StarGhost
Elite Member
|
0 |
|
|
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
|
|
@mR.Bi: bồ để ý xem cái cái rule của bồ có bị qua mặt bởi các rule (equally/more specific) nào khác không, vì bồ sử dụng "iptables -A INPUT". Thứ nữa, secmask hỏi vậy chắc không phải vì không thấy dest IP, mà vì các rule trong INPUT chỉ áp dụng với local box, còn rule trong PREROUTING áp dụng với các packet đầu vào xuất hiện trên NIC, tức là mức độ cover rộng hơn. |
|
Mind your thought. |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
28/12/2008 21:21:00 (+0700) | #9 | 164212 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
mR.Bi wrote:
Hi Secmask,
Mình chỉ được quản lí một server thôi , chắc bạn thắc mắc vì thấy iptables không match được string, và trong rule mình không chỉ định Destination IP.
Sau khi sử dụng discard service, dùng rule của anh conmale, kết quả:
Code:
# iptables -t nat -L -v -n
Chain PREROUTING (policy ACCEPT 661K packets, 33M bytes)
pkts bytes target prot opt in out source destination
661K 33M REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "muviet" ALGO name bm TO 65535 www ports 9
........
........
String mà mình match là muviet
Khá là hoàn hảo.
StarGhost đã trả lời câu phía trên rất ngắn gọn và chính xác.
Riêng thắc mắc của em về phần "string match" thì thế này. String match sẽ rất kém hiệu suất nếu như em không giới hạn offset (từ byte nào đến byte nào trên packet). Luật của em đưa ra buộc trọn bộ packet bị xét. Bởi thế hiệu suất rất kém. Có những packet sẽ không match bởi vì chúng bị chẻ nhỏ ra (đặc biệt nếu em cho phép "KeepAlive" trên apache).
Dòng luật anh đưa ra về khía cạnh "match string" y hệt như dòng luật của em. Tuy nhiên dòng luật của anh lại match và đẩy packets bị "matched" về discard port nhiều hơn em là vì ở biên độ prerouting rộng hơn biên độ filter (sau khi packet đã được xác định destination là gì). Ở biên độ này, netfilter không bị bận rộn cho việc filter packet gì cả. Nó chỉ đơn thuần làm công tác "match" và sau đó wwwect packet này đi đến một điểm đích nào đó nên nó làm việc hữu hiệu hơn rất nhiều. Nếu là anh, anh sẽ sniff một mớ packets đang dùng để tấn công host của em. Sau đó, anh sẽ xác định offset của string được matched nằm ở khoảng nào để giúp cho công tác "match string" nhanh chóng và hiệu quả hơn. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
29/12/2008 11:17:26 (+0700) | #10 | 164338 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
@Conmale,StarGhost: Cám ơn 2 anh, em cũng phần nào hiểu được cơ chế hoạt động của PREROUTING, và "match string" rồi.
Riêng về phần xác định offset của string để em tìm hiểu, sẽ cố gắng trả bài sau. Nếu được anh cho em một ví dụ thì sẽ học được nhanh hơn . Trước giờ em toàn giới hạn offset theo kiểu đoán và "mò" không .
À, em còn câu hỏi đầu bài chưa tìm ra lời đáp, vì trong trường hợp này, nếu không có dấu hiệu để nhận biết bằng match string, thì em nghĩ giải pháp null routing là rất khả dụng. Liệu cách đó có thể thực hiện được không?
|
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
29/12/2008 23:40:12 (+0700) | #11 | 164414 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
mR.Bi wrote:
@Conmale,StarGhost: Cám ơn 2 anh, em cũng phần nào hiểu được cơ chế hoạt động của PREROUTING, và "match string" rồi.
Riêng về phần xác định offset của string để em tìm hiểu, sẽ cố gắng trả bài sau. Nếu được anh cho em một ví dụ thì sẽ học được nhanh hơn . Trước giờ em toàn giới hạn offset theo kiểu đoán và "mò" không .
OK, packet offset theo yêu cầu
Như em thấy trên bức hình, đoạn "string" anh cần tìm là: "/?anz....." và packet được chọn đó là một HTTP (ở dạng GET). Khi bấm vào dòng (khoanh màu đỏ) thì hai khung bên dưới sẽ hiển thị chi tiết của packet này. Phần offset là phần nằm ở khung cuối. Trên khung này, nếu dựa vào cột đầu tiên (bên tay trái) thì em có thể xác định được offset của string "/?anz" nằm ở khoảng nào. Cái này chỉ là cách sử dụng Wireshark (Ethereal) mà thôi. Em nên xem phần help của nó để hiểu hơn về cách sử dụng.
Điều quan trọng cần bàn ở đây là làm mọi cách để gia tăng hiệu suất. Bất cứ thao tác tìm kiếm nào cũng mất thời gian, tốn tài nguyên và... chậm nếu như biên độ tìm quá rộng. Bởi thế, thay vì buộc netfilter tìm một string nào đó trong cả một packet lớn, mình nên thu hẹp biên độ tìm cho nó. netfilter / iptables có một module "length", dùng nó để giới hạn như sau:
-m length --length <start_offset>:<end_offset>
Gia tăng hiệu suất không chỉ nằm trong biên độ tìm kiếm mà còn nằm ở chỗ giúp netfilter / iptables xác định dạng packet nào thì mới "tốn sức" làm việc. Với packet trên, khi phân tích ở khung thứ nhì của Wireshark, em sẽ xác định được packet này là một packet có ACK, PSH flags được set. Nếu quan sát kỹ những packets tương tự, em sẽ thấy chúng toàn là ACK, PSH cả. Bởi thế, giúp netfilter / iptables trong trường hợp này có thể bằng cách ấn định cụ thể thêm dạng packet mà chúng cần điều tra và thực thi công tác:
-p tcp --tcp-flags ACK,PSH ACK,PSH
Điều này giúp netfilter / iptables cực kỳ nhiều bởi vì nó không phải inspect mọi packet đi qua mà chỉ inspect các gói tin có flags là ACK, PSH. Nó giúp giảm khối lượng công việc đến 70% hoặc hơn và không phí tài nguyên vô ích. Đối với hoàn cảnh bị DDoS, mọi chi tiết giúp nâng cao hiệu suất và tiết kiệm tài nguyên đều quý giá vô ngần.
(Anh để em tự hình thành một dòng luật mới dựa trên 2 điểm ở trên thì mới vui và có gặt hái).
mR.Bi wrote:
À, em còn câu hỏi đầu bài chưa tìm ra lời đáp, vì trong trường hợp này, nếu không có dấu hiệu để nhận biết bằng match string, thì em nghĩ giải pháp null routing là rất khả dụng. Liệu cách đó có thể thực hiện được không?
Cũng ở phân mục này đã có một chủ đề thảo luận về null routing (sau khi anh gởi bài ký sự DDoS thứ 23). Em nên đọc lại. Cá nhân anh cho rằng null routing không hiệu suất vì DDoS thay đổi source IP liên tục. Nếu ứng dụng một bộ phận theo dõi các IP gởi request và chọn ra các IP "vi phạm" để từ đó thay đổi routing table liên tục thì quá chậm và quá tốn kém tài nguyên. Điểm cốt lõi của cách chống DDoS bằng cách đẩy các packet mang tính vi phạm vào /dev/null nằm ở chỗ nó giúp việc nhận ra chúng nhanh nhất và triệt chúng một cách gọn nhẹ nhất. null routing có thể có ích cho một số hoàn cảnh khác và có lẽ không được thực dụng lắm cho việc chống DDoS.
Thân mến. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
30/12/2008 12:01:15 (+0700) | #12 | 164493 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Em thử trả bài, không chắc cú cho lắm rule của em
Code:
iptables -t nat -A PREROUTING -p tcp --tcp-flags ACK,PSH ACK,PSH --dport 80 -m string --string "/?anz" -m length --length 47:81 --algo bm -j REDIRECT --to-ports 9
Em đang đọc bài viết về null routing anh nhắc tới.
Cám ơn anh. |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
31/12/2008 13:19:14 (+0700) | #13 | 164662 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Kì quặc 1 điều là xong bài post ở trên thì kẻ tấn công lột luôn cái string nhận diện của em, không hiểu có ai đó trong đây muốn mình mất việc không mà làm thế (j/k) , do vậy hiện tại dòng rule với string match trên trở nên vô dụng.
Em capture một mớ packet, cụ thể nó như thế này:
cái hình làm hơi vội, có vài thông tin mình ko muốn đưa lên, mong mọi người thông cảm
Request DDOS từ IP 203.162.3.155 có referer là http://www.yahoo.com, string offset nằm trong đoạn từ 00c0 đến 00d0, em thử đặt ra một rule wwwect nó về port 9:
Code:
iptables -t nat -A PREROUTING -i $IF -p tcp --dport 80 -m string --string 'www.yahoo.com' -m length --length 191:209 --algo bm -j REDIRECT --to-port 9
Nhưng không có packet nào bị "match" cả.
Code:
# iptables -t nat -v -n -L
Chain PREROUTING (policy ACCEPT 73684 packets, 4933K bytes)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "www.yahoo.com" ALGO name bm TO 65535length 191:209 www ports 9
Xem log thì nó chỉ bị cản bởi ModSec
Code:
[Tue Dec 30 10:12:48 2008] [error] [client 203.162.3.155] ModSecurity: Access denied with code 406 (phase 2). Pattern match "www\\.yahoo\\.com" at REQUEST_HEADERS:Referer. [file "/usr/local/apache/conf/modsec2.conf"] [line "20"] [hostname "www.mysite.com"] [uri "/path/index.php"] [unique_id "3Mz3W9ArllsAAGPkV1wAAAMz"]
Em vẫn không tin tưởng lắm về độ chính xác của rule mình đưa ra. Không hiểu nó sai chỗ nào? Mong mọi người giúp đỡ.
Cám ơn! |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
02/01/2009 23:58:32 (+0700) | #14 | 164926 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
Mr. Bi thân mến,
Mấy hôm nay anh "bị" liên hoan triền miên, xỉn triền miên nên không vào diễn đàn nên không hồi báo sớm hơn.
"Vấn nạn" của em gặp phải cũng là vấn nạn mà HVA gặp phải trước đây. Kỹ thuật "detect" dấu hiệu bị tấn công phụ thuộc vào những điểm đặc thù để dựa vào đó mà xử lý. Lần trước, điểm đặc thù em có thể tìm thấy là string "muviet". String này có thể sẽ thay đổi thường xuyên, thậm chí thay đổi random trong mỗi request. Bởi thế, khi chọn lựa một thứ "vũ khí" để chống đỡ, em cần suy nghĩ đến biên độ rộng nhất mà "vũ khí" này có thể bảo vệ em.
Trong trường hợp không còn "string" (dấu hiệu cụ thể) nào cả thì cần xét kỹ hơn: điểm nào là điểm đặt thù của các packets trên? Nếu em chọn dấu hiện referer www.yahoo.com thì em vô tình cản luôn các request hợp lệ chuyển từ trang tìm kiếm của yahoo vào site của em. Đây là cách không tối ưu.
Hãy xét xem, tâng số của các requests tấn công em khác các request bình thường thế nào? Các request bình thường (đi từ 1 IP) có khi nào gởi liên tục 10, 20, 30, 40 requests trong 1 giây không? --> đây cũng là điểm đặc thù em có thể dùng để chọn "vũ khí" mới để tự vệ vậy.
Anh giới thiệu em một đoạn "adaptive" rule dùng module recent để "trị" dạng DDoS không có dấu hiệu (string) gì ngoài tầng số tấn công:
Code:
# create an incoming table to control packets base on recent rules
iptables -N incominghttp
# create a conn table to control maximum connection per IP
iptables -N conn
iptables -A conn -j DROP
# create a blacklist table
iptables -N blacklist
iptables -A blacklist -j LOG --log-prefix "BLACKLISTING: "
iptables -A blacklist -m recent --name BLACKLIST --set -j DROP
# create a httpnormal to control normal flow of http if above is satisfied
iptables -N httpnormal
# now add rules into it (httpnormal)
iptables -A httpnormal -p tcp ! --syn -s $NET --sport $HI_PORTS -d $IP --dport 80 -m state --state NEW -m limit --limit 1/m -j LOG --log-prefix "NEWNOTSYN_HTTP: "
iptables -A httpnormal -p tcp ! --syn -s $NET --sport $HI_PORTS -d $IP --dport 80 -m state --state NEW -j DROP
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m limit --limit 10/m --limit-burst $BURST_ME -j LOG --log-prefix "SYNFLOOD: "
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m state --state NEW -m limit --limit $SYN_ME --limit-burst $BURST_ME -j ACCEPT
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m state --state NEW -j ACCEPT
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m limit --limit $SYN_ME --limit-burst $BURST_ME -j LOG --log-prefix "OVER_BURST: "
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m limit --limit $SYN_ME --limit-burst $BURST_ME -j conn
iptables -A httpnormal -p tcp -s $NET -d $IP --dport 80 -m state --state ESTABLISHED -m connlimit --connlimit-above $GLOBAL -m limit --limit 2/m -j LOG --log-prefix "OVERCONNLIMIT: "
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -d $IP --dport 80 -m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID: "
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -d $IP --dport 80 -m conntrack --ctstate INVALID -j DROP
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -m state --state ESTABLISHED -d $IP --dport 80 -m connlimit ! --connlimit-above $GLOBAL -j ACCEPT
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -m state --state ESTABLISHED -d $IP --dport 80 -m connlimit --connlimit-above $GLOBAL -j conn
echo "connlimit is defined"
# After defining INPUT, only allow OUTPUT as ESTABLISHED state
# There should be no SYN packet from port 80 of HTTP server
# Using own server to initiate request to other sites is impossible
iptables -A OUTPUT -p tcp -s $IP --sport 80 -d $NET --dport $HI_PORTS -m state --state ESTABLISHED -j ACCEPT
# then allow all ESTABLISHED INPUT without SYN
# Once the connection is ESTABLISHED (passed all the rules above) - should not restrict rate to maximise performance
iptables -A httpnormal -p tcp ! --syn -s $NET --sport $HI_PORTS -d $IP --dport 80 -m state --state ESTABLISHED -j ACCEPT
# rate limiting on incoming http packets and keep a blacklist for 60 seconds
# this rule drops *any* packet if the IP is in the blacklist
iptables -A incominghttp -m recent --name BLACKLIST --update --seconds 60 -j DROP
# all *established* http connections are allowed to continue
iptables -A incominghttp -p tcp --dport 80 -m state --state ESTABLISHED,RELATED -j httpnormal
# all *new* http connections are all put into a list 'httpconn'
# if there are 20 SYN packets in 30 seconds (as defined in variables SECS and HITS above)
# we send the package to chain 'blacklist ' which puts the IP in the blacklist
iptables -A incominghttp -p tcp --dport 80 -m state --state NEW -m recent --name httpconn --rcheck --seconds $SECS --hitcount $HITS -j blacklist
# if we have seen less then 20 such packets in the last 30 seconds we accept
# and direct the packets to the normal http chain httpnormal
iptables -A incominghttp -p tcp --dport 80 -m state --state NEW -m recent --name httpconn --set -j httpnormal
echo "Start the actual http rule..."
$IPTABS -A INPUT -p tcp -s $NET -d $IP --dport 80 -j incominghttp
echo "The HTTP service is provided"
}
Em xem và suy nghĩ về đoạn rule trên và cho anh biết em đã đúc kết được những gì nhá? . |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
03/01/2009 15:42:09 (+0700) | #15 | 165031 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Anh,
Đầu năm có vẻ anh ăn chơi thả cửa nhỉ
Nhìn vào đoạn script iptables của anh, công đoạn được thực hiện theo cách thức: log sau đó dựa vào log để drop. Và hầu như tất cả các rules anh đưa ra đều có những giá trị được anh "pre-define" cụ thể từ trước, mà những giá trị này không phải ông System Admin nào cũng biết rõ và đưa ra những con số ngay được.
Đoạn rule của anh là kết quả của quá trình nghiên cứu các phương thức tấn công, và...có lẽ anh trải nghiệm nhiều trong việc đối phó với tấn công từ chối dịch vụ, ví dụ như em nếu gặp trường hợp bị A tấn công bằng phương thức 1, em chỉ cố găng bằng cách nào đó đưa ra những rule để đối phó với A, mà nếu tiếp theo có ông B thì cách thức dùng để đối phó với A trở nên vô dụng với B, em lại mày mò cách đối phó với B. Nói chung em không có kế hoạch rõ ràng, và không tính đến một bài toán mang tính toàn vẹn...như anh.
Điều em thắc mắc là rõ ràng ta không thể cùng một lúc vừa log vừa drop, nên anh chỉ định các user-define-table, list, log-prefix để dựa vào đó lọc ra các packet "vi phạm". Nhưng liệu việc ghi log như thế có thực sự bền bỉ? Vì cũng như anh từng nói việc ghi log liên tục như thế chiếm dụng rất nhiều tài nguyên của server, cho dù anh có đưa ra giá trị --limit-burst, theo em con số này có vẻ khá quan trọng trong đoạn iptables script của anh. Em chưa nghĩ ra anh đặt là bao nhiêu, trước giờ em toàn không ấn định cụ thể (5).
Và những rule bên trên cũng không thể chống đối với dạng tấn công liên tục từ rất nhiều nguồn, làm bão hoà đường truyền. Tác vụ ghi log làm firewall tốn khá nhiều thời gian, và nếu như em đặt ra một rule thế này:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s –j ACCEPT
thì em kiểm tra, có lúc chính nó làm server load tăng vọt, có khi hoàn toàn trì trệ. Vậy log + drop sẽ chậm hơn rất nhiều và tác vụ xử lí sẽ tốn server load hơn so với chỉ drop, phải không anh?
Đọc xong đoạn rule của anh em nghĩ mình phải học lại kiến thức căn bản về iptables, nhiều rule em đọc xong google từng option mới mườn tượng ra được cách thức hoạt động của nó. Em đang đọc phần conntract:
http://www.faqs.org/docs/iptables/theconntrackentries.html
Hiện tại server bên em được bên cung cấp đặt sau lưng con Pix firewall, nhưng chả hiểu bên đấy config thế nào packet vẫn vào như nhà không cửa .
Em thử áp dụng script của anh lại gặp phải lỗi iptables:
Code:
#iptables -A INPUT -p tcp -d $myip --dport 80 -m state --state ESTABLISHED -m connlimit --connlimit-above 4 -j DROP
iptables: Unknown error 18446744073709551615
Có lẽ em nên post vào box khác hợp lí hơn. Cám ơn anh rất nhiều, đang bị bội thực kiến thức |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
04/01/2009 05:53:55 (+0700) | #16 | 165068 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
mR.Bi wrote:
Anh,
Đầu năm có vẻ anh ăn chơi thả cửa nhỉ
Mỗi năm chỉ có vài ngày thôi em .
mR.Bi wrote:
Nhìn vào đoạn script iptables của anh, công đoạn được thực hiện theo cách thức: log sau đó dựa vào log để drop. Và hầu như tất cả các rules anh đưa ra đều có những giá trị được anh "pre-define" cụ thể từ trước, mà những giá trị này không phải ông System Admin nào cũng biết rõ và đưa ra những con số ngay được.
Đoạn rule của anh là kết quả của quá trình nghiên cứu các phương thức tấn công, và...có lẽ anh trải nghiệm nhiều trong việc đối phó với tấn công từ chối dịch vụ, ví dụ như em nếu gặp trường hợp bị A tấn công bằng phương thức 1, em chỉ cố găng bằng cách nào đó đưa ra những rule để đối phó với A, mà nếu tiếp theo có ông B thì cách thức dùng để đối phó với A trở nên vô dụng với B, em lại mày mò cách đối phó với B. Nói chung em không có kế hoạch rõ ràng, và không tính đến một bài toán mang tính toàn vẹn...như anh.
Các pre-defined values không quan trọng bởi vì tùy hoàn cảnh, những value này sẽ thay đổi. Đó là lý do anh không kèm theo những values ấy (và để tránh tình trạng copy & paste và dùng không suy nghĩ).
mR.Bi wrote:
Điều em thắc mắc là rõ ràng ta không thể cùng một lúc vừa log vừa drop, nên anh chỉ định các user-define-table, list, log-prefix để dựa vào đó lọc ra các packet "vi phạm". Nhưng liệu việc ghi log như thế có thực sự bền bỉ? Vì cũng như anh từng nói việc ghi log liên tục như thế chiếm dụng rất nhiều tài nguyên của server, cho dù anh có đưa ra giá trị --limit-burst, theo em con số này có vẻ khá quan trọng trong đoạn iptables script của anh. Em chưa nghĩ ra anh đặt là bao nhiêu, trước giờ em toàn không ấn định cụ thể (5).
Nếu em xem kỹ thì sẽ thấy giới hạn và tầng số log rất thấp. Log quá nhiều thì hại nhưng log đúng mức (tùy theo hoàn cảnh) thì lợi.
mR.Bi wrote:
Và những rule bên trên cũng không thể chống đối với dạng tấn công liên tục từ rất nhiều nguồn, làm bão hoà đường truyền. Tác vụ ghi log làm firewall tốn khá nhiều thời gian, và nếu như em đặt ra một rule thế này:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s –j ACCEPT
thì em kiểm tra, có lúc chính nó làm server load tăng vọt, có khi hoàn toàn trì trệ. Vậy log + drop sẽ chậm hơn rất nhiều và tác vụ xử lí sẽ tốn server load hơn so với chỉ drop, phải không anh?
Đúng. Không có một thứ luật nhiệm mầu nào cả. Cùng một luật đưa ra có thể làm việc hoàn chỉnh cho một server này nhưng có thể hoàn toàn vô dụng cho server kia. Bởi thế, anh luôn luôn nhấn mạnh: tùy hoàn cảnh.
mR.Bi wrote:
Đọc xong đoạn rule của anh em nghĩ mình phải học lại kiến thức căn bản về iptables, nhiều rule em đọc xong google từng option mới mườn tượng ra được cách thức hoạt động của nó. Em đang đọc phần conntract:
http://www.faqs.org/docs/iptables/theconntrackentries.html
Cũng không đến nỗi vậy đâu . Nếu em đọc và phân tích từng dòng luật ở trên, em sẽ thấy được lý do tại sao chúng hiện hữu như thế. Đến lúc ấy, mọi chuyện sẽ trở nên đơn giản.
mR.Bi wrote:
Hiện tại server bên em được bên cung cấp đặt sau lưng con Pix firewall, nhưng chả hiểu bên đấy config thế nào packet vẫn vào như nhà không cửa .
Nếu con PIX chẳng cản lọc cái gì liên quan đến packet rate thì "vào như nhà không cửa" là chuyện tự nhiên.
mR.Bi wrote:
Em thử áp dụng script của anh lại gặp phải lỗi iptables:
Code:
#iptables -A INPUT -p tcp -d $myip --dport 80 -m state --state ESTABLISHED -m connlimit --connlimit-above 4 -j DROP
iptables: Unknown error 18446744073709551615
Vì iptables của em thiếu module "connlimit" mà ra thôi.
mR.Bi wrote:
Có lẽ em nên post vào box khác hợp lí hơn. Cám ơn anh rất nhiều, đang bị bội thực kiến thức
Hì hì. Lúc đầu thì choáng 1 tí thôi. Từ từ, thong thả thì sẽ tiêu hóa. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
29/01/2009 07:17:27 (+0700) | #17 | 167675 |
|
Phó Hồng Tuyết
Member
|
0 |
|
|
Joined: 20/04/2007 20:02:10
Messages: 275
Location: Nơi Sâu Thẳm Tâm Hồn
Offline
|
|
mong năm mới anh conmale cho thêm vài đoạn nữa. |
|
"Một người thành công không có ý nghĩ đổ thừa thất bại do ...." |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
30/01/2009 20:33:08 (+0700) | #18 | 167725 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
Phó Hồng Tuyết wrote:
mong năm mới anh conmale cho thêm vài đoạn nữa.
Vài đoạn gì em? |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
04/02/2009 07:55:46 (+0700) | #19 | 168085 |
|
Phó Hồng Tuyết
Member
|
0 |
|
|
Joined: 20/04/2007 20:02:10
Messages: 275
Location: Nơi Sâu Thẳm Tâm Hồn
Offline
|
|
conmale wrote:
Mr. Bi thân mến,
Mấy hôm nay anh "bị" liên hoan triền miên, xỉn triền miên nên không vào diễn đàn nên không hồi báo sớm hơn.
"Vấn nạn" của em gặp phải cũng là vấn nạn mà HVA gặp phải trước đây. Kỹ thuật "detect" dấu hiệu bị tấn công phụ thuộc vào những điểm đặc thù để dựa vào đó mà xử lý. Lần trước, điểm đặc thù em có thể tìm thấy là string "muviet". String này có thể sẽ thay đổi thường xuyên, thậm chí thay đổi random trong mỗi request. Bởi thế, khi chọn lựa một thứ "vũ khí" để chống đỡ, em cần suy nghĩ đến biên độ rộng nhất mà "vũ khí" này có thể bảo vệ em.
Trong trường hợp không còn "string" (dấu hiệu cụ thể) nào cả thì cần xét kỹ hơn: điểm nào là điểm đặt thù của các packets trên? Nếu em chọn dấu hiện referer www.yahoo.com thì em vô tình cản luôn các request hợp lệ chuyển từ trang tìm kiếm của yahoo vào site của em. Đây là cách không tối ưu.
Hãy xét xem, tâng số của các requests tấn công em khác các request bình thường thế nào? Các request bình thường (đi từ 1 IP) có khi nào gởi liên tục 10, 20, 30, 40 requests trong 1 giây không? --> đây cũng là điểm đặc thù em có thể dùng để chọn "vũ khí" mới để tự vệ vậy.
Anh giới thiệu em một đoạn "adaptive" rule dùng module recent để "trị" dạng DDoS không có dấu hiệu (string) gì ngoài tầng số tấn công:
Code:
# create an incoming table to control packets base on recent rules
iptables -N incominghttp
# create a conn table to control maximum connection per IP
iptables -N conn
iptables -A conn -j DROP
# create a blacklist table
iptables -N blacklist
iptables -A blacklist -j LOG --log-prefix "BLACKLISTING: "
iptables -A blacklist -m recent --name BLACKLIST --set -j DROP
# create a httpnormal to control normal flow of http if above is satisfied
iptables -N httpnormal
# now add rules into it (httpnormal)
iptables -A httpnormal -p tcp ! --syn -s $NET --sport $HI_PORTS -d $IP --dport 80 -m state --state NEW -m limit --limit 1/m -j LOG --log-prefix "NEWNOTSYN_HTTP: "
iptables -A httpnormal -p tcp ! --syn -s $NET --sport $HI_PORTS -d $IP --dport 80 -m state --state NEW -j DROP
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m limit --limit 10/m --limit-burst $BURST_ME -j LOG --log-prefix "SYNFLOOD: "
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m state --state NEW -m limit --limit $SYN_ME --limit-burst $BURST_ME -j ACCEPT
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m state --state NEW -j ACCEPT
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m limit --limit $SYN_ME --limit-burst $BURST_ME -j LOG --log-prefix "OVER_BURST: "
iptables -A httpnormal -p tcp --syn -s $NET -d $IP --dport 80 -m limit --limit $SYN_ME --limit-burst $BURST_ME -j conn
iptables -A httpnormal -p tcp -s $NET -d $IP --dport 80 -m state --state ESTABLISHED -m connlimit --connlimit-above $GLOBAL -m limit --limit 2/m -j LOG --log-prefix "OVERCONNLIMIT: "
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -d $IP --dport 80 -m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID: "
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -d $IP --dport 80 -m conntrack --ctstate INVALID -j DROP
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -m state --state ESTABLISHED -d $IP --dport 80 -m connlimit ! --connlimit-above $GLOBAL -j ACCEPT
iptables -A httpnormal -p tcp -s $NET --sport $HI_PORTS -m state --state ESTABLISHED -d $IP --dport 80 -m connlimit --connlimit-above $GLOBAL -j conn
echo "connlimit is defined"
# After defining INPUT, only allow OUTPUT as ESTABLISHED state
# There should be no SYN packet from port 80 of HTTP server
# Using own server to initiate request to other sites is impossible
iptables -A OUTPUT -p tcp -s $IP --sport 80 -d $NET --dport $HI_PORTS -m state --state ESTABLISHED -j ACCEPT
# then allow all ESTABLISHED INPUT without SYN
# Once the connection is ESTABLISHED (passed all the rules above) - should not restrict rate to maximise performance
iptables -A httpnormal -p tcp ! --syn -s $NET --sport $HI_PORTS -d $IP --dport 80 -m state --state ESTABLISHED -j ACCEPT
# rate limiting on incoming http packets and keep a blacklist for 60 seconds
# this rule drops *any* packet if the IP is in the blacklist
iptables -A incominghttp -m recent --name BLACKLIST --update --seconds 60 -j DROP
# all *established* http connections are allowed to continue
iptables -A incominghttp -p tcp --dport 80 -m state --state ESTABLISHED,RELATED -j httpnormal
# all *new* http connections are all put into a list 'httpconn'
# if there are 20 SYN packets in 30 seconds (as defined in variables SECS and HITS above)
# we send the package to chain 'blacklist ' which puts the IP in the blacklist
iptables -A incominghttp -p tcp --dport 80 -m state --state NEW -m recent --name httpconn --rcheck --seconds $SECS --hitcount $HITS -j blacklist
# if we have seen less then 20 such packets in the last 30 seconds we accept
# and direct the packets to the normal http chain httpnormal
iptables -A incominghttp -p tcp --dport 80 -m state --state NEW -m recent --name httpconn --set -j httpnormal
echo "Start the actual http rule..."
$IPTABS -A INPUT -p tcp -s $NET -d $IP --dport 80 -j incominghttp
echo "The HTTP service is provided"
}
Em xem và suy nghĩ về đoạn rule trên và cho anh biết em đã đúc kết được những gì nhá? .
em đã áp dụng thử nhưng nó bão lôi thế này anh à.
Code:
root@i3network:/etc/init.d# sh entry-conmale
iptables: Chain already exists
iptables: Chain already exists
iptables: Chain already exists
iptables: Chain already exists
Bad argument `limit'
Try `iptables -h' or 'iptables --help' for more information.
Bad argument `ACCEPT'
Try `iptables -h' or 'iptables --help' for more information.
Bad argument `conn'
Try `iptables -h' or 'iptables --help' for more information.
connlimit is defined
Start the actual http rule...
entry-conmale: 65: -A: not found
The HTTP service is provided
em chưa hiểu các lỗi trên mong anh bớt chút thời gian giải thích hộ em.
Phó Hồng Tuyết wrote:
mong năm mới anh conmale cho thêm vài đoạn nữa.
Vài đoạn gì em?
ý là em mong anh cho thêm vài đoạn script. giống như trong topic này nè anh. |
|
"Một người thành công không có ý nghĩ đổ thừa thất bại do ...." |
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
04/02/2009 15:11:35 (+0700) | #20 | 168131 |
Mr.Khoai
Moderator
|
Joined: 27/06/2006 01:55:07
Messages: 954
Offline
|
|
Phó Hồng Tuyết,
Đừng có lấy cái iptables script của anh conmale mà chạy đại. Bạn chỉ nên đọc để tham khảo thêm cách anh conmale triển khai firewall cho một forum như HVA là thế nào, sau đó tự bạn nên viết lại một cái firewall để thích hợp với yêu cầu cá nhân của bạn. Chạy script của ảnh thì chả hiểu thêm được gì đâu.
Trước tiên nên tìm hiểu về iptables đã. Các chains, các rules được áp dụng thế nào? Các modules nào trong kernel hỗ trợ cho iptables? Và hỗ trợ như thế nào?
khoai |
|
|
|
|
[Question] Re: Vài câu hỏi về Null routing |
04/02/2009 20:25:39 (+0700) | #21 | 168136 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
Chính xác nội dung của cái "entry-conmale" là gì?
Anh có đưa ra 100 đoạn script cũng vô nghĩa vì nó không để phục vụ cái gì cả. |
|
What bringing us together is stronger than what pulling us apart. |
|
Users currently in here |
1 Anonymous
|
|
Powered by JForum - Extended by HVAOnline
hvaonline.net | hvaforum.net | hvazone.net | hvanews.net | vnhacker.org
1999 - 2013 ©
v2012|0504|218|
|
|