func (f *fakeIptables) restore(restoreTableName utiliptables.Table, data []byte, flush utiliptables.FlushFlag) error { buf := bytes.NewBuffer(data) var tableName utiliptables.Table for { line, err := buf.ReadString('\n') if err != nil { break } if line[0] == '#' { continue } line = strings.TrimSuffix(line, "\n") if strings.HasPrefix(line, "*") { tableName = utiliptables.Table(line[1:]) } if tableName != "" { if restoreTableName != "" && restoreTableName != tableName { continue } if strings.HasPrefix(line, ":") { chainName := utiliptables.Chain(strings.Split(line[1:], " ")[0]) if flush == utiliptables.FlushTables { table, chain, _ := f.getChain(tableName, chainName) if chain != nil { delete(table.chains, string(chainName)) } } _, _ = f.ensureChain(tableName, chainName) } else if strings.HasPrefix(line, "-A") { parts := strings.Split(line, " ") if len(parts) < 3 { return fmt.Errorf("Invalid iptables rule '%s'", line) } chainName := utiliptables.Chain(parts[1]) rule := strings.TrimPrefix(line, fmt.Sprintf("-A %s ", chainName)) _, err := f.ensureRule(utiliptables.Append, tableName, chainName, rule) if err != nil { return err } } else if strings.HasPrefix(line, "-X") { parts := strings.Split(line, " ") if len(parts) < 3 { return fmt.Errorf("Invalid iptables rule '%s'", line) } if err := f.DeleteChain(tableName, utiliptables.Chain(parts[1])); err != nil { return err } } else if line == "COMMIT" { if restoreTableName == tableName { return nil } tableName = "" } } } return nil }
func SetupIptables(ipt iptables.Interface, clusterNetworkCIDR string) error { rules := []FirewallRule{ {"nat", "POSTROUTING", []string{"-s", clusterNetworkCIDR, "!", "-d", clusterNetworkCIDR, "-j", "MASQUERADE"}}, {"filter", "INPUT", []string{"-p", "udp", "-m", "multiport", "--dports", "4789", "-m", "comment", "--comment", "001 vxlan incoming", "-j", "ACCEPT"}}, {"filter", "INPUT", []string{"-i", "tun0", "-m", "comment", "--comment", "traffic from docker for internet", "-j", "ACCEPT"}}, {"filter", "FORWARD", []string{"-d", clusterNetworkCIDR, "-j", "ACCEPT"}}, {"filter", "FORWARD", []string{"-s", clusterNetworkCIDR, "-j", "ACCEPT"}}, } for _, rule := range rules { _, err := ipt.EnsureRule(iptables.Prepend, iptables.Table(rule.table), iptables.Chain(rule.chain), rule.args...) if err != nil { return err } } return nil }
// syncIPTableRules syncs the cluster network cidr iptables rules. // Called from SyncLoop() or firwalld reload() func (n *NodeIPTables) syncIPTableRules() error { n.mu.Lock() defer n.mu.Unlock() start := time.Now() defer func() { glog.V(4).Infof("syncIPTableRules took %v", time.Since(start)) }() glog.V(3).Infof("Syncing openshift iptables rules") rules := n.getStaticNodeIPTablesRules() for _, rule := range rules { _, err := n.ipt.EnsureRule(iptables.Prepend, iptables.Table(rule.table), iptables.Chain(rule.chain), rule.args...) if err != nil { return fmt.Errorf("Failed to ensure rule %v exists: %v", rule, err) } } return nil }