2008-09-20 18 views
36

Tôi cần truy vấn các quy tắc hiện tại, cũng như có thể dễ dàng thêm và xóa quy tắc. Tôi đã không tìm thấy bất kỳ API nào để thực hiện việc này. Có cái gì tôi đang mất tích?Làm cách nào tôi có thể quản lý các quy tắc iptables một cách có lập trình khi đang di chuyển?

Gần nhất tôi đã đến một giải pháp đang sử dụng iptables-save | iptables-xml để truy vấn và tự gọi lệnh iptables để thêm/xóa quy tắc. Một giải pháp khác mà tôi đã xem xét đơn giản là tái tạo toàn bộ ruleset ra khỏi cơ sở dữ liệu của ứng dụng của tôi và xả toàn bộ chuỗi, sau đó áp dụng lại nó. Nhưng tôi muốn tránh điều này vì tôi không muốn bỏ bất kỳ gói nào - trừ khi có một cách để làm điều này một cách nguyên tử. Tôi tự hỏi nếu có một cách tốt hơn.

API trong C sẽ tuyệt vời; tuy nhiên, khi tôi dự định xây dựng nó thành một chương trình suid độc lập, các thư viện thực hiện điều này bằng bất kỳ ngôn ngữ nào cũng tốt.

+0

Dường như có thể chuyển từ XML sang iptables-restore 'xsltproc iptables.xslt my-iptables.xml | iptables-restore'. Xem manpage của 'iptables-xml'. – CMCDragonkai

Trả lời

3

Có cố tình không có API để quản lý các quy tắc này. Bạn không cần phải làm như vậy. Hoặc một cái gì đó.

Nếu quý vị cần quy tắc đó là đủ năng động mà bạn quan tâm việc thực hiện thực hiện/sbin/iptables, có những cách khác để làm điều đó:

  • Sử dụng một cái gì đó giống như một trận đấu hoặc ip set phù hợp với "gần đây" , bạn có thể thêm/xóa địa chỉ IP khỏi danh sách đen/trắng mà không thay đổi tập hợp quy tắc.
  • Bạn có thể vượt qua các gói dữ liệu vào không gian người dùng cho lọc sử dụng NFQUEUE
+4

Có vẻ ngớ ngẩn với tôi rằng không có API cho việc này. Tôi không thực sự quan tâm đến hiệu suất như vậy, nhưng gọi iptables cảm thấy giống như một cách khủng khiếp hacky làm việc. – Ycros

+0

Hmm, tôi có thể sử dụng ipsets - và từ góc nhìn hiệu suất, đó thực sự là một ý tưởng hay. Thật không may tôi sẽ phải cuộn hạt nhân của riêng tôi, và điều này là không thể như một số nơi phần mềm này sẽ chạy là trên máy ảo, nơi tôi không thể gây rối với hạt nhân một cách dễ dàng. Và họ vẫn không cung cấp một API tốt đẹp. – Ycros

+0

ipt_recent là một mục tiêu phù hợp tiêu chuẩn iptables cho phép bạn tự động thêm/xóa địa chỉ IP từ một tập bằng cách ghi vào một tập tin trong/proc mà không thay đổi các quy tắc. Mặt khác, nó không dành cho các bộ IP lớn và dường như có giới hạn tối đa cố định. – MarkR

0

đúng MarkR, bạn đang không được phép làm điều này. Cách dễ nhất là gọi iptables từ tập lệnh hoặc viết cấu hình iptables và 'khôi phục' nó.

Tuy nhiên, nếu bạn muốn, hãy đọc nguồn của iptables. iptables sử dụng các kết quả phù hợp và các bảng như các đối tượng dùng chung. Bạn có thể sử dụng nguồn hoặc chúng.

Trình netfilter Linux cũng có một số tệp bao gồm/usr/include/netfilter *. Đây là một số chức năng cấp thấp. Đó là những gì iptables sử dụng. Đây là gần như một API là một trong những có thể nhận được mà không có iptables.

Nhưng API này là 'lộn xộn'. Hãy nhớ rằng nó được thiết kế để chỉ được sử dụng bởi iptables. Nó không được tài liệu rất tốt, bạn có thể gặp vấn đề rất cụ thể, API có thể thay đổi khá nhanh mà không có bất kỳ cảnh báo nào, vì vậy bản nâng cấp có thể sẽ phá vỡ mã của bạn, v.v.

+2

Tôi có thể chấp nhận rằng việc sử dụng API nội bộ là không tốt, nhưng tại sao điều này lại tệ đến mức họ sẽ cố tình không bao gồm API công khai? Tôi có thể đi với một khôi phục nếu tôi có thể làm một khôi phục của một chuỗi duy nhất - Tôi sẽ phải làm một số thử nghiệm. – Ycros

+0

Có, bạn có thể khôi phục một chuỗi. :-) –

+0

Ở đó, trong câu trả lời. – terminus

4

Theo như tôi hiểu (mặc dù không có tham chiếu nào đề cập đến nó), iptables-restore là nguyên tử. Cuối cùng, khi dòng COMMIT được đọc, iptables gọi iptc_commit trong libiptc (trong giao diện nội bộ bạn không được phép sử dụng), sau đó gọi setsockopt(SO_SET_REPLACE) với các quy tắc mới của bạn.

Điều đó nghe có vẻ nguyên tử như bạn có thể nhận được: với một cuộc gọi hạt nhân. Tuy nhiên, nhiều bên có kiến ​​thức hơn được mời tranh chấp điều này. :-)

Chỉnh sửa: Tôi có thể xác nhận rằng mô tả của bạn là chính xác. iptables-restore được thực hiện như một hoạt động nguyên tử trong hạt nhân.

Để được nhiều hơn cụ thể hoạt động "chỉ" là nguyên tử trên cơ sở mỗi CPU. Khi chúng tôi lưu trữ toàn bộ các ruleset blob trên mỗi CPU (do tối ưu hóa bộ nhớ cache).

16

Từ netfilter FAQ:

Câu trả lời thật không may là: Số

Bây giờ bạn có thể nghĩ 'nhưng những gì về libiptc?'. Như đã được chỉ ra nhiều lần trong (các) danh sách gửi thư, libiptc là KHÔNG BAO GIỜ có nghĩa là được sử dụng như một giao diện công cộng. Chúng tôi không đảm bảo một giao diện ổn định, và nó được lên kế hoạch để loại bỏ nó trong lần xuất hiện tiếp theo của gói lọc linux. libiptc là cách quá thấp lớp được sử dụng hợp lý anyway.

Chúng tôi nhận thức được rằng có một thiếu cơ bản đối với API như vậy và chúng tôi đang nỗ lực cải thiện tình huống đó. Cho đến lúc đó, bạn nên sử dụng hệ thống() hoặc mở một đường ống vào stdin của iptables-restore. Sau này sẽ cung cấp cho bạn một cách hiệu suất tốt hơn.

+0

Tôi tự hỏi tại sao Câu hỏi thường gặp không giải quyết được vấn đề về nguyên tử. Nó nên; Tôi đã đi đến những rắc rối của việc xem xét việc thực hiện iptables-khôi phục chỉ để đảm bảo nó nguyên tử. Điều quan trọng đối với OP ở đây, và tôi cũng đã có một dự án yêu cầu nó. –

+1

Bài đăng danh sách gửi thư netfilter này nói rằng iptables-restore là nguyên tử: http://www.mail-archive.com/[email protected]/msg00456.html –

+0

Đối với những người rất dũng cảm vẫn muốn thực hiện việc này, có một số thông tin tại đây: http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-4.html#ss4.2 – Roman

12

Sử dụng quy tắc iptables-save và iptables-restore để truy vấn và tạo lại dễ dàng là cách hiệu quả nhất để thực hiện. Chúng được sử dụng, một lần, là các kịch bản shell, nhưng bây giờ chúng là các chương trình C hoạt động rất hiệu quả.

Tuy nhiên, tôi nên chỉ ra rằng có một công cụ mà bạn có thể sử dụng sẽ giúp duy trì iptables dễ dàng hơn nhiều. Hầu hết rulesets động đang thực sự cùng một quy tắc lặp đi lặp lại nhiều lần, chẳng hạn như:

iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT 
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT 

Thay vì thay thế những quy tắc mỗi khi bạn muốn thay đổi những cổng có thể truy cập vào cổng 22 (hữu dụng cho tiếng nói, cổng gõ), bạn có thể sử dụng ipsets. Viz:

ipset -N ssh_allowed nethash 
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT 
ipset -A ssh_allowed 1.1.1.1 
ipset -A ssh_allowed 2.2.2.0/24 

Bộ có thể giữ địa chỉ ip, mạng, cổng, địa chỉ mac và có thời gian chờ lưu hồ sơ. (Bao giờ muốn thêm một cái gì đó chỉ trong một giờ?).

Thậm chí còn có một cách nguyên tử để trao đổi một tập hợp với một bộ khác, do đó làm mới nghĩa là tạo một tập hợp tạm thời mới, sau đó hoán đổi nó làm tên của tập hợp hiện có.

+0

Aye, câu trả lời hàng đầu đề cập đến ipsets, nhưng như tôi đã nói trong một bình luận ở đó - nó đòi hỏi một mô-đun hạt nhân không có trong Ubuntu theo mặc định, và nó không phải cái gì tôi có thể cài đặt trên bất kỳ máy ảo nào mà tôi sử dụng. – Ycros

+1

Vâng, tôi đã báo cáo lỗi đó vào tháng 1 '07. https://bugs.launchpad.net/ubuntu/+source/ipset/+bug/79182 – Jerub

+2

Ubuntu hỗ trợ ipset đầy đủ ngay bây giờ. – Jerub

1

Sáng nay tôi thức dậy để thấy rằng đã nhận được một cuộc tấn công từ chối dịch vụ (DOS) từ Nga. Họ đã đánh tôi từ hàng chục khối IP. Họ phải có một nhóm lớn các IP hoặc một số loại danh sách/dịch vụ proxy. Mỗi khi tôi chặn một IP, một cái khác xuất hiện. Cuối cùng, tôi tìm kiếm một kịch bản, và thấy rằng tôi cần viết giải pháp của riêng mình. Sau đây là một chút agressive, nhưng họ đã chạy TOP LOAD LEVEL của tôi đến hơn 200.

Đây là một kịch bản nhanh chóng tôi đã viết để chặn các DOS trong thời gian thực.

cat **"output of the logs"** | php ipchains.php **"something unique in the logs"** 

==> PHP Script:

<?php 

$ip_arr = array(); 

while(1) 
{ 
    $line = trim(fgets(STDIN)); // reads one line from STDIN 
    $ip = trim(strtok($line, " ")); 

    if(!array_key_exists($ip, $ip_arr)) 
     $ip_arr[$ip] = 0; 

    $regex = sprintf("/%s/", $argv[1]); 

    $cnt = preg_match_all($regex, $line); 

    if($cnt < 1) continue; 

    $ip_arr[$ip] += 1; 

    if($ip_arr[$ip] == 1 ) 
    { 
//  printf("%s\n", $argv[1]); 
//  printf("%d\n", $cnt); 
//  printf("%s\n", $line); 

     printf("-A BLOCK1 -s %s/24 -j DROP\n", $ip); 

     $cmd = sprintf("/sbin/iptables -I BLOCK1 -d %s/24 -j DROP", $ip); 
     system($cmd); 
    } 
} 

?> 

Giả định:

1) BLOCK1 is a Chain already created. 
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN 
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file. 
4) You are familiar with PHP 
5) You understand web log line items/fields and output. 
0

Đây là một ví dụ của việc sử dụng bash và iptables để chặn tự động các hacker lợi dụng sshd trên CentOS . Trong trường hợp này, tôi đã cấu hình sshd để không cho phép đăng nhập mật khẩu (cho phép khóa). Tôi nhìn vào/var/log/an toàn cho các mục của "Bye Bye", đó là cách lịch sự của sshd nói f-off ...

IP=$(awk '/Bye Bye/{print $9}' /var/log/secure | 
    sed 's/://g' |sort -u | head -n 1) 

[[ "$IP" < "123" ]] || { 

    echo "Found $IP - blocking it..." >> /var/log/hacker.log 

    /sbin/iptables -A INPUT -s $IP -j DROP 

    service iptables save 

    sed -i "/$IP/d" /var/log/secure 

} 

Tôi chạy vòng lặp này mỗi giây, phút hoặc bất kỳ điều gì làm tôi hạnh phúc. Tôi kiểm tra giá trị của $ IP để xác minh nó tìm thấy một giá trị hữu ích, nếu vậy tôi gọi iptables để thả nó, và tôi sử dụng sed để thanh lọc tệp nhật ký của $ IP để mục nhập không được thêm lại.

Tôi thực hiện một chút trước khi xử lý (không được hiển thị) sang danh sách trắng một số IP quan trọng luôn hợp lệ và có thể gặp sự cố khi kết nối (do lỗi người dùng). Theo thời gian, tôi sắp xếp danh sách bộ lọc iptables và tạo dải IP từ chúng (sử dụng tập lệnh khác - và khi được chọn, chúng thường là dải IP từ Ấn Độ, Trung Quốc và Nga). Do đó, bộ quy tắc lọc iptables tổng thể của tôi nằm trong khoảng từ 50 đến 500 mục nhập; ipset không thực sự cải thiện nhiều trong danh sách ngắn.

+1

Ý nghĩa của số 123 là gì? Nếu bạn muốn kiểm tra xem bạn có một địa chỉ IP hợp lệ hay không bằng cách kiểm tra giá trị của octet đầu tiên, nó có thể là bất cứ thứ gì lên tới 223 tôi tin. – tripleee

+0

Đây không phải là thử nghiệm của bất kỳ octet nào. Nếu khi phân tích cú pháp/var/log/secure bạn kết thúc với một trường trống hoặc bị hỏng, bạn kiểm tra giá trị để không chạy lệnh iptables. Giá trị '123' khá tùy ý. Trong thử nghiệm này nhiều hơn một chút, tôi thấy bạn có lẽ nên thay thế '123' với '1' để bao gồm một phạm vi IP hoàn chỉnh, mặc dù. Khi thử nghiệm một IP nhỏ hơn '123', nó sẽ đúng đối với địa chỉ IP trong phạm vi từ 2.0.0.0 đến 255.255.255.255, vì vậy nó sẽ không chặn IP trong phạm vi 1.x.x.x. Khi thử nghiệm IP nhỏ hơn '1', nó phù hợp với 0.0.0.1 đến 255.255.255.255. – Andrew

5

Bạn có thể xem xét sử dụng rfw là API REST cho iptables. Nó đang tuần tự hóa các lệnh iptables từ các nguồn đồng thời có khả năng khác nhau và thực thi từ xa iptables khi đang di chuyển.

rfw được thiết kế cho các hệ thống phân tán cố gắng cập nhật quy tắc tường lửa trên nhiều hộp nhưng cũng có thể chạy trên một máy duy nhất trên giao diện localhost. Sau đó, nó cho phép tránh chi phí SSL và xác thực vì nó có thể chạy trên HTTP thuần trong trường hợp này.

lệnh mẫu:

PUT /drop/input/eth0/11.22.33.44 

tương ứng với:

iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP 

Bạn có thể chèn và xóa các quy tắc cũng như truy vấn cho tình trạng hiện tại để có được những quy định hiện hành ở định dạng JSON:

GET /list/input 

Tuyên bố từ chối trách nhiệm: Tôi đã bắt đầu dự án đó. Đó là mã nguồn mở theo giấy phép MIT.

+0

Nếu nó qua HTTP, điều đó có gây nguy hiểm cho tường lửa không? –

+0

Như đã nêu ở trên, mặc định là HTTPS. Có một tùy chọn để vô hiệu hóa SSL và sử dụng đồng bằng HTTP, hữu ích khi chạy trên localhost trong môi trường người dùng đơn lẻ. –

+0

Bất kỳ thứ gì điều khiển tường lửa "lập trình"/từ xa và/hoặc tự động đều nguy hiểm. Tuy nhiên, bảo mật thích hợp tại chỗ có thể giảm thiểu điều này, tức là mã thông báo sso/2fa phía sau cổng api (như kong) sẽ đi một chặng đường dài để đáp ứng nhu cầu bảo mật đó. –

Các vấn đề liên quan