firewalld_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. fwd, err := firewalldInit()
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. _ = fwd.conn.Close()
  29. }
  30. func TestReloaded(t *testing.T) {
  31. iptable := GetIptable(IPv4)
  32. fwdChain, err := iptable.NewChain("FWD", Filter, false)
  33. if err != nil {
  34. t.Fatal(err)
  35. }
  36. err = iptable.ProgramChain(fwdChain, bridgeName, false, true)
  37. if err != nil {
  38. t.Fatal(err)
  39. }
  40. defer fwdChain.Remove()
  41. // copy-pasted from iptables_test:TestLink
  42. ip1 := net.ParseIP("192.168.1.1")
  43. ip2 := net.ParseIP("192.168.1.2")
  44. const port = 1234
  45. const proto = "tcp"
  46. // create a dummy firewalldConnection and mark it as "running", because
  47. // OnReloaded (registerReloadCallback),
  48. fwd := &firewalldConnection{}
  49. fwd.running.Store(true)
  50. err = fwdChain.Link(Append, ip1, ip2, port, proto, bridgeName)
  51. if err != nil {
  52. t.Fatal(err)
  53. } else {
  54. // to be re-called again later
  55. fwd.registerReloadCallback(func() { fwdChain.Link(Append, ip1, ip2, port, proto, bridgeName) })
  56. }
  57. rule1 := []string{
  58. "-i", bridgeName,
  59. "-o", bridgeName,
  60. "-p", proto,
  61. "-s", ip1.String(),
  62. "-d", ip2.String(),
  63. "--dport", strconv.Itoa(port),
  64. "-j", "ACCEPT",
  65. }
  66. if !iptable.Exists(fwdChain.Table, fwdChain.Name, rule1...) {
  67. t.Fatal("rule1 does not exist")
  68. }
  69. // flush all rules
  70. fwdChain.Remove()
  71. fwd.onReload()
  72. // make sure the rules have been recreated
  73. if !iptable.Exists(fwdChain.Table, fwdChain.Name, rule1...) {
  74. t.Fatal("rule1 hasn't been recreated")
  75. }
  76. }
  77. func TestPassthrough(t *testing.T) {
  78. skipIfNoFirewalld(t)
  79. fwd, err := newConnection()
  80. if err != nil {
  81. t.Fatal(err)
  82. }
  83. defer fwd.conn.Close()
  84. rule1 := []string{
  85. "-i", "lo",
  86. "-p", "udp",
  87. "--dport", "123",
  88. "-j", "ACCEPT",
  89. }
  90. _, err = fwd.passthrough(IPv4, append([]string{"-A"}, rule1...)...)
  91. if err != nil {
  92. t.Error(err)
  93. }
  94. if !GetIptable(IPv4).Exists(Filter, "INPUT", rule1...) {
  95. t.Error("rule1 does not exist")
  96. }
  97. }
  98. // TestFirewalldUninitialized checks that calling methods, such as isRunning()
  99. // on an empty, uninitialized firewalldConnection doesn't panic, and returns
  100. // the expected status.
  101. func TestFirewalldUninitialized(t *testing.T) {
  102. var fwd *firewalldConnection
  103. if fwd.isRunning() {
  104. t.Error("did not expect an uninitialized firewalldConnection to be running")
  105. }
  106. err := fwd.addInterface("anything")
  107. if err != nil {
  108. t.Errorf("unexpected error when calling addInterface on an uninitialized firewalldConnection: %v", err)
  109. }
  110. err = fwd.delInterface("anything")
  111. if err != nil {
  112. t.Errorf("unexpected error when calling delInterface on an uninitialized firewalldConnection: %v", err)
  113. }
  114. fwd.registerReloadCallback(func() {})
  115. _, err = fwd.passthrough(IPv4)
  116. if err != nil {
  117. t.Errorf("unexpected error when calling passthrough on an uninitialized firewalldConnection: %v", err)
  118. }
  119. }