Làm cách nào để kiểm tra xem quy tắc iptables đã tồn tại chưa?


41

Tôi cần thêm một quy tắc vào iptables để chặn các kết nối đến cổng tcp từ Internet.

Vì tập lệnh của tôi có thể được gọi nhiều lần và không có tập lệnh nào để xóa quy tắc, tôi muốn kiểm tra xem quy tắc iptables đã tồn tại trước khi chèn nó chưa - nếu không sẽ có rất nhiều quy tắc kép trong chuỗi INPUT.

Làm cách nào để kiểm tra xem quy tắc iptables đã tồn tại chưa?


Hoặc, sử dụng trình bao bọc này, cung cấp tương tác iptables bình thường: xyne.archlinux.ca/projects/ideemables
sampablokuper

Câu trả lời:


44

Có một -C --checktùy chọn mới trong các phiên bản iptables gần đây.

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
# echo $?
1

# iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
# echo $?
0

Đối với các phiên bản iptables cũ hơn, tôi sẽ sử dụng đề xuất của Garrett:

# iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"

12

-CTùy chọn mới là không thỏa đáng, bởi vì nó mở cho điều kiện cuộc đua thời gian kiểm tra thời gian sử dụng (TOCTTOU). Nếu hai quy trình cố gắng thêm cùng một quy tắc cùng một lúc, -Csẽ không bảo vệ chúng khỏi việc thêm hai lần.

Vì vậy, nó thực sự không tốt hơn grepgiải pháp. Một công việc xử lý văn bản chính xác trên đầu ra của iptables-savecó thể hoạt động một cách đáng tin cậy -C, vì đầu ra đó là một ảnh chụp nhanh đáng tin cậy về trạng thái của các bảng.

Điều cần thiết là một --ensuretùy chọn kiểm tra nguyên tử và thêm quy tắc chỉ khi nó không tồn tại. Hơn nữa, thật tuyệt nếu quy tắc được chuyển đến đúng vị trí nơi quy tắc mới sẽ được chèn nếu nó chưa tồn tại ( --ensure-move). Chẳng hạn, nếu iptables -I 1được sử dụng để tạo quy tắc ở đầu chuỗi, nhưng quy tắc đó đã tồn tại ở vị trí thứ bảy, thì quy tắc hiện tại sẽ chuyển sang vị trí đầu tiên.

Không có các tính năng này, tôi nghĩ một cách giải quyết khả thi là viết một vòng lặp shell shell dựa trên mã giả này:

while true ; do
  # delete all copies of the rule first

  while copies_of_rule_exist ; do
    iptables -D $RULE
  done

  # now try to add the rule

  iptables -A $RULE # or -I 

  # At this point there may be duplicates due to races.
  # Bail out of loop if there is exactly one, otherwise
  # start again.
  if exactly_one_copy_of_rule_exists ; then
    break;
  fi
done

Mã này có thể quay xung quanh; nó không đảm bảo rằng hai hoặc nhiều tay đua sẽ bị loại trong một số lần lặp cố định. Một số giấc ngủ ngược theo cấp số nhân ngẫu nhiên có thể được thêm vào để giúp với điều đó.


1
Tôi có thể thêm rằng lệnh này không thỏa đáng vì lý do đơn giản là bạn phải xác định chính xác cách thức quy tắc của bạn được thêm vào. Tôi đã thực hiện thử nghiệm với thiết lập của mình và nó không thể tìm thấy quy tắc vì tôi không chỉ định các từ khóa và giá trị chính xác ...
Fabien Haddadi

Nếu bạn tạm thời xóa một quy tắc thì bạn có thể phá vỡ một cái gì đó ...
Mehrdad

5

Điều này có vẻ hơi ngược, nhưng nó hoạt động với tôi - Hãy thử xóa quy tắc trước.

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;

Bạn sẽ nhận được một tin nhắn tương tự như:

iptables: Quy tắc xấu (có quy tắc phù hợp tồn tại trong chuỗi đó không?)

Sau đó, chỉ cần thêm quy tắc của bạn như bình thường:

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;


1
Mở một lỗ không mong muốn trong tường lửa của bạn, chỉ để mô phỏng một lệnh idempotent, có lẽ không phải là một ý tưởng tuyệt vời. Chắc chắn, lỗ hổng được dự định là tạm thời, nhưng nó vẫn cải thiện cơ hội của kẻ tấn công. Và nếu một cái gì đó làm gián đoạn việc bổ sung quy tắc thay thế, thì lỗ hổng có thể tồn tại vô thời hạn.
sampablokuper

Điểm hay @sampablokuper: chiến lược này có lẽ chỉ phù hợp với quy tắc ACCEPT chứ không phải DROP, vì lý do bảo mật
lucaferrario

Tôi cuối cùng đã làm điều tương tự!
warhansen

4

Chỉ cần liệt kê và tìm kiếm nó?

iptables --list | grep $ip

... hoặc tuy nhiên bạn có quy tắc được chỉ định. Nếu bạn sử dụng, grep -qnó sẽ không xuất ra bất cứ thứ gì và bạn chỉ có thể kiểm tra giá trị trả về với$?


3
Tôi sẽ đề nghị iptables-save|grep $ipthay vì nó là một định dạng dễ phân tích cú pháp hơn, đặc biệt là trong một tập lệnh. Bạn cũng có thể kiểm tra cú pháp chính xác của lệnh nếu muốn.
Garrett

1
Cả hai điều này thực sự trả lời câu hỏi, bởi vì iptables-save|grep $iprất có thể phù hợp với nhiều quy tắc. Có thể iptables-savecó thể được sử dụng để kiểm tra đặc tả quy tắc hoàn chỉnh , nhưng đó vẫn là một chút hack: định dạng được trả về iptables-savecó thể không khớp chính xác với quy tắc trong tập lệnh. iptables-savecó thể tạo các tùy chọn theo thứ tự khác, thêm những thứ (như -m tcp), v.v.
larsks

Hãy nhớ rằng iptables --listsẽ cố gắng giải quyết các cổng nổi tiếng. Vì vậy, hãy chắc chắn về điều đó trước khi bạn grep cho một cổng.
Fabien Haddadi


0

Để tránh các quy tắc trùng lặp từ tập lệnh của bạn, hãy thêm dòng dưới đây.

iptables -C -INPUT -p tcp --dport 8080 --jump ACCEPT || iptables -A -INPUT -p tcp --dport 8080 --jump ACCEPT

Lần đầu tiên khi lệnh trên được chạy, chúng ta sẽ quan sát thông báo bên dưới

iptables: Quy tắc xấu (có quy tắc phù hợp tồn tại trong chuỗi đó không?).

Đây chỉ là thông tin. Nhưng nửa sau của lệnh sẽ đảm bảo thêm quy tắc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.