używając firewalld i firewall-cmd jak dodać regułę do podstawowego łańcucha INPUT, a nie INPUT_direct

2

więc po przeczytaniu strony podręcznika firewalld i dokumentacji fedory doszedłem do wniosku, że aby dodać niestandardową regułę do zapory ogniowej z określonymi argumentami, muszę użyć struktury

 firewall-cmd [--permanent] --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>

konkretnie staram się stworzyć niestandardową regułę z dopasowaniem geograficznym, aby zablokować wszystkie kraje, które nie pochodzą z USA. Zanim to zrobię, muszę najpierw dodać pasującą regułę, która zezwala na dostęp z mojej sieci lokalnej, ponieważ kontroluję serwer przez ssh w lokalnej sieci prywatnej, więc dodaję taką regułę

 firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 192.168.0.0/24 -j ACCEPT

następnie dodaję drugą taką zasadę

 firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -m geoip ! --src-cc US -j DROP

dodają one do łańcucha wejściowego, ale dodają w ramach podłańcucha o nazwie INPUT_direct, ten podłańcuch jest wymieniony na ogólnej niezmienionej liście reguł INPUT jako trzeci i szybki

 iptables -L INPUT

pokazuje łańcuch INPUT jako ten

 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
 ACCEPT     all  --  anywhere             anywhere
 INPUT_direct  all  --  anywhere             anywhere
 INPUT_ZONES_SOURCE  all  --  anywhere             anywhere
 INPUT_ZONES  all  --  anywhere             anywhere
 ACCEPT     icmp --  anywhere             anywhere
 DROP       all  --  anywhere             anywhere             ctstate INVALID
 REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

i INPUT_direct as

 Chain INPUT_direct (1 references)
 target     prot opt source               destination
 ACCEPT     all  --  192.168.0.0/24         anywhere
 DROP       all  --  anywhere             anywhere             -m geoip ! --source-country US

to może działać dla niektórych, ale jeśli uruchomię

 ping france.fr

Dostaję w rezultacie

 PING france.fr (46.18.192.148) 56(84) bytes of data.
 64 bytes from ns1-sgg.produhost.net (46.18.192.148): icmp_seq=1 ttl=52 time=136 ms
 64 bytes from ns1-sgg.produhost.net (46.18.192.148): icmp_seq=2 ttl=52 time=135 ms
 64 bytes from ns1-sgg.produhost.net (46.18.192.148): icmp_seq=3 ttl=52 time=136 ms

jest to bardziej niż prawdopodobne ze względu na zasadę WEJŚCIA nr 1

 iptables  -L INPUT 1

 ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Zdaję sobie sprawę, że mógłbym po prostu zastosować ten sam niestandardowy zestaw reguł do łańcucha OUTPUT i zablokować żądanie ping do francji.fr lub czegokolwiek poza USA, ale jak mogę dodać zestaw reguł do podstawowego łańcucha INPUT, więc

 iptables -L INPUT

pokazuje to zamiast tego

 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 ACCEPT     all  --  192.168.0.0/24         anywhere
 DROP       all  --  anywhere             anywhere             -m geoip ! --source-country US
 ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
 ACCEPT     all  --  anywhere             anywhere
 INPUT_direct  all  --  anywhere             anywhere
 INPUT_ZONES_SOURCE  all  --  anywhere             anywhere
 INPUT_ZONES  all  --  anywhere             anywhere
 ACCEPT     icmp --  anywhere             anywhere
 DROP       all  --  anywhere             anywhere             ctstate INVALID
 REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Pytam o to, ponieważ czuję, że to, czego chcę zamiast tego, co jest wynikiem firewall-cmd, jest nieco bezpieczniejsze, czy się mylę? Chciałbym zachować zaporę kontrolowaną przez firewalld zamiast upuszczać firewalld i powracać do iptables w celu lepszej przyszłej integracji i możliwych problemów z wycofaniem, więc jest to możliwe nawet w przypadku firewalld, czy też będę zmuszony uruchomić niestandardowy skrypt w rozruch, który obejmuje

 iptables -I INPUT 1 -s 192.168.0.0/24 -j ACCEPT
 iptables -I INPUT 2 -m geoip ! --src-cc US -j DROP

a jeśli to jest opcja, gdzie mogę umieścić ten skrypt?

Chris
źródło

Odpowiedzi:

0

w tej chwili najlepszym sposobem na zrealizowanie tego jest zrobienie dokładnie tego, co zaproponowałem, a mianowicie dodanie reguły zrzutu przychodzącego, ale także zrzutu wychodzącego, aby polecenia były

 firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 192.168.0.0/24 -j ACCEPT
 firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -m geoip ! --src-cc US -j DROP
 firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 192.168.0.0/24 -j ACCEPT
 firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -m geoip ! --dst-cc US -j DROP

obecnie nie ma innego sposobu na dodanie reguły bezpośrednio do łańcucha WEJŚCIA lub WYJŚCIA poprzez firewall-cmd

Postanowiłem to zrobić tylko w ten sposób, ponieważ czułem, że jeśli jakiś robak lub złośliwe oprogramowanie dostanie się do mojego serwera, jego wychodzące połączenie z dowolnym krajem zostanie uznane za POWIĄZANE, ZAPEWNIONE lub USTANOWIONE, ale ta metoda polega jedynie na dodaniu do łańcucha delegate_output wydaje się działać na rzecz zablokowania wszystkich połączeń wychodzących, więc jestem zadowolony

Jestem bardziej niż pewien, że ktoś mógłby poprawić tę odpowiedź, wyjaśniając, w jaki sposób mogę wstawić polecenie do jakiegoś skryptu inicjującego lub skryptu systemowego, ale myślę, że byłbym bardziej szczęśliwy, gdyby fedora wymyślił opcję, która dodałaby go bezpośrednio do podstawowego łańcuch, ale może to zła praktyka

Chris
źródło