Skip to content

Commit f84799b

Browse files
tamilmani1989sharmasushant
authored andcommitted
Added support for blocking private IP space via snat bridge (#228)
* Added support for blocking private ip space via snat bridge except for 10.0.0.10
1 parent d28b594 commit f84799b

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

network/ovs_endpointclient_linux.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ func (client *OVSEndpointClient) AddEndpoints(epInfo *EndpointInfo) error {
7575
return err
7676
}
7777

78+
if err := addOrDeletePrivateIPBlockRule("A"); err != nil {
79+
log.Printf("addPrivateIPBlockRule failed with error %v", err)
80+
return err
81+
}
82+
7883
if err := addMasqueradeRule(client.snatBridgeIP); err != nil {
7984
log.Printf("Adding snat rule failed with error %v", err)
8085
return err

network/ovs_networkclient_linux.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3247
func 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+
261339
func addStaticRoute(ip string, interfaceName string) error {
262340
log.Printf("[ovs] Adding %v static route", ip)
263341
var routes []RouteInfo

0 commit comments

Comments
 (0)