@@ -817,6 +817,13 @@ def getGatewayByIp(self, ipa):
817817 return interface .get_gateway ()
818818 return None
819819
820+ def getPrivateGatewayNetworks (self ):
821+ interfaces = []
822+ for interface in self .config .address ().get_interfaces ():
823+ if interface .is_private_gateway ():
824+ interfaces .append (interface )
825+ return interfaces
826+
820827 def portsToString (self , ports , delimiter ):
821828 ports_parts = ports .split (":" , 2 )
822829 if ports_parts [0 ] == ports_parts [1 ]:
@@ -948,12 +955,21 @@ def processStaticNatRule(self, rule):
948955 if device is None :
949956 raise Exception ("Ip address %s has no device in the ips databag" % rule ["public_ip" ])
950957
958+ chain_name = "PREROUTING-%s-def" % device
951959 self .fw .append (["mangle" , "front" ,
952- "-A PREROUTING -s %s/32 -m state --state NEW -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff" %
953- rule ["internal_ip" ]])
954- self .fw .append (["mangle" , "front" ,
955- "-A PREROUTING -s %s/32 -m state --state NEW -j MARK --set-xmark %s/0xffffffff" %
956- (rule ["internal_ip" ], hex (100 + int (device [len ("eth" ):])))])
960+ "-A PREROUTING -s %s/32 -m state --state NEW -j %s" %
961+ (rule ["internal_ip" ], chain_name )])
962+ self .fw .append (["mangle" , "" ,
963+ "-A %s -j MARK --set-xmark %s/0xffffffff" %
964+ (chain_name , hex (100 + int (device [len ("eth" ):])))])
965+ self .fw .append (["mangle" , "" ,
966+ "-A %s -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff" %
967+ chain_name ])
968+ private_gateways = self .getPrivateGatewayNetworks ()
969+ for private_gw in private_gateways :
970+ self .fw .append (["mangle" , "front" , "-A %s -d %s -j RETURN" %
971+ (chain_name , private_gw .get_network ())])
972+
957973 self .fw .append (["nat" , "front" ,
958974 "-A PREROUTING -d %s/32 -j DNAT --to-destination %s" % (rule ["public_ip" ], rule ["internal_ip" ])])
959975 self .fw .append (["nat" , "front" ,
0 commit comments