Ai
5 Star 6 Fork 4

zstackio/zstack-vyos

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
firewall_iptables_test.go 32.75 KB
一键复制 编辑 原始数据 按行查看 历史
shixin.ruan 提交于 2024-07-08 14:31 +08:00 . [root]: use openeuler image for vpc
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
package plugin
import (
"fmt"
"strings"
"zstack-vyos/utils"
. "github.com/onsi/ginkgo"
gomega "github.com/onsi/gomega"
log "github.com/sirupsen/logrus"
)
var _ = Describe("firewall_iptables_test", func() {
//var ruleInfo1, ruleInfo2, ruleInfo
It("[IPTABLES]FIREWALL : prepare", func() {
eipMap = make(map[string]eipInfo, EipInfoMaxSize)
utils.InitLog(utils.GetVyosUtLogDir()+"firewall_iptables_test.log", false)
utils.CleanTestEnvForUT()
SetKeepalivedStatusForUt(KeepAlivedStatus_Master)
utils.SetSkipVyosIptablesForUT(true)
cleanPluginMaps()
configureAllNicsForUT()
})
/* get firewall */
It("[IPTABLES]FIREWALL : get firewall", func() {
By("####test get private nic firewall #######")
// in ruleset of pri nic will permit through eip group
// in ruleset of pub nic will permit through eip group
ipInPubL3, _ := utils.GetFreePubL3Ip()
eip1 := eipInfo{VipIp: ipInPubL3, PublicMac: utils.PubNicForUT.Mac,
GuestIp: "192.168.1.200", PrivateMac: utils.PrivateNicsForUT[0].Mac,
SnatInboundTraffic: false}
cmd1 := setEipCmd{Eip: eip1}
log.Debugf("createEip eip1: %+v before get firewall", eip1)
createEip(&cmd1)
checkSyncEipByIptables(eip1)
nicInfo := nicTypeInfo{Mac: utils.PrivateNicsForUT[0].Mac, NicType: "private"}
gcmd := getConfigCmd{NicTypeInfos: []nicTypeInfo{nicInfo}}
rsp := getFirewallConfig(&gcmd)
grsp, _ := rsp.(getConfigRsp)
log.Debugf("get firewall: %+v", grsp.Refs)
checkDefaultNicRules(nicInfo, grsp.Refs)
checkEipRulesInChain(false, nicInfo, grsp.Refs)
By("####test get public nic firewall #######")
nicInfo = nicTypeInfo{Mac: utils.PubNicForUT.Mac, NicType: "public"}
gcmd = getConfigCmd{NicTypeInfos: []nicTypeInfo{nicInfo}}
rsp = getFirewallConfig(&gcmd)
grsp, _ = rsp.(getConfigRsp)
log.Debugf("get firewall: %+v", grsp.Refs)
checkDefaultNicRules(nicInfo, grsp.Refs)
checkEipRulesInChain(true, nicInfo, grsp.Refs)
eipCmd := removeEipCmd{Eip: eip1}
removeEip(&eipCmd)
})
/* when apply a ruleset to vpc interface will call this api: applyRuleSetChanges */
It("[IPTABLES]FIREWALL : test applyRuleSetChanges", func() {
ruleInfo1 := ruleInfo{
SourceIp: "192.168.1.100,192.168.101.0/24,192.168.30.10-192.168.30.20", DestIp: "192.168.1.101,192.168.201.0/24,192.168.30.30-192.168.30.40",
State: "enable",
IsDefault: false, RuleNumber: 1110,
AllowStates: "new,established,invalid,related",
Protocol: "all", Action: "accept"}
ruleInfo2 := ruleInfo{
SourceIp: "192.168.2.100", DestIp: "192.168.2.101",
DestPort: "1000-1007", SourcePort: "10000-10010",
State: "enable",
IsDefault: false, RuleNumber: 1002,
AllowStates: "established,related",
Tcp: "SYN,ACK",
Protocol: "tcp", Action: "drop"}
ruleInfo3 := ruleInfo{
SourceIp: "192.168.3.100,192.168.3.101, 192.168.3.102", DestIp: "192.168.103.100,192.168.103.101, 192.168.103.102",
DestPort: "1000,1002,1004,100-200", SourcePort: "1000,1002,1004,100-200",
State: "enable",
IsDefault: false, RuleNumber: 1003,
Protocol: "udp", Action: "reject"}
ruleInfo4 := ruleInfo{
SourceIp: "192.168.104.0/24", DestIp: "192.168.204.0/24",
State: "enable",
IsDefault: false, RuleNumber: 1010,
Protocol: "icmp", Action: "accept"}
ruleInfo5 := ruleInfo{
SourceIp: "192.168.5.100", DestIp: "192.168.5.101",
DestPort: "1000", SourcePort: "10000",
State: "enable",
IsDefault: false, RuleNumber: 2001,
Protocol: "tcp", Action: "drop"}
ruleInfo6 := ruleInfo{
SourceIp: "10.1.1.1-10.1.1.10", DestIp: "20.1.1.1-20.1.1.10",
DestPort: "100-200,300,400-500", SourcePort: "150-250,350,450-550",
State: "enable",
IsDefault: false, RuleNumber: 1122,
Protocol: "udp", Action: "accept",
}
ruleInfo7 := ruleInfo{
SourceIp: "10.1.1.1-10.1.1.10", DestIp: "20.1.1.1-20.1.1.10",
DestPort: "100-200,300,400-500", SourcePort: "150-250,350,450-550",
State: "enable",
IsDefault: false, RuleNumber: 1123,
Protocol: "udp", Action: "accept",
}
rules := []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5, ruleInfo6, ruleInfo7}
ethRuleSetRef1 := ethRuleSetRef{
Mac: utils.PrivateNicsForUT[0].Mac,
Forward: FIREWALL_DIRECTION_IN,
RuleSetInfo: ruleSetInfo{ActionType: "accept"},
}
ethRuleSetRef2 := ethRuleSetRef{
Mac: utils.PubNicForUT.Mac,
Forward: FIREWALL_DIRECTION_OUT,
RuleSetInfo: ruleSetInfo{ActionType: "reject"},
}
refs := []ethRuleSetRef{ethRuleSetRef1, ethRuleSetRef2}
ruleSetName1 := buildRuleSetName(utils.PrivateNicsForUT[0].Name, FIREWALL_DIRECTION_IN)
ruleSetName2 := buildRuleSetName(utils.PubNicForUT.Name, FIREWALL_DIRECTION_OUT)
By("####test applyRuleSetChanges attach ruleset to interface #######")
acm1 := &attachRuleSetCmd{Ref: ethRuleSetRef1}
attachRuleSet(acm1)
// check default rule
checkDefaultAction(ruleSetName1, "accept")
acm2 := &attachRuleSetCmd{Ref: ethRuleSetRef2}
attachRuleSet(acm2)
// check default rule
checkDefaultAction(ruleSetName2, "reject")
By("####test applyRuleSetChanges add new rules #######")
cmd := applyRuleSetChangesCmd{Refs: refs, NewRules: rules}
err := applyRuleSetChanges(&cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("firewall rule apply ruleset change failed: %+v", err))
checkIptableRule(ruleSetName1, rules, false)
checkIptableRule(ruleSetName2, rules, false)
By("####test applyRuleSetChanges add new rules again #######")
cmd = applyRuleSetChangesCmd{Refs: refs, NewRules: rules}
err = applyRuleSetChanges(&cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("firewall rule apply ruleset change failed: %+v", err))
checkIptableRule(ruleSetName1, rules, false)
checkIptableRule(ruleSetName2, rules, false)
By("####test applyRuleSetChanges remove rules #######")
cmd = applyRuleSetChangesCmd{Refs: refs, DeleteRules: rules}
err = applyRuleSetChanges(&cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("firewall rule apply ruleset change failed: %+v", err))
checkIptableRule(ruleSetName1, rules, true)
checkIptableRule(ruleSetName2, rules, true)
By("####test applyRuleSetChanges remove rules again #######")
cmd = applyRuleSetChangesCmd{Refs: refs, DeleteRules: rules}
err = applyRuleSetChanges(&cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("firewall rule apply ruleset change failed: %+v", err))
checkIptableRule(ruleSetName1, rules, true)
checkIptableRule(ruleSetName2, rules, true)
By("####test applyRuleSetChanges change rule state #######")
// add rule set rules
cmd = applyRuleSetChangesCmd{Refs: refs, NewRules: rules}
err = applyRuleSetChanges(&cmd)
// change rule state and apply
ruleInfo7Copy := ruleInfo7
ruleInfo7Copy.State = "disable"
rulesCopy := []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5, ruleInfo6, ruleInfo7Copy}
cmd = applyRuleSetChangesCmd{Refs: refs, NewRules: rulesCopy, DeleteRules: []ruleInfo{ruleInfo7}}
err = applyRuleSetChanges(&cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("firewall rule apply ruleset change failed: %+v", err))
checkIptableRuleByRuleNum(ruleSetName1, []ruleInfo{ruleInfo7}, true)
checkIptableRuleByRuleNum(ruleSetName2, []ruleInfo{ruleInfo7}, true)
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5, ruleInfo6}, false)
checkIptableRule(ruleSetName2, []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5, ruleInfo6}, false)
// change rule state and apply to only in direction
ruleInfo6Copy := ruleInfo6
ruleInfo6Copy.State = "disable"
rulesCopy = []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5, ruleInfo6Copy}
refs = []ethRuleSetRef{ethRuleSetRef1}
cmd = applyRuleSetChangesCmd{Refs: refs, NewRules: rulesCopy, DeleteRules: []ruleInfo{ruleInfo6}}
err = applyRuleSetChanges(&cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("firewall rule apply ruleset change failed: %+v", err))
checkIptableRuleByRuleNum(ruleSetName1, []ruleInfo{ruleInfo6}, true)
checkIptableRuleByRuleNum(ruleSetName2, []ruleInfo{ruleInfo6}, false)
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5}, false)
checkIptableRule(ruleSetName2, []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5, ruleInfo6}, false)
refs = []ethRuleSetRef{ethRuleSetRef1, ethRuleSetRef2}
cmd = applyRuleSetChangesCmd{Refs: refs, DeleteRules: rules}
err = applyRuleSetChanges(&cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("firewall rule apply ruleset change failed: %+v", err))
checkIptableRule(ruleSetName1, rules, true)
checkIptableRule(ruleSetName2, rules, true)
})
/* when reconnect/restart vpc router, all rule need to be re-installed, call this api: applyUserRules */
It("[IPTABLES]FIREWALL : test applyUserRules", func() {
ruleInfo1 := ruleInfo{
SourceIp: "192.168.1.100,192.168.101.0/24,192.168.10.1-192.168.10.10", DestIp: "192.168.1.101,192.168.201.0/24,192.168.10.30-192.168.10.40",
State: "enable",
IsDefault: false, RuleNumber: 1110,
AllowStates: "new,established,invalid,related",
Protocol: "all", Action: "accept"}
ruleInfo2 := ruleInfo{
SourceIp: "192.168.2.100", DestIp: "192.168.2.101",
DestPort: "1000-1007", SourcePort: "10000-10010",
State: "enable",
IsDefault: false, RuleNumber: 1002,
AllowStates: "established,related",
Tcp: "SYN,ACK",
Protocol: "tcp", Action: "drop"}
ruleInfo3 := ruleInfo{
SourceIp: "192.168.3.100,192.168.3.101, 192.168.3.102", DestIp: "192.168.103.100,192.168.103.101, 192.168.103.102",
DestPort: "1000,1002,1004,100-200", SourcePort: "1000,1002,1004,100-200",
State: "enable",
IsDefault: false, RuleNumber: 1003,
Protocol: "udp", Action: "reject"}
ruleInfo4 := ruleInfo{
SourceIp: "192.168.104.0/24", DestIp: "192.168.204.0/24",
State: "enable",
IsDefault: false, RuleNumber: 1010,
AllowStates: "new,related",
Protocol: "icmp", Action: "accept"}
ruleInfo5 := ruleInfo{
SourceIp: "30.1.1.1-30.1.1.10", DestIp: "40.1.1.1-40.1.1.10",
DestPort: "120-220,320,420-520", SourcePort: "130-230,330,430-530",
State: "enable",
IsDefault: false, RuleNumber: 1122,
Protocol: "tcp", Action: "drop",
}
ruleInfo6 := ruleInfo{
SourceIp: "30.1.1.1-30.1.1.11", DestIp: "40.1.1.1-40.1.1.11",
DestPort: "120-220", SourcePort: "130-230",
State: "disable",
IsDefault: false, RuleNumber: 1123,
Protocol: "tcp", Action: "drop",
}
rulesApply := []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5, ruleInfo6}
rules := []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3, ruleInfo4, ruleInfo5}
ruleSetName1 := buildRuleSetName(utils.PrivateNicsForUT[0].Name, FIREWALL_DIRECTION_IN)
ruleSetName2 := buildRuleSetName(utils.PubNicForUT.Name, FIREWALL_DIRECTION_OUT)
By("####test applyUserRules re-install rules #######")
ruleSetInfo1 := ruleSetInfo{
Name: "rs1",
ActionType: "accept",
EnableDefaultLog: false,
Rules: rulesApply}
ruleSetInfo2 := ruleSetInfo{
Name: "rs2",
ActionType: "reject",
EnableDefaultLog: false,
Rules: rulesApply,
}
ethRuleSetRef3 := ethRuleSetRef{
Mac: utils.PrivateNicsForUT[0].Mac,
Forward: FIREWALL_DIRECTION_IN,
RuleSetInfo: ruleSetInfo1,
}
ethRuleSetRef4 := ethRuleSetRef{
Mac: utils.PubNicForUT.Mac,
Forward: FIREWALL_DIRECTION_OUT,
RuleSetInfo: ruleSetInfo2,
}
refs2 := []ethRuleSetRef{ethRuleSetRef3, ethRuleSetRef4}
acmd := applyUserRuleCmd{Refs: refs2}
err := applyUserRules(&acmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("applyUserRules re-install rules: %+v", err))
// check iptables default rule
checkDefaultAction(ruleSetName1, "accept")
checkDefaultAction(ruleSetName2, "reject")
// check iptables rules
checkIptableRule(ruleSetName1, rules, false)
checkIptableRule(ruleSetName2, rules, false)
By("####test applyUserRules re-install rules 2 #######")
err = applyUserRules(&acmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("applyUserRules re-install rules: %+v", err))
checkIptableRule(ruleSetName1, rules, false)
checkIptableRule(ruleSetName2, rules, false)
/* applyUserRules command will remove all rule, and add new rules */
By("####test applyUserRules re-install rules 3 #######")
ruleSetInfo1 = ruleSetInfo{
Name: "rs1",
ActionType: "accept",
EnableDefaultLog: false,
Rules: nil}
ruleSetInfo2 = ruleSetInfo{
Name: "rs2",
ActionType: "reject",
EnableDefaultLog: false,
Rules: nil,
}
ethRuleSetRef3 = ethRuleSetRef{
Mac: utils.PrivateNicsForUT[0].Mac,
Forward: FIREWALL_DIRECTION_IN,
RuleSetInfo: ruleSetInfo1,
}
ethRuleSetRef4 = ethRuleSetRef{
Mac: utils.PubNicForUT.Mac,
Forward: FIREWALL_DIRECTION_OUT,
RuleSetInfo: ruleSetInfo2,
}
refs2 = []ethRuleSetRef{ethRuleSetRef3, ethRuleSetRef4}
acmd = applyUserRuleCmd{Refs: refs2}
log.Debugf("start apply user rule")
err = applyUserRules(&acmd)
log.Debugf("apply user rule error is %v", err)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("applyUserRules re-install rules: %+v", err))
// check iptables default rule
checkDefaultAction(ruleSetName1, "accept")
checkDefaultAction(ruleSetName2, "reject")
checkIptableRule(ruleSetName1, rules, true)
checkIptableRule(ruleSetName2, rules, true)
})
/* when attach a vpc nic to firewall or add new rules to firewall */
It("[IPTABLES]FIREWALL : test rules add/remove", func() {
ruleInfo1 := ruleInfo{
SourceIp: "192.168.1.100,192.168.101.0/24,192.168.100.1-192.168.100.10", DestIp: "192.168.1.101,192.168.201.0/24,192.168.100.11-192.168.100.20",
DestPort: "1000", SourcePort: "10000",
State: "enable",
IsDefault: false, RuleNumber: 2110,
AllowStates: "new,established,invalid,related",
Protocol: "tcp", Action: "accept"}
ruleInfo2 := ruleInfo{
SourceIp: "10.10.10.10-10.10.10.100", DestIp: "10.20.20.20-10.20.20.200",
DestPort: "140-240,340,440-540", SourcePort: "140-240,340,440-540",
State: "enable",
IsDefault: false, RuleNumber: 1122,
Protocol: "udp", Action: "accept",
}
ruleInfo3 := ruleInfo{
SourceIp: "10.10.10.10-10.10.10.100", DestIp: "10.20.20.20-10.20.20.200",
DestPort: "140-240,340,440-540", SourcePort: "140-240,340,440-540",
State: "disable",
IsDefault: false, RuleNumber: 1123,
Protocol: "tcp", Action: "accept",
}
rulesCreate := []ruleInfo{ruleInfo1, ruleInfo2, ruleInfo3}
rules := []ruleInfo{ruleInfo1, ruleInfo2}
ruleSet := ruleSetInfo{
Name: "rs1",
ActionType: "accept",
EnableDefaultLog: false,
Rules: rulesCreate}
ethRuleSetRef1 := ethRuleSetRef{
Mac: utils.PrivateNicsForUT[0].Mac,
Forward: FIREWALL_DIRECTION_IN,
RuleSetInfo: ruleSet,
}
ethRuleSetRef2 := ethRuleSetRef{
Mac: utils.PrivateNicsForUT[0].Mac,
Forward: FIREWALL_DIRECTION_OUT,
RuleSetInfo: ruleSet,
}
ruleSetName1 := buildRuleSetName(utils.PrivateNicsForUT[0].Name, FIREWALL_DIRECTION_IN)
ruleSetName2 := buildRuleSetName(utils.PrivateNicsForUT[0].Name, FIREWALL_DIRECTION_OUT)
By("####test add rule to firewall #######")
createRuleCmd2 := &createRuleCmd{Ref: ethRuleSetRef1}
err := createRule(createRuleCmd2)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("createRuleByIptables add rules failed: %+v", err))
createRuleCmd3 := &createRuleCmd{Ref: ethRuleSetRef2}
err3 := createRule(createRuleCmd3)
gomega.Expect(err3).To(gomega.BeNil(), fmt.Sprintf("createRuleByIptables add rules failed: %+v", err))
checkDefaultAction(ruleSetName1, "accept")
checkCreateRuleByIptables(utils.PrivateNicsForUT[0].Name, ruleSetName1, ethRuleSetRef1)
checkCreateRuleByIptables(utils.PrivateNicsForUT[0].Name, ruleSetName2, ethRuleSetRef2)
checkIptableRule(ruleSetName1, rules, false)
By("####test change rule state to disable #######")
cCmd1 := changeRuleStateCmd{Rule: ruleInfo1, State: "disable", Mac: utils.PrivateNicsForUT[0].Mac, Forward: FIREWALL_DIRECTION_IN}
cCmd2 := changeRuleStateCmd{Rule: ruleInfo2, State: "disable", Mac: utils.PrivateNicsForUT[0].Mac, Forward: FIREWALL_DIRECTION_IN}
changeRuleState(&cCmd1)
changeRuleState(&cCmd2)
checkIptableRule(ruleSetName1, rules, true)
By("####test change rule state to enable #######")
cCmd1.State = "enable"
cCmd2.State = "enable"
changeRuleState(&cCmd1)
changeRuleState(&cCmd2)
checkIptableRule(ruleSetName1, rules, false)
By("####test deleteRule #######")
deleteRuleCmd1 := deleteRuleCmd{Ref: ethRuleSetRef1}
deleteRule(&deleteRuleCmd1)
checkIptableRule(ruleSetName1, rules, true)
deleteRuleCmd2 := deleteRuleCmd{Ref: ethRuleSetRef2}
deleteRule(&deleteRuleCmd2)
checkIptableRule(ruleSetName2, rules, true)
})
It("[IPTABLES]FIREWALL : test update firewall", func() {
ruleInfo1 := ruleInfo{
SourceIp: "10.2.2.1-10.2.2.10", DestIp: "20.2.2.1-20.2.2.10",
DestPort: "100-200,300,400-500", SourcePort: "150-250,350,450-550",
State: "enable",
IsDefault: false, RuleNumber: 1234,
Protocol: "udp", Action: "accept",
}
ruleInfo2 := ruleInfo{
SourceIp: "10.2.2.1-10.2.2.10,172.16.90.157,192.168.100.0/24", DestIp: "20.2.2.1-20.2.2.10,172.16.90.100,192.168.10.0/24",
DestPort: "100-200,300", SourcePort: "150-250",
State: "enable",
IsDefault: false, RuleNumber: 1234,
Protocol: "udp", Action: "accept",
}
ruleInfo3 := ruleInfo{
SourceIp: "10.2.2.1-10.2.2.10", DestIp: "20.2.2.1-20.2.2.10",
DestPort: "100-200,300,400-500", SourcePort: "150-250,350,450-550",
State: "enable",
IsDefault: false, RuleNumber: 1235,
Protocol: "udp", Action: "accept",
}
ruleSet := ruleSetInfo{
Name: "rs10",
ActionType: "accept",
EnableDefaultLog: false,
}
ethRuleSetRef := ethRuleSetRef{
Mac: utils.PrivateNicsForUT[0].Mac,
Forward: FIREWALL_DIRECTION_IN,
RuleSetInfo: ruleSet,
}
ruleSetName1 := buildRuleSetName(utils.PrivateNicsForUT[0].Name, FIREWALL_DIRECTION_IN)
cmd := &createRuleCmd{Ref: ethRuleSetRef}
log.Debugf("####test add oldRule start #######")
cmd.Ref.RuleSetInfo.Rules = []ruleInfo{ruleInfo1, ruleInfo3}
err := createRule(cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("createRuleByIptables add rules failed: %+v", err))
checkCreateRuleByIptables(utils.PrivateNicsForUT[0].Name, ruleSetName1, cmd.Ref)
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo1, ruleInfo3}, false)
log.Debugf("####test add newRule, oldRule should be deleted #######")
cmd.Ref.RuleSetInfo.Rules = []ruleInfo{ruleInfo2, ruleInfo3}
err = createRule(cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("createRuleByIptables add rules failed: %+v", err))
checkCreateRuleByIptables(utils.PrivateNicsForUT[0].Name, ruleSetName1, cmd.Ref)
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo2, ruleInfo3}, false)
log.Debugf("####test delete newRule start####")
ethRuleSetRef.RuleSetInfo.Rules = []ruleInfo{ruleInfo2, ruleInfo3}
deleteRuleCmd := &deleteRuleCmd{Ref: ethRuleSetRef}
deleteRule(deleteRuleCmd)
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo2}, true)
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo3}, true)
})
/* change firewall default action */
It("[IPTABLES]FIREWALL : test change default action", func() {
ruleSetName := buildRuleSetName(utils.PrivateNicsForUT[0].Name, "IN")
updateRuleSetCmd1 := updateRuleSetCmd{Mac: utils.PrivateNicsForUT[0].Mac, Forward: "IN", ActionType: "reject"}
updateRuleSet(&updateRuleSetCmd1)
checkDefaultAction(ruleSetName, "reject")
updateRuleSetCmd1 = updateRuleSetCmd{Mac: utils.PrivateNicsForUT[0].Mac, Forward: "IN", ActionType: "drop"}
updateRuleSet(&updateRuleSetCmd1)
checkDefaultAction(ruleSetName, "drop")
updateRuleSetCmd1 = updateRuleSetCmd{Mac: utils.PrivateNicsForUT[0].Mac, Forward: "IN", ActionType: "accept"}
updateRuleSet(&updateRuleSetCmd1)
checkDefaultAction(ruleSetName, "accept")
})
/* delete firewall */
It("[IPTABLES]FIREWALL : test delete firewall", func() {
//ethInfo+table -> ref getFirewallConfig(getConfigCmd1)
nicTypeInfo1 := nicTypeInfo{Mac: utils.PubNicForUT.Mac, NicType: "Public"}
nicTypeInfo2 := nicTypeInfo{Mac: utils.PrivateNicsForUT[0].Mac, NicType: "Private"}
nicTypeInfo := []nicTypeInfo{nicTypeInfo1, nicTypeInfo2}
//delete firewall config
By("TestCreateUserRule deleteUserRule ")
getConfigCmd1 := getConfigCmd{nicTypeInfo}
deleteUserRule(&getConfigCmd1)
checkDeleteUserRuleByIpTables()
})
It("[IPTABLES]FIREWALL : test modify firewall rule and change state", func() {
ruleInfo1 := ruleInfo{
SourceIp: "10.10.10.1,10.10.10.10-10.10.10.20", DestIp: "20.20.20.1,20.20.20.10-20.20.20.20",
State: "enable",
IsDefault: false, RuleNumber: 1234,
Protocol: "udp", Action: "accept",
}
ruleSet := ruleSetInfo{
Name: "rs10",
ActionType: "accept",
EnableDefaultLog: false,
}
ethRuleSetRef := ethRuleSetRef{
Mac: utils.PrivateNicsForUT[0].Mac,
Forward: FIREWALL_DIRECTION_IN,
RuleSetInfo: ruleSet,
}
ruleSetName1 := buildRuleSetName(utils.PrivateNicsForUT[0].Name, FIREWALL_DIRECTION_IN)
cmd := &createRuleCmd{Ref: ethRuleSetRef}
cmd.Ref.RuleSetInfo.Rules = []ruleInfo{ruleInfo1}
err := createRule(cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("createRuleByIptables add rules failed: %+v", err))
checkCreateRuleByIptables(utils.PrivateNicsForUT[0].Name, ruleSetName1, cmd.Ref)
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo1}, false)
ruleInfo1.State = "disable"
cmd.Ref.RuleSetInfo.Rules = []ruleInfo{ruleInfo1}
err = createRule(cmd)
gomega.Expect(err).To(gomega.BeNil(), fmt.Sprintf("createRuleByIptables add rules failed: %+v", err))
checkIptableRule(ruleSetName1, []ruleInfo{ruleInfo1}, true)
})
It("[IPTABLES]FIREWALL : firewall_iptables destroying env", func() {
utils.CleanTestEnvForUT()
})
})
func checkIptableRuleByRuleNum(ruleSetName string, rules []ruleInfo, delete bool) {
table := utils.NewIpTables(utils.FirewallTable)
for _, r := range rules {
rule := getIpTableRuleFromRule(ruleSetName, r)
res := false
for _, tr := range table.Rules {
if rule.GetChainName() != tr.GetChainName() {
continue
}
if rule.GetRuleNumber() == tr.GetRuleNumber() {
res = true
break
}
}
if delete {
gomega.Expect(res).To(gomega.BeFalse(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
} else {
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
}
}
//check ruleinfo -> iptablerule
func checkIptableRule(ruleSetName string, rules []ruleInfo, delete bool) {
table := utils.NewIpTables(utils.FirewallTable)
for _, r := range rules {
rule := getIpTableRuleFromRule(ruleSetName, r)
res := table.Check(rule)
if delete {
gomega.Expect(res).To(gomega.BeFalse(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
} else {
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
if r.EnableLog {
rule1 := *rule
rule1.SetAction(utils.IPTABLES_ACTION_LOG)
res := table.Check(rule)
if delete {
gomega.Expect(res).To(gomega.BeFalse(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
} else {
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
}
}
}
func checkApplyUserRuleByIpTables(cmd *applyUserRuleCmd) {
table := utils.NewIpTables(utils.FirewallTable)
for _, ref := range cmd.Refs {
nicName, err := utils.GetNicNameByMac(ref.Mac)
utils.PanicOnError(err)
ruleSetName := buildRuleSetName(nicName, ref.Forward)
//create ruleSet and add last rule
table.AddChain(ruleSetName)
rule := utils.NewDefaultIpTableRule(ruleSetName, utils.IPTABLES_RULENUMBER_MAX)
rule.SetAction(ref.RuleSetInfo.ActionType)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
/* check chain */
if ref.Forward == FIREWALL_DIRECTION_OUT {
rule := utils.NewIpTableRule(utils.VYOS_FWD_OUT_ROOT_CHAIN)
rule.SetAction(ruleSetName)
rule.SetOutNic(nicName)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
} else if ref.Forward == FIREWALL_DIRECTION_IN {
rule := utils.NewIpTableRule(utils.VYOS_FWD_ROOT_CHAIN)
rule.SetAction(ruleSetName)
rule.SetOutNic(nicName)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
/* check rule */
for _, r := range ref.RuleSetInfo.Rules {
rule := getIpTableRuleFromRule(ruleSetName, r)
res = table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
if r.EnableLog {
rule1 := rule.Copy()
rule1.SetAction(utils.IPTABLES_ACTION_LOG)
res = table.Check(rule1)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule1.String()))
}
}
}
}
func checkCreateRuleByIptables(nicName, ruleSetName string, ref ethRuleSetRef) {
table := utils.NewIpTables(utils.FirewallTable)
if ref.Forward == FIREWALL_DIRECTION_OUT {
rule := utils.NewIpTableRule(utils.VYOS_FWD_OUT_ROOT_CHAIN)
rule.SetAction(ruleSetName)
rule.SetOutNic(nicName)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
} else if ref.Forward == FIREWALL_DIRECTION_IN {
rule := utils.NewIpTableRule(utils.VYOS_FWD_ROOT_CHAIN)
rule.SetAction(ruleSetName)
rule.SetInNic(nicName)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
if ref.Forward == FIREWALL_DIRECTION_OUT {
rule := utils.NewDefaultIpTableRule(ruleSetName, utils.IPTABLES_RULENUMBER_MAX)
rule.SetAction(utils.IPTABLES_ACTION_RETURN)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
rule := utils.NewDefaultIpTableRule(ruleSetName, utils.IPTABLES_RULENUMBER_MAX)
rule.SetAction(getIptablesRuleActionFromRuleAction(ref.RuleSetInfo.ActionType))
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
func checkDeleteUserRuleByIpTables() {
table := utils.NewIpTables(utils.FirewallTable)
inChainNames := utils.GetFirewallInputChains(table)
for _, name := range inChainNames {
rule := utils.NewDefaultIpTableRule(name, utils.IPTABLES_RULENUMBER_9999)
rule.SetAction(utils.IPTABLES_ACTION_RETURN)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
outChainNames := utils.GetFirewallOutputChains(table)
for _, name := range outChainNames {
rule := utils.NewDefaultIpTableRule(name, utils.IPTABLES_RULENUMBER_MAX)
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeFalse(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
}
func checkDefaultAction(ruleSetName, action string) {
table := utils.NewIpTables(utils.FirewallTable)
rule := utils.NewDefaultIpTableRule(ruleSetName, utils.IPTABLES_RULENUMBER_MAX)
rule.SetAction(getIptablesRuleActionFromRuleAction(action))
res := table.Check(rule)
gomega.Expect(res).To(gomega.BeTrue(), fmt.Sprintf("firewall rule [%s] check failed", rule.String()))
}
func checkDefaultNicRules(nicInfo nicTypeInfo, refs []ethRuleSetRef) {
gomega.Expect(len(refs) == 3).To(gomega.BeTrue(), fmt.Sprintf("nic has %d rulesets", len(refs)))
for _, ref := range refs {
gomega.Expect(ref.Mac == nicInfo.Mac).To(gomega.BeTrue(),
fmt.Sprintf("ref mac address: %s different from nic mac:%s", ref.Mac, nicInfo.Mac))
if ref.Forward == "out" {
gomega.Expect(len(ref.RuleSetInfo.Rules) == 0).To(gomega.BeTrue(),
fmt.Sprintf("there are %d rule in out direction", len(ref.RuleSetInfo.Rules)))
gomega.Expect(ref.RuleSetInfo.ActionType == "accept").To(gomega.BeTrue(),
fmt.Sprintf("default action type:%s ", ref.RuleSetInfo.ActionType))
gomega.Expect(ref.RuleSetInfo.EnableDefaultLog).To(gomega.BeFalse(),
fmt.Sprintf("enable log %v", ref.RuleSetInfo.EnableDefaultLog))
} else if ref.Forward == "local" {
gomega.Expect(len(ref.RuleSetInfo.Rules) == 3).To(gomega.BeTrue(),
fmt.Sprintf("there are %d rule in local direction", len(ref.RuleSetInfo.Rules)))
gomega.Expect(ref.RuleSetInfo.ActionType == "reject").To(gomega.BeTrue(),
fmt.Sprintf("default action type:%s ", ref.RuleSetInfo.ActionType))
gomega.Expect(ref.RuleSetInfo.EnableDefaultLog).To(gomega.BeFalse(),
fmt.Sprintf("enable log %v", ref.RuleSetInfo.EnableDefaultLog))
nicName, _ := utils.GetNicNameByMac(nicInfo.Mac)
ip, _ := utils.GetIpByNicName(nicName)
r1 := ref.RuleSetInfo.Rules[0]
gomega.Expect(r1.RuleNumber == 1).To(gomega.BeTrue(),
fmt.Sprintf("local direction 1st rulenumber [%+v]", r1))
gomega.Expect(r1.AllowStates == "related,established").To(gomega.BeTrue(),
fmt.Sprintf("local direction 1st allowstate %s", r1.AllowStates))
gomega.Expect(r1.Action == strings.ToLower(utils.IPTABLES_ACTION_ACCEPT)).To(gomega.BeTrue(),
fmt.Sprintf("in direction 1st action [%+v]", r1.Action))
r2 := ref.RuleSetInfo.Rules[1]
gomega.Expect(r2.RuleNumber == 2).To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd rulenumber %d", r2.RuleNumber))
gomega.Expect(r2.AllowStates == "").To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd allowstate %s", r2.AllowStates))
gomega.Expect(r2.Action == strings.ToLower(utils.IPTABLES_ACTION_ACCEPT)).To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd action [%+v]", r2.Action))
gomega.Expect(r2.Protocol == "ICMP").To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd Protocol [%+v]", r2.Protocol))
gomega.Expect(r2.DestIp == ip).To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd DestIp [%+v]", r2.DestIp))
r3 := ref.RuleSetInfo.Rules[2]
gomega.Expect(r3.RuleNumber == 3).To(gomega.BeTrue(),
fmt.Sprintf("in direction 3rd rulenumber %d", r3.RuleNumber))
gomega.Expect(r3.AllowStates == "").To(gomega.BeTrue(),
fmt.Sprintf("in direction 3rd allowstate %s", r3.AllowStates))
gomega.Expect(r3.Action == strings.ToLower(utils.IPTABLES_ACTION_REJECT)).To(gomega.BeTrue(),
fmt.Sprintf("in direction 3rd action [%+v]", r3.Action))
gomega.Expect(r3.DestPort == "22").To(gomega.BeTrue(),
fmt.Sprintf("in direction 3rd dport [%+v]", r3.DestPort))
gomega.Expect(r3.Protocol == "TCP").To(gomega.BeTrue(),
fmt.Sprintf("in direction 3rd Protocol [%+v]", r3.Protocol))
gomega.Expect(r3.DestIp == ip).To(gomega.BeTrue(),
fmt.Sprintf("in direction 3rd DestIp [%+v]", r3.DestIp))
} else {
gomega.Expect(len(ref.RuleSetInfo.Rules) > 2).To(gomega.BeTrue(),
fmt.Sprintf("there are %d rule in in direction", len(ref.RuleSetInfo.Rules)))
gomega.Expect(ref.RuleSetInfo.ActionType == "reject").To(gomega.BeTrue(),
fmt.Sprintf("default action type:%s ", ref.RuleSetInfo.ActionType))
gomega.Expect(ref.RuleSetInfo.EnableDefaultLog).To(gomega.BeFalse(),
fmt.Sprintf("enable log %v", ref.RuleSetInfo.EnableDefaultLog))
r1 := ref.RuleSetInfo.Rules[0]
gomega.Expect(r1.RuleNumber == utils.FORWARD_CHAIN_SYSTEM_RULE_RULE_NUMBER_MIN).To(gomega.BeTrue(),
fmt.Sprintf("in direction 1st rulenumber [%+v]", r1))
gomega.Expect(r1.AllowStates == "related,established").To(gomega.BeTrue(),
fmt.Sprintf("in direction 1st allowstate %s", r1.AllowStates))
gomega.Expect(r1.Action == strings.ToLower(utils.IPTABLES_ACTION_ACCEPT)).To(gomega.BeTrue(),
fmt.Sprintf("in direction 1st action [%+v]", r1.Action))
r2 := ref.RuleSetInfo.Rules[len(ref.RuleSetInfo.Rules)-1]
gomega.Expect(r2.RuleNumber == utils.IPTABLES_RULENUMBER_9999).To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd rulenumber %d", r2.RuleNumber))
gomega.Expect(r2.AllowStates == "new").To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd allowstate %s", r2.AllowStates))
gomega.Expect(r2.Action == strings.ToLower(utils.IPTABLES_ACTION_ACCEPT)).To(gomega.BeTrue(),
fmt.Sprintf("in direction 2nd action [%+v]", r1.Action))
}
}
}
func checkEipRulesInChain(isPubNic bool, nicInfo nicTypeInfo, refs []ethRuleSetRef) {
for _, ref := range refs {
if ref.Forward == "in" {
r1 := ref.RuleSetInfo.Rules[1]
gomega.Expect(r1.RuleNumber == 5001).To(gomega.BeTrue(),
fmt.Sprintf("in direction eip rule rulenumber [%+v]", r1))
gomega.Expect(r1.SourcePort == "").To(gomega.BeTrue(),
fmt.Sprintf("in direction eip SourcePort [%+v]", r1.SourcePort))
gomega.Expect(r1.DestPort == "").To(gomega.BeTrue(),
fmt.Sprintf("in direction eip DestPort [%+v]", r1.DestPort))
if isPubNic {
gomega.Expect(r1.DestIp == "eip-group").To(gomega.BeTrue(),
fmt.Sprintf("in direction eip DestIp [%+v]", r1.DestIp))
} else {
gomega.Expect(r1.SourceIp == "eip-group").To(gomega.BeTrue(),
fmt.Sprintf("in direction eip SourceIp [%+v]", r1.SourceIp))
}
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zstackio/zstack-vyos.git
git@gitee.com:zstackio/zstack-vyos.git
zstackio
zstack-vyos
zstack-vyos
master

搜索帮助