@@ -29,6 +29,21 @@ const (
2929 ovsOpt = "OVS_CTL_OPTS='--delete-bridges'"
3030)
3131
32+ func getPrivateIPSpace () []string {
33+ privateIPAddresses := []string {"10.0.0.0/8" , "172.16.0.0/12" , "192.168.0.0/16" }
34+ return privateIPAddresses
35+ }
36+
37+ func getFilterChains () []string {
38+ chains := []string {"FORWARD" , "INPUT" , "OUTPUT" }
39+ return chains
40+ }
41+
42+ func getFilterchainTarget () []string {
43+ actions := []string {"ACCEPT" , "DROP" }
44+ return actions
45+ }
46+
3247func updateOVSConfig (option string ) error {
3348 f , err := os .OpenFile (ovsConfigFile , os .O_APPEND | os .O_RDWR , 0666 )
3449 if err != nil {
@@ -86,6 +101,11 @@ func (client *OVSNetworkClient) CreateBridge() error {
86101 return err
87102 }
88103
104+ if err := addOrDeletePrivateIPBlockRule ("A" ); err != nil {
105+ log .Printf ("addPrivateIPBlockRule failed with error %v" , err )
106+ return err
107+ }
108+
89109 if err := addMasqueradeRule (client .snatBridgeIP ); err != nil {
90110 return err
91111 }
@@ -171,6 +191,10 @@ func (client *OVSNetworkClient) DeleteBridge() error {
171191 log .Printf ("Deleting ebtable vlan drop rule failed with error %v" , err )
172192 }
173193
194+ if err := addOrDeletePrivateIPBlockRule ("D" ); err != nil {
195+ log .Printf ("Deleting PrivateIP Block rules failed with error %v" , err )
196+ }
197+
174198 if err := ovsctl .DeletePortFromOVS (client .bridgeName , azureSnatVeth1 ); err != nil {
175199 return err
176200 }
@@ -258,6 +282,60 @@ func createSnatBridge(snatBridgeIP string, mainInterface string) error {
258282 return nil
259283}
260284
285+ func addOrDeleteFilterRule (action string , ipAddress string , chainName string , target string ) error {
286+ option := "i"
287+
288+ if chainName == "OUTPUT" {
289+ option = "o"
290+ }
291+
292+ if action != "D" {
293+ cmd := fmt .Sprintf ("iptables -t filter -C %v -%v %v -d %v -j %v" , chainName , option , snatBridgeName , ipAddress , target )
294+ _ , err := platform .ExecuteCommand (cmd )
295+ if err == nil {
296+ log .Printf ("Iptable filter for private ipaddr %v on %v chain %v target rule already exists" , ipAddress , chainName , target )
297+ return nil
298+ }
299+ }
300+
301+ cmd := fmt .Sprintf ("iptables -t filter -%v %v -%v %v -d %v -j %v" , action , chainName , option , snatBridgeName , ipAddress , target )
302+ _ , err := platform .ExecuteCommand (cmd )
303+ if err != nil {
304+ log .Printf ("Iptable filter %v action for private ipaddr %v on %v chain %v target failed with %v" , action , ipAddress , chainName , target , err )
305+ return err
306+ }
307+
308+ return nil
309+ }
310+
311+ func addOrDeletePrivateIPBlockRule (action string ) error {
312+ privateIPAddresses := getPrivateIPSpace ()
313+ chains := getFilterChains ()
314+ target := getFilterchainTarget ()
315+
316+ for _ , chain := range chains {
317+ if err := addOrDeleteFilterRule (action , "10.0.0.10" , chain , target [0 ]); err != nil {
318+ return err
319+ }
320+ }
321+
322+ for _ , ipAddress := range privateIPAddresses {
323+ if err := addOrDeleteFilterRule (action , ipAddress , chains [0 ], target [1 ]); err != nil {
324+ return err
325+ }
326+
327+ if err := addOrDeleteFilterRule (action , ipAddress , chains [1 ], target [1 ]); err != nil {
328+ return err
329+ }
330+
331+ if err := addOrDeleteFilterRule (action , ipAddress , chains [2 ], target [1 ]); err != nil {
332+ return err
333+ }
334+ }
335+
336+ return nil
337+ }
338+
261339func addStaticRoute (ip string , interfaceName string ) error {
262340 log .Printf ("[ovs] Adding %v static route" , ip )
263341 var routes []RouteInfo
0 commit comments