33
44from simulator .packet import PacketIP
55from simulator .routes import Router
6+ from simulator .logger import log_info , log_error , log_ok
67
7- from plugins .translate .abstract import NetworkInterface , StaticRoute , StaticRouteRule
88from plugins .system .abstract import FirewallSystem
9+ from plugins .translate .config import DEFAULT_ROUTES
10+ from plugins .translate .abstract import NetworkInterface , StaticRoute , StaticRouteRule
911
1012FLOW_INPUT = 'input'
1113FLOW_OUTPUT = 'output'
@@ -29,37 +31,61 @@ def __init__(self, packet: PacketIP, simulator):
2931 self .local_src , packet .ni_in = self ._is_ip_local (packet .src )
3032 self .local_dst , packet .ni_out = self ._is_ip_local (packet .dst )
3133 self .flow_type = self ._get_flow_type ()
34+ # log_info('Firewall', f'Flow-type: {self.flow_type}')
3235
3336 self .route_src = self ._s .router .get_src_route (self .packet )
3437 self ._update_packet_ni_in ()
38+ if packet .ni_in is not None :
39+ log_info ('Firewall' , f'Packet inbound-interface: { packet .ni_in } ' )
3540
3641 if self .route_src is None :
37- raise ConnectionError ('No Source-Route found' )
42+ log_error ('Router' , 'No Source-Route found' )
43+ return
3844
45+ # todo: prerouting firewall-filters
3946 # todo: DNAT
4047 self ._dnat_done = True
4148 self .dnat = None
49+ if self .dnat is not None :
50+ log_info ('Firewall' , f'Performed DNAT: { self .dnat } ' )
4251
4352 self .local_dst , packet .ni_out = self ._is_ip_local (packet .dst )
4453 self .flow_type = self ._get_flow_type ()
54+
4555 self .route_dst = self ._s .router .get_route (self .packet )
4656 self ._update_packet_ni_out ()
57+ if packet .ni_out is not None :
58+ log_info ('Firewall' , f'Packet outbound-interface: { packet .ni_out } ' )
4759
4860 if self .route_dst is None :
49- raise ConnectionError ('No Destination-Route found' )
61+ log_error ('Router' , 'No Destination-Route found' )
62+ return
63+
64+ log_info ('Firewall' , f'Flow-type: { self .flow_type } ' )
65+
66+ if self ._is_bogon_to_wan () and self ._s .system .FIREWALL_WAN_DROP_BOGONS :
67+ log_error ('Firewall' , 'Dropping traffic to WAN targeting bogons' )
68+ return
69+
70+ # todo: main firewall-filters
5071
5172 # todo: SNAT
5273 self .snat = None
74+ if self .snat is not None :
75+ log_info ('Firewall' , f'Performed SNAT: { self .snat } ' )
76+
77+ # todo: egress firewall-filters
78+
79+ log_ok ('Firewall' , 'Packet passed' )
5380
5481 def dump (self ) -> dict :
5582 return {
5683 'packet' : self .packet .dump (),
57- 'ipp' : self ._ipp ,
5884 'src_is_local' : self .local_src ,
5985 'dst_is_local' : self .local_dst ,
6086 'flow_type' : self .flow_type ,
61- 'route_src' : [ route . dump () for route in self .route_src ] ,
62- 'route_dst' : [ route . dump () for route in self .route_dst ] ,
87+ 'route_src' : self . route_src . dump () if self .route_src is not None else None ,
88+ 'route_dst' : self . route_dst . dump () if self .route_dst is not None else None ,
6389 'dnat' : self .dnat ,
6490 'snat' : self .snat ,
6591 }
@@ -91,19 +117,26 @@ def _update_packet_ni_in(self):
91117 if self .packet .ni_in is not None :
92118 return
93119
94- if len ( self .route_src ) == 0 :
120+ if self .route_src is None :
95121 return
96122
97- self .packet .ni_in = self .route_src [ 0 ] .ni
123+ self .packet .ni_in = self .route_src .ni
98124
99125 def _update_packet_ni_out (self ) -> (str , None ):
100126 if self .packet .ni_out is not None :
101127 return
102128
103- if len ( self .route_dst ) == 0 :
129+ if self .route_dst is None :
104130 return
105131
106- self .packet .ni_out = self .route_dst [0 ].ni
132+ self .packet .ni_out = self .route_dst .ni
133+
134+ def _is_bogon_to_wan (self ) -> bool :
135+ if self .route_dst .net in DEFAULT_ROUTES and \
136+ not self .packet .dst .is_global :
137+ return True
138+
139+ return False
107140
108141
109142class Simulator :
0 commit comments