iptables_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package iptables
  2. import (
  3. "crypto/rand"
  4. "math/big"
  5. "reflect"
  6. "testing"
  7. )
  8. func randChain(t *testing.T) string {
  9. n, err := rand.Int(rand.Reader, big.NewInt(1000000))
  10. if err != nil {
  11. t.Fatalf("Failed to generate random chain name: %v", err)
  12. }
  13. return "TEST-" + n.String()
  14. }
  15. func TestChain(t *testing.T) {
  16. chain := randChain(t)
  17. ipt, err := New()
  18. if err != nil {
  19. t.Fatalf("New failed: %v", err)
  20. }
  21. // chain shouldn't exist, this will create new
  22. err = ipt.ClearChain("filter", chain)
  23. if err != nil {
  24. t.Fatalf("ClearChain (of missing) failed: %v", err)
  25. }
  26. // chain now exists
  27. err = ipt.ClearChain("filter", chain)
  28. if err != nil {
  29. t.Fatalf("ClearChain (of empty) failed: %v", err)
  30. }
  31. // put a simple rule in
  32. err = ipt.Append("filter", chain, "-s", "0.0.0.0/0", "-j", "ACCEPT")
  33. if err != nil {
  34. t.Fatalf("Append failed: %v", err)
  35. }
  36. // can't delete non-empty chain
  37. err = ipt.DeleteChain("filter", chain)
  38. if err == nil {
  39. t.Fatalf("DeleteChain of non-empty chain did not fail")
  40. }
  41. err = ipt.ClearChain("filter", chain)
  42. if err != nil {
  43. t.Fatalf("ClearChain (of non-empty) failed: %v", err)
  44. }
  45. // chain empty, should be ok
  46. err = ipt.DeleteChain("filter", chain)
  47. if err != nil {
  48. t.Fatalf("DeleteChain of empty chain failed: %v", err)
  49. }
  50. }
  51. func TestRules(t *testing.T) {
  52. chain := randChain(t)
  53. ipt, err := New()
  54. if err != nil {
  55. t.Fatalf("New failed: %v", err)
  56. }
  57. // chain shouldn't exist, this will create new
  58. err = ipt.ClearChain("filter", chain)
  59. if err != nil {
  60. t.Fatalf("ClearChain (of missing) failed: %v", err)
  61. }
  62. err = ipt.Append("filter", chain, "-s", "10.1.0.0/16", "-d", "8.8.8.8/32", "-j", "ACCEPT")
  63. if err != nil {
  64. t.Fatalf("Append failed: %v", err)
  65. }
  66. err = ipt.AppendUnique("filter", chain, "-s", "10.1.0.0/16", "-d", "8.8.8.8/32", "-j", "ACCEPT")
  67. if err != nil {
  68. t.Fatalf("AppendUnique failed: %v", err)
  69. }
  70. err = ipt.Append("filter", chain, "-s", "10.2.0.0/16", "-d", "8.8.8.8/32", "-j", "ACCEPT")
  71. if err != nil {
  72. t.Fatalf("Append failed: %v", err)
  73. }
  74. err = ipt.Insert("filter", chain, 2, "-s", "10.2.0.0/16", "-d", "9.9.9.9/32", "-j", "ACCEPT")
  75. if err != nil {
  76. t.Fatalf("Insert failed: %v", err)
  77. }
  78. err = ipt.Insert("filter", chain, 1, "-s", "10.1.0.0/16", "-d", "9.9.9.9/32", "-j", "ACCEPT")
  79. if err != nil {
  80. t.Fatalf("Insert failed: %v", err)
  81. }
  82. err = ipt.Delete("filter", chain, "-s", "10.1.0.0/16", "-d", "9.9.9.9/32", "-j", "ACCEPT")
  83. if err != nil {
  84. t.Fatalf("Insert failed: %v", err)
  85. }
  86. rules, err := ipt.List("filter", chain)
  87. if err != nil {
  88. t.Fatalf("List failed: %v", err)
  89. }
  90. expected := []string{
  91. "-N " + chain,
  92. "-A " + chain + " -s 10.1.0.0/16 -d 8.8.8.8/32 -j ACCEPT",
  93. "-A " + chain + " -s 10.2.0.0/16 -d 9.9.9.9/32 -j ACCEPT",
  94. "-A " + chain + " -s 10.2.0.0/16 -d 8.8.8.8/32 -j ACCEPT",
  95. }
  96. if !reflect.DeepEqual(rules, expected) {
  97. t.Fatalf("List mismatch: \ngot %#v \nneed %#v", rules, expected)
  98. }
  99. }