Làm cách nào để xóa các quy tắc cụ thể khỏi iptables?


334

Tôi đang lưu trữ các dịch vụ HTTP và HTTPS đặc biệt trên các cổng 8006 và 8007 tương ứng. Tôi sử dụng iptables để "kích hoạt" máy chủ; tức là định tuyến các cổng HTTP và HTTPS đến:

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006 
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007  
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007 

Công việc này như một cái duyên vậy. Tuy nhiên tôi muốn tạo một tập lệnh khác vô hiệu hóa máy chủ của tôi một lần nữa; tức là khôi phục iptables về trạng thái trước khi chạy các dòng trên. Tuy nhiên tôi đang gặp khó khăn trong việc tìm ra cú pháp để loại bỏ các quy tắc này. Điều duy nhất có vẻ hoạt động là một tuôn ra hoàn toàn:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Nhưng điều đó cũng sẽ xóa các quy tắc iptables khác không mong muốn.


2
Tôi thấy rằng tốt hơn là sử dụng -Ithay vì -Acho ACCEPTcác dòng. Điều này là do thông thường, dòng cuối cùng ( INPUTví dụ như chuỗi) là một DROPhoặc REJECTvà bạn muốn quy tắc của mình đến trước đó. -Ađặt quy tắc mới sau quy tắc cuối cùng, trong khi -Iđặt quy tắc ở đầu.
Đánh dấu Lakata

Câu trả lời:


471

Thực hiện các lệnh tương tự nhưng thay thế "-A" bằng "-D". Ví dụ:

iptables -A ...

trở thành

iptables -D ...

7
Nếu bạn có một số quy tắc của một loại, nó sẽ không loại bỏ tất cả chúng.
ETech

4
cố gắng thực hiện lệnh -D này nhiều lần và nó sẽ xóa tất cả chúng.
Zhenyu Li

4
tôi đã thực hiện cùng một lệnh, nhưng với -D thay vì -I. Nhưng tôi nhận được BAD RULE (tồn tại một quy tắc phù hợp) ...
Ben

4
Nếu bạn đã thêm quy tắc bằng -Ihoặc -R, bạn vẫn có thể xóa quy tắc đó bằng -D.
David Xia

Chỉ cần một lưu ý. Tôi tạo quy tắc với 'iptables -A ...' và quy tắc xuất hiện nhưng không hiệu quả. Khi sử dụng 'iptables -D ...', phản hồi là quy tắc xấu . Mặc dù vậy, quy tắc đã bị xóa. Quy tắc được hiển thị với 'sudo iptables -nvL'. Chuỗi tôi đã sử dụng là 'INPUT'.
Ben Paz

446

Bạn cũng có thể sử dụng số của quy tắc ( - số dòng ):

iptables -L INPUT --line-numbers

Ví dụ đầu ra:

Chain INPUT (policy ACCEPT) 
    num  target prot opt source destination
    1    ACCEPT     udp  --  anywhere  anywhere             udp dpt:domain 
    2    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:domain 
    3    ACCEPT     udp  --  anywhere  anywhere             udp dpt:bootps 
    4    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:bootps

Vì vậy, nếu bạn muốn xóa quy tắc thứ hai:

iptables -D INPUT 2

Cập nhật

Nếu bạn sử dụng (d) một bảng cụ thể (ví dụ: nat), bạn phải thêm nó vào lệnh xóa (thx thành @ThorSummoner cho nhận xét)

sudo iptables -t nat -D PREROUTING 1

4
Cả hai giải pháp đều tốt, nhưng giải pháp này sẽ không hoạt động trong cài đặt theo kịch bản khi không biết số dòng. Vì vậy, giải pháp khác là tổng quát hơn, và do đó chính xác hơn, IMO.
Jeroen

2
Chà nếu bạn không biết dòng bạn có thể sử dụng một nhận xét (như câu trả lời trong số) hoặc thực hiện một grep cho quy tắc của bạn:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27

6
Điều này chỉ tốt nếu bảng không thể có quy tắc được chèn tại bất kỳ thời điểm nào. Mặt khác, số dòng có thể thay đổi giữa việc quan sát chúng và thực hiện quy tắc xóa. Trong trường hợp như vậy, sẽ không an toàn khi cho rằng cửa sổ thời gian quá ngắn đến mức "điều đó khó có thể xảy ra".
Nick

14
Hãy nhớ rằng nếu bạn xóa một quy tắc, số dòng của phần còn lại sẽ thay đổi. Vì vậy, nếu bạn cần xóa quy tắc 5, 10 và 12 ... hãy xóa chúng 12, 10, sau đó 5.
TomOnTime

2
Khi cố gắng xóa các quy tắc PREROUTING, tôi phải chỉ định -t nat, ví dụ : sudo iptables -t nat --line-numbers -L, và cũng xóa chúng -t nat, ví dụ: sudo iptables -t nat -D PREROUTING 1(Có thể đáng để thêm vào câu trả lời không?)
ThorSummoner

31

Giải pháp tốt nhất phù hợp với tôi mà không gặp vấn đề gì theo cách này:
1. Thêm quy tắc tạm thời với một số nhận xét:

comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g')
iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION

2. Khi quy tắc được thêm vào và bạn muốn xóa nó (hoặc mọi thứ có nhận xét này), hãy làm:

iptables-save | grep -v "${comment}" | iptables-restore

Vì vậy, bạn sẽ xóa 100% tất cả các quy tắc khớp với bình luận $ và không để lại các dòng khác. Giải pháp này hoạt động trong 2 tháng qua với khoảng 100 thay đổi quy tắc mỗi ngày - không có vấn đề gì. Hy vọng, nó giúp


2
Trong trường hợp bạn không có iptables-save / restore:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour

Để sử dụng trong đời thực: CRON 1) xóa các spamhauslệnh cấm iptables cũ , 2) lấy spamhaus.org/drop , 3) grep cho CIDR IP vàiptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross 15/1/2015

2
@Mansour Hoặc iptables -S | sed "/$comment/s/-A/iptables -D/e";) như thế này
hek2mgl 15/03/2015

@ hek2mgl sed không bỏ cuộc, phải không? =] Cảm ơn, tôi sẽ ghi nhớ khả năng này (Tôi sẽ quên cú pháp trong một ngày).
Mansour

sed được sử dụng chỉ để loại bỏ "-" khỏi uuid. Trong mọi trường hợp, một khi bạn có cú pháp sed - nó sẽ không bao giờ bị lãng quên. ))
ETech

11

Đầu tiên liệt kê tất cả các quy tắc iptables với lệnh này:

iptables -S

nó liệt kê như:

-A XYZ -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Sau đó sao chép dòng mong muốn và chỉ cần thay thế -Abằng -Dđể xóa dòng đó:

iptables -D XYZ -p ...

2
Hãy nhận biết! Đây là câu trả lời không đầy đủ. Từ hướng dẫn về "-S": "Giống như mọi lệnh iptables khác, nó áp dụng cho bảng được chỉ định (bộ lọc là mặc định).". Vì vậy, trong trường hợp sử dụng công tắc này - nên được lặp lại cho tất cả các bảng: nat, mangle, v.v.
pmod

1
Trong trường hợp của tôi, tôi nhận được iptables: Bad rule (does a matching rule exist in that chain?).những gì bây giờ?
Abdull 16/2/2016

Ah, đã tìm ra nó - lệnh xóa của tôi bị thiếu đặc tả bảng. Vì vậy, trong trường hợp bạn liệt kê tất cả các quy tắc từ bảng natvới sudo iptables -S -t natvà bạn muốn xóa một trong các quy tắc được trả về, sao chép là không đủ. Bạn phải thêm -t nat, ví dụ sudo iptables -D ... -t nat.
Abdull 16/2/2016

Dễ hiểu!
sknight 13/11/19

5

Sử dụng -Dlệnh, đây là cách mantrang giải thích nó:

-D, --delete chain rule-specification
-D, --delete chain rulenum
    Delete  one  or more rules from the selected chain.  
    There are two versions of this command: 
    the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.

Hãy nhận ra lệnh này, giống như tất cả các lệnh khác ( -A, -I) hoạt động trên bảng nhất định. Nếu bạn không làm việc trên bảng mặc định ( filterbảng), hãy sử dụng -t TABLENAMEđể chỉ định bảng mục tiêu đó.

Xóa quy tắc để khớp

iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

Lưu ý: Điều này chỉ xóa quy tắc đầu tiên phù hợp. Nếu bạn có nhiều quy tắc khớp (điều này có thể xảy ra trong iptables), hãy chạy nó nhiều lần.

Xóa quy tắc được chỉ định dưới dạng số

iptables -D INPUT 2

Khác với việc đếm số bạn có thể liệt kê số dòng với --line-numbertham số, ví dụ:

iptables -t nat -nL --line-number

Tôi tìm thấy cái này với - số dòng là tốt nhất
Davuz

Đúng! Tuyệt vời! Đừng muốn toàn bộiptables -F
Dev Anand Sadasivam

2

Giả sử rằng, nếu bạn muốn xóa các quy tắc NAT,

Liệt kê các IPtables được nối bằng lệnh bên dưới,

# sudo iptables -L -t nat -v

Chain PREROUTING (policy ACCEPT 18 packets, 1382 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7   420 DNAT       tcp  --  any    any     anywhere             saltmaster           tcp dpt:http to:172.31.5.207:80
    0     0 DNAT       tcp  --  eth0   any     anywhere             anywhere             tcp dpt:http to:172.31.5.207:8080

Nếu bạn muốn xóa quy tắc nat khỏi IPtables, chỉ cần thực hiện lệnh,

# sudo iptables -F -t nat -v

Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'

Sau đó, bạn có thể xác minh rằng,

# sudo iptables -L -t nat -v
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.