3 YÉjBuã @s6ddlmZddlZddlZddlZddlmZddlmZm Z m Z m Z m Z ddl mZmZmZmZmZmZmZddlmZmZmZmZmZmZmZddlmZmZddl m!Z!d Z"e"d d Z#d Z$d Z%iddde%fidde%fdde%fdœdde%fdde%fdde%fdde%fdœdœZ&Gdd„de'ƒZ(dS)é)Úabsolute_importN)Úlog)Ú check_macÚ getPortRangeÚ normalizeIP6Úcheck_single_addressÚ check_address)Ú FirewallErrorÚ UNKNOWN_ERRORÚ INVALID_RULEÚINVALID_ICMPTYPEÚ INVALID_TYPEÚ INVALID_ENTRYÚ INVALID_PORT)Ú Rich_AcceptÚ Rich_RejectÚ Rich_DropÚ Rich_MarkÚRich_MasqueradeÚRich_ForwardPortÚRich_IcmpBlock)Ú ICMP_TYPESÚ ICMPV6_TYPES)ÚNftablesZ firewalldÚ_Z policy_dropZpolicy_é Ú PREROUTINGÚ preroutingé–édZ postrouting)rÚ POSTROUTINGÚinputÚforwardÚoutput)rÚINPUTÚFORWARDÚOUTPUT)ÚrawÚmangleÚnatÚfilterc@sjeZdZdZdZdd„Zdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z d�dd„Z dd„Z dd„Zdd„Zdd„Zd‘dd„Zdd„Zd’d d!„Zd"d#„Zd“d%d&„Zd”d(d)„Zd•d*d+„Zd–d,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Z!d@dA„Z"dBdC„Z#dDdE„Z$dFdG„Z%dHdI„Z&d—dJdK„Z'dLdM„Z(dNdO„Z)dPdQ„Z*dRdS„Z+d˜dTdU„Z,d™dVdW„Z-dšdXdY„Z.dZd[„Z/d›d\d]„Z0dœd^d_„Z1d�d`da„Z2dždbdc„Z3dŸddde„Z4d dfdg„Z5dhdi„Z6d¡djdk„Z7dldm„Z8d¢dndo„Z9dpdq„Z:drds„Z;dtdu„Zd¤dzd{„Z?d|d}„Z@d¥d~d„ZAd€d�„ZBd‚dƒ„ZCd„d…„ZDd†d‡„ZEdˆd‰„ZFdŠd‹„ZGdŒd�„ZHd¦dŽd�„ZIdS)§ÚnftablesTcCsb||_d|_g|_i|_i|_i|_i|_i|_gggdœ|_t ƒ|_ |j j dƒ|j j dƒdS)NT)ÚinetÚipÚip6) Ú_fwZrestore_command_existsZavailable_tablesÚrule_to_handleÚrule_ref_countÚrich_rule_priority_countsÚpolicy_priority_countsÚzone_source_index_cacheÚcreated_tablesrr+Zset_echo_outputZset_handle_output)ÚselfÚfw©r8ú/usr/lib/python3.6/nftables.pyÚ__init__Xs znftables.__init__cCsŠxdD]}||krPqWd||dkr`||ddd||dddf}||dd=n(d||dkr„d}||dd=ndS||dd }|rÈ|dkrÈ||krÆ|||krÆ||j|ƒn¾|dk�r†||krâg||<|�r(|||k�r||j|ƒ||jd d „d �||j|ƒ}n|jj�r8d }n t||ƒ}||}||=|d k�rf||d<n |d8}||d<||ddd<dS)NÚaddÚinsertÚdeletez%%ZONE_SOURCE%%ÚruleÚzoneÚaddressz%%ZONE_INTERFACE%%ÚfamilycSs|dS)Nrr8)Úxr8r8r9Ú„sz3nftables._run_replace_zone_source..)ÚkeyréÚindex)r;r<r=)ÚremoveÚappendÚsortrFr/Ú_allow_zone_driftingÚlen)r6r>r4ÚverbZ zone_sourcerArFÚ _verb_snippetr8r8r9Ú_run_replace_zone_sourcegsD        z!nftables._run_replace_zone_sourcecCsBd|krdtj|dƒiSd|kr4dtj|dƒiSttdƒ‚dS)Nr<r=r;zFailed to reverse rule)ÚcopyÚdeepcopyr r )r6Údictr8r8r9Ú reverse_rule–s znftables.reverse_rulec Cs¨xd D]}||krPqW|||dk�r¤||d|}||d|=t|ƒtkr^ttdƒ‚||dd||ddf}|dkrÊ||ksª|||ksª|||dkr´ttd ƒ‚|||d 8<nÚ||krÚi||<|||kròd|||<d}xVt||jƒƒD]B}||k�r"|dk�r"P||||7}||k�r|dk�rP�qW|||d 7<||} ||=|dk�r„| |d<n |d 8}| |d<||ddd <dS) Nr;r<r=r>z%priority must be followed by a numberrAÚchainrz*nonexistent or underflow of priority countrErF)r;r<r=)ÚtypeÚintr r r ÚsortedÚkeys) r6r>Zpriority_countsÚtokenrLÚpriorityrSrFÚprMr8r8r9Ú_set_rule_replace_priorityžsD          z#nftables._set_rule_replace_prioritycCsfx`d D]X}||krd||krtj||dƒ}xd D]}||kr6||=q6Wtj|dd �}|SqWdS) Nr;r<r=r>rFÚhandleÚpositionT)Z sort_keys)r;r<r=)rFr\r])rOrPÚjsonÚdumps)r6r>rLÚrule_keyZnon_keyr8r8r9Ú _get_rule_keyÌs   znftables._get_rule_keycCsLdddddg}dddg}g}g}tj|jƒ}tj|jƒ}tj|jƒ} |jjƒ} �xÊ|D�]À} t| ƒtkrvtt d| ƒ‚x|D]} | | kr|Pq|W| | kr¤tt d| ƒ‚|j | ƒ} | | k�rDt j d|j| | | ƒ| dkrê| | d 7<qVnX| | d k�r | | d 8<qVn6| | d k�r,| | d 8<ntt d | | | fƒ‚n| �r\| dk�r\d | | <|j| ƒtj| ƒ}| �rttd|| d d ƒƒ|| d d <|j||d ƒ|j||dƒ|j|| ƒ| dk�rdd |dd d|dd d|dd d|j| dœii}|j|ƒqVWdddd iig|i}t jƒdk�rVt jd|jtj|ƒƒ|jj|ƒ\}}}|dk�rŠtdd|tj|ƒfƒ‚||_||_| |_| |_d}x |D]˜} |d 7}|j | ƒ} | �sÌ�q¬d| k�rê|j| =|j| =�q¬x"|D]} | |d|k�rðP�qðW| |d|k�r$�q¬|d|| d d|j| <�q¬WdS)Nr;r<r=ÚflushÚreplacez#rule must be a dictionary, rule: %szno valid verb found, rule: %sz%s: prev rule ref cnt %d, %srEz)rule ref count bug: rule_key '%s', cnt %dr>Úexprz%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%rAÚtablerS)rArerSr\r+ZmetainfoZjson_schema_versionéz.%s: calling python-nftables with JSON blob: %srz'%s' failed: %s JSON blob: %szpython-nftablesr\)rOrPr2r3r4r1rTrQr r r rarZdebug2Ú __class__rHÚlistr*r[rNr0ZgetDebugLogLevelZdebug3r^r_r+Zjson_cmdÚ ValueError)r6ÚrulesÚ log_deniedZ _valid_verbsZ_valid_add_verbsZ_deduplicated_rulesZ_executed_rulesr2r3r4r1r>rLr`Z_ruleZ json_blobZrcr#ÚerrorrFr8r8r9Ú set_rulesÚs�             &         znftables.set_rulescCs|j|g|ƒdS)NÚ)rm)r6r>rkr8r8r9Úset_rule:sznftables.set_ruleNcCs|r |gStjƒS)N)ÚIPTABLES_TO_NFT_HOOKrW)r6rer8r8r9Úget_available_tables>sznftables.get_available_tablescCsFg}xÚ policy_keyrAr8r8r9Úbuild_flush_rulesPs    znftables.build_flush_rulesc Csldddœ|}g}xTdD]L}|j|ddtd d |fd d d diiddddgidœiddigdœiiƒqW|S)Nr;r=)TFr!r"r#r>r,z%s_%sr*ÚmatchÚctrDÚstateÚinÚsetÚ establishedÚrelated)ÚleftÚopÚrightÚaccept)rArerSrd)r!r"r#)rHÚTABLE_NAME_POLICY)r6ÚenableÚadd_delrjÚhookr8r8r9rtgs    z)nftables._build_set_policy_rules_ct_rulesc Cstg}|dkrt|jdddtdœiiƒ|jdjtƒx>dD]6}|jdddtd d |fd |dtd ddœiiƒq:W|dk�rö|jdddtdœiiƒ|jdjtƒx>dD]6}|jdddtd d |fd |dtd ddœiiƒq¬W||jdƒ7}nz|dk�rfx4|jdƒD]&}|j|ƒ}||jk�r |j|ƒ�q W||jtƒ7}t|jdk�rp|jdjtƒn t t dƒ|S)NZPANICr;rer,)rArrrr#rSz%s_%sr'r*i,rEÚdrop)rArerrrTr†ÚprioÚpolicyÚDROPr!r"rTÚACCEPTFznot implemented)rr#iÔþÿÿ)r!r"r#) rHrƒr5ÚNFT_HOOK_OFFSETrtrar0rsrGr r )r6r‰rjr†r>rvr8r8r9Úbuild_set_policy_rulestsH               znftables.build_set_policy_rulescCsJtƒ}|dks|dkr$|jtjƒƒ|dks4|dkrB|jtjƒƒt|ƒS)NÚipv4Úipv6)r|ÚupdaterrWrrh)r6ÚipvZ supportedr8r8r9Úsupported_icmp_types¨s znftables.supported_icmp_typescCs>g}x4dD],}|jdd|tdœiiƒ|j|jtƒq W|S)Nr,r-r.r;re)rArr)r,r-r.)rHrur5)r6Zdefault_tablesrAr8r8r9Úbuild_default_tables²s   znftables.build_default_tablesÚoffcCsªg}xÐtdjƒD]À}|jdddtd|ddtd|dtd|d d œiiƒxz|jjrld d d dgnd d dgD]X}|jdddtd||fdœiiƒ|jdddtd|ddd||fiigdœiiƒqvWqWxâd?D]Ú}xÔtdjƒD]Ä}|jdd|td|ddtd|dtd|d d œiiƒx~|jj�rJd d d dgnd d dgD]Z}|jdd|td||fdœiiƒ|jdd|td|ddd||fiigdœiiƒ�qTWqîWqÜWxVtdjƒD]F}|jdddtd|ddtd|dtd|d d œiiƒ�qÈW|jdddtddddddiid d!d"d#gid$œid%digdœiiƒ|jdddtdddddd&iid d'd$œid%digdœiiƒ|jdddtdddd(dd)iid*d+d$œid%digdœiiƒx~|jj�ræd d d dgnd d dgD]Z}|jdddtd,d|fdœiiƒ|jdddtddddd,d|fiigdœiiƒ�qðW|d-k�r¦|jdddtddddddiid d!d.gid$œi|j|ƒd/d0d1iigdœiiƒ|jdddtddddddiid d!d.gid$œid2digdœiiƒ|d-k�r$|jdddtdd|j|ƒd/d0d3iigdœiiƒ|jdddtddd4d5d6d7œigdœiiƒ|jdddtdd8ddddiid d!d"d#gid$œid%digdœiiƒ|jdddtdd8dddd&iid d'd$œid%digdœiiƒ|jdddtdd8dd(dd)iid*d+d$œid%digdœiiƒxbd@D]Z}|jdddtd,d8|fdœiiƒ|jdddtdd8ddd,d8|fiigdœiiƒ�qWxŠdAD]‚}xz|jj�rŽd d gnd gD]^}|jdddtd;d8||fdœiiƒ|jdddtdd8ddd;d8||fiigdœiiƒ�q”W�qvWxbdBD]Z}|jdddtd,d8|fdœiiƒ|jdddtdd8ddd,d8|fiigdœiiƒ�qW|d-k�r¸|jdddtdd8ddddiid d!d.gid$œi|j|ƒd/d0d1iigdœiiƒ|jdddtdd8ddddiid d!d.gid$œid2digdœiiƒ|d-k�r6|jdddtdd8|j|ƒd/d0d3iigdœiiƒ|jdddtdd8d4d5d6d7œigdœiiƒ|jdddtdd<ddddiid d!d"d#gid$œid%digdœiiƒ|jdddtd=dd(dd>iid*d+d$œid%digdœiiƒxbdCD]Z}|jdddtd,d<|fdœiiƒ|jdddtdd<ddd,d<|fiigdœiiƒ�qäWxbdDD]Z}|jdddtd,d<|fdœiiƒ|jdddtdd<ddd,d<|fiigdœiiƒ�qHW|S)ENr(r;rSr,z mangle_%sr*z%srrE)rArerrrTr†rˆÚ POLICIES_preZ ZONES_SOURCEZZONESÚ POLICIES_postz mangle_%s_%s)rArerrr>ÚjumpÚtarget)rArerSrdr-r.r)znat_%sz nat_%s_%sz filter_%sr$rxryrDrzr{r|r}r~)rr€r�r‚ZstatusÚdnatÚmetaÚiifnamez==Úloz filter_%s_%sr”ZinvalidrÚprefixzSTATE_INVALID_DROP: r‡zFINAL_REJECT: ÚrejectÚicmpxzadmin-prohibited)rTrdr%ÚINÚOUTzfilter_%s_%s_%sr&Ú filter_OUTPUTÚoifname)r-r.)r•)r r¡)r–)r•)r–)rprWrHrur/rJÚ_pkttype_match_fragment)r6rkZ default_rulesrSZdispatch_suffixrAÚ directionr8r8r9Úbuild_default_rulesºsŠ $  (  &  .        &  &                 &   .   &               &   &znftables.build_default_rulescCs4|dkrdddgS|dkr dgS|dkr0ddgSgS) Nr*r$Ú FORWARD_INÚ FORWARD_OUTr(rr)r r8)r6rer8r8r9Úget_zone_table_chains‹s znftables.get_zone_table_chainsr,c  s¨ˆdkr\ˆdkr\g} | jˆjˆ|ˆˆ||||dd� ƒ| jˆjˆ|ˆˆ||||dd� ƒ| Sˆjjj|ƒ‰ˆjdkrxdnd‰ˆdkr�ˆd kr�d nd } ˆjjj|ˆt| ƒ‰g} g} |rÚ| jd d ddiiddt |ƒidœiƒ|�r| jd d ddiiddt |ƒidœiƒdddœ}|�rlxT|D]L}ˆdk�rTˆjj j |ƒ}||k�rTˆ||k�rT�q| jˆj d|ƒƒ�qW|�rÈxT|D]L}ˆdk�r°ˆjj j |ƒ}||k�r°ˆ||k�r°�qx| jˆj d|ƒƒ�qxW‡‡‡‡‡‡‡‡fdd„}g} | �rHx¶| D]P}| �rxB| D]}| j|||ƒƒ�qWn"ˆdk�r0|�r0n| j||dƒƒ�qòWn\ˆdk�rZ|�rZnJ| �r‚xB| D]}| j|d|ƒƒ�qfWn"ˆdk�r”|�r”n| j|ddƒƒ| S)Nr)r,r-)rAr.rÚpreÚpostr TFrxršrDr›z==r|)rr€r�r£)rŽr�ÚsaddrÚdaddrcs‚g}|r|j|ƒ|r |j|ƒ|jdddˆˆfiiƒˆtdˆˆˆf|dœ}|jˆjˆƒƒˆrrdd|iiSdd|iiSdS) Nr—r˜z%s_%sz%s_%s_POLICIES_%s)rArerSrdr;r>r=)rHrur�Ú_policy_priority_fragment)Úingress_fragmentÚegress_fragmentÚexpr_fragmentsr>)Ú_policyrSÚ chain_suffixr„rAÚp_objr6rer8r9Ú_generate_policy_dispatch_ruleÉs    zRnftables.build_policy_ingress_egress_rules.._generate_policy_dispatch_rule) ÚextendÚ!build_policy_ingress_egress_rulesr/r‰Z get_policyrYÚpolicy_base_chain_nameÚPOLICY_CHAIN_PREFIXrHrhr?Z check_sourceÚ_rule_addr_fragment)r6r„r‰rerSZingress_interfacesZegress_interfacesZingress_sourcesZegress_sourcesrArjÚisSNATZingress_fragmentsZegress_fragmentsZ ipv_to_familyÚsrcr‘Údstrµr¯r°r8)r²rSr³r„rAr´r6rer9r·•sv          z*nftables.build_policy_ingress_egress_rulesFc  Csª|dkrT|dkrTg} | j|j|||||||dƒƒ| j|j|||||||dƒƒ| S|dkrh|dkrhdnd} |jjj||t| d�} d d d d d d d œ|} |t|ƒd d krÄ|dt|ƒd …d}d} |dkrè| dd|| fiig}n,ddd| iid|dœi| dd|| fiig}|�rL| �rLd}|td||f|dœ}|j|j ƒƒnP|�rnd}|td||f|dœ}n.d}|td||f|dœ}|�sœ|j|j ƒƒ|d|iigS)Nr)r,r-r.r TF)r»r›r£)rr r$r§r¨r&rEú+Ú*Úgotor˜z%s_%srxršrDz==)rr€r�r<z %s_%s_ZONES)rArerSrdr;r=r>) r¶Ú!build_zone_source_interface_rulesr/r‰r¸r¹rKrur�Ú_zone_interface_fragment)r6r„r?r‰Ú interfacererSrHrArjr»r²ÚoptÚactionr±rLr>r8r8r9rÁs\     z*nftables.build_zone_source_interface_rulesc Csn|dkrª|dkrªg}|jdƒr6|j|tdƒd…ƒ} nd} td|ƒsTt|ƒsT| dkrp|j|j||||||dƒƒtd|ƒsŠt|ƒsŠ| dkr¦|j|j||||||dƒƒ|S|dkr¾|dkr¾d nd } |jjj ||t | d �} d d dœ|} dddddddœ|} |jj �rd||f}n d||f}d}|t ||j | |ƒ|dd|| fiigdœ}|j|j||ƒƒ| d|iigS)Nr)r,zipset:rŽr-r�r.r TF)r»r<r=)TFr¬r­)rr r$r§r¨r&z%s_%s_ZONES_SOURCEz %s_%s_ZONESrÀr˜z%s_%s)rArerSrdr>)Ú startswithÚ_set_get_familyrKrrr¶Úbuild_zone_source_address_rulesr/r‰r¸r¹rJrurºr�Ú_zone_source_fragment)r6r„r?r‰r@rerSrArjZ ipset_familyr»r²r…rÄZzone_dispatch_chainrÅr>r8r8r9rÈ<sB    z(nftables.build_zone_source_address_rulesc Cs|dkrH|dkrHg}|j|j||||dƒƒ|j|j||||dƒƒ|Sdddœ|}|dkrj|dkrjd nd }|jjj||t|d �} g}|j|d |td || fdœiiƒx0d!D](} |j|d |td|| | fdœiiƒq°WxDd"D]<} |j|d|td || fddd|| | fiigdœiiƒqâW|jjj|j } |jj ƒdk�r¬|dk�r¬| d#k�r¬| } | dk�rhd} |j|d|td || f|j |jj ƒƒddd| | fiigdœiiƒ|dk�r| d$k�r| d%k�rÔ|j ƒ} n | j ƒdi} |j|d|td || f| gdœiiƒ|�s|jƒ|S)&Nr)r,r-r.r;r=)TFr TF)r»rSz%s_%s)rArerrrªrÚdenyÚallowr«z%s_%s_%sr>r—r˜)rArerSrdr”r*ÚREJECTú %%REJECT%%rŠr�z"filter_%s_%s: "r‹)rªrrÊrËr«)rªrrÊrËr«)rÌrÍrŠ)r‹rÌrÍrŠ)rÍrÌ)r¶Úbuild_policy_chain_rulesr/r‰r¸r¹rHruZ _policiesr˜Úget_log_deniedr¤Ú_reject_fragmentÚlowerÚreverse)r6r„r‰rerSrArjr…r»r²r³r˜Z log_suffixÚtarget_fragmentr8r8r9rÎjsZ      &             z!nftables.build_policy_chain_rulescCs<|dkr iS|d kr,ddddiid |d œiSttd |ƒ‚dS) NÚallÚunicastÚ broadcastÚ multicastrxršrDÚpkttypez==)rr€r�zInvalid pkttype "%s")rÕrÖr×)r r )r6rØr8r8r9r¤£s  z nftables._pkttype_match_fragmentcCsddddœiddddœiddddœiddddœiddddœiddddœiddddœiddddœiddddœiddddœiddd dœiddd dœiddd dœiddd dœidd d dœiddd dœiddd dœiddd dœiddd dœiddddœiddddœidddiidddiidœ}||S)NržÚicmpzhost-prohibited)rTrdznet-prohibitedzadmin-prohibitedÚicmpv6znet-unreachablezhost-unreachablezport-unreachablerŸzprot-unreachablezaddr-unreachablezno-routerTz tcp reset)zicmp-host-prohibitedz host-prohibzicmp-net-prohibitedz net-prohibzicmp-admin-prohibitedz admin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp-net-unreachablez net-unreachzicmp-host-unreachablez host-unreachzicmp-port-unreachablezicmp6-port-unreachablez port-unreachzicmp-proto-unreachablez proto-unreachzicmp6-addr-unreachablez addr-unreachzicmp6-no-routezno-routez tcp-resetztcp-rstr8)r6Z reject_typeZfragsr8r8r9Ú_reject_types_fragment­s0                      znftables._reject_types_fragmentcCsddddœiS)NržrŸzadmin-prohibited)rTrdr8)r6r8r8r9rÐÍsznftables._reject_fragmentcCs ddddiiddddgid œiS) NrxršrDÚl4protoz==r|rÙrÚ)rr€r�r8)r6r8r8r9Ú_icmp_match_fragmentÑs znftables._icmp_match_fragmentcCsP|siSdddddœ}|jƒ\}}|||dœ}|jƒ}|dk rH||d<d|iS) NÚsecondZminuteZhourZday)ÚsÚmÚhÚd)ÚrateZperÚburstÚlimit)Z value_parseZ burst_parse)r6råZ rich_to_nftrãZdurationrârär8r8r9Ú_rich_rule_limit_fragmentÖs  z"nftables._rich_rule_limit_fragmentcCsÂt|jƒtttgkrn<|jrHt|jƒtttt gkrRt t dt|jƒƒ‚n t t dƒ‚|j dkr¬t|jƒttgks€t|jƒtt gkr„dSt|jƒtgks¦t|jƒttgkr¾dSn|j dkrºdSdSdS)NzUnknown action %szNo rule action specified.rrËrÊrªr«) rTÚelementrrrrÅrrrrr r rY)r6Ú rich_ruler8r8r9Ú_rich_rule_chain_suffixîs    z nftables._rich_rule_chain_suffixcCs>|j r|j rttdƒ‚|jdkr(dS|jdkr6dSdSdS)NzNot log or auditrrrªr«)rÚauditr r rY)r6rèr8r8r9Ú _rich_rule_chain_suffix_from_logs   z)nftables._rich_rule_chain_suffix_from_logcCsddiS)Nz%%ZONE_INTERFACE%%r8)r6r8r8r9rÂsz!nftables._zone_interface_fragmentcCsNtd|ƒrt|ƒ}n,td|ƒr@|jdƒ}t|dƒd|d}d||dœiS)Nr�ú/rrEz%%ZONE_SOURCE%%)r?r@)rrrÚsplit)r6r?r@Z addr_splitr8r8r9rÉs     znftables._zone_source_fragmentcCs d|jiS)Nz%%POLICY_PRIORITY%%)rY)r6r‰r8r8r9r®sz"nftables._policy_priority_fragmentcCs| s|jdkriSd|jiS)Nrz%%RICH_RULE_PRIORITY%%)rY)r6rèr8r8r9Ú_rich_rule_priority_fragmentsz%nftables._rich_rule_priority_fragmentc CsÆ|js iS|jjj||tƒ}dddœ|}|j|ƒ}i} |jjrPd|jj| d<|jjr|d|jjkrhdn|jj} d| | d<d td |||f||j |jj ƒd | igd œ} | j |j |ƒƒ|d | iiS)Nr;r=)TFz%sr�ZwarningÚwarnÚlevelr,z%s_%s_%sr)rArerSrdr>) rr/r‰r¸r¹rër�rðrurærår�rî) r6r‰rèr„rer±r²r…r³Z log_optionsrðr>r8r8r9Ú_rich_rule_log"s&    znftables._rich_rule_logc Cs‚|js iS|jjj||tƒ}dddœ|}|j|ƒ}dtd|||f||j|jjƒdddiigd œ} | j |j |ƒƒ|d | iiS) Nr;r=)TFr,z%s_%s_%srrðrê)rArerSrdr>) rêr/r‰r¸r¹rërurærår�rî) r6r‰rèr„rer±r²r…r³r>r8r8r9Ú_rich_rule_audit<s   znftables._rich_rule_auditc Cs˜|js iS|jjj||tƒ}dddœ|}|j|ƒ}d|||f} t|jƒtkr\ddi} �nt|jƒtkrŒ|jjr‚|j |jjƒ} nddi} nÐt|jƒt kr¤ddi} n¸t|jƒt k�rHd}|jjj||tƒ}d|||f} |jj j d ƒ} t| ƒd k�r,dd d d iiddd d d ii| d gi| dgidœi} ndd d d ii| ddœi} nttdt|jƒƒ‚dt| ||j|jjƒ| gdœ} | j|j|ƒƒ|d| iiS)Nr;r=)TFz%s_%s_%sr‚ržr‡r(rìrEršrDÚmarkú^ú&r)rDÚvaluezUnknown action %sr,)rArerSrdr>)rÅr/r‰r¸r¹rérTrrrÛrrr|rírKr r rurærår�rî) r6r‰rèr„rer±r²r…r³rSZ rule_actionrör>r8r8r9Ú_rich_rule_actionNsB     , znftables._rich_rule_actioncCsê|jdƒr0|j|tdƒd…d|kr(dnd|ƒSt|ƒr>d}n†td|ƒrNd}nvtd|ƒr€d}tj|dd�}d |jj |j d œi}nDtd |ƒr˜d }t |ƒ}n,d }|j d ƒ}d t |dƒt |dƒd œi}dd||dœi|rÚdnd|dœiSdS)Nzipset:r­TFÚetherrŽr-)Ústrictr�)ÚaddrrKr�r.rìrrErxÚpayload)ÚprotocolÚfieldz!=z==)rr€r�)rÆÚ_set_match_fragmentrKrrrÚ ipaddressZ IPv4NetworkZnetwork_addressZ compressedZ prefixlenrrírU)r6Z addr_fieldr@ÚinvertrAZnormalized_addressZaddr_lenr8r8r9rºys( &      znftables._rule_addr_fragmentcCs6|siS|d krttd|ƒ‚ddddiid|d œiS) NrŽr�zInvalid familyrxršrDÚnfprotoz==)rr€r�)rŽr�)r r )r6Z rich_familyr8r8r9Ú_rich_rule_family_fragment’s  z#nftables._rich_rule_family_fragmentcCs8|siS|jr|j}n|jr&d|j}|jd||jd�S)Nzipset:r­)r)rúÚipsetrºr)r6Z rich_destr@r8r8r9Ú_rich_rule_destination_fragment�s z(nftables._rich_rule_destination_fragmentcCsZ|siS|jr|j}n2t|dƒr.|jr.|j}nt|dƒrH|jrHd|j}|jd||jd�S)NÚmacrzipset:r¬)r)rúÚhasattrrrrºr)r6Z rich_sourcer@r8r8r9Ú_rich_rule_source_fragment§s z#nftables._rich_rule_source_fragmentcCsPt|ƒ}t|tƒr$|dkr$ttƒ‚n(t|ƒdkr8|dSd|d|dgiSdS)NrrEÚrange)rÚ isinstancerUr rrK)r6Úportrr8r8r9Ú_port_fragment´s   znftables._port_fragmentc Csbdddœ|}d}|jjj||tƒ} g} |r>| j|j|jƒƒ|rT| j|jd|ƒƒ|r|| j|j|j ƒƒ| j|j |j ƒƒ| jdd|dd œid |j |ƒd œiƒ| s¶t |jƒtkrÜ| jdd d diiddddgid œiƒg} |�r0| j|j||||| ƒƒ| j|j||||| ƒƒ| j|j||||| ƒƒn.| j|ddtd|| f| ddigdœiiƒ| S)Nr;r=)TFr*r­rxrûÚdport)rürýz==)rr€r�ryrDrzr{r|ÚnewÚ untrackedr>r,z %s_%s_allowr‚)rArerSrd)r/r‰r¸r¹rHrrArºrÚ destinationrÚsourcer rTrÅrrñròr÷ru) r6r„r‰Úprotor rrèr…rer²r±rjr8r8r9Úbuild_policy_ports_rules½s:   z!nftables.build_policy_ports_rulesc CsZdddœ|}d}|jjj||tƒ}g} |r>| j|j|jƒƒ|rT| j|jd|ƒƒ|r|| j|j|j ƒƒ| j|j |j ƒƒ| jdddd iid |d œiƒ| s®t |j ƒtkrÔ| jdd dd iiddddgid œiƒg} |�r(| j|j||||| ƒƒ| j|j||||| ƒƒ| j|j||||| ƒƒn.| j|ddtd||f| ddigdœiiƒ| S)Nr;r=)TFr*r­rxršrDrÜz==)rr€r�ryrzr{r|r rr>r,z %s_%s_allowr‚)rArerSrd)r/r‰r¸r¹rHrrArºrrrrrTrÅrrñròr÷ru) r6r„r‰rürrèr…rer²r±rjr8r8r9Úbuild_policy_protocol_rulesás8   z$nftables.build_policy_protocol_rulesc Csbdddœ|}d}|jjj||tƒ} g} |r>| j|j|jƒƒ|rT| j|jd|ƒƒ|r|| j|j|j ƒƒ| j|j |j ƒƒ| jdd|dd œid |j |ƒd œiƒ| s¶t |jƒtkrÜ| jdd d diiddddgid œiƒg} |�r0| j|j||||| ƒƒ| j|j||||| ƒƒ| j|j||||| ƒƒn.| j|ddtd|| f| ddigdœiiƒ| S)Nr;r=)TFr*r­rxrûÚsport)rürýz==)rr€r�ryrDrzr{r|r rr>r,z %s_%s_allowr‚)rArerSrd)r/r‰r¸r¹rHrrArºrrrrr rTrÅrrñròr÷ru) r6r„r‰rr rrèr…rer²r±rjr8r8r9Úbuild_policy_source_ports_ruless:   z(nftables.build_policy_source_ports_rulesc CsÌd}|jjj||tƒ} dddœ|} g} |rR| jdddtd||f||dœiiƒg} |rl| j|jd |ƒƒ| jd d |d d œid|j|ƒdœiƒ| jdd||fiƒ| j| ddtd| | dœiiƒ| S)Nr*r;r=)TFz ct helperr,z helper-%s-%s)rArerrrTrür­rxrûr )rürýz==)rr€r�r>zfilter_%s_allow)rArerSrd)r/r‰r¸r¹rHrurºr ) r6r„r‰rr rZ helper_nameZmodule_short_namerer²r…rjr±r8r8r9Úbuild_policy_helper_ports_rules)s.    z(nftables.build_policy_helper_ports_rulesc Cs²dddœ|}|jjj||tƒ}g} |rv|t|ƒddkrT|dt|ƒd…d}ddd d iid |d œid dig} n|jd|ƒd dig} dtd|| dœ} | j|d| iiƒ| S)Nr;r=)TFrEr¾r¿rxršrDr£z==)rr€r�r‚r­r,zfilter_%s_allow)rArerSrdr>)r/r‰r¸r¹rKrºrurH) r6r„r?r‰rerÃrr…r²rjrdr>r8r8r9Úbuild_zone_forward_rulesFs"  z!nftables.build_zone_forward_rulesc Cs¸d}|jjj||tdd�}dddœ|}g}|r`|j|j|jƒƒ|j|j|jƒƒ|j |ƒ} nd} |t d|| f|d d d d iid ddœiddigdœ} | j |j |ƒƒ|d| iigS)Nr)T)r»r;r=)TFrËz nat_%s_%srxršrDr£z!=rœ)rr€r�Z masquerade)rArerSrdr>) r/r‰r¸r¹rHrrrrrérur�rî) r6r„r‰rArèrer²r…r±r³r>r8r8r9Ú"_build_policy_masquerade_nat_rules_s&   z+nftables._build_policy_masquerade_nat_rulesc Cs^g}|rD|jr|jdks,|jrDtd|jjƒrD|j|j||d|ƒƒnV|r„|jrX|jdksl|jr„td|jjƒr„|j|j||d|ƒƒn|j|j||d|ƒƒd}|jjj||t ƒ}dddœ|}g}|rö|j |j |j ƒƒ|j |j |jƒƒ|j|ƒ} nd } d td || f|d d ddiiddddgidœiddigdœ} | j|j|ƒƒ|j |d| iiƒ|S)Nr�r.rŽr-r*r;r=)TFrËr,z filter_%s_%srxryrDrzr{r|r r)rr€r�r‚)rArerSrdr>)rArrrúr¶rr/r‰r¸r¹rHrrrrérur�rî) r6r„r‰rèrjrer²r…r±r³r>r8r8r9Úbuild_policy_masquerade_rulesxs8   z&nftables.build_policy_masquerade_rulesc Cs$d} |jjj|| tƒ} dddœ|} g} |r\| j|j|jƒƒ| j|j|jƒƒ|j |ƒ} nd} | jdd|dd œid |j |ƒd œiƒ|rØt d |ƒrœt |ƒ}|rÄ|d krÄ| jd||j |ƒdœiƒqð| jdd|iiƒn| jdd|j |ƒiiƒ|t d| | f| dœ}|j|j|ƒƒ| d|iigS)Nr)r;r=)TFrËrxrûr )rürýz==)rr€r�r�rnr™)rúr rúZredirectr z nat_%s_%s)rArerSrdr>)r/r‰r¸r¹rHrrrrrér rrrur�rî)r6r„r‰r rüÚtoaddrÚtoportrArèrer²r…r±r³r>r8r8r9Ú$_build_policy_forward_port_nat_rules�s4     z-nftables._build_policy_forward_port_nat_rulesc CsØg}|rF|jr|jdks&|rFtd|ƒrF|j|j||||||d|ƒƒnŽ|rˆ|jrZ|jdksh|rˆtd|ƒrˆ|j|j||||||d|ƒƒnL|r¶td|ƒr¶|j|j||||||d|ƒƒn|j|j||||||d|ƒƒ|S)Nr�r.rŽr-)rArr¶r) r6r„r‰r rürrrèrjr8r8r9Úbuild_policy_forward_port_rulesÂs    z(nftables.build_policy_forward_port_rulescCsHdd|ddœid|dœig}|dk rD|jdd|ddœid|dœiƒ|S)NrxrûrT)rürýz==)rr€r�Úcode)rH)r6rürTrÚ fragmentsr8r8r9Ú_icmp_types_fragments×s  znftables._icmp_types_fragmentscCs‚|dkr4|tkr4t|\}}}|jd||r.dn|ƒS|dkrh|tkrht|\}}}|jd||rbdn|ƒSttd||j|fƒ‚dS)NrŽrÙr�rÚz)ICMP type '%s' not supported by %s for %s)rr rr r rr)r6r‘Z icmp_typeZ_typeÚ_codeZ _omit_coder8r8r9Ú_icmp_types_to_nft_fragmentsász%nftables._icmp_types_to_nft_fragmentscCsBd}|jjj||tƒ}dddœ|}|r6|jr6|j}n<|jrjg}d|jkrT|jdƒd|jkrr|jdƒnddg}g} �xÄ|D�]º} |jjj|ƒr¨d||f} ddi} nd ||f} |jƒ} g} |rú| j|j |j ƒƒ| j|j |jƒƒ| j|j |j ƒƒ| j|j| |jƒƒ|�r¶| j|j||||| ƒƒ| j|j||||| ƒƒ|j�rf| j|j||||| ƒƒnN|j|ƒ}d td |||f| |jƒgd œ}|j|j|ƒƒ| j|d |iiƒq~|jjƒdk�r|jjj|ƒ �r| j|d d t| | |j|jjƒƒddd||fiigd œiiƒ| j|d d t| | | gd œiiƒq~W| S)Nr*r;r=)TFrŽr�z %s_%s_allowr‚z %s_%s_denyr,z%s_%s_%s)rArerSrdr>r”rr�z"%s_%s_ICMP_BLOCK: ")r/r‰r¸r¹ÚipvsrrHÚquery_icmp_block_inversionrÐrrArrrr¶r"rrrñròrÅr÷rérur�rîrÏr¤)r6r„r‰Zictrèrer²r…r#rjr‘Z final_chainrÓr±r³r>r8r8r9Úbuild_policy_icmp_block_rulesìsb          " " z&nftables.build_policy_icmp_block_rulescCsâd}|jjj||tƒ}g}dddœ|}|jjj|ƒr@|jƒ}nddi}|j|ddtd||fd |jƒ|gd œiiƒ|jj ƒd krÞ|jjj|ƒrÞ|j|ddtd||fd |jƒ|j |jj ƒƒd d d||fiigd œiiƒ|S)Nr*r;r=)TFr‚r>r,z%s_%sé)rArerSrFrdr”rr�z%s_%s_ICMP_BLOCK: ) r/r‰r¸r¹r$rÐrHrurÝrÏr¤)r6r„r‰rer²rjr…rÓr8r8r9Ú'build_policy_icmp_block_inversion_rules(s,      z0nftables.build_policy_icmp_block_inversion_rulesc CsÆg}ddddiidddœiddd d d gd d œidddœig}|dkrV|jdddiiƒ|jddiƒ|jdddtd|dœiiƒ|jdddtddddddœiddddgidœid digdœiiƒ|S)!NrxršrDrz==r�)rr€r�Zfibr¬ZiifróZoif)ÚflagsÚresultFr”rr�zrpfilter_DROP: r‡r<r>r,Zfilter_PREROUTING)rArerSrdrûrÚrT)rürýr|znd-router-advertznd-neighbor-solicitr‚)rHru)r6rkrjr±r8r8r9Úbuild_rpfilter_rulesGs0     znftables.build_rpfilter_rulesc Cs¶ddddddddd g }d d „|Dƒ}d d dddœidd|idœig}|jjd"krb|jdddiiƒ|j|jdƒƒg}|jdddtdd|dœiiƒ|jdddtd d!|dœiiƒ|S)#Nz ::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19cSs2g|]*}d|jdƒdt|jdƒdƒdœi‘qS)r�rìrrE)rúrK)rírU)Ú.0rBr8r8r9ú nsz5nftables.build_rfc3964_ipv4_rules..rxrûr.r­)rürýz==r|)rr€r�rÕrÔrr�zRFC3964_IPv4_REJECT: z addr-unreachr;r>r,r¢rE)rArerSrFrdZfilter_FORWARDé)rÕrÔ)r/Z _log_deniedrHrÛru)r6Z daddr_setr±rjr8r8r9Úbuild_rfc3964_ipv4_rulescs:   z!nftables.build_rfc3964_ipv4_rulescCsŽd}g}|j|j|jƒƒ|j|j|jƒƒ|j|j|jƒƒg}|j|j|||||ƒƒ|j|j|||||ƒƒ|j|j |||||ƒƒ|S)Nr*) rHrrArrrrrñròr÷)r6r„r‰rèrer±rjr8r8r9Ú*build_policy_rich_source_destination_rules†sz3nftables.build_policy_rich_source_destination_rulescCs|dkr dSdS)NrŽr�ÚebTF)rŽr�r0r8)r6r‘r8r8r9Úis_ipv_supported•sznftables.is_ipv_supportedc Cs°dddœ}||||ddg||dd||g||dd||g||dg||||||g||ddg||dd||g||dgdd œ }||krž||Sttd |ƒ‚dS) NZ ipv4_addrZ ipv6_addr)rŽr�Z inet_protoZ inet_serviceróZifnameZ ether_addr) zhash:ipz hash:ip,portzhash:ip,port,ipzhash:ip,port,netz hash:ip,markzhash:netz hash:net,netz hash:net,portzhash:net,port,netzhash:net,ifacezhash:macz!ipset type name '%s' is not valid)r r )r6r‘rTZipv_addrÚtypesr8r8r9Ú_set_type_listšs"    znftables._set_type_listc CsÎ|rd|kr|ddkrd}nd}t||j||ƒdœ}x0|jdƒdjdƒD]}|dkrLd g|d <PqLW|r”d|kr€|d|d<d|kr”|d|d<g}x0dD](}d|i} | j|ƒ|jdd| iiƒqžW|S)NrAÚinet6r�rŽ)rerrrTú:rEú,r-Únetr Zintervalr(ZtimeoutZmaxelemÚsizer,r.r;r|)r-r7r )r,r-r.)rur3rír�rH) r6rrrTÚoptionsr‘Zset_dictÚtrjrAZ rule_dictr8r8r9Úbuild_set_create_rules´s*     znftables.build_set_create_rulescCs$|j|||ƒ}|j||jjƒƒdS)N)r;rmr/rÏ)r6rrrTr9rjr8r8r9Ú set_createÒsznftables.set_createcCs8x2dD]*}dd|t|dœii}|j||jjƒƒqWdS)Nr,r-r.r=r|)rArerr)r,r-r.)ruror/rÏ)r6rrrAr>r8r8r9Ú set_destroyÖs   znftables.set_destroycCs6|jjj|ƒjjdƒdjdƒ}g}xØtt|ƒƒD]È}||dkrr|jdddiiƒ|jdd |rdd nd d œiƒq2||dkr¢|jd|j|ƒ|r”dndd œiƒq2||dkrÊ|jdd|r¾dndiiƒq2||dkrê|jdddiiƒq2t d||ƒ‚q2Wdt|ƒdk�rd|in|d|�r&dndd|dœiS)Nr5rEr6r ršrDrÜrûZthr r)rürýr-r7rr­r¬Zifacer›r£róz-Unsupported ipset type for match fragment: %srxÚconcatrz!=z==ú@)rr€r�)r-r7r) r/rÚ get_ipsetrTrírrKrHrÇr )r6rrZ match_destrÚ type_formatrÚir8r8r9rþÝs$      znftables._set_match_fragmentc CsN|jjj|ƒ}|jjdƒdjdƒ}|jdƒ}t|ƒt|ƒkrHttdƒ‚g}�xâtt|ƒƒD�]Ð}||dk�r,y||j dƒ}Wn&t k r¨|j dƒ||} Yn,X|j ||d|…ƒ|||dd…} y| j dƒ}Wn t k �r|j | ƒYn(X|j d| d|…| |dd…giƒq\||dk�r d||k�rb|j d||jdƒiƒn¼y||j d ƒ}WnLt k �rÀ||} d |j k�r²|j d d k�r²t | ƒ} |j | ƒYn^X||d|…} d |j k�rö|j d d k�röt | ƒ} |j d| t|||dd…ƒdœiƒq\|j ||ƒq\Wt|ƒdk�rJd|igS|S)Nr5rEr6z+Number of values does not match ipset type.r Ztcpú-rr-r7rìrAr4r�)rúrKr>)r-r7)r/rr@rTrírKr rrrFrirHr9rrU) r6rrÚentryÚobjrAZ entry_tokensZfragmentrBrFZport_strrúr8r8r9Ú_set_entry_fragmentôsL  ("znftables._set_entry_fragmentc Csjg}g}t|ttfƒs|g}x|D]}|j|j||ƒƒq"Wx(dD] }|jdd|t||dœiiƒqBW|S)Nr,r-r.r;rç)rArerrÚelem)r,r-r.)r rhÚtupler¶rFrHru)r6rrÚentriesrjÚelementsrçrAr8r8r9Úbuild_set_add_rules(s   znftables.build_set_add_rulescCs"|j||ƒ}|j||jjƒƒdS)N)rKrmr/rÏ)r6rrrDrjr8r8r9Úset_add7s znftables.set_addcCsF|j||ƒ}x4dD],}dd|t||dœii}|j||jjƒƒqWdS)Nr,r-r.r=rç)rArerrrG)r,r-r.)rFruror/rÏ)r6rrrDrçrAr>r8r8r9Ú set_delete;s   znftables.set_deletecCs4g}x*dD]"}dd|t|dœii}|j|ƒq W|S)Nr,r-r.rbr|)rArerr)r,r-r.)rurH)r6rrrjrAr>r8r8r9Úbuild_set_flush_rulesDs  znftables.build_set_flush_rulescCs |j|ƒ}|j||jjƒƒdS)N)rNrmr/rÏ)r6rrrjr8r8r9Ú set_flushMs znftables.set_flushcCsJ|jjj|ƒ}|jdkrd}n(|jrBd|jkrB|jddkrBd}nd}|S)Nzhash:macrørAr4r.r-)r/rr@rTr9)r6rrrrAr8r8r9rÇQs znftables._set_get_familycCs�g}|j|j|||ƒƒ|j|j|ƒƒxbtdt|ƒdƒD]<}|j|j||||d…ƒƒ|j||jjƒƒ|j ƒq:W|j||jjƒƒdS)Nriè) r¶r;rNrrKrKrmr/rÏÚclear)r6Zset_nameZ type_namerIZcreate_optionsZ entry_optionsrjrBr8r8r9Ú set_restore^s znftables.set_restore)N)N)r”)r,)Fr,)r,)r,)F)NN)NN)NN)NN)N)N)N)N)N)N)F)N)N)F)NN)JÚ__name__Ú __module__Ú __qualname__rrZpolicies_supportedr:rNrRr[rarmrorqrsrwrtr�r’r“r¦r©r·rÁrÈrÎr¤rÛrÐrÝrærérërÂrÉr®rîrñròr÷rºrrrr rrrrrrrrrr r"r%r'r*r.r/r1r3r;r<r=rþrFrKrLrMrNrOrÇrQr8r8r8r9r+Ts’/.`  4  R i ; - 9   +     $ $ $   ' $   < #   4  r+ijÿÿÿiœÿÿÿ))Z __future__rrOr^rÿZfirewall.core.loggerrZfirewall.functionsrrrrrZfirewall.errorsr r r r r rrZfirewall.core.richrrrrrrrZfirewall.core.icmprrZnftables.nftablesrrurƒr¹rŒrpÚobjectr+r8r8r8r9Ús,  $$