The code looks fine to me. Looking forward to your repo! --Sheng
On Wed, May 8, 2013 at 3:12 PM, Will Stevens <wstev...@cloudops.com> wrote: > Alright, I have updated the code to what I have pasted at the bottom. I > have tested it and it is working as expected. With this change I now have > multiple networks per account working with my external firewall device. > > I will be posting my code to a public repo soon so people can start > checking it out. > > Thanks for confirming this was legacy. > > Cheers, > > Will > > --- > > IPAddressVO sourceNatIp = null; > if (!sharedSourceNat) { > // Get the source NAT IP address for this network > List<? extends IpAddress> sourceNatIps = > _networkModel.listPublicIpsAssignedToAccount(network.getAccountId(), > zoneId, true); > > for (IpAddress ipAddress : sourceNatIps) { > if (ipAddress.getAssociatedWithNetworkId().longValue() == > network.getId()) { > sourceNatIp = _ipAddressDao.findById(ipAddress.getId()); > break; > } > } > if (sourceNatIp == null) { > String errorMsg = "External firewall was unable to find the source > NAT IP address for network " + network.getName(); > s_logger.error(errorMsg); > return true; > } > } > > > > > On Wed, May 8, 2013 at 5:21 PM, Sheng Yang <sh...@yasker.org> wrote: > > > I've checked the code and seems it's legacy code here. SRX's support for > > "per account" is broken anyway, so you can modify it according to your > > requirement. > > > > Multiple networks per account for external devices is really nice to > have, > > I think you can go ahead and implement it. > > > > Thanks. > > > > --Sheng > > > > On Wed, May 8, 2013 at 1:25 PM, Will Stevens <wstev...@cloudops.com> > > wrote: > > > > > I am trying to use the 'per account' source nat type in the network > > > offering for my Palo Alto Firewall integration. I currently have it > > > working for one network per account. Obviously I would like to support > > > more than one network per account. I am not sure that this > functionality > > > is currently implemented. > > > > > > Here is the code in question in ExternalFirewallDeviceManagerImpl.java > > and > > > function 'manageGuestNetworkWithExternalFirewall': > > > IPAddressVO sourceNatIp = null; > > > if (!sharedSourceNat) { > > > // Get the source NAT IP address for this account > > > List<? extends IpAddress> sourceNatIps = > > > _networkModel.listPublicIpsAssignedToAccount(network.getAccountId(), > > > zoneId, true); > > > > > > if (sourceNatIps.size() != 1) { > > > String errorMsg = "External firewall was unable to find the > > source > > > NAT IP address for account " > > > + account.getAccountName(); > > > s_logger.error(errorMsg); > > > return true; > > > } else { > > > sourceNatIp = > > _ipAddressDao.findById(sourceNatIps.get(0).getId()); > > > } > > > } > > > > > > This piece of code is supposed to handle the when the source nat type > is > > > 'per account' instead of 'per zone'. This clearly only supports one > > > network per account. > > > > > > Since the condition when 'sourceNatIps.size() != 1' is only an error, > > would > > > I have the go ahead to implement support for multiple networks in one > > > account or am I missing something here? Basically, I will want to set > > the > > > 'sourceNatIp' variable to be the source nat ip for the specific > network. > > > > > > Let me know what you think... > > > > > > Thanks, > > > > > > Will > > > > > > > > > > > > > > > > > > On Thu, Apr 18, 2013 at 6:28 PM, Will Stevens <wstev...@cloudops.com> > > > wrote: > > > > > > > Great. Thanks again, this is very helpful. > > > > > > > > So the way I am doing it is good for now. If IP space becomes an > issue > > > > (when people are actually using it), I could implement the 'per zone' > > > > approach as well. > > > > > > > > In the per zone approach, the firewall would be initially configured > > with > > > > a public IP and a generic source nat rule which would map the entire > > > guest > > > > network range in the trusted zone to the preconfigured public IP in > the > > > > untrusted zone. I understand how this works now and why the source > nat > > > > rules will not need to be managed by cloudstack. > > > > > > > > Thanks again for the explanation. > > > > > > > > > > > > On Thu, Apr 18, 2013 at 6:12 PM, Sheng Yang <sh...@yasker.org> > wrote: > > > > > > > >> Hi Will, > > > >> > > > >> "per account" is perfectly fine in your case. "per zone" can be used > > if > > > >> user want to preserve some public IPs. And with "per zone", > CloudStack > > > >> just > > > >> won't care about source nat ip allocation etc any more, it would > > assume > > > >> that the firewall should already has taken care of that. Source NAT > IP > > > >> would be blank in Cloudstack(a.k.a. isolated network without source > > nat > > > >> ip). > > > >> > > > >> It's not requirement to support "per zone". In fact as long as your > > > device > > > >> can support of the source nat mechanism then it's fine. But I don't > > > think > > > >> you need to handle source nat rules if you use "per zone" mode(from > > CS's > > > >> perspective). E.g. Juniper SRX has such a configuration: > > > >> > > > >> nat { > > > >> source { > > > >> pool inat-pool { > > > >> address { > > > >> 10.223.161.18/32; > > > >> } > > > >> } > > > >> rule-set trust { > > > >> from zone trust; > > > >> to zone untrust; > > > >> rule i-nat { > > > >> match { > > > >> source-address 10.0.0.0/8; > > > >> } > > > >> then { > > > >> source-nat { > > > >> pool { > > > >> inat-pool; > > > >> } > > > >> } > > > >> } > > > >> } > > > >> } > > > >> } > > > >> } > > > >> > > > >> This one would fit all traffic from "trust" zone(every newly created > > > >> isolated network would be in trust zone) to "untrust" zone(public > > > >> network), > > > >> using source nat. > > > >> > > > >> --Sheng > > > >> > > > >> On Thu, Apr 18, 2013 at 2:50 PM, Will Stevens < > wstev...@cloudops.com> > > > >> wrote: > > > >> > > > >> > Thanks for the answer Sheng. > > > >> > > > > >> > I currently have the Palo Alto firewall using the 'per account' > > method > > > >> and > > > >> > when 'IpAssocCommand' is run (when the first VM is added to a palo > > > alto > > > >> > network ), I am dynamically creating a public sub-interface and > > > >> assigning a > > > >> > public IP (provided by cloudstack). I am also creating a private > > > >> > sub-interface on the PA which I am using the the gateway for the > CS > > > >> > network. I am dynamically creating/deleting the SourceNat rules > > > between > > > >> > the two sub-interfaces (gateway/cidr# -> public_ip/32) on > implement > > > and > > > >> > shutdown. > > > >> > > > > >> > In your eyes, is this the best way to handle this? If I was to > use > > > the > > > >> > 'per zone' option, how would the Source Nat IP get set in > > Cloudstack? > > > >> So > > > >> > there would be one public IP per zone which all the public traffic > > > >> would go > > > >> > through for all networks? I would still have to handle the source > > nat > > > >> > rules from each CS network to that single public IP I believe. > > > >> > > > > >> > I am slowly getting this all documented at: > > > >> > > > > >> > > > > >> > > > > > > https://cwiki.apache.org/confluence/display/CLOUDSTACK/Palo+Alto+Firewall+Integration > > > >> > > > > >> > Thanks... > > > >> > > > > >> > > > > >> > On Thu, Apr 18, 2013 at 5:19 PM, Sheng Yang <sh...@yasker.org> > > wrote: > > > >> > > > > >> > > Hi Will, > > > >> > > > > > >> > > "Per zone" is mostly for external network devices(e.g. SRX). We > > can > > > >> > > configure one public network address on SRX, and use that > > one(which > > > is > > > >> > out > > > >> > > of Cloudstack's control) for all the public traffic go through > the > > > >> > device. > > > >> > > That's "Per zone". > > > >> > > > > > >> > > "Per account" is the other way, used by VR in CloudStack. It > would > > > >> > acquire > > > >> > > one public ip from public ip pool in the zone for each isolated > > > >> network, > > > >> > > and make it source nat IP for the network. The name "per > account" > > > >> because > > > >> > > in the past one user would have only one isolated network, so > the > > > >> network > > > >> > > is de facto per account. It's not necessary true now, but the > name > > > >> > remained > > > >> > > I think. > > > >> > > > > > >> > > There are probably bad names, we should get better name than > > them... > > > >> > > > > > >> > > --Sheng > > > >> > > > > > >> > > > > > >> > > On Thu, Apr 18, 2013 at 2:07 PM, Will Stevens < > > > wstev...@cloudops.com> > > > >> > > wrote: > > > >> > > > > > >> > > > Oh, my bad. I forgot about that. > > > >> > > > > > > >> > > > On the 'create network service offering' overlay, if you > select > > > >> > > 'SourceNat' > > > >> > > > in Supported Services, there is a drop down which get added. > > The > > > >> drop > > > >> > > down > > > >> > > > has the title of 'Supported Source Nat Type' and has two > > options: > > > >> 'Per > > > >> > > > zone' and 'Per account' > > > >> > > > > > > >> > > > Thanks, > > > >> > > > > > > >> > > > Will > > > >> > > > > > > >> > > > > > > >> > > > On Thu, Apr 18, 2013 at 4:09 PM, Chip Childers < > > > >> > > chip.child...@sungard.com > > > >> > > > >wrote: > > > >> > > > > > > >> > > > > Will, > > > >> > > > > > > > >> > > > > Images and other attachments are stripped on this list (text > > > only > > > >> > > > > please!) > > > >> > > > > > > > >> > > > > Can you post the image somewhere or describe the list? > > > >> > > > > > > > >> > > > > On Thu, Apr 18, 2013 at 04:05:36PM -0400, Will Stevens > wrote: > > > >> > > > > > In the 'Create network service offering' flow there is > this > > > >> > dropdown: > > > >> > > > > > > > > >> > > > > > [image: Inline image 1] > > > >> > > > > > > > > >> > > > > > What are the implications for picking one or the other? > > > >> > > > > > > > > >> > > > > > This code seems related in > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > 'com.cloud.network.ExternalFirewallDeviceManagerImpl.manageGuestNetworkWithExternalFirewall()' > > > >> > > > > > : > > > >> > > > > > NetworkOffering offering = > > > >> > > > > > > > _networkOfferingDao.findById(network.getNetworkOfferingId()); > > > >> > > > > > boolean sharedSourceNat = offering.getSharedSourceNat(); > > > >> > > > > > > > > >> > > > > > IPAddressVO sourceNatIp = null; > > > >> > > > > > if (!sharedSourceNat) { > > > >> > > > > > // Get the source NAT IP address for this account > > > >> > > > > > List<? extends IpAddress> sourceNatIps = > > > >> > > > > > > > > >> _networkMgr.listPublicIpsAssignedToAccount(network.getAccountId(), > > > >> > > > > > zoneId, true); > > > >> > > > > > > > > >> > > > > > if (sourceNatIps.size() != 1) { > > > >> > > > > > String errorMsg = "External firewall was unable to > > > find > > > >> the > > > >> > > > > source > > > >> > > > > > NAT IP address for account " > > > >> > > > > > + account.getAccountName(); > > > >> > > > > > s_logger.error(errorMsg); > > > >> > > > > > return true; > > > >> > > > > > } else { > > > >> > > > > > sourceNatIp = > > > >> > > > > _ipAddressDao.findById(sourceNatIps.get(0).getId()); > > > >> > > > > > } > > > >> > > > > > } > > > >> > > > > > > > > >> > > > > > How does the 'sourceNatIp' get set if 'sharedSourceNat' is > > > true? > > > >> > > > > > > > > >> > > > > > Thanks, > > > >> > > > > > > > > >> > > > > > Will > > > >> > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > > > > > > > > >