Bir iptables kuralının var olup olmadığını nasıl kontrol edebilirim?


41

İnternet'ten bir tcp portuna bağlantıları engellemek için iptables'a bir kural eklemeliyim.

Komut dosyam birden çok kez çağrılabildiğinden ve kuralı silmek için bir komut dosyası bulunmadığından, eklemeden önce bir iptables kuralının var olup olmadığını kontrol etmek istiyorum - aksi takdirde INPUT zincirinde birçok kurallar olacaktır.

Bir iptables kuralının var olup olmadığını nasıl kontrol edebilirim?


Alternatif olarak, idempotent iptables etkileşimi sağlayan bu sarıcıyı
kullanın

Yanıtlar:


44

-C --checkSon iptables sürümlerinde yeni bir seçenek var.

# 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

Eski iptables sürümleri için Garrett önerisini kullanırdım:

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

12

Yeni -Cseçenek tatminkar değildir, çünkü kullanım zamanı (TOCTTOU) yarış koşullarına açıktır. İki işlem aynı kuralı aynı anda eklemeye çalışırsa, -Ciki defa eklemelerini engellemez.

Yani, grepçözümden gerçekten daha iyi değil . Çıktı üzerinden doğru bir metin işleme işi , bu çıktı tabloların durumunun güvenilir bir anlık görüntüsü olduğundan, o iptables-savekadar güvenilir bir şekilde çalışabilir -C.

İhtiyaç duyulan şey, --ensureyalnızca zaten mevcut değilse, atomik olarak kontrol eden ve bir kural ekleyen bir seçenektir. Dahası, eğer kural mevcut değilse yeni bir kuralın ekleneceği doğru konuma getirildiyse iyi olurdu ( --ensure-move). Örneğin iptables -I 1, bir zincirin başında bir kural oluşturmak için kullanılıyorsa, ancak bu kural zaten yedinci konumda mevcutsa, mevcut kural ilk konuma taşınmalıdır.

Bu özellikler olmadan, uygulanabilir bir geçici çözümün bu sözde koda dayalı bir kabuk betiği döngüsü yazmak olduğunu düşünüyorum:

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

Bu kod etrafta dönebilir; iki veya daha fazla yarışçının belirli sayıda tekrar içinde bulunacağını garanti etmez. Buna yardımcı olmak için bazı randomize üssel backoff uykuları eklenebilir.


1
Kuralın eklenme şeklini tam olarak belirlemeniz gereken basit nedenden ötürü bu komutun tatmin edici olmadığını ekleyebilir miyim? Testimi kurulumumla yaptım ve kural bulamadı çünkü tam anahtar kelimeleri ve değerleri tam olarak belirtmedim ...
Fabien Haddadi

Bir kuralı geçici olarak kaldırırsanız, bir şeyi kırabilir ...
Mehrdad

5

Bu biraz geriye görünebilir ama benim için çalışıyor - İlk önce kuralı silmeyi deneyin.

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

Benzer bir mesaj almalısınız:

iptables: Hatalı kural (bu zincirde eşleşen bir kural var mı?)

Ardından kuralınızı normal olarak ekleyin:

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


1
Güvenlik duvarınızda istenmeyen bir delik açmak, yalnızca belirsiz bir komutu simüle etmek için, muhtemelen iyi bir fikir değildir. Tabii ki, delik geçici olacak şekilde tasarlanmıştır, ancak yine de bir saldırganın şansını artırır. Bir şey değiştirme kuralının eklenmesini engellerse, delik süresiz olarak devam edebilir.
sampablokuper

İyi nokta @sampablokuper: Bu strateji muhtemelen güvenlik nedeniyle yalnızca DROP kuralları için KABUL kuralları için uygun değildir
lucaferrario

Ben de aynı şeyi yaptım!
Warhansen

4

Sadece listele ve ara.

iptables --list | grep $ip

... veya bununla birlikte, kuralın belirtilmiş olduğu. Eğer kullanırsanız grep -qo alışkanlık çıktı bir şey ve sadece birlikte dönüş değerini kontrol edebilirsiniz$?


3
Bunun iptables-save|grep $ipyerine, özellikle bir betikte daha kolay çözümlenebilir bir format olduğu için önerebilirim . İsterseniz komutun tam sözdizimini de kontrol edebilirsiniz.
Garrett

1
Bunların hiçbiri aslında soruyu cevaplamıyor, çünkü birden fazla kurala iptables-save|grep $ipçok iyi uyuyor olabilir . Kural tanımlamasının tamamını kontrol etmek için muhtemelen kullanılabilir , ancak bu hala bir parça hack: Bu komutun döndürdüğü kural tam olarak eşleşmeyebilir. seçenekleri farklı bir sırayla oluşturabilir, bir şeyler ekleyebilir (gibi ), vb. iptables-saveiptables-saveiptables-save-m tcp
larsks

iptables --listTanınmış limanları çözmeye çalışacağınızı unutmayın . Bir limana girmeden önce bundan emin olun.
Fabien Haddadi


0

Komut dosyanızdan yinelenen kuralları önlemek için satırın altına ekleyin.

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

Yukarıdaki komut ilk çalıştırıldığında, aşağıdaki mesajı göreceğiz.

iptables: Hatalı kural (bu zincirde eşleşen bir kural var mı?).

Bu sadece bilgi amaçlı. Ancak komutun ikinci yarısı kuralı eklemeyi sağlayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.