{"id":1923,"date":"2021-05-28T09:28:40","date_gmt":"2021-05-28T07:28:40","guid":{"rendered":"http:\/\/clark.tipistrani.it\/?p=1923"},"modified":"2023-06-22T15:44:36","modified_gmt":"2023-06-22T13:44:36","slug":"ale2-nftables-firewall-per-dmz","status":"publish","type":"post","link":"http:\/\/clark.tipistrani.it\/?p=1923","title":{"rendered":"Ale2 nftables Firewall per DMZ"},"content":{"rendered":"<p>A proposito di <a href=\"http:\/\/clark.tipistrani.it\/?p=1901\">ZendTo<\/a> mi sono dovuto riscrivere lo script di firewall per gestire la DMZ.<br \/>\nGi\u00e0 in passato avevo fatto un lavoro del genere per un CRM che non \u00e8 mai decollato veramente, oggi l&#8217;ho riscritto per nftables, per dire la verit\u00e0 mi sono detto \u00e8 inutile e stupido che vai a scoprire di nuovo l&#8217;acqua calda, ispirati a qualcosa che funziona scritto da qualcuno che sa cosa scrive, quindi senza tanti giri mi sono preso le idee di <a href=\"http:\/\/www.commedia.it\/ccontavalli\/docs-it\/iptables\/iptables4dummies\/iptables4dummies-28.html\">Carlo Contavalli<\/a> che ne sa decisamente parecchio e le ho riscritte secondo la mia esigenza in nftables.<\/p>\n<p>il risultato \u00e8 questo :<\/p>\n<p>#!\/usr\/sbin\/nft -f<br \/>\ninclude &#8220;\/usr\/local\/bin\/<a href=\"http:\/\/clark.tipistrani.it\/?p=1814\">vars<\/a>&#8221;<br \/>\ninclude &#8220;\/usr\/local\/bin\/<a href=\"http:\/\/clark.tipistrani.it\/?p=1810\">definitions<\/a>&#8221;<br \/>\nflush ruleset<br \/>\nadd table inet firewall<br \/>\nadd table inet fw-nat<br \/>\nadd table inet fail2ban<br \/>\nadd table netdev noddos<\/p>\n<p>add chain netdev noddos ingress { type filter hook ingress device eth0 priority -500; }<br \/>\nadd chain inet firewall INPUT { type filter hook input priority 0; policy drop; }<br \/>\nadd chain inet firewall FORWARD { type filter hook forward priority 0; policy drop; }<br \/>\nadd chain inet firewall OUTPUT { type filter hook output priority 0; policy drop; }<br \/>\nadd chain inet fw-nat PREROUTING { type nat hook prerouting priority -100; }<br \/>\nadd chain inet fw-nat POSTROUTING { type nat hook postrouting priority 100; }<br \/>\nadd chain inet fail2ban input { type filter hook input priority 100; }<br \/>\nadd chain inet firewall IPS { type filter hook forward priority 10; }<br \/>\nadd chain inet firewall LANDMZ<br \/>\nadd chain inet firewall LANINET<br \/>\nadd chain inet firewall DMZINET<br \/>\nadd chain inet firewall DMZLAN<br \/>\nadd chain inet firewall INETDMZ<br \/>\nadd chain inet firewall INETLAN<\/p>\n<p>add rule inet fw-nat PREROUTING iif $EXTIF ip daddr $WEBIP tcp dport 22 counter dnat to $GRECALE:22<br \/>\nadd rule inet fw-nat PREROUTING iif $EXTIF ip daddr $WEBIP tcp dport 80 counter dnat to $GRECALE:80<br \/>\nadd rule inet fw-nat PREROUTING iif $EXTIF ip daddr $WEBIP tcp dport 443 counter dnat to $GRECALE:443<br \/>\nadd rule inet fw-nat PREROUTING iif $EXTIF ip daddr $WEBIP tcp dport 1922 counter dnat to $GRECALE:1922<\/p>\n<h3>###vedi addendum a fine pagina<\/h3>\n<p>add rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 22 meta nftrace set 1 counter dnat to $GRECALE:22<br \/>\nadd rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 80 counter dnat to $GRECALE:80<br \/>\nadd rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 443 counter dnat to $GRECALE:443<br \/>\nadd rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 1922 counter dnat to $GRECALE:1922<br \/>\n###<\/p>\n<p>add rule inet fw-nat PREROUTING iif $EXTIF ip daddr $VPNIP tcp dport 775 counter dnat to $CHIMERA:775<br \/>\nadd rule inet fw-nat PREROUTING iif $EXTIF ip daddr $VPNIP tcp dport 1194 counter dnat to $CHIMERA:1194<br \/>\nadd rule inet fw-nat PREROUTING tcp flags &amp; (syn|ack) == syn|ack ct state new drop<br \/>\nadd rule inet fw-nat PREROUTING tcp flags &amp; (fin|syn) == fin|syn drop<br \/>\nadd rule inet fw-nat PREROUTING tcp flags &amp; (syn|rst) == fin|rst drop<br \/>\nadd rule inet fw-nat PREROUTING tcp flags &amp; (fin|rst) == fin|rst drop<br \/>\nadd rule inet fw-nat PREROUTING tcp flags &amp; (fin|ack) == fin drop<br \/>\nadd rule inet fw-nat PREROUTING tcp flags &amp; (psh|ack) == psh drop<br \/>\nadd rule inet fw-nat PREROUTING tcp flags &amp; (ack|urg) == urg counter drop<\/p>\n<p>add rule inet firewall FORWARD ct state { established, related } counter accept<br \/>\nadd rule inet firewall FORWARD ct state invalid counter drop<br \/>\nadd rule inet firewall FORWARD iif $EXTIF oif $INTIF ip daddr $CHIMERA tcp dport { 775, 1194 } ct state new accept<br \/>\nadd rule inet firewall FORWARD iif $INTIF oif $DMZIF counter jump LANDMZ<br \/>\nadd rule inet firewall FORWARD iif $INTIF oif $EXTIF counter jump LANINET<br \/>\nadd rule inet firewall FORWARD iif $DMZIF oif $EXTIF counter jump DMZINET<br \/>\nadd rule inet firewall FORWARD iif $DMZIF oif $INTIF counter jump DMZLAN<br \/>\nadd rule inet firewall FORWARD iif $EXTIF oif $DMZIF counter jump INETDMZ<br \/>\nadd rule inet firewall FORWARD iif $EXTIF oif $INTIF counter jump INETLAN<br \/>\nadd rule inet firewall LANDMZ ip saddr != $LAN counter drop<br \/>\nadd rule inet firewall LANDMZ ip daddr $GRECALE tcp dport 80 counter accept<br \/>\nadd rule inet firewall LANDMZ ip daddr $GRECALE tcp dport 443 counter accept<br \/>\nadd rule inet firewall LANDMZ ip daddr $GRECALE tcp dport 22 counter accept<br \/>\nadd rule inet firewall LANDMZ ip daddr $GRECALE tcp dport 1922 counter accept<br \/>\nadd rule inet firewall LANDMZ ip daddr $GRECALE tcp dport 53 counter accept<br \/>\nadd rule inet firewall LANDMZ ip daddr $GRECALE udp dport 53 counter accept<br \/>\nadd rule inet firewall LANDMZ ct state { new,related,established } counter accept<br \/>\nadd rule inet firewall LANDMZ ct state invalid counter drop<br \/>\nadd rule inet firewall LANDMZ ip protocol tcp counter reject with tcp reset<br \/>\nadd rule inet firewall DMZLAN ip saddr != $DMZ counter drop<br \/>\nadd rule inet firewall DMZLAN ct state { related,established } counter accept<br \/>\nadd rule inet firewall DMZLAN ct state invalid counter drop<br \/>\nadd rule inet firewall DMZLAN ip protocol tcp counter reject with tcp reset<br \/>\nadd rule inet firewall LANINET ip saddr != $LAN counter drop<br \/>\nadd rule inet firewall LANINET tcp dport 21 counter accept<br \/>\nadd rule inet firewall LANINET ct state { new,related,established } counter accept<br \/>\nadd rule inet firewall LANINET ct state invalid counter drop<br \/>\nadd rule inet firewall LANINET ip protocol tcp counter reject with tcp reset<br \/>\nadd rule inet firewall INETLAN ip saddr $LAN counter drop<br \/>\nadd rule inet firewall INETLAN ip saddr $DMZ counter drop<br \/>\nadd rule inet firewall INETLAN ct state { related,established } counter accept<br \/>\nadd rule inet firewall INETLAN ct state invalid counter drop<br \/>\nadd rule inet firewall INETLAN ip protocol tcp counter reject with tcp reset<br \/>\nadd rule inet firewall INETDMZ ip saddr $LAN counter drop<br \/>\nadd rule inet firewall INETDMZ ip saddr $DMZ counter drop<br \/>\nadd rule inet firewall INETDMZ ip daddr $GRECALE tcp dport 80 counter accept<br \/>\nadd rule inet firewall INETDMZ ip daddr $GRECALE tcp dport 22 counter accept<br \/>\nadd rule inet firewall INETDMZ ip daddr $GRECALE tcp dport 53 counter accept<br \/>\nadd rule inet firewall INETDMZ ip daddr $GRECALE udp dport 53 counter accept<br \/>\nadd rule inet firewall INETDMZ ip daddr $GRECALE tcp dport 1922 counter accept<br \/>\nadd rule inet firewall INETDMZ ip daddr $GRECALE tcp dport 443 counter accept<br \/>\nadd rule inet firewall INETDMZ ct state { new,related,established } counter accept<br \/>\nadd rule inet firewall INETDMZ ct state invalid counter drop<br \/>\nadd rule inet firewall INETDMZ ip protocol tcp counter reject with tcp reset<br \/>\nadd rule inet firewall DMZINET ip saddr != $DMZ counter drop<br \/>\nadd rule inet firewall DMZINET ip saddr $GRECALE tcp dport 80 counter accept<br \/>\nadd rule inet firewall DMZINET ip saddr $GRECALE tcp dport 443 counter accept<br \/>\nadd rule inet firewall DMZINET ip saddr $GRECALE tcp dport 53 counter accept<br \/>\nadd rule inet firewall DMZINET ip saddr $GRECALE udp dport 53 counter accept<br \/>\nadd rule inet firewall DMZINET ct state { new,related,established } counter accept<br \/>\nadd rule inet firewall DMZINET ct state invalid counter drop<br \/>\nadd rule inet firewall DMZINET ip protocol tcp counter reject with tcp reset<br \/>\nadd rule inet firewall INPUT tcp dport 1922 counter accept<br \/>\nadd rule inet firewall INPUT iif $INTIF ip saddr $PERSEO udp dport 694 ct state { new,related,established } counter accept<br \/>\nadd rule inet firewall INPUT ct state { related,established } counter accept<br \/>\nadd rule inet firewall INPUT ct state invalid counter drop<br \/>\nadd rule inet firewall INPUT ip protocol tcp counter reject with tcp reset<br \/>\nadd rule inet firewall OUTPUT ct state { new,related,established } counter accept<br \/>\nadd rule inet firewall OUTPUT ct state invalid counter drop<br \/>\nadd rule inet firewall FORWARD ip frag-off != 0 ip protocol icmp counter drop<br \/>\nadd rule netdev noddos ingress iif $EXTIF ip saddr {$GOOD_BOYS} counter accept<br \/>\nadd rule netdev noddos ingress iif $EXTIF ip saddr {$RESERVED_NET} counter drop<br \/>\nadd rule netdev noddos ingress ip frag-off &amp; 0x1fff != 0 counter drop<br \/>\nadd rule netdev noddos ingress tcp flags &amp; (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg counter drop<br \/>\nadd rule netdev noddos ingress tcp flags &amp; (fin|syn|rst|psh|ack|urg) == 0x0 counter drop<br \/>\nadd rule netdev noddos ingress tcp flags syn tcp option maxseg size 1-536 counter drop<br \/>\n#add rule inet fw-nat POSTROUTING oif $EXTIF ip saddr $LAN counter snat to $EXTIP<br \/>\n#add rule inet fw-nat POSTROUTING oif $EXTIF ip saddr $DMZ counter snat to $WEBIP<br \/>\nadd rule inet fw-nat POSTROUTING masquerade<br \/>\nCome al solito lo SNAT non funziona, o meglio funziona dalla ditta ma se cerco di collegarmi via VPN non c&#8217;\u00e8 verso, nel momento in cui cambio da SNAT a masquerade la vpn parte come un razzo, questa cosa mi da il mal di testa e prima o poi ne verr\u00f2 fuori.<\/p>\n<p>Addendum:<br \/>\n<a href=\"http:\/\/clark.tipistrani.it\/wp-content\/uploads\/2021\/05\/murphy.pdf\">Murphy<\/a> come al solito ci si mette e ti rovina le cose.<\/p>\n<p>il nostro GW aziendale lato lan \u00e8 il .241 finale, che ovviamente risiede sulla macchina dove gira il firewall, molto bene uscendo da quel GW invece che da quello di test non funziona piu&#8217; niente.<br \/>\nDopo averci sbattuto parecchio la testa, ho provato a chiedere consiglio su un gruppo di informatici su Facebook, e uno di questi mi ha parlato di un problema simile che ha risolto in un certo modo, quindi ragiona ragiona ragiona ho aggiunto questi rules e tutto ha cominciato a funzionare a dovere<\/p>\n<p>add rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 22 meta nftrace set 1 counter dnat to $GRECALE:22<br \/>\nadd rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 80 counter dnat to $GRECALE:80<br \/>\nadd rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 443 counter dnat to $GRECALE:443<br \/>\nadd rule inet fw-nat PREROUTING ip saddr $LAN iif $INTIF ip daddr $WEBIP tcp dport 1922 counter dnat to $GRECALE:1922<\/p>\n<p>Il nftrace mi e&#8217; servito per fare la prova del nove e dato che tutto sommato non disturba lo lascio.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A proposito di ZendTo mi sono dovuto riscrivere lo script di firewall per gestire la DMZ. Gi\u00e0 in passato avevo fatto un lavoro del genere per un CRM che non \u00e8 mai decollato veramente, oggi l&#8217;ho riscritto per nftables, per dire la verit\u00e0 mi sono detto \u00e8 inutile e stupido che vai a scoprire di [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[109,8,14,6],"tags":[207,180,25],"class_list":["post-1923","post","type-post","status-publish","format-standard","hentry","category-firewall","category-linux","category-networking","category-work","tag-dmz","tag-nftables","tag-script-2"],"_links":{"self":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/1923","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1923"}],"version-history":[{"count":11,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/1923\/revisions"}],"predecessor-version":[{"id":2430,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/1923\/revisions\/2430"}],"wp:attachment":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1923"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1923"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}