Вот моя интерпретация сортировки BFS на выходе iptables -S
; он считывает каждое правило и находит целевую (или -P
политику ); как только все правила прочитаны, он начинает со встроенных целей -и печатает последовательные уровни правил.
#!/usr/bin/perl -w
use strict;
# for now, a chain name has to match regex: [[:alnum:]_-]+
my %jumpsto = ();
while (<>) {
chomp;
next if /^#/;
if (/-[AIR]\s+([[:alnum:]_-]+).*-j\s+([[:alnum:]_-]+)/) {
unless (exists $jumpsto{$1}{$2}) {
$jumpsto{$1}{$2}=$_;
}
} elsif (/-P ([[:alnum:]_-]+)\s+(ACCEPT|DROP)/) {
unless (exists $jumpsto{$1}{$2}) {
$jumpsto{$1}{$2}=$_;
}
}
}
my @queue = ();
push @queue, qw(INPUT OUTPUT FORWARD PREROUTING POSTROUTING);
my @nextqueue = ();
while (@queue) {
my $item = shift @queue;
foreach my $target (keys %{ $jumpsto{$item} }) {
print $jumpsto{$item}{$target}. "\n";
push @nextqueue, $target;
}
if (! @queue && @nextqueue) {
@queue = @nextqueue;
@nextqueue = ();
print "---------------\n";
}
}
При вводе образца в вопрос вывод:
-A INPUT -j UBNT_VPN_IPSEC_FW_HOOK
-P INPUT ACCEPT
-A INPUT -j VYATTA_POST_FW_IN_HOOK
-A INPUT -j VYATTA_FW_LOCAL_HOOK
-P OUTPUT ACCEPT
-A OUTPUT -j VYATTA_POST_FW_OUT_HOOK
-A FORWARD -j VYATTA_FW_IN_HOOK
-A FORWARD -j MINIUPNPD
-P FORWARD ACCEPT
-A FORWARD -j VYATTA_POST_FW_FWD_HOOK
-A FORWARD -j UBNT_VPN_IPSEC_FW_IN_HOOK
-A FORWARD -j UBNT_FW_IN_SUSPEND_HOOK
-A FORWARD -j UBNT_PFOR_FW_HOOK
-A FORWARD -j VYATTA_FW_OUT_HOOK
---------------
-A VYATTA_POST_FW_IN_HOOK -j ACCEPT
-A VYATTA_FW_LOCAL_HOOK -i eth0 -j WAN_LOCAL
-A VYATTA_POST_FW_OUT_HOOK -j ACCEPT
-A VYATTA_FW_IN_HOOK -i eth1 -j LAN1_IN
-A VYATTA_FW_IN_HOOK -i eth0 -j WAN_IN
-A VYATTA_POST_FW_FWD_HOOK -j ACCEPT
-A VYATTA_FW_OUT_HOOK -o eth0 -j WAN_OUT
---------------
-A WAN_LOCAL -m comment --comment WAN_LOCAL-30 -m state --state INVALID -j DROP
-A WAN_LOCAL -m comment --comment WAN_LOCAL-10 -m state --state ESTABLISHED -j RETURN
-A WAN_LOCAL -m comment --comment WAN_LOCAL-30 -m state --state INVALID -j LOG --log-prefix "[WAN_LOCAL-30-D]"
-A LAN1_IN -p udp -m comment --comment LAN1_IN-20 -m udp --dport 53 -m set --match-set dnsaddr dst -j RETURN
-A LAN1_IN -m comment --comment LAN1_IN-10 -m state --state INVALID -j DROP
-A LAN1_IN -m comment --comment LAN1_IN-10 -m state --state INVALID -j LOG --log-prefix "[LAN1_IN-10-D]"
-A WAN_IN -m comment --comment WAN_IN-30 -m state --state INVALID -j DROP
-A WAN_IN -m comment --comment WAN_IN-10 -m state --state ESTABLISHED -j RETURN
-A WAN_IN -m comment --comment WAN_IN-30 -m state --state INVALID -j LOG --log-prefix "[WAN_IN-30-D]"
-A WAN_OUT -m comment --comment WAN_OUT-40 -m state --state INVALID -j DROP
-A WAN_OUT -m comment --comment WAN_OUT-10 -m state --state NEW -j RETURN
-A WAN_OUT -m comment --comment WAN_OUT-40 -m state --state INVALID -j LOG --log-prefix "[WAN_OUT-40-D]"
---------------
Моя первоначальная неверная интерпретация заключалась в следующем perl-скрипте, который преобразует iptables -S
в файл, совместимый с graphviz -. Он создает граф, который связывает исходные цепочки с их целевыми цепочками.
#!/usr/bin/perl -w
use strict;
# for now, a chain name has to match regex: [[:alnum:]_-]+
print "digraph rules {\n";
print "\toverlap=scalexy;\n";
my %jumpsto = ();
while (<>) {
chomp;
next if /^#/;
if (/-[AIR]\s+([[:alnum:]_-]+).*-j\s+([[:alnum:]_-]+)/) {
unless (exists $jumpsto{$1}{$2}) {
print "\"$1\" -> \"$2\";\n";
$jumpsto{$1}{$2}=1;
}
} elsif (/-P ([[:alnum:]_-]+)\s+(ACCEPT|DROP)/) {
unless (exists $jumpsto{$1}{$2}) {
print "\"$1\" -> \"$2\";\n";
$jumpsto{$1}{$2}=1;
}
}
}
print "}\n";
Учитывая входные данные выборки в вопросе, результирующий результат будет:
digraph rules {
overlap=scalexy;
"INPUT" -> "ACCEPT";
"FORWARD" -> "ACCEPT";
"OUTPUT" -> "ACCEPT";
"INPUT" -> "UBNT_VPN_IPSEC_FW_HOOK";
"INPUT" -> "VYATTA_FW_LOCAL_HOOK";
"INPUT" -> "VYATTA_POST_FW_IN_HOOK";
"FORWARD" -> "MINIUPNPD";
"FORWARD" -> "UBNT_VPN_IPSEC_FW_IN_HOOK";
"FORWARD" -> "UBNT_PFOR_FW_HOOK";
"FORWARD" -> "UBNT_FW_IN_SUSPEND_HOOK";
"FORWARD" -> "VYATTA_FW_IN_HOOK";
"FORWARD" -> "VYATTA_FW_OUT_HOOK";
"FORWARD" -> "VYATTA_POST_FW_FWD_HOOK";
"OUTPUT" -> "VYATTA_POST_FW_OUT_HOOK";
"LAN1_IN" -> "LOG";
"LAN1_IN" -> "DROP";
"LAN1_IN" -> "RETURN";
"VYATTA_FW_IN_HOOK" -> "WAN_IN";
"VYATTA_FW_IN_HOOK" -> "LAN1_IN";
"VYATTA_FW_LOCAL_HOOK" -> "WAN_LOCAL";
"VYATTA_FW_OUT_HOOK" -> "WAN_OUT";
"VYATTA_POST_FW_FWD_HOOK" -> "ACCEPT";
"VYATTA_POST_FW_IN_HOOK" -> "ACCEPT";
"VYATTA_POST_FW_OUT_HOOK" -> "ACCEPT";
"WAN_IN" -> "RETURN";
"WAN_IN" -> "LOG";
"WAN_IN" -> "DROP";
"WAN_LOCAL" -> "RETURN";
"WAN_LOCAL" -> "LOG";
"WAN_LOCAL" -> "DROP";
"WAN_OUT" -> "RETURN";
"WAN_OUT" -> "LOG";
"WAN_OUT" -> "DROP";
}
... что приводит к следующему графику. Нажмите один раз, чтобы увеличить версию; нажмите еще раз, если ваш браузер автоматически уменьшит масштаб.
Нет, dd не может уничтожить ваш физический диск. Только крайние случаи, чтобы изнашивать его, если он давно используется, и вы записали на него последнюю каплю данных, используя dd. С другой стороны, данные и информация о разделе действительно могут быть уничтожены, и в вашем случае это выглядит так!
После перезагрузки в системе Linux попробуйте следующее:
Осторожно, parted действует сразу после нажатия Enter, в отличие от fdisk, который ожидает команду записи.
sudo parted /dev/sdb
(или ваш диск Samsung EVO)
mklabel loop
(практически удалить любую таблицу разделов)
На этом этапе вы можете оставить его полностью пустым и попытаться перезагрузиться, чтобы увидеть, прекратились ли задержки и т. д., или продолжить разбиение диска.
Вы также можете оставить loop
, не делать никаких разделов и mkfs.ext4 /dev/sdb
Это немного новинка, но это возможно.
Но, скорее всего, вы определите таблицу разделов,
mklabel gpt
(в системах efi)
mklabel msdos
(в системах биос)
И сделать раздел
mkpart (на этом этапе вы можете следовать указаниям мастера. Выберите основной, если это таблица msdos -mbr, файловая система ext4, начало 0%, конец 100%)
печать (просмотр нового раздела)
Выход врозь,
и, наконец,mkfs.ext4 /dev/sdb1
Если, конечно, вы хотите иметь файловую систему ext4
.