<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
YjBu             	   @   s6  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZ d dl m!Z! d	Z"e"d
 d Z#dZ$dZ%i ddde% fidde% fdde% fddd e% fdd e% fdd e% fdd e% fddZ&G dd de'Z(dS )    )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_dropZpolicy_
   
PREROUTING
prerouting   d   Zpostrouting)r   POSTROUTINGinputforwardoutput)r   INPUTFORWARDOUTPUT)rawmanglenatfilterc               @   sj  e Zd Zd ZdZdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd ZdddZdd Zdd Zdd Zdd ZdddZdd Zdd d!Zd"d# Zdd%d&Zdd(d)Zdd*d+Zdd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&ddJdKZ'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+ddTdUZ,ddVdWZ-ddXdYZ.dZd[ Z/dd\d]Z0dd^d_Z1dd`daZ2ddbdcZ3ddddeZ4ddfdgZ5dhdi Z6ddjdkZ7dldm Z8ddndoZ9dpdq Z:drds Z;dtdu Z<dvdw Z=ddxdyZ>ddzd{Z?d|d} Z@dd~dZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdddZIdS )nftablesTc             C   sb   || _ d| _g | _i | _i | _i | _i | _i | _g g g d| _t	 | _
| j
jd | j
jd d S )NT)inetipip6)_fwZrestore_command_existsZavailable_tablesrule_to_handlerule_ref_countrich_rule_priority_countspolicy_priority_countszone_source_index_cachecreated_tablesr   r+   Zset_echo_outputZset_handle_output)selffw r8   /usr/lib/python3.6/nftables.py__init__X   s    znftables.__init__c             C   s  xdD ]}||krP qW d|| d kr`|| d d d || d d d f}|| d d= n(d|| d krd }|| d d= nd S || d d	 }|r|dkr||kr||| kr|| j | n|dkr||krg ||< |r(||| kr|| j| || jd
d d || j|}n| jjr8d}nt|| }|| }||= |dkrf||d< n |d8 }||d< ||d d d< d S )Naddinsertdeletez%%ZONE_SOURCE%%rulezoneaddressz%%ZONE_INTERFACE%%familyc             S   s   | d S )Nr   r8   )xr8   r8   r9   <lambda>   s    z3nftables._run_replace_zone_source.<locals>.<lambda>)keyr      index)r;   r<   r=   )removeappendsortrF   r/   _allow_zone_driftinglen)r6   r>   r4   verbZzone_sourcerA   rF   _verb_snippetr8   r8   r9   _run_replace_zone_sourceg   sD    




z!nftables._run_replace_zone_sourcec             C   sB   d|krdt j|d iS d|kr4dt j|d iS ttdd S )Nr<   r=   r;   zFailed to reverse rule)copydeepcopyr	   r
   )r6   dictr8   r8   r9   reverse_rule   s
    znftables.reverse_rulec       
      C   s  xdD ]}||krP qW ||| d kr|| d | }|| d |= t |tkr^ttd|| d d || d d f}|dkr||ks||| ks|| | dkrttd	|| |  d
8  < n||kri ||< ||| krd|| |< d}xVt|| j D ]B}||kr"|dkr"P ||| | 7 }||kr|dkrP qW || |  d
7  < || }	||= |dkr|	|d< n |d
8 }|	|d< ||d d d< d S )Nr;   r<   r=   r>   z%priority must be followed by a numberrA   chainr   z*nonexistent or underflow of priority countrE   rF   )r;   r<   r=   )typeintr	   r   r
   sortedkeys)
r6   r>   Zpriority_countstokenrL   priorityrS   rF   prM   r8   r8   r9   _set_rule_replace_priority   sD    

 


z#nftables._set_rule_replace_priorityc             C   sf   x`d
D ]X}||krd|| krt j|| d }xdD ]}||kr6||= q6W tj|dd	}|S qW d S )Nr;   r<   r=   r>   rF   handlepositionT)Z	sort_keys)r;   r<   r=   )rF   r\   r]   )rO   rP   jsondumps)r6   r>   rL   rule_keyZnon_keyr8   r8   r9   _get_rule_key   s    


znftables._get_rule_keyc             C   sL  dddddg}dddg}g }g }t j| j}t j| j}t j| j}	| jj  }
x|D ]}t|tkrvtt	d| x|D ]}||kr|P q|W ||krtt
d| | j|}||
krDtjd| j|
| | |dkr|
|  d	7  < qVnX|
| d	kr|
|  d	8  < qVn6|
| d	kr,|
|  d	8  < ntt	d
||
| f n|r\|dkr\d	|
|< |j| t j|}|rttd || d d || d d< | j||d | j||d | j||	 |dkrdd|d d d |d d d |d d d | j| dii}|j| qVW dddd	iig| i}tj dkrVtjd| jtj| | jj|\}}}|dkrtdd|tj|f || _|| _|	| _|
| _d}x|D ]}|d	7 }| j|}|s̐qd|kr| j|= | j|= qx"|D ]}||d | krP qW ||d | kr$q|d | | d d | j|< qW d S )Nr;   r<   r=   flushreplacez#rule must be a dictionary, rule: %szno valid verb found, rule: %sz%s: prev rule ref cnt %d, %srE   z)rule ref count bug: rule_key '%s', cnt %dr>   exprz%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%rA   tablerS   )rA   re   rS   r\   r+   ZmetainfoZjson_schema_version   z.%s: calling python-nftables with JSON blob: %sr   z'%s' failed: %s
JSON blob:
%szpython-nftablesr\   )rO   rP   r2   r3   r4   r1   rT   rQ   r	   r
   r   ra   r   Zdebug2	__class__rH   listr*   r[   rN   r0   ZgetDebugLogLevelZdebug3r^   r_   r+   Zjson_cmd
ValueError)r6   rules
log_deniedZ_valid_verbsZ_valid_add_verbsZ_deduplicated_rulesZ_executed_rulesr2   r3   r4   r1   r>   rL   r`   Z_ruleZ	json_blobZrcr#   errorrF   r8   r8   r9   	set_rules   s    







&






znftables.set_rulesc             C   s   | j |g| dS )N )rm   )r6   r>   rk   r8   r8   r9   set_rule:  s    znftables.set_ruleNc             C   s   |r
|gS t j S )N)IPTABLES_TO_NFT_HOOKrW   )r6   re   r8   r8   r9   get_available_tables>  s    znftables.get_available_tablesc             C   sF   g }x<dD ]4}|j dd||dii |j dd||dii q
W |S )	Nr,   r-   r.   r;   re   )rA   namer=   )r,   r-   r.   )rH   )r6   re   rj   rA   r8   r8   r9   _build_delete_table_rulesB  s    


z"nftables._build_delete_table_rulesc             C   s   i }i }xB| j dD ]4}| j|}|| jkr| j| ||< | j| ||< qW || _|| _i | _i | _i | _x*dD ]"}t| j| krp| j| j	t qpW | j
tS )NTr,   r-   r.   )r,   r-   r.   ) _build_set_policy_rules_ct_rulesra   r0   r1   r2   r3   r4   
TABLE_NAMEr5   rG   rs   )r6   Zsaved_rule_to_handleZsaved_rule_ref_countr>   
policy_keyrA   r8   r8   r9   build_flush_rulesP  s     


znftables.build_flush_rulesc             C   sl   ddd| }g }xTdD ]L}|j |ddtd	d
|f ddddiiddddgididd igdii qW |S )Nr;   r=   )TFr!   r"   r#   r>   r,   z%s_%sr*   matchctrD   stateinsetestablishedrelated)leftoprightaccept)rA   re   rS   rd   )r!   r"   r#   )rH   TABLE_NAME_POLICY)r6   enableadd_delrj   hookr8   r8   r9   rt   g  s    


z)nftables._build_set_policy_rules_ct_rulesc             C   st  g }|dkrt|j dddtdii | jd j t x>dD ]6}|j dddtd	d
|f d|dt d ddii q:W |dk r|j dddtdii | jd j t x>dD ]6}|j dddtd	d|f d|dt d ddii qW || jd7 }nz|dkrfx4| jdD ]&}| j|}|| jkr|j | qW || jt7 }t| jd krp| jd jt n
t	t
d |S )NZPANICr;   re   r,   )rA   rr   r   r#   rS   z%s_%sr'   r*   i,  rE   drop)rA   re   rr   rT   r   priopolicyDROPr!   r"   r   TACCEPTFznot implemented)r   r#   i)r!   r"   r#   )rH   r   r5   NFT_HOOK_OFFSETrt   ra   r0   rs   rG   r	   r
   )r6   r   rj   r   r>   rv   r8   r8   r9   build_set_policy_rulest  sH    













znftables.build_set_policy_rulesc             C   sJ   t  }|d ks|dkr$|jtj  |d ks4|dkrB|jtj  t|S )Nipv4ipv6)r|   updater   rW   r   rh   )r6   ipvZ	supportedr8   r8   r9   supported_icmp_types  s    znftables.supported_icmp_typesc             C   s>   g }x4dD ],}|j dd|tdii | j| j t q
W |S )Nr,   r-   r.   r;   re   )rA   rr   )r,   r-   r.   )rH   ru   r5   )r6   Zdefault_tablesrA   r8   r8   r9   build_default_tables  s    

znftables.build_default_tablesoffc             C   s  g }xt d j D ]}|jdddtd| ddt d | d  t d | d	 d
ii xz| jjrlddddgndddgD ]X}|jdddtd||f dii |jdddtd| ddd||f iigdii qvW qW xd?D ]}xt d j D ]}|jdd|td| ddt d | d  t d | d	 d
ii x~| jjrJddddgndddgD ]Z}|jdd|td||f dii |jdd|td| ddd||f iigdii qTW qW qW xVt d j D ]F}|jdddtd| ddt d | d  t d | d	 d
ii qW |jdddtdd ddddiid d!d"d#gid$id%d igdii |jdddtdd dddd&iid d'd$id%d igdii |jdddtdd dd(dd)iid*d+d$id%d igdii x~| jjrddddgndddgD ]Z}|jdddtd,d|f dii |jdddtdd ddd,d|f iigdii qW |d-kr|jdddtdd ddddiid d!d.gid$i| j|d/d0d1iigdii |jdddtdd ddddiid d!d.gid$id2d igdii |d-kr$|jdddtdd | j|d/d0d3iigdii |jdddtdd d4d5d6d7igdii |jdddtdd8 ddddiid d!d"d#gid$id%d igdii |jdddtdd8 dddd&iid d'd$id%d igdii |jdddtdd8 dd(dd)iid*d+d$id%d igdii xbd@D ]Z}|jdddtd,d8|f dii |jdddtdd8 ddd,d8|f iigdii qW xdAD ]}xz| jjrddgndgD ]^}|jdddtd;d8||f dii |jdddtdd8 ddd;d8||f iigdii qW qvW xbdBD ]Z}|jdddtd,d8|f dii |jdddtdd8 ddd,d8|f iigdii qW |d-kr|jdddtdd8 ddddiid d!d.gid$i| j|d/d0d1iigdii |jdddtdd8 ddddiid d!d.gid$id2d igdii |d-kr6|jdddtdd8 | j|d/d0d3iigdii |jdddtdd8 d4d5d6d7igdii |jdddtdd< ddddiid d!d"d#gid$id%d igdii |jdddtd=dd(dd>iid*d+d$id%d igdii xbdCD ]Z}|jdddtd,d<|f dii |jdddtdd< ddd,d<|f iigdii qW xbdDD ]Z}|jdddtd,d<|f dii |jdddtdd< ddd,d<|f iigdii qHW |S )ENr(   r;   rS   r,   z	mangle_%sr*   z%sr   rE   )rA   re   rr   rT   r   r   POLICIES_preZZONES_SOURCEZZONESPOLICIES_postzmangle_%s_%s)rA   re   rr   r>   jumptarget)rA   re   rS   rd   r-   r.   r)   znat_%sz	nat_%s_%sz	filter_%sr$   rx   ry   rD   rz   r{   r|   r}   r~   )r   r   r   r   Zstatusdnatmetaiifnamez==lozfilter_%s_%sr   Zinvalidr   prefixzSTATE_INVALID_DROP: r   zFINAL_REJECT: rejecticmpxzadmin-prohibited)rT   rd   r%   INOUTzfilter_%s_%s_%sr&   filter_OUTPUToifname)r-   r.   )r   )r   r   )r   )r   )r   )rp   rW   rH   ru   r/   rJ   _pkttype_match_fragment)r6   rk   Zdefault_rulesrS   Zdispatch_suffixrA   	directionr8   r8   r9   build_default_rules  s   
$

(

&

.
 


&

&











&


.


&










&


&znftables.build_default_rulesc             C   s4   |dkrdddgS |dkr dgS |dkr0ddgS g S )	Nr*   r$   
FORWARD_INFORWARD_OUTr(   r   r)   r    r8   )r6   re   r8   r8   r9   get_zone_table_chains  s    
znftables.get_zone_table_chainsr,   c
                s  dkr\dkr\g }
|
j j|||||dd	 |
j j|||||dd	 |
S jjj|jdk rxdnddkrd	krd
nd}jjj|t| g }g }|r|jddddiiddt	|idi |r|jddddiiddt	|idi ddd}|rlxT|D ]L}dkrTjj
j|}||krT|| krTq|jjd| qW |rxT|D ]L}dkrjj
j|}||kr|| krqx|jjd| qxW  fdd}g }
|rHx|D ]P}|rxB|D ]}|
j||| qW n"dkr0|r0n|
j||d  qW n\dkrZ|rZnJ|rxB|D ]}|
j|d | qfW n"dkr|rn|
j|d d  |
S )Nr)   r,   r-   )rA   r.   r   prepostr    TFrx   r   rD   r   z==r|   )r   r   r   r   )r   r   saddrdaddrc                s   g }| r|j |  |r |j | |j ddd f ii tdf |d}|jj rrdd|iiS dd|iiS d S )	Nr   r   z%s_%sz%s_%s_POLICIES_%s)rA   re   rS   rd   r;   r>   r=   )rH   ru   r   _policy_priority_fragment)ingress_fragmentegress_fragmentexpr_fragmentsr>   )_policyrS   chain_suffixr   rA   p_objr6   re   r8   r9   _generate_policy_dispatch_rule  s    

zRnftables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule)extend!build_policy_ingress_egress_rulesr/   r   Z
get_policyrY   policy_base_chain_namePOLICY_CHAIN_PREFIXrH   rh   r?   Zcheck_source_rule_addr_fragment)r6   r   r   re   rS   Zingress_interfacesZegress_interfacesZingress_sourcesZegress_sourcesrA   rj   isSNATZingress_fragmentsZegress_fragmentsZipv_to_familysrcr   dstr   r   r   r8   )r   rS   r   r   rA   r   r6   re   r9   r     sv    









z*nftables.build_policy_ingress_egress_rulesFc	          
   C   s  |dkrT|dkrTg }	|	j | j|||||||d |	j | j|||||||d |	S |dkrh|dkrhdnd}
| jjj||t|
d}d	d
d	d	d
d
d| }|t|d  dkr|d t|d  d }d}|dkr|dd||f iig}n,ddd|iid|di|dd||f iig}|rL| rLd}|td||f |d}|j| j	  nP|rnd}|td||f |d}n.d}|td||f |d}|s|j| j	  |d|iigS )Nr)   r,   r-   r.   r    TF)r   r   r   )r   r    r$   r   r   r&   rE   +*gotor   z%s_%srx   r   rD   z==)r   r   r   r<   z%s_%s_ZONES)rA   re   rS   rd   r;   r=   r>   )
r   !build_zone_source_interface_rulesr/   r   r   r   rK   ru   r   _zone_interface_fragment)r6   r   r?   r   	interfacere   rS   rH   rA   rj   r   r   optactionr   rL   r>   r8   r8   r9   r      s\    



z*nftables.build_zone_source_interface_rulesc          	   C   sn  |dkr|dkrg }|j dr6| j|tdd  }	nd }	td|sTt|sT|	dkrp|j| j||||||d td|st|s|	dkr|j| j||||||d |S |dkr|dkrd	nd
}
| jjj	||t
|
d}ddd| }ddddddd| }| jjrd||f }nd||f }d}|t|| j|||dd||f iigd}|j| j|| |d|iigS )Nr)   r,   zipset:r   r-   r   r.   r    TF)r   r<   r=   )TFr   r   )r   r    r$   r   r   r&   z%s_%s_ZONES_SOURCEz%s_%s_ZONESr   r   z%s_%s)rA   re   rS   rd   r>   )
startswith_set_get_familyrK   r   r   r   build_zone_source_address_rulesr/   r   r   r   rJ   ru   r   r   _zone_source_fragment)r6   r   r?   r   r@   re   rS   rA   rj   Zipset_familyr   r   r   r   Zzone_dispatch_chainr   r>   r8   r8   r9   r   <  sB    


z(nftables.build_zone_source_address_rulesc             C   s  |dkrH|dkrHg }|j | j||||d |j | j||||d |S ddd| }|dkrj|dkrjd	nd
}| jjj||t|d}	g }|j|d|td||	f dii x0d!D ](}
|j|d|td||	|
f dii qW xDd"D ]<}
|j|d|td||	f ddd||	|
f iigdii qW | jjj| j	}| jj
 dkr|dkr|d#kr|}|dkrhd}|j|d|td||	f | j| jj
 ddd|	|f iigdii |dkr|d$kr|d%kr| j }n|j d i}|j|d|td||	f |gdii |s|j  |S )&Nr)   r,   r-   r.   r;   r=   )TFr    TF)r   rS   z%s_%s)rA   re   rr   r   r   denyallowr   z%s_%s_%sr>   r   r   )rA   re   rS   rd   r   r*   REJECT
%%REJECT%%r   r   z"filter_%s_%s: "r   )r   r   r   r   r   )r   r   r   r   r   )r   r   r   )r   r   r   r   )r   r   )r   build_policy_chain_rulesr/   r   r   r   rH   ru   Z	_policiesr   get_log_deniedr   _reject_fragmentlowerreverse)r6   r   r   re   rS   rA   rj   r   r   r   r   r   Z
log_suffixtarget_fragmentr8   r8   r9   r   j  sZ    





&




 





z!nftables.build_policy_chain_rulesc             C   s<   |dkri S |dkr,ddddiid	|d
iS t td|d S )Nallunicast	broadcast	multicastrx   r   rD   pkttypez==)r   r   r   zInvalid pkttype "%s")r   r   r   )r	   r   )r6   r   r8   r8   r9   r     s    
z nftables._pkttype_match_fragmentc             C   s  ddddiddddiddddiddddiddddiddddiddddiddddiddddiddddiddd	diddd	diddd
diddd
diddd
diddddiddddiddddiddddiddddiddddidddiidddiid}|| S )Nr   icmpzhost-prohibited)rT   rd   znet-prohibitedzadmin-prohibitedicmpv6znet-unreachablezhost-unreachablezport-unreachabler   zprot-unreachablezaddr-unreachablezno-routerT   z	tcp reset)zicmp-host-prohibitedzhost-prohibzicmp-net-prohibitedz
net-prohibzicmp-admin-prohibitedzadmin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp-net-unreachableznet-unreachzicmp-host-unreachablezhost-unreachzicmp-port-unreachablezicmp6-port-unreachablezport-unreachzicmp-proto-unreachablezproto-unreachzicmp6-addr-unreachablezaddr-unreachzicmp6-no-routezno-routez	tcp-resetztcp-rstr8   )r6   Zreject_typeZfragsr8   r8   r9   _reject_types_fragment  s0    
znftables._reject_types_fragmentc             C   s   ddddiS )Nr   r   zadmin-prohibited)rT   rd   r8   )r6   r8   r8   r9   r     s    znftables._reject_fragmentc             C   s    ddddiiddddgid	iS )
Nrx   r   rD   l4protoz==r|   r   r   )r   r   r   r8   )r6   r8   r8   r9   _icmp_match_fragment  s    znftables._icmp_match_fragmentc             C   sP   |si S ddddd}|j  \}}||| d}|j }|d k	rH||d< d|iS )	NsecondZminuteZhourZday)smhd)rateZperburstlimit)Zvalue_parseZburst_parse)r6   r   Zrich_to_nftr   Zdurationr   r   r8   r8   r9   _rich_rule_limit_fragment  s    z"nftables._rich_rule_limit_fragmentc             C   s   t |jtttgkrn<|jrHt |jtttt	gkrRt
tdt |j n
t
td|jdkrt |jttgkst |jtt	gkrdS t |jtgkst |jttgkrdS n|jdk rdS dS d S )NzUnknown action %szNo rule action specified.r   r   r   r   r   )rT   elementr   r   r   r   r   r   r   r   r	   r   rY   )r6   	rich_ruler8   r8   r9   _rich_rule_chain_suffix  s     


z nftables._rich_rule_chain_suffixc             C   s>   |j  r|j rttd|jdkr(dS |jdk r6dS dS d S )NzNot log or auditr   r   r   r   )r   auditr	   r   rY   )r6   r   r8   r8   r9    _rich_rule_chain_suffix_from_log  s    


z)nftables._rich_rule_chain_suffix_from_logc             C   s   dd iS )Nz%%ZONE_INTERFACE%%r8   )r6   r8   r8   r9   r     s    z!nftables._zone_interface_fragmentc             C   sN   t d|rt|}n,td|r@|jd}t|d d |d  }d||diS )Nr   /r   rE   z%%ZONE_SOURCE%%)r?   r@   )r   r   r   split)r6   r?   r@   Z
addr_splitr8   r8   r9   r     s    



znftables._zone_source_fragmentc             C   s
   d|j iS )Nz%%POLICY_PRIORITY%%)rY   )r6   r   r8   r8   r9   r     s    z"nftables._policy_priority_fragmentc             C   s   | s|j dkri S d|j iS )Nr   z%%RICH_RULE_PRIORITY%%)rY   )r6   r   r8   r8   r9   _rich_rule_priority_fragment  s    z%nftables._rich_rule_priority_fragmentc             C   s   |j s
i S | jjj||t}ddd| }| j|}i }	|j jrPd|j j |	d< |j jr|d|j jkrhdn|j j}
d|
 |	d< d	td
|||f || j	|j j
d|	ig d}|j| j| |d|iiS )Nr;   r=   )TFz%sr   Zwarningwarnlevelr,   z%s_%s_%sr   )rA   re   rS   rd   r>   )r   r/   r   r   r   r   r   r   ru   r   r   r   r   )r6   r   r   r   re   r   r   r   r   Zlog_optionsr   r>   r8   r8   r9   _rich_rule_log"  s&    
znftables._rich_rule_logc       
      C   s   |j s
i S | jjj||t}ddd| }| j|}dtd|||f || j|j jdddiig d	}	|	j	| j
| |d
|	iiS )Nr;   r=   )TFr,   z%s_%s_%sr   r   r   )rA   re   rS   rd   r>   )r   r/   r   r   r   r   ru   r   r   r   r   )
r6   r   r   r   re   r   r   r   r   r>   r8   r8   r9   _rich_rule_audit<  s    
znftables._rich_rule_auditc             C   s  |j s
i S | jjj||t}ddd| }| j|}d|||f }	t|j tkr\dd i}
n t|j tkr|j jr| j	|j j}
ndd i}
nt|j t
krdd i}
nt|j tkrHd}| jjj||t}d|||f }	|j jjd	}t|d
kr,ddddiidddddii|d
 gi|d gidi}
nddddii|d di}
nttdt|j  dt|	|| j|j j|
g d}|j| j| |d|iiS )Nr;   r=   )TFz%s_%s_%sr   r   r   r(   r   rE   r   rD   mark^&r   )rD   valuezUnknown action %sr,   )rA   re   rS   rd   r>   )r   r/   r   r   r   r   rT   r   r   r   r   r   r|   r   rK   r	   r   ru   r   r   r   r   )r6   r   r   r   re   r   r   r   r   rS   Zrule_actionr   r>   r8   r8   r9   _rich_rule_actionN  sB    


,znftables._rich_rule_actionc             C   s   |j dr0| j|tdd  d|kr(dnd|S t|r>d}ntd|rNd}nvtd|rd}tj|dd}d	|jj	|j
d
i}nDtd|rd}t|}n,d}|jd}d	t|d t|d d
i}dd||di|rdnd|diS d S )Nzipset:r   TFetherr   r-   )strictr   )addrrK   r   r.   r   r   rE   rx   payload)protocolfieldz!=z==)r   r   r   )r   _set_match_fragmentrK   r   r   r   	ipaddressZIPv4NetworkZnetwork_addressZ
compressedZ	prefixlenr   r   rU   )r6   Z
addr_fieldr@   invertrA   Znormalized_addressZaddr_lenr8   r8   r9   r   y  s(    
&





znftables._rule_addr_fragmentc             C   s6   |si S |d
krt td| ddddiid|d	iS )Nr   r   zInvalid familyrx   r   rD   nfprotoz==)r   r   r   )r   r   )r	   r   )r6   Zrich_familyr8   r8   r9   _rich_rule_family_fragment  s    
z#nftables._rich_rule_family_fragmentc             C   s8   |si S |j r|j }n|jr&d|j }| jd||jdS )Nzipset:r   )r   )r   ipsetr   r   )r6   Z	rich_destr@   r8   r8   r9   _rich_rule_destination_fragment  s    
z(nftables._rich_rule_destination_fragmentc             C   sZ   |si S |j r|j }n2t|dr.|jr.|j}nt|drH|jrHd|j }| jd||jdS )Nmacr  zipset:r   )r   )r   hasattrr  r  r   r   )r6   Zrich_sourcer@   r8   r8   r9   _rich_rule_source_fragment  s    
z#nftables._rich_rule_source_fragmentc             C   sP   t |}t|tr$|dk r$ttn(t|dkr8|d S d|d |d giS d S )Nr   rE   range)r   
isinstancerU   r	   r   rK   )r6   portr  r8   r8   r9   _port_fragment  s    
znftables._port_fragmentc          	   C   sb  ddd| }d}| j jj||t}	g }
|r>|
j| j|j |rT|
j| jd| |r||
j| j|j	 |
j| j
|j |
jdd|dd	id
| j|di | st|jtkr|
jddddiiddddgidi g }|r0|j| j|||||
 |j| j|||||
 |j| j|||||
 n.|j|ddtd||	f |
dd ig dii |S )Nr;   r=   )TFr*   r   rx   r   dport)r   r   z==)r   r   r   ry   rD   rz   r{   r|   new	untrackedr>   r,   z%s_%s_allowr   )rA   re   rS   rd   )r/   r   r   r   rH   r  rA   r   r  destinationr  sourcer  rT   r   r   r   r   r   ru   )r6   r   r   protor
  r  r   r   re   r   r   rj   r8   r8   r9   build_policy_ports_rules  s:    


z!nftables.build_policy_ports_rulesc          	   C   sZ  ddd| }d}| j jj||t}g }	|r>|	j| j|j |rT|	j| jd| |r||	j| j|j	 |	j| j
|j |	jdddd	iid
|di | st|jtkr|	jddddiiddddgidi g }
|r(|
j| j|||||	 |
j| j|||||	 |
j| j|||||	 n.|
j|ddtd||f |	dd ig dii |
S )Nr;   r=   )TFr*   r   rx   r   rD   r   z==)r   r   r   ry   rz   r{   r|   r  r  r>   r,   z%s_%s_allowr   )rA   re   rS   rd   )r/   r   r   r   rH   r  rA   r   r  r  r  r  rT   r   r   r   r   r   ru   )r6   r   r   r   r  r   r   re   r   r   rj   r8   r8   r9   build_policy_protocol_rules  s8    

z$nftables.build_policy_protocol_rulesc          	   C   sb  ddd| }d}| j jj||t}	g }
|r>|
j| j|j |rT|
j| jd| |r||
j| j|j	 |
j| j
|j |
jdd|dd	id
| j|di | st|jtkr|
jddddiiddddgidi g }|r0|j| j|||||
 |j| j|||||
 |j| j|||||
 n.|j|ddtd||	f |
dd ig dii |S )Nr;   r=   )TFr*   r   rx   r   sport)r   r   z==)r   r   r   ry   rD   rz   r{   r|   r  r  r>   r,   z%s_%s_allowr   )rA   re   rS   rd   )r/   r   r   r   rH   r  rA   r   r  r  r  r  r  rT   r   r   r   r   r   ru   )r6   r   r   r  r
  r  r   r   re   r   r   rj   r8   r8   r9   build_policy_source_ports_rules  s:    


z(nftables.build_policy_source_ports_rulesc          	   C   s   d}| j jj||t}	ddd| }
g }|rR|jdddtd||f ||dii g }|rl|j| jd	| |jd
d|ddid| j|di |jdd||f i |j|
ddtd|	 |dii |S )Nr*   r;   r=   )TFz	ct helperr,   zhelper-%s-%s)rA   re   rr   rT   r   r   rx   r   r  )r   r   z==)r   r   r   r>   zfilter_%s_allow)rA   re   rS   rd   )r/   r   r   r   rH   ru   r   r  )r6   r   r   r  r
  r  Zhelper_nameZmodule_short_namere   r   r   rj   r   r8   r8   r9   build_policy_helper_ports_rules)  s.    



z(nftables.build_policy_helper_ports_rulesc             C   s   ddd| }| j jj||t}g }	|rv|t|d  dkrT|d t|d  d }ddd	d
iid|didd ig}
n| jd|dd ig}
dtd| |
d}|	j|d|ii |	S )Nr;   r=   )TFrE   r   r   rx   r   rD   r   z==)r   r   r   r   r   r,   zfilter_%s_allow)rA   re   rS   rd   r>   )r/   r   r   r   rK   r   ru   rH   )r6   r   r?   r   re   r   r  r   r   rj   rd   r>   r8   r8   r9   build_zone_forward_rulesF  s"    z!nftables.build_zone_forward_rulesc          	   C   s   d}| j jj||tdd}ddd| }g }|r`|j| j|j |j| j|j | j	|}	nd}	|t
d||	f |d	d
ddiidddidd ig d}
|
j| j| |d|
iigS )Nr)   T)r   r;   r=   )TFr   z	nat_%s_%srx   r   rD   r   z!=r   )r   r   r   Z
masquerade)rA   re   rS   rd   r>   )r/   r   r   r   rH   r  r  r  r  r   ru   r   r   )r6   r   r   rA   r   re   r   r   r   r   r>   r8   r8   r9   "_build_policy_masquerade_nat_rules_  s&    
z+nftables._build_policy_masquerade_nat_rulesc          
   C   s^  g }|rD|j r|j dks,|jrDtd|jjrD|j| j||d| nV|r|j rX|j dksl|jrtd|jjr|j| j||d| n|j| j||d| d}| jjj||t	}ddd| }g }|r|j
| j|j |j
| j|j | j|}	nd	}	d
td||	f |ddddiiddddgididd ig d}
|
j| j| |j
|d|
ii |S )Nr   r.   r   r-   r*   r;   r=   )TFr   r,   zfilter_%s_%srx   ry   rD   rz   r{   r|   r  r  )r   r   r   r   )rA   re   rS   rd   r>   )rA   r  r   r   r   r  r/   r   r   r   rH   r  r  r  r   ru   r   r   )r6   r   r   r   rj   re   r   r   r   r   r>   r8   r8   r9   build_policy_masquerade_rulesx  s8    
z&nftables.build_policy_masquerade_rulesc	             C   s$  d}	| j jj||	t}
ddd| }g }|r\|j| j|j |j| j|j | j	|}nd}|jdd|dd	id
| j
|di |rtd|rt|}|r|dkr|jd|| j
|di q|jdd|ii n|jdd| j
|ii |td|
|f |d}|j| j| |d|iigS )Nr)   r;   r=   )TFr   rx   r   r  )r   r   z==)r   r   r   r   rn   r   )r   r
  r   Zredirectr
  z	nat_%s_%s)rA   re   rS   rd   r>   )r/   r   r   r   rH   r  r  r  r  r   r  r   r   ru   r   r   )r6   r   r   r
  r   toaddrtoportrA   r   re   r   r   r   r   r>   r8   r8   r9   $_build_policy_forward_port_nat_rules  s4    


z-nftables._build_policy_forward_port_nat_rulesc       	   
   C   s   g }|rF|j r|j dks&|rFtd|rF|j| j||||||d| n|r|j rZ|j dksh|rtd|r|j| j||||||d| nL|rtd|r|j| j||||||d| n|j| j||||||d| |S )Nr   r.   r   r-   )rA   r   r   r  )	r6   r   r   r
  r   r  r  r   rj   r8   r8   r9   build_policy_forward_port_rules  s    z(nftables.build_policy_forward_port_rulesc             C   sH   dd|ddid|dig}|d k	rD|j dd|ddid|di |S )Nrx   r   rT   )r   r   z==)r   r   r   code)rH   )r6   r   rT   r  	fragmentsr8   r8   r9   _icmp_types_fragments  s    znftables._icmp_types_fragmentsc             C   s   |dkr4|t kr4t | \}}}| jd||r.d n|S |dkrh|tkrht| \}}}| jd||rbd n|S ttd|| j|f d S )Nr   r   r   r   z)ICMP type '%s' not supported by %s for %s)r   r   r   r	   r   rr   )r6   r   Z	icmp_typeZ_type_codeZ
_omit_coder8   r8   r9   _icmp_types_to_nft_fragments  s    z%nftables._icmp_types_to_nft_fragmentsc             C   sB  d}| j jj||t}ddd| }|r6|jr6|j}n<|jrjg }d|jkrT|jd d|jkrr|jd nddg}g }	x|D ]}
| j jj|rd||f }dd i}nd	||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
td|||f || j g d}|j| j| |	j|d|ii q~| j j dkr| j jj| r|	j|dd
t||| j| j j ddd||f iig dii |	j|dd
t|||g dii q~W |	S )Nr*   r;   r=   )TFr   r   z%s_%s_allowr   z
%s_%s_denyr,   z%s_%s_%s)rA   re   rS   rd   r>   r   r   r   z"%s_%s_ICMP_BLOCK: ")r/   r   r   r   ipvsr  rH   query_icmp_block_inversionr   r  rA   r  r  r  r   r"  rr   r   r   r   r   r   ru   r   r   r   r   )r6   r   r   Zictr   re   r   r   r#  rj   r   Zfinal_chainr   r   r   r>   r8   r8   r9   build_policy_icmp_block_rules  sb    





"
"
z&nftables.build_policy_icmp_block_rulesc             C   s   d}| j jj||t}g }ddd| }| j jj|r@| j }ndd i}|j|ddtd||f d	| j |gd
ii | j j	 dkr| j jj|r|j|ddtd||f d	| j | j
| j j	 ddd||f iigd
ii |S )Nr*   r;   r=   )TFr   r>   r,   z%s_%s   )rA   re   rS   rF   rd   r   r   r   z%s_%s_ICMP_BLOCK: )r/   r   r   r   r$  r   rH   ru   r   r   r   )r6   r   r   re   r   rj   r   r   r8   r8   r9   'build_policy_icmp_block_inversion_rules(  s,    




 z0nftables.build_policy_icmp_block_inversion_rulesc             C   s   g }ddddiidddiddd	d
dgddidddig}|dkrV|j dddii |j dd i |j dddtd|dii |j dddtddddddiddddgidid d igdii |S )!Nrx   r   rD   r  z==r   )r   r   r   Zfibr   Ziifr   Zoif)flagsresultFr   r   r   zrpfilter_DROP: r   r<   r>   r,   Zfilter_PREROUTING)rA   re   rS   rd   r   r   rT   )r   r   r|   znd-router-advertznd-neighbor-solicitr   )rH   ru   )r6   rk   rj   r   r8   r8   r9   build_rpfilter_rulesG  s0    

znftables.build_rpfilter_rulesc          	   C   s   ddddddddd	g	}d
d |D }dddddidd|idig}| j jd"krb|jdddii |j| jd g }|jdddtdd|dii |jdddtd d!|dii |S )#Nz::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19c             S   s2   g | ]*}d |j dd t|j dd diqS )r   r   r   rE   )r   rK   )r   rU   ).0rB   r8   r8   r9   
<listcomp>n  s    z5nftables.build_rfc3964_ipv4_rules.<locals>.<listcomp>rx   r   r.   r   )r   r   z==r|   )r   r   r   r   r   r   r   zRFC3964_IPv4_REJECT: zaddr-unreachr;   r>   r,   r   rE   )rA   re   rS   rF   rd   Zfilter_FORWARD   )r   r   )r/   Z_log_deniedrH   r   ru   )r6   Z	daddr_setr   rj   r8   r8   r9   build_rfc3964_ipv4_rulesc  s:    

z!nftables.build_rfc3964_ipv4_rulesc             C   s   d}g }|j | j|j |j | j|j |j | j|j g }|j | j||||| |j | j||||| |j | j	||||| |S )Nr*   )
rH   r  rA   r  r  r  r  r   r   r   )r6   r   r   r   re   r   rj   r8   r8   r9   *build_policy_rich_source_destination_rules  s    z3nftables.build_policy_rich_source_destination_rulesc             C   s   |dkrdS dS )Nr   r   ebTF)r   r   r0  r8   )r6   r   r8   r8   r9   is_ipv_supported  s    znftables.is_ipv_supportedc             C   s   ddd}|| || ddg|| dd|| g|| dd|| g|| dg|| || || g|| ddg|| dd|| g|| dgdd	}||kr|| S t td
| d S )NZ	ipv4_addrZ	ipv6_addr)r   r   Z
inet_protoZinet_servicer   ZifnameZ
ether_addr)zhash:ipzhash:ip,portzhash:ip,port,ipzhash:ip,port,netzhash:ip,markzhash:netzhash:net,netzhash:net,portzhash:net,port,netzhash:net,ifacezhash:macz!ipset type name '%s' is not valid)r	   r   )r6   r   rT   Zipv_addrtypesr8   r8   r9   _set_type_list  s"    

znftables._set_type_listc       
      C   s   |rd|kr|d dkrd}nd}t || j||d}x0|jdd jdD ]}|dkrLdg|d< P qLW |rd|kr|d |d< d|kr|d |d< g }x0dD ](}d|i}	|	j| |jdd|	ii qW |S )NrA   inet6r   r   )re   rr   rT   :rE   ,r-   netr
  Zintervalr(  ZtimeoutZmaxelemsizer,   r.   r;   r|   )r-   r7  r
  )r,   r-   r.   )ru   r3  r   r   rH   )
r6   rr   rT   optionsr   Zset_dicttrj   rA   Z	rule_dictr8   r8   r9   build_set_create_rules  s*    


znftables.build_set_create_rulesc             C   s$   | j |||}| j|| jj  d S )N)r;  rm   r/   r   )r6   rr   rT   r9  rj   r8   r8   r9   
set_create  s    znftables.set_createc             C   s8   x2dD ]*}dd|t |dii}| j|| jj  qW d S )Nr,   r-   r.   r=   r|   )rA   re   rr   )r,   r-   r.   )ru   ro   r/   r   )r6   rr   rA   r>   r8   r8   r9   set_destroy  s
    
znftables.set_destroyc             C   s6  | j jj|jjdd jd}g }xtt|D ]}|| dkrr|jdddii |jdd	|rdd
nddi q2|| dkr|jd| j||rdnddi q2|| dkr|jdd|rdndii q2|| dkr|jdddii q2t	d||  q2W dt|dkrd|in|d |r&dndd| diS )Nr5  rE   r6  r
  r   rD   r   r   Zthr  r  )r   r   r-   r7  r  r   r   Zifacer   r   r   z-Unsupported ipset type for match fragment: %srx   concatr   z!=z==@)r   r   r   )r-   r7  r  )
r/   r  	get_ipsetrT   r   r  rK   rH   r   r	   )r6   rr   Z
match_destr   type_formatr  ir8   r8   r9   r     s$     znftables._set_match_fragmentc             C   sN  | j jj|}|jjdd jd}|jd}t|t|krHttdg }xtt|D ]}|| dkr,y|| j	d}W n& t
k
r   |jd || }	Y n,X |j|| d |  || |d d  }	y|	j	d}W n  t
k
r   |j|	 Y n(X |jd|	d | |	|d d  gi q\|| dkr d|| krb|jd|| jdi ny|| j	d}W nL t
k
r   || }
d|jkr|jd dkrt|
}
|j|
 Y n^X || d | }
d|jkr|jd dkrt|
}
|jd|
t|| |d d  di q\|j||  q\W t|dkrJd|igS |S )Nr5  rE   r6  z+Number of values does not match ipset type.r
  Ztcp-r  r-   r7  r   rA   r4  r   )r   rK   r>  )r-   r7  )r/   r  r@  rT   r   rK   r	   r   r  rF   ri   rH   r9  r   rU   )r6   rr   entryobjrA  Zentry_tokensZfragmentrB  rF   Zport_strr   r8   r8   r9   _set_entry_fragment  sL    

("znftables._set_entry_fragmentc          	   C   sj   g }g }t |ttfs|g}x|D ]}|j| j|| q"W x(dD ] }|jdd|t||dii qBW |S )Nr,   r-   r.   r;   r   )rA   re   rr   elem)r,   r-   r.   )r	  rh   tupler   rF  rH   ru   )r6   rr   entriesrj   elementsr   rA   r8   r8   r9   build_set_add_rules(  s    


znftables.build_set_add_rulesc             C   s"   | j ||}| j|| jj  d S )N)rK  rm   r/   r   )r6   rr   rD  rj   r8   r8   r9   set_add7  s    znftables.set_addc             C   sF   | j ||}x4dD ],}dd|t||dii}| j|| jj  qW d S )Nr,   r-   r.   r=   r   )rA   re   rr   rG  )r,   r-   r.   )rF  ru   ro   r/   r   )r6   rr   rD  r   rA   r>   r8   r8   r9   
set_delete;  s    
znftables.set_deletec             C   s4   g }x*dD ]"}dd|t |dii}|j| q
W |S )Nr,   r-   r.   rb   r|   )rA   re   rr   )r,   r-   r.   )ru   rH   )r6   rr   rj   rA   r>   r8   r8   r9   build_set_flush_rulesD  s    
znftables.build_set_flush_rulesc             C   s    | j |}| j|| jj  d S )N)rN  rm   r/   r   )r6   rr   rj   r8   r8   r9   	set_flushM  s    
znftables.set_flushc             C   sJ   | j jj|}|jdkrd}n(|jrBd|jkrB|jd dkrBd}nd}|S )Nzhash:macr   rA   r4  r.   r-   )r/   r  r@  rT   r9  )r6   rr   r  rA   r8   r8   r9   r   Q  s    
znftables._set_get_familyc             C   s   g }|j | j||| |j | j| xbtdt|dD ]<}|j | j||||d   | j|| jj  |j	  q:W | j|| jj  d S )Nr   i  )
r   r;  rN  r  rK   rK  rm   r/   r   clear)r6   Zset_nameZ	type_namerI  Zcreate_optionsZentry_optionsrj   rB  r8   r8   r9   set_restore^  s    znftables.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__rr   Zpolicies_supportedr:   rN   rR   r[   ra   rm   ro   rq   rs   rw   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r%  r'  r*  r.  r/  r1  r3  r;  r<  r=  r   rF  rK  rL  rM  rN  rO  r   rQ  r8   r8   r8   r9   r+   T   s   /.`
4


 R
i 
;
-
9
 +

	
$
$
$


'
$



<
#


4		r+   iji))Z
__future__r   rO   r^   r   Zfirewall.core.loggerr   Zfirewall.functionsr   r   r   r   r   Zfirewall.errorsr	   r
   r   r   r   r   r   Zfirewall.core.richr   r   r   r   r   r   r   Zfirewall.core.icmpr   r   Znftables.nftablesr   ru   r   r   r   rp   objectr+   r8   r8   r8   r9   <module>   s,   $$



