<!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j%                 @   s<  d dl Zd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dl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$Z$d	Z%d
ddgddgddd
ddgdddgd
ddgdZ&dddZ'dddZ(dd Z)dd Z*dd Z+G dd de,Z-G dd de-Z.dS )    N)runProg)log)tempFilereadfile	splitArgs	check_macportStrcheck_single_addresscheck_addressnormalizeIP6)config)FirewallErrorINVALID_PASSTHROUGHINVALID_RULEUNKNOWN_ERRORINVALID_ADDRINVALID_ICMPTYPE)Rich_AcceptRich_Reject	Rich_Drop	Rich_MarkRich_MasqueradeRich_ForwardPortRich_IcmpBlock)
ICMP_TYPESICMPV6_TYPES INPUTOUTPUTFORWARD
PREROUTINGPOSTROUTING)securityrawmanglenatfilterzicmp-host-prohibitedzicmp6-adm-prohibited)ipv4ipv6icmpz	ipv6-icmpc             C   s   ddddddd}| dd }x~|D ]v}y|j |}W n tk
rL   w$Y nX |d
kryt||d	   W n tk
r~   Y nX |j|d	  || ||< q$W |S )z Inverse valid rule z-Dz--deletez-Xz--delete-chain)z-Az--appendz-Iz--insertz-Nz--new-chainN-I--insert   )r*   r+   )index	Exceptionintpop)argsreplace_argsret_argsargidx r6   /usr/lib/python3.6/ipXtables.pycommon_reverse_rule;   s(    
r8   c             C   s   ddddddd}| dd }x|D ]x}y|j |}W n tk
rL   w$Y nX |dkryt||d	   W n tk
r~   Y nX |j|d	  || ||< |S W ttd
dS )z Reverse valid passthough rule z-Dz--deletez-Xz--delete-chain)z-Az--appendz-Iz--insertz-Nz--new-chainN-I--insertr,   zno '-A', '-I' or '-N' arg)r9   r:   )r-   
ValueErrorr/   r0   r   r   )r1   r2   r3   xr5   r6   r6   r7   common_reverse_passthrough`   s,    
r=   c             C   s   t | } t ddddddddd	d
ddddddddddg}t| |@ dkrbttdt| |@ d  t ddddddg}t| |@ dkrttddS )zZ Check if passthough rule is valid (only add, insert and new chain
    rules are allowed) z-Cz--checkz-Dz--deletez-Rz	--replacez-Lz--listz-Sz--list-rulesz-Fz--flushz-Zz--zeroz-Xz--delete-chainz-Pz--policyz-Ez--rename-chainr   zarg '%s' is not allowedz-Az--appendz-Iz--insertz-Nz--new-chainzno '-A', '-I' or '-N' argN)setlenr   r   list)r1   Znot_allowedZneededr6   r6   r7   common_check_passthrough   s*    

rA   c               @   s  e Zd 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dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zdjd"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zdkd,d-Zd.d/ Zdld1d2Zd3d4 Zd5d6 Zdmd8d9Zdnd:d;Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dodRdSZ,dpdTdUZ-dqdVdWZ.dXdY Z/drdZd[Z0dsd\d]Z1dtd^d_Z2d`da Z3dudbdcZ4ddde Z5dfdg Z6dhdi Z7d!S )v	ip4tablesr'   Tc             C   sd   || _ tj| j | _tjd| j  | _| j | _| j | _	| j
  g | _i | _i | _g | _i | _d S )Nz
%s-restore)_fwr   ZCOMMANDSipv_command_restore_command_detect_wait_optionwait_option_detect_restore_wait_optionrestore_wait_optionfill_existsavailable_tablesrich_rule_priority_countspolicy_priority_countszone_source_index_cache
our_chains)selffwr6   r6   r7   __init__   s    

zip4tables.__init__c             C   s$   t jj| j| _t jj| j| _d S )N)ospathexistsrE   Zcommand_existsrF   Zrestore_command_exists)rQ   r6   r6   r7   rK      s    zip4tables.fill_existsc             C   s   | j r(| j |kr(| j gdd |D  }ndd |D }tjd| j| jdj| t| j|\}}|dkrtd| jdj||f |S )Nc             S   s   g | ]}d | qS )z%sr6   ).0itemr6   r6   r7   
<listcomp>   s    z#ip4tables.__run.<locals>.<listcomp>c             S   s   g | ]}d | qS )z%sr6   )rW   rX   r6   r6   r7   rY      s    z	%s: %s %s r   z'%s %s' failed: %s)rH   r   debug2	__class__rE   joinr   r;   )rQ   r1   Z_argsstatusretr6   r6   r7   Z__run   s    zip4tables.__runc             C   s<   y|j |}W n tk
r"   dS X ||||d < dS d S )NF   T)r-   r;   )rQ   rulepatternZreplacementir6   r6   r7   _rule_replace   s    zip4tables._rule_replacec             C   s   |t ko|t | kS )N)BUILT_IN_CHAINS)rQ   rD   tablechainr6   r6   r7   is_chain_builtin   s    zip4tables.is_chain_builtinc             C   s2   d|g}|r|j d n
|j d |j | |gS )Nz-tz-Nz-X)append)rQ   addrf   rg   ra   r6   r6   r7   build_chain_rules   s    

zip4tables.build_chain_rulesc             C   s8   d|g}|r |d|t |g7 }n|d|g7 }||7 }|S )Nz-tz-Iz-D)str)rQ   rj   rf   rg   r-   r1   ra   r6   r6   r7   
build_rule   s    zip4tables.build_rulec             C   s   t |S )N)r8   )rQ   r1   r6   r6   r7   reverse_rule   s    zip4tables.reverse_rulec             C   s   t | d S )N)rA   )rQ   r1   r6   r6   r7   check_passthrough   s    zip4tables.check_passthroughc             C   s   t |S )N)r=   )rQ   r1   r6   r6   r7   reverse_passthrough   s    zip4tables.reverse_passthroughc             C   s   d}y|j d}W n tk
r&   Y nX t||d krD||d  }d }xLd
D ]D}y|j |}W n tk
rt   Y qNX t||d krN||d  }qNW ||fS )Nr&   z-tr`   -A--append-I--insert-N--new-chain)rq   rr   rs   rt   ru   rv   )r-   r;   r?   )rQ   r1   rf   rc   rg   optr6   r6   r7   passthrough_parse_table_chain   s$     z'ip4tables.passthrough_parse_table_chainc             C   s4  yH|j d}|j| |j|}d|d kr:||d f}n||d f}W nF tk
r   y|j d}|j| d }W n tk
r   d S X Y nX d}|d dkrd}|r| r||kr|j| nn|r0| r||kr|j| |jdd d |j |}n| jjrd}nt|}d|d< |j	dd|d   d S )Nz%%ZONE_SOURCE%%z-m         z%%ZONE_INTERFACE%%Tr   -D--deleteFc             S   s   | d S )Nr   r6   )r<   r6   r6   r7   <lambda>(  s    z4ip4tables._run_replace_zone_source.<locals>.<lambda>)keyz-Ir,   z%dr`   )r|   r}   )
r-   r0   r;   removeri   sortrC   _allow_zone_driftingr?   insert)rQ   ra   rO   rc   zoneZzone_sourcerule_addr-   r6   r6   r7   _run_replace_zone_source  s>    







z"ip4tables._run_replace_zone_sourcec             C   s  y|j |}W n tk
r$   Y nX d}d}d}|j| |j|}t|tkr\ttdd}	xLdD ]D}
y|j |
}W n tk
r   Y qfX t||d krf||d  }	qfW xhdD ]`}
y|j |
}W n tk
r   Y qX t||d k r||d  }|
dkrd}|
dkrd}qW |	|f}|sp||ksP||| ksP|| | dkrZttd|| |  d8  < n||kri ||< ||| krd|| |< d}xHt	|| j
 D ]4}||kr|rP ||| | 7 }||krP qW || |  d7  < d
||< |j|d d|  dS )a  
        Change something like
          -t filter -I public_IN %%RICH_RULE_PRIORITY%% 123
        or
          -t filter -A public_IN %%RICH_RULE_PRIORITY%% 321
        into
          -t filter -I public_IN 4
        or
          -t filter -I public_IN
        TFr`   z%priority must be followed by a numberr&   -t--table-A--append-I--insert-D--deleter   z*nonexistent or underflow of priority countr,   z%dN)r   r   )r   r   r   r   r   r   )r   r   )r   r   )r-   r;   r0   typer/   r   r   r?   r   sortedkeysr   )rQ   ra   Zpriority_countstokenrc   r   r   Zinsert_add_indexpriorityrf   rw   jrg   r-   pr6   r6   r7   _set_rule_replace_priority4  sj    



 




z$ip4tables._set_rule_replace_priorityc             C   sP  t  }i }tj| j}tj| j}tj| j}x|D ]}|d d  }	| j|	dddt| j g | j|	dt	| j g y|	j
d}
W n tk
r   Y n8X |dkrq6|d$krd
dd|g|	|
|
d < n
|	j|
 | j|	|d | j|	|d | j|	| d}xZd%D ]R}y|	j
|}
W n tk
r,   Y n(X t|	|
d kr|	j|
 |	j|
}qW xhtt|	D ]X}
xPtjD ]F}||	|
 krt|	|
 jdo|	|
 jd rtd|	|
  |	|
< qtW qhW |j|g j|	 q6W xR|D ]J}|| }|jd|  x"|D ]}	|jdj|	d  q W |jd qW |j  tj|j}tjd| j| j d|j|j!f  g }| j"rz|j| j" |jd t#| j ||jd\}}tj$ dkr
t%|j}|d k	r
d}
xH|D ]@}tj&d|
|f ddd  |jdstj&d!dd" |
d7 }
qW tj'|j |dkr:td#| j dj||f || _|| _|| _d S )&Nz
%%REJECT%%REJECTz--reject-withz%%ICMP%%z%%LOGTYPE%%offunicast	broadcast	multicastz-mpkttypez
--pkt-typer`   z%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%r&   -t--table"z"%s"z*%s
rZ   
zCOMMIT
z	%s: %s %sz%s: %dz-n)stdinr,   z%8d: %sr   )nofmtnlr   )r   z'%s %s' failed: %s)r   r   r   )r   r   )(r   copydeepcopyrM   rN   rO   rd   DEFAULT_REJECT_TYPErD   ICMPr-   r;   r0   r   r   r?   rangestringZ
whitespace
startswithendswith
setdefaultri   writer]   closerT   statnamer   r[   r\   rF   st_sizerJ   r   ZgetDebugLogLevelr   Zdebug3unlink)rQ   rules
log_denied	temp_fileZtable_rulesrM   rN   rO   Z_rulera   rc   rf   rw   cr   r1   r^   r_   linesliner6   r6   r7   	set_rules  s    









zip4tables.set_rulesc             C   s   | j |dddt| j g | j |dt| j g y|jd}W n tk
rR   Y n:X |dkr`dS |dkrddd|g|||d < n
|j| tj| j	}tj| j
}tj| j}| j||d | j||d | j|| | j|}|| _	|| _
|| _|S )Nz
%%REJECT%%r   z--reject-withz%%ICMP%%z%%LOGTYPE%%r   r   r   r   r   z-mr   z
--pkt-typer`   z%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%)r   r   r   )rd   r   rD   r   r-   r;   r0   r   r   rM   rN   rO   r   r   _ip4tables__run)rQ   ra   r   rc   rM   rN   rO   outputr6   r6   r7   set_rule  s.    

zip4tables.set_ruleNc             C   s   g }|r|gnt j }xx|D ]p}|| jkr6|j| qy,| jd|ddg | jj| |j| W q tk
r   tjd| j|f  Y qX qW |S )Nz-tz-Lz-nzA%s table '%s' does not exist (or not enough permission to check).)	re   r   rL   ri   r   r;   r   Zdebug1rD   )rQ   rf   r_   Ztablesr6   r6   r7   get_available_tables  s    

zip4tables.get_available_tablesc             C   s`   d}t | jdddg}|d dkr\d}t | jdddg}|d dkrHd}tjd| j| j| |S )Nr   z-wz-Lz-nr   z-w10z%s: %s will be using %s option.)r   rE   r   r[   r\   )rQ   rH   r_   r6   r6   r7   rG     s    zip4tables._detect_wait_optionc             C   s   t  }|jd |j  d}xJdD ]B}t| j|g|jd}|d dkr"d|d kr"d	|d kr"|}P q"W tjd
| j| j| t	j
|j |S )Nz#foor   -w--wait=2)r   r   zinvalid optionr`   zunrecognized optionz%s: %s will be using %s option.)r   r   )r   r   r   r   rF   r   r   r[   r\   rT   r   )rQ   r   rH   Ztest_optionr_   r6   r6   r7   rI   $  s    

z%ip4tables._detect_restore_wait_optionc             C   sV   i | _ i | _g | _g }x:tj D ].}| j|s0q xdD ]}|jd||g q6W q W |S )N-F-X-Zz-t)r   r   r   )rM   rN   rO   re   r   r   ri   )rQ   r   rf   flagr6   r6   r7   build_flush_rules7  s    

zip4tables.build_flush_rulesc             C   sf   g }|dkrdn|}xLt j D ]@}| j|s.q|dkr8qx$t | D ]}|jd|d||g qBW qW |S )NZPANICDROPr%   z-tz-P)re   r   r   ri   )rQ   policyr   _policyrf   rg   r6   r6   r7   build_set_policy_rulesF  s    
z ip4tables.build_set_policy_rulesc             C   sN   t  }|d ks| jdkr&|jtj  |d ks8| jdkrF|jtj  t|S )Nr'   r(   )r>   rD   updater   r   r   r@   )rQ   rD   Z	supportedr6   r6   r7   supported_icmp_typesR  s    zip4tables.supported_icmp_typesc             C   s   g S )Nr6   )rQ   r6   r6   r7   build_default_tables\  s    zip4tables.build_default_tablesr   c       	      C   s  i }| j drpg |d< t | jd< xLtd D ]@}|d jd|  |d jd||f  | jd jd|  q,W | j dr\g |d< t | jd< xtd D ]}|d jd|  |d jd||f  | jd jd|  |dkrxt| jjrddd	d
gndd	d
gD ]R}|d jd||f  |d jd|||f  | jd jtd||f g qW qW | j drNg |d< t | jd< xtd D ]}|d jd|  |d jd||f  | jd jd|  |dkrxv| jjrddd	d
gndd	d
gD ]R}|d jd||f  |d jd|||f  | jd jtd||f g qW qW | j dr@g |d< t | jd< xtd D ]}|d jd|  |d jd||f  | jd jd|  |d9krxxv| jjrddd	d
gndd	d
gD ]R}|d jd||f  |d jd|||f  | jd jtd||f g qW qxW g |d< t | jd< |d jd |d jd |d jd |d jd | jd jtd xf| jjrddd	d
gndd	d
gD ]B}|d jd|  |d jd|  | jd jtd|  qW |dkr |d jd |d jd |dkrF|d jd |d jd |d jd |d jd  |d jd! |d jd" | jd jtd# xJd:D ]B}|d jd$|  |d jd%|  | jd jtd&|  qW xzd;D ]r}xj| jjr
dd	gnd	gD ]N}|d jd)||f  |d jd*||f  | jd jtd+||f  qW qW xJd<D ]B}|d jd$|  |d jd%|  | jd jtd&|  qnW |dkr|d jd, |d jd- |dkr|d jd. |d jd/ |d  d0d1d2d3g7  < | jd jtd4 xJd=D ]B}|d jd5|  |d jd6|  | jd jtd7|  q2W xJd>D ]B}|d jd5|  |d jd6|  | jd jtd7|  q~W g }xJ|D ]B}|| j  krqx(|| D ]}|jd8|gt	|  qW qW |S )?Nr"   z-N %s_directz-A %s -j %s_directz	%s_directr#   r    POLICIES_preZZONES_SOURCEZZONESPOLICIES_postz-N %s_%sz-A %s -j %s_%sz%s_%sr$   r%   r!   r&   zB-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPTz-A INPUT -i lo -j ACCEPTz-N INPUT_directz-A INPUT -j INPUT_directZINPUT_directz-N INPUT_%sz-A INPUT -j INPUT_%szINPUT_%sr   z^-A INPUT -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: 'z/-A INPUT -m conntrack --ctstate INVALID -j DROPz9-A INPUT %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: 'z-A INPUT -j %%REJECT%%zD-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPTz-A FORWARD -i lo -j ACCEPTz-N FORWARD_directz-A FORWARD -j FORWARD_directZFORWARD_directz-N FORWARD_%sz-A FORWARD -j FORWARD_%sz
FORWARD_%sINOUTz-N FORWARD_%s_%sz-A FORWARD -j FORWARD_%s_%szFORWARD_%s_%sz`-A FORWARD -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: 'z1-A FORWARD -m conntrack --ctstate INVALID -j DROPz;-A FORWARD %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: 'z-A FORWARD -j %%REJECT%%z-N OUTPUT_directz>-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTz-A OUTPUT -o lo -j ACCEPTz-A OUTPUT -j OUTPUT_directZOUTPUT_directz-N OUTPUT_%sz-A OUTPUT -j OUTPUT_%sz	OUTPUT_%sz-t)r    r!   )r   )r   r   )r   )r   )r   )
r   r>   rP   re   ri   rj   rC   r   r   r   )	rQ   r   Zdefault_rulesrg   Zdispatch_suffix	directionZfinal_default_rulesrf   ra   r6   r6   r7   build_default_rules`  s    
$(
&*
&*&



(






"zip4tables.build_default_rulesc             C   sf   |dkrdddhS |dkr,d| j  kr,dhS |dkrHd| j  krHddhS |d	krbd	| j  krbdhS i S )
Nr&   r   
FORWARD_INFORWARD_OUTr$   r    r%   r!   r#   )r   )rQ   rf   r6   r6   r7   get_zone_table_chains  s    
zip4tables.get_zone_table_chainsc	                s  | j jj|jdk rdnddkr4dkr4dnd}	| j jj|t|	 g }
g }x|D ]}|
jd|g qZW x|D ]}|jd	|g qvW xB|D ]:}| j jj|}|dkr| j	| rq|
j| j
d| qW x\|D ]T}| j jj|}|dkr| j	| rqt|rdkrq|j| j
d| qW  fdd}g }|
rx|
D ]F}|rx8|D ]}|j||| qdW n|rn|j||d  qTW nH|rn@|rx8|D ]}|j|d | qW n|rn|j|d d  |S )Nr   prepostr%   r!   TFz-iz-or'   r(   z-sr   r   z-dc                sV   ddd }d|df dj g}| r6|j|  |rD|j| |jd g |S )Nz-Az-D)TFz-tz%s_POLICIES_%sz%%POLICY_PRIORITY%%z-j)r   extend)ingress_fragmentegress_fragmentadd_delra   )r   rg   chain_suffixenablep_objrf   r6   r7   _generate_policy_dispatch_rule  s    


zSip4tables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule)r'   r(   )r'   r(   )r!   r   r   )rC   r   Z
get_policyr   policy_base_chain_namePOLICY_CHAIN_PREFIXri   r   Zcheck_sourceis_ipv_supported_rule_addr_fragmentr   )rQ   r   r   rf   rg   Zingress_interfacesZegress_interfacesZingress_sourcesZegress_sourcesisSNATZingress_fragmentsZegress_fragments	interfaceaddrrD   r   r   r   r   r6   )r   rg   r   r   r   rf   r7   !build_policy_ingress_egress_rules  sR    






z+ip4tables.build_policy_ingress_egress_rulesFc             C   s   |dkr|dkrdnd}| j jj||t|d}	ddddddd| }
d	}|rb| rbd
d| dg}n,|rtdd| g}ndd| g}|s|dg7 }|d||
|||	g7 }|gS )Nr%   r!   TF)r   z-iz-o)r    r!   r   r   r   r   z-gz-Iz%s_ZONESz%%ZONE_INTERFACE%%z-Az-Dz-t)rC   r   r   r   )rQ   r   r   r   r   rf   rg   ri   r   r   rw   actionra   r6   r6   r7   !build_zone_source_interface_rules6  s&    

z+ip4tables.build_zone_source_interface_rulesc             C   s   |j drP|dd  }|dkr$d}nd}dj|g| jjj| }ddd	||gS t|rz|dkrjttd
ddd|j gS t	d|rt
|}n,td|r|jd}t
|d d |d  }||gS d S )Nzipset:   z-ddstsrc,z-mr>   z--match-setzCan't match a destination MAC.macz--mac-sourcer(   /r   r`   )r   r]   rC   ipsetZget_dimensionr   r   r   upperr	   r   r
   split)rQ   rw   addressinvertr   flags
addr_splitr6   r6   r7   r   P  s"    





zip4tables._rule_addr_fragmentc             C   s   ddd| }|dkr"|dkr"dnd}| j jj||t|d}	d	d
d	d	d
d
d| }
| j jrdd| }nd| }t|r|dkrg S ||d|d|g}|j| j|
| |jd|	g |gS )Nz-Iz-D)TFr%   r!   TF)r   z-sz-d)r    r!   r   r   r   r   z%s_ZONES_SOURCEz%s_ZONESr   r   z%%ZONE_SOURCE%%z-tz-g)r!   r   r   )rC   r   r   r   r   r   r   r   )rQ   r   r   r   r   rf   rg   r   r   r   rw   Zzone_dispatch_chainra   r6   r6   r7   build_zone_source_address_rulesf  s&    
z)ip4tables.build_zone_source_address_rulesc             C   s>  ddd| }ddd| }|dkr0|dkr0dnd	}| j jj||t|d
}| j| jt|d| d| d| d| d| g g }	|	j||d|g |	j|d| d|g |	j|d| d|g |	j|d| d|g |	j|d| d|g |	j|d| d|g |	j||d|dd| g |	j||d|dd| g |	j||d|dd| g |	j||d|dd| g |	j||d|dd| g | j jj| j	}
| j j
 dkr|dkr|
dkr|	j||d|ddddd| g	 |
dkr|	j||d|ddddd| g	 |dkr,|
dkr,|	j||d|d|
g |s:|	j  |	S )Nz-Nz-X)TFz-Az-Dr%   r!   TF)r   z%s_logz%s_denyz%s_prez%s_postz%s_allowz-tz-jr   r&   r   
%%REJECT%%z%%LOGTYPE%%LOGz--log-prefixz"%s_REJECT: "r   z"%s_DROP: "ACCEPT)r   r   )r   r   r   r   )rC   r   r   r   rP   r   r>   ri   Z	_policiestargetget_log_deniedreverse)rQ   r   r   rf   rg   Zadd_del_chainZadd_del_ruler   r   r   r   r6   r6   r7   build_policy_chain_rules  sN    




z"ip4tables.build_policy_chain_rulesc             C   s2   |sg S ddd|j g}|jd k	r.|d|jg7 }|S )Nz-mlimitz--limitz--limit-burst)valueZburst)rQ   r   sr6   r6   r7   _rule_limit  s    
zip4tables._rule_limitc             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   allowZdenyr   r   )r   elementr   r   r   r   r   r   r   r   r   r   r   )rQ   	rich_ruler6   r6   r7   _rich_rule_chain_suffix  s     


z!ip4tables._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   r   )rQ   r  r6   r6   r7    _rich_rule_chain_suffix_from_log  s    


z*ip4tables._rich_rule_chain_suffix_from_logc             C   s   |j dkrg S d|j gS )Nr   z%%RICH_RULE_PRIORITY%%)r   )rQ   r  r6   r6   r7   _rich_rule_priority_fragment  s    
z&ip4tables._rich_rule_priority_fragmentc       
      C   s   |j s
g S | jjj||t}ddd| }| j|}d||d||f g}	|	| j|7 }	|	|ddg 7 }	|j jr|	dd	|j j g7 }	|j jr|	d
d|j j g7 }	|	| j	|j j
7 }	|	S )Nz-Az-D)TFz-tz%s_%sz-jr   z--log-prefixz'%s'z--log-levelz%s)r   rC   r   r   r   r  r	  prefixlevelr  r   )
rQ   r   r  r   rf   rule_fragmentr   r   r   ra   r6   r6   r7   _rich_rule_log  s    
zip4tables._rich_rule_logc             C   s   |j s
g S ddd| }| jjj||t}| j|}d||d||f g}	|	| j|7 }	|	|7 }	t|jt	krrd}
n,t|jt
krd}
nt|jtkrd}
nd	}
|	d
dd|
g7 }	|	| j|j j7 }	|	S )Nz-Az-D)TFz-tz%s_%sZacceptZrejectZdropunknownz-jZAUDITz--type)r  rC   r   r   r   r  r	  r   r   r   r   r   r  r   )rQ   r   r  r   rf   r  r   r   r   ra   _typer6   r6   r7   _rich_rule_audit  s$    
zip4tables._rich_rule_auditc             C   s2  |j s
g S ddd| }| jjj||t}| j|}d||f }	t|j tkrXddg}
nt|j tkrddg}
|j jr|
d|j jg7 }
nnt|j t	krdd	g}
nVt|j t
krd
}| jjj||t}d||f }	ddd|j jg}
nttdt|j  d|||	g}|| j|7 }|||
 7 }|| j|j j7 }|S )Nz-Az-D)TFz%s_%sz-jr   r   z--reject-withr   r$   MARKz--set-xmarkzUnknown action %sz-t)r   rC   r   r   r   r  r   r   r   r   r   r>   r   r   r	  r  r   )rQ   r   r  r   rf   r  r   r   r   rg   Zrule_actionra   r6   r6   r7   _rich_rule_action  s4    


zip4tables._rich_rule_actionc             C   s   |sg S g }|j r|jr"|jd td|j rB|dt|j g7 }qtd|j r||j jd}|dt|d d |d  g7 }q|d|j g7 }nD|jr|ddg7 }|jr|jd | jj	j
|jd	}|d
|j|g7 }|S )N!r(   z-dr   r   r`   z-mr>   r   z--match-set)r   r   ri   r	   r   r
   r   r   rC   r   _ipset_match_flags)rQ   Z	rich_destr  r   r   r6   r6   r7   _rich_rule_destination_fragment1  s&    
"
z)ip4tables._rich_rule_destination_fragmentc             C   s  |sg S g }|j r|jr"|jd td|j rB|dt|j g7 }nHtd|j r||j jd}|dt|d d |d  g7 }n|d|j g7 }nt|dr|jr|ddg7 }|jr|jd |d	|jg7 }nPt|d
o|j	r|ddg7 }|jr|jd | j
jj|j	d}|d|j	|g7 }|S )Nr  r(   z-sr   r   r`   r   z-mz--mac-sourcer   r>   r   z--match-set)r   r   ri   r	   r   r
   r   hasattrr   r   rC   r   r  )rQ   Zrich_sourcer  r   r   r6   r6   r7   _rich_rule_source_fragmentI  s0    
"

z$ip4tables._rich_rule_source_fragmentc             C   s  ddd| }d}| j jj||t}	d|g}
|rD|
ddt| g7 }
|rT|
d|g7 }
|rx|
| j|j7 }
|
| j|j7 }
| st	|j
tkr|
d	d
ddg7 }
g }|r|j| j|||||
 |j| j|||||
 |j| j|||||
 n"|j|d|	 d|g|
 ddg  |S )Nz-Az-D)TFr&   z-pz--dportz%sz-dz-m	conntrackz	--ctstatezNEW,UNTRACKEDz%s_allowz-tz-jr   )rC   r   r   r   r   r  destinationr  sourcer   r   r   ri   r  r  r  )rQ   r   r   protoportr  r  r   rf   r   r  r   r6   r6   r7   build_policy_ports_rulesf  s*    z"ip4tables.build_policy_ports_rulesc             C   s   ddd| }d}| j jj||t}d|g}	|r<|	d|g7 }	|r`|	| j|j7 }	|	| j|j7 }	| stt|j	t
kr|	ddd	d
g7 }	g }
|r|
j| j|||||	 |
j| j|||||	 |
j| j|||||	 n"|
j|d| d|g|	 ddg  |
S )Nz-Az-D)TFr&   z-pz-dz-mr  z	--ctstatezNEW,UNTRACKEDz%s_allowz-tz-jr   )rC   r   r   r   r  r  r  r  r   r   r   ri   r  r  r  )rQ   r   r   protocolr  r  r   rf   r   r  r   r6   r6   r7   build_policy_protocol_rules  s&    z%ip4tables.build_policy_protocol_rulesc             C   s  ddd| }d}| j jj||t}	d|g}
|rD|
ddt| g7 }
|rT|
d|g7 }
|rx|
| j|j7 }
|
| j|j7 }
| st	|j
tkr|
d	d
ddg7 }
g }|r|j| j|||||
 |j| j|||||
 |j| j|||||
 n"|j|d|	 d|g|
 ddg  |S )Nz-Az-D)TFr&   z-pz--sportz%sz-dz-mr  z	--ctstatezNEW,UNTRACKEDz%s_allowz-tz-jr   )rC   r   r   r   r   r  r  r  r  r   r   r   ri   r  r  r  )rQ   r   r   r  r  r  r  r   rf   r   r  r   r6   r6   r7   build_policy_source_ports_rules  s*    z)ip4tables.build_policy_source_ports_rulesc             C   sv   d}| j jj||t}	ddd| }
|
d|	 ddd|g}|rP|dd	t| g7 }|r`|d
|g7 }|ddd|g7 }|gS )Nr#   z-Az-D)TFz%s_allowz-tz-pz--dportz%sz-dz-jZCTz--helper)rC   r   r   r   r   )rQ   r   r   r  r  r  Zhelper_nameZmodule_short_namerf   r   r   ra   r6   r6   r7   build_policy_helper_ports_rules  s    z)ip4tables.build_policy_helper_ports_rulesc       
   	   C   s   ddd| }| j jj||t}g }	|rH|	jdd|d| d|dd	g n6t|rTg S |	jdd|d| g| jd
| dd	g  |	S )Nz-Az-D)TFz-tr&   z%s_allowz-oz-jr   z-d)rC   r   r   r   ri   r   r   )
rQ   r   r   r   rf   r   r  r   r   r   r6   r6   r7   build_zone_forward_rules  s    z"ip4tables.build_zone_forward_rulesc       
      C   s,  d}| j jj||tdd}ddd| }g }|rj| j|}|| j|7 }|| j|j7 }|| j|j	7 }nd}g }	|	j
dd|d	||f g| d
ddddg  g }|r| j|}|| j|7 }|| j|j7 }|| j|j	7 }nd}d}| j jj||t}|	j
dd|d	||f g| ddddddg  |	S )Nr%   T)r   z-Az-D)TFr  z-tz%s_%sr  z-oloz-jZ
MASQUERADEr&   z-mr  z	--ctstatezNEW,UNTRACKEDr   )rC   r   r   r   r  r	  r  r  r  r  ri   )
rQ   r   r   r  rf   r   r   r  r   r   r6   r6   r7   build_policy_masquerade_rules  s6    

z'ip4tables.build_policy_masquerade_rulesc          
   C   s
  d}| j jj||t}	ddd| }
d}|rPtd|rH|dt| 7 }n||7 }|rn|dkrn|dt|d	 7 }g }|r| j|}| j|}|| j	|j
7 }|| j|j7 }nd
}g }|r|j| j|||d| |jdd|
d|	|f g| d|dt|ddd|g  |S )Nr%   z-Az-D)TFr   r(   z[%s]z:%s-r  z-tz%s_%sz-pz--dportz-jZDNATz--to-destination)rC   r   r   r   r	   r   r   r  r	  r  r  r  r  ri   r  )rQ   r   r   r  r  ZtoportZtoaddrr  rf   r   r   Ztor  r   r   r6   r6   r7   build_policy_forward_port_rules  s2    


z)ip4tables.build_policy_forward_port_rulesc             C   s   | j dkrL|tkrLt| \}}}|r,t|nt|d t| }ddd|gS | j dkr|tkrt| \}}}|rxt|nt|d t| }ddd|gS ttd	| d
| j d S )Nr'   r   z-mr)   z--icmp-typer(   Zicmp6z--icmpv6-typez
ICMP type z not supported by )rD   r   rl   r   r   r   r   )rQ   Z	icmp_typer  _codeZ
_omit_codeZ	_type_strr6   r6   r7   _icmp_types_fragment  s      zip4tables._icmp_types_fragmentc             C   s  d}| j jj||t}ddd| }| jdkrDddg}| j|j}	nddg}| j|j}	g }
| j jj|rxd	| }d
}nd| }d}g }|r|| j|j	7 }|| j
|j7 }|||	 7 }|rL|
j| j||||| |
j| j||||| |jr|
j| j||||| n:| j|}|
jd||d||f g| j| | ddg  n`| j j dkr|d
kr|
j||d|g| ddddd| g  |
j||d|g| d|g  |
S )Nr&   z-Az-D)TFr'   z-pr)   z	ipv6-icmpz%s_allowr   z%s_denyz
%%REJECT%%z-tz%s_%sz-jr   z%%LOGTYPE%%r   z--log-prefixz"%s_ICMP_BLOCK: ")rC   r   r   r   rD   r(  r   query_icmp_block_inversionr  r  r  r  ri   r  r  r   r  r  r	  r   )rQ   r   r   Zictr  rf   r   r   r  matchr   Zfinal_chainZfinal_targetr  r   r6   r6   r7   build_policy_icmp_block_rules,  sJ    

 z'ip4tables.build_policy_icmp_block_rulesc       	      C   s   d}| j jj||t}g }d}| j jj|rd}| j j dkr|rRd|t|g}nd|g}|d|dd	d
dddd| g	 }|j| |d7 }nd}|rd|t|g}nd|g}|d|dd	d|g }|j| |S )Nr&   r   z
%%REJECT%%r   z-Iz-Dz-tz-pz%%ICMP%%z%%LOGTYPE%%z-jr   z--log-prefixz"%s_ICMP_BLOCK: "r`   r   )rC   r   r   r   r)  r   rl   ri   )	rQ   r   r   rf   r   r   Zrule_idxZ
ibi_targetra   r6   r6   r7   'build_policy_icmp_block_inversion_rules]  s.    



z1ip4tables.build_policy_icmp_block_inversion_rulesc             C   sx   d}g }|| j |j7 }|| j|j7 }g }|j| j||||| |j| j||||| |j| j||||| |S )Nr&   )r  r  r  r  ri   r  r  r  )rQ   r   r   r  rf   r  r   r6   r6   r7   *build_policy_rich_source_destination_rules  s    z4ip4tables.build_policy_rich_source_destination_rulesc             C   s
   || j kS )N)rD   )rQ   rD   r6   r6   r7   r     s    zip4tables.is_ipv_supported)N)N)r   )F)F)NN)NN)NN)NN)N)N)N)8__name__
__module____qualname__rD   r   Zpolicies_supportedrS   rK   r   rd   rh   rk   rm   rn   ro   rp   rx   r   r   r   r   r   rG   rI   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   r6   r6   r6   r7   rB      sj   			)Pa#



zN

0"




&
!
1"rB   c               @   s&   e Zd ZdZd ZdddZdd ZdS )		ip6tablesr(   Fc             C   s   g }|j ddddddddd	d
g
 |dkrL|j ddddddddd	dddg |j dddddddd	dg	 |j dddddddd	dg	 |S )Nz-Ir    z-tr$   z-mZrpfilterz--invertz--validmarkz-jr   r   r   z--log-prefixzrpfilter_DROP: z-pz	ipv6-icmpz$--icmpv6-type=neighbour-solicitationr   z"--icmpv6-type=router-advertisement)ri   )rQ   r   r   r6   r6   r7   build_rpfilter_rules  s$    



zip6tables.build_rpfilter_rulesc             C   s   ddddddddd	g	}d
}| j d j| g }|jddd|g xT|D ]L}|jddd|d|ddddg
 | jjdkrF|jddd|d|ddddg
 qFW |jdddddd|g |jdddddd|g |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::/19ZRFC3964_IPv4r&   z-tz-Nz-Iz-dz-jr   z--reject-withzaddr-unreachr   allr   z--log-prefixz"RFC3964_IPv4_REJECT: "r   4r   )r   r3  )rP   rj   ri   rC   Z_log_denied)rQ   Z
daddr_listZ
chain_namer   Zdaddrr6   r6   r7   build_rfc3964_ipv4_rules  s4    



z"ip6tables.build_rfc3964_ipv4_rulesN)F)r.  r/  r0  rD   r   r2  r5  r6   r6   r6   r7   r1    s   
r1  )/Zos.pathrT   r   Zfirewall.core.progr   Zfirewall.core.loggerr   Zfirewall.functionsr   r   r   r   r   r	   r
   r   Zfirewallr   Zfirewall.errorsr   r   r   r   r   r   Zfirewall.core.richr   r   r   r   r   r   r   Zfirewall.core.icmpr   r   r   r   re   r   r   r8   r=   rA   objectrB   r1  r6   r6   r6   r7   <module>   sB   ( $%*          o