@@ -82,38 +82,46 @@ func (n *bridgeNetwork) setupIPTables(config *networkConfiguration, i *bridgeInt
8282 IP : ipnet .IP .Mask (ipnet .Mask ),
8383 Mask : ipnet .Mask ,
8484 }
85- if err = setupIPTablesInternal (config .BridgeName , maskedAddrv4 , config .EnableICC , config .EnableIPMasquerade , hairpinMode , true ); err != nil {
86- return fmt .Errorf ("Failed to Setup IP tables: %s" , err .Error ())
87- }
88- n .registerIptCleanFunc (func () error {
89- return setupIPTablesInternal (config .BridgeName , maskedAddrv4 , config .EnableICC , config .EnableIPMasquerade , hairpinMode , false )
90- })
85+ if config .Internal {
86+ if err = setupInternalNetworkRules (config .BridgeName , maskedAddrv4 , true ); err != nil {
87+ return fmt .Errorf ("Failed to Setup IP tables: %s" , err .Error ())
88+ }
89+ n .registerIptCleanFunc (func () error {
90+ return setupInternalNetworkRules (config .BridgeName , maskedAddrv4 , false )
91+ })
92+ } else {
93+ if err = setupIPTablesInternal (config .BridgeName , maskedAddrv4 , config .EnableICC , config .EnableIPMasquerade , hairpinMode , true ); err != nil {
94+ return fmt .Errorf ("Failed to Setup IP tables: %s" , err .Error ())
95+ }
96+ n .registerIptCleanFunc (func () error {
97+ return setupIPTablesInternal (config .BridgeName , maskedAddrv4 , config .EnableICC , config .EnableIPMasquerade , hairpinMode , false )
98+ })
99+ natChain , filterChain , _ , err := n .getDriverChains ()
100+ if err != nil {
101+ return fmt .Errorf ("Failed to setup IP tables, cannot acquire chain info %s" , err .Error ())
102+ }
91103
92- natChain , filterChain , _ , err := n . getDriverChains ( )
93- if err != nil {
94- return fmt .Errorf ("Failed to setup IP tables, cannot acquire chain info %s" , err .Error ())
95- }
104+ err = iptables . ProgramChain ( natChain , config . BridgeName , hairpinMode , true )
105+ if err != nil {
106+ return fmt .Errorf ("Failed to program NAT chain: %s" , err .Error ())
107+ }
96108
97- err = iptables .ProgramChain (natChain , config .BridgeName , hairpinMode , true )
98- if err != nil {
99- return fmt .Errorf ("Failed to program NAT chain: %s" , err .Error ())
100- }
109+ err = iptables .ProgramChain (filterChain , config .BridgeName , hairpinMode , true )
110+ if err != nil {
111+ return fmt .Errorf ("Failed to program FILTER chain: %s" , err .Error ())
112+ }
101113
102- err = iptables .ProgramChain (filterChain , config .BridgeName , hairpinMode , true )
103- if err != nil {
104- return fmt .Errorf ("Failed to program FILTER chain: %s" , err .Error ())
114+ n .registerIptCleanFunc (func () error {
115+ return iptables .ProgramChain (filterChain , config .BridgeName , hairpinMode , false )
116+ })
117+
118+ n .portMapper .SetIptablesChain (filterChain , n .getNetworkBridgeName ())
105119 }
106120
107121 if err := ensureJumpRule ("FORWARD" , IsolationChain ); err != nil {
108122 return err
109123 }
110124
111- n .registerIptCleanFunc (func () error {
112- return iptables .ProgramChain (filterChain , config .BridgeName , hairpinMode , false )
113- })
114-
115- n .portMapper .SetIptablesChain (filterChain , n .getNetworkBridgeName ())
116-
117125 return nil
118126}
119127
@@ -312,12 +320,26 @@ func ensureJumpRule(fromChain, toChain string) error {
312320
313321func removeIPChains () {
314322 for _ , chainInfo := range []iptables.ChainInfo {
315- iptables. ChainInfo {Name : DockerChain , Table : iptables .Nat },
316- iptables. ChainInfo {Name : DockerChain , Table : iptables .Filter },
317- iptables. ChainInfo {Name : IsolationChain , Table : iptables .Filter },
323+ {Name : DockerChain , Table : iptables .Nat },
324+ {Name : DockerChain , Table : iptables .Filter },
325+ {Name : IsolationChain , Table : iptables .Filter },
318326 } {
319327 if err := chainInfo .Remove (); err != nil {
320328 logrus .Warnf ("Failed to remove existing iptables entries in table %s chain %s : %v" , chainInfo .Table , chainInfo .Name , err )
321329 }
322330 }
323331}
332+
333+ func setupInternalNetworkRules (bridgeIface string , addr net.Addr , insert bool ) error {
334+ var (
335+ inDropRule = iptRule {table : iptables .Filter , chain : IsolationChain , args : []string {"-i" , bridgeIface , "!" , "-d" , addr .String (), "-j" , "DROP" }}
336+ outDropRule = iptRule {table : iptables .Filter , chain : IsolationChain , args : []string {"-o" , bridgeIface , "!" , "-s" , addr .String (), "-j" , "DROP" }}
337+ )
338+ if err := programChainRule (inDropRule , "DROP INCOMING" , insert ); err != nil {
339+ return err
340+ }
341+ if err := programChainRule (outDropRule , "DROP OUTGOING" , insert ); err != nil {
342+ return err
343+ }
344+ return nil
345+ }
0 commit comments