2828from CsRule import CsRule
2929
3030VRRP_TYPES = ['guest' ]
31- PUBLIC_INTERFACE = ['eth1' ]
31+ VPC_PUBLIC_INTERFACE = ['eth1' ]
32+ NETWORK_PUBLIC_INTERFACE = ['eth2' ]
3233
3334class CsAddress (CsDataBag ):
3435
@@ -288,52 +289,62 @@ def post_configure(self, address):
288289 """ The steps that must be done after a device is configured """
289290 route = CsRoute ()
290291 if not self .get_type () in ["control" ]:
291- route .add_table (self .dev )
292-
293- CsRule (self .dev ).addMark ()
292+
293+ if self .dev != 'eth0' :
294+ route .add_table (self .dev )
295+ CsRule (self .dev ).addMark ()
296+ self .set_mark ()
297+
294298 self .check_is_up ()
295- self .set_mark ()
296299 self .arpPing ()
297-
300+
298301 CsRpsrfs (self .dev ).enable ()
299302 self .post_config_change ("add" )
300303
301304 '''For isolated/redundant and dhcpsrvr routers, call this method after the post_config is complete '''
302305 if not self .config .is_vpc ():
303306 self .setup_router_control ()
304-
305- if self .config .is_vpc () or self .cl .is_redundant ():
306- # The code looks redundant here, but we actually have to cater for routers and
307- # VPC routers in a different manner. Please do not remove this block otherwise
308- # The VPC default route will be broken.
309- if self .get_type () in ["public" ]:
310- gateway = str (address ["gateway" ])
311- route .add_defaultroute (gateway )
307+
308+
309+ try :
310+ if str (address ["gateway" ]) == "None" :
311+ raise ValueError
312+ except (KeyError , ValueError ):
313+ logging .debug ("IP %s was not provided with a gateway." % self .ip ())
312314 else :
313- # once we start processing public ip's we need to verify there
314- # is a default route and add if needed
315- if (self .cl .get_gateway ()):
316- route .add_defaultroute (self .cl .get_gateway ())
315+ if self .get_type () in ["public" ]:
316+ if self .config .is_vpc ():
317+ main_public_nic = VPC_PUBLIC_INTERFACE
318+ else :
319+ main_public_nic = NETWORK_PUBLIC_INTERFACE
320+
321+ if self .dev in main_public_nic :
322+ logging .debug ("IP %s has the gateway %s that should be in the main routing table." % \
323+ (self .ip (), address ["gateway" ]))
324+ route .add_defaultroute (address ["gateway" ])
325+ else :
326+ logging .debug ("IP %s has the gateway %s that is not intended for the main routing table." % \
327+ (self .ip (), address ["gateway" ]))
317328
318329 def check_is_up (self ):
319330 """ Ensure device is up """
320331 cmd = "ip link show %s | grep 'state DOWN'" % self .getDevice ()
321332 for i in CsHelper .execute (cmd ):
322333 if " DOWN " in i :
323334 cmd2 = "ip link set %s up" % self .getDevice ()
324- # If redundant only bring up public interfaces that are not eth1.
325- # Reason: private gateways are public interfaces.
326- # master.py and keepalived will deal with eth1 public interface.
327- if self .cl .is_redundant () and (not self .is_public () or self .getDevice () not in PUBLIC_INTERFACE ):
335+ # All interfaces should be up on non-redundant or master routers
336+ if not self .cl .is_redundant () or self .cl .is_master ():
328337 CsHelper .execute (cmd2 )
329- # if not redundant bring everything up
330- if not self .cl . is_redundant ():
338+ # only bring up non-public interfaces on backup redundant routers
339+ elif not self .is_public ():
331340 CsHelper .execute (cmd2 )
332341
342+
333343 def set_mark (self ):
334- cmd = "-A PREROUTING -i %s -m state --state NEW -j CONNMARK --set-xmark %s/0xffffffff" % \
335- (self .getDevice (), self .dnum )
336- self .fw .append (["mangle" , "" , cmd ])
344+ if self .get_type () in ['public' ]:
345+ cmd = "-A PREROUTING -i %s -m state --state NEW -j CONNMARK --set-xmark %s/0xffffffff" % \
346+ (self .getDevice (), self .dnum )
347+ self .fw .append (["mangle" , "" , cmd ])
337348
338349 def get_type (self ):
339350 """ Return the type of the IP
@@ -369,9 +380,13 @@ def setup_router_control(self):
369380 def fw_router (self ):
370381 if self .config .is_vpc ():
371382 return
372- self .fw .append (["mangle" , "front" , "-A PREROUTING " +
383+
384+ restore_mark = ["mangle" , "front" , "-A PREROUTING " +
373385 "-m state --state RELATED,ESTABLISHED " +
374- "-j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff" ])
386+ "-j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff" ]
387+
388+ if restore_mark not in self .fw :
389+ self .fw .append (restore_mark )
375390
376391 if self .get_type () in ["public" ]:
377392 self .fw .append (["mangle" , "front" ,
@@ -399,6 +414,10 @@ def fw_router(self):
399414 "-j CONNMARK --set-xmark %s/0xffffffff" % self .dnum ])
400415 self .fw .append (
401416 ["mangle" , "" , "-A FIREWALL_%s -j DROP" % self .address ['public_ip' ]])
417+ self .fw .append (
418+ ["filter" , "" , "-A FORWARD -i %s -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT" % self .dev ])
419+ self .fw .append (
420+ ["filter" , "" , "-A FORWARD -i eth0 -o %s -j FW_OUTBOUND" % self .dev ])
402421
403422 self .fw .append (["filter" , "" , "-A INPUT -d 224.0.0.18/32 -j ACCEPT" ])
404423 self .fw .append (["filter" , "" , "-A INPUT -d 225.0.0.50/32 -j ACCEPT" ])
@@ -422,23 +441,16 @@ def fw_router(self):
422441 ["filter" , "" , "-A FORWARD -i %s -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT" % self .dev ])
423442 self .fw .append (
424443 ["filter" , "" , "-A FORWARD -i %s -o %s -m state --state NEW -j ACCEPT" % (self .dev , self .dev )])
425- self .fw .append (
426- ["filter" , "" , "-A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT" ])
427444 self .fw .append (
428445 ["filter" , "" , "-A FORWARD -i eth0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT" ])
429- self .fw .append (
430- ["filter" , "" , "-A FORWARD -i eth0 -o eth2 -j FW_OUTBOUND" ])
431- self .fw .append (["mangle" , "" ,
432- "-A PREROUTING -i %s -m state --state NEW " % self .dev +
433- "-j CONNMARK --set-xmark %s/0xffffffff" % self .dnum ])
434446
435447 self .fw .append (['' , 'front' , '-A FORWARD -j NETWORK_STATS' ])
436448 self .fw .append (['' , 'front' , '-A INPUT -j NETWORK_STATS' ])
437449 self .fw .append (['' , 'front' , '-A OUTPUT -j NETWORK_STATS' ])
438- self .fw .append (['' , '' , '-A NETWORK_STATS -i eth0 -o eth2' ])
439- self .fw .append (['' , '' , '-A NETWORK_STATS -i eth2 -o eth0' ])
440- self .fw .append (['' , '' , '-A NETWORK_STATS -o eth2 ! -i eth0 -p tcp' ])
441- self .fw .append (['' , '' , '-A NETWORK_STATS -i eth2 ! -o eth0 -p tcp' ])
450+ self .fw .append (['' , '' , '-A NETWORK_STATS -i eth0 -o %s' % self . dev ])
451+ self .fw .append (['' , '' , '-A NETWORK_STATS -i %s -o eth0' % self . dev ])
452+ self .fw .append (['' , '' , '-A NETWORK_STATS -o %s ! -i eth0 -p tcp' % self . dev ])
453+ self .fw .append (['' , '' , '-A NETWORK_STATS -i %s ! -o eth0 -p tcp' % self . dev ])
442454
443455 def fw_vpcrouter (self ):
444456 if not self .config .is_vpc ():
@@ -519,6 +531,8 @@ def post_config_change(self, method):
519531 route = CsRoute ()
520532 if method == "add" :
521533 route .add_table (self .dev )
534+ if "gateway" in self .address and self .address ["gateway" ] != "None" :
535+ route .add_route (self .dev , "default via %s" % self .address ["gateway" ])
522536 route .add_route (self .dev , str (self .address ["network" ]))
523537 elif method == "delete" :
524538 logging .warn ("delete route not implemented" )
0 commit comments