firewalld_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //go:build linux
  2. package iptables
  3. import (
  4. "net"
  5. "strconv"
  6. "testing"
  7. "github.com/godbus/dbus/v5"
  8. )
  9. func skipIfNoFirewalld(t *testing.T) {
  10. t.Helper()
  11. conn, err := dbus.SystemBus()
  12. if err != nil {
  13. t.Skipf("cannot connect to D-bus system bus: %v", err)
  14. }
  15. defer conn.Close()
  16. var zone string
  17. err = conn.Object(dbusInterface, dbusPath).Call(dbusInterface+".getDefaultZone", 0).Store(&zone)
  18. if err != nil {
  19. t.Skipf("firewalld is not running: %v", err)
  20. }
  21. }
  22. func TestFirewalldInit(t *testing.T) {
  23. skipIfNoFirewalld(t)
  24. if err := firewalldInit(); err != nil {
  25. t.Fatal(err)
  26. }
  27. }
  28. func TestReloaded(t *testing.T) {
  29. iptable := GetIptable(IPv4)
  30. fwdChain, err := iptable.NewChain("FWD", Filter, false)
  31. if err != nil {
  32. t.Fatal(err)
  33. }
  34. err = iptable.ProgramChain(fwdChain, bridgeName, false, true)
  35. if err != nil {
  36. t.Fatal(err)
  37. }
  38. defer fwdChain.Remove()
  39. // copy-pasted from iptables_test:TestLink
  40. ip1 := net.ParseIP("192.168.1.1")
  41. ip2 := net.ParseIP("192.168.1.2")
  42. const port = 1234
  43. const proto = "tcp"
  44. err = fwdChain.Link(Append, ip1, ip2, port, proto, bridgeName)
  45. if err != nil {
  46. t.Fatal(err)
  47. } else {
  48. // to be re-called again later
  49. OnReloaded(func() { fwdChain.Link(Append, ip1, ip2, port, proto, bridgeName) })
  50. }
  51. rule1 := []string{
  52. "-i", bridgeName,
  53. "-o", bridgeName,
  54. "-p", proto,
  55. "-s", ip1.String(),
  56. "-d", ip2.String(),
  57. "--dport", strconv.Itoa(port),
  58. "-j", "ACCEPT",
  59. }
  60. if !iptable.Exists(fwdChain.Table, fwdChain.Name, rule1...) {
  61. t.Fatal("rule1 does not exist")
  62. }
  63. // flush all rules
  64. fwdChain.Remove()
  65. reloaded()
  66. // make sure the rules have been recreated
  67. if !iptable.Exists(fwdChain.Table, fwdChain.Name, rule1...) {
  68. t.Fatal("rule1 hasn't been recreated")
  69. }
  70. }
  71. func TestPassthrough(t *testing.T) {
  72. skipIfNoFirewalld(t)
  73. rule1 := []string{
  74. "-i", "lo",
  75. "-p", "udp",
  76. "--dport", "123",
  77. "-j", "ACCEPT",
  78. }
  79. _, err := Passthrough(Iptables, append([]string{"-A"}, rule1...)...)
  80. if err != nil {
  81. t.Fatal(err)
  82. }
  83. if !GetIptable(IPv4).Exists(Filter, "INPUT", rule1...) {
  84. t.Fatal("rule1 does not exist")
  85. }
  86. }