setup_ip_tables_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package bridge
  2. import (
  3. "net"
  4. "testing"
  5. "github.com/docker/libnetwork/netutils"
  6. "github.com/docker/libnetwork/pkg/iptables"
  7. )
  8. const (
  9. iptablesTestBridgeIP = "192.168.42.1"
  10. )
  11. func TestProgramIPTable(t *testing.T) {
  12. // Create a test bridge with a basic bridge configuration (name + IPv4).
  13. defer netutils.SetupTestNetNS(t)()
  14. createTestBridge(getBasicTestConfig(), &bridgeInterface{}, t)
  15. // Store various iptables chain rules we care for.
  16. rules := []struct {
  17. rule iptRule
  18. descr string
  19. }{
  20. {iptRule{table: iptables.Filter, chain: "FORWARD", args: []string{"-d", "127.1.2.3", "-i", "lo", "-o", "lo", "-j", "DROP"}}, "Test Loopback"},
  21. {iptRule{table: iptables.Nat, chain: "POSTROUTING", preArgs: []string{"-t", "nat"}, args: []string{"-s", iptablesTestBridgeIP, "!", "-o", DefaultBridgeName, "-j", "MASQUERADE"}}, "NAT Test"},
  22. {iptRule{table: iptables.Filter, chain: "FORWARD", args: []string{"-i", DefaultBridgeName, "!", "-o", DefaultBridgeName, "-j", "ACCEPT"}}, "Test ACCEPT NON_ICC OUTGOING"},
  23. {iptRule{table: iptables.Filter, chain: "FORWARD", args: []string{"-o", DefaultBridgeName, "-m", "conntrack", "--ctstate", "RELATED,ESTABLISHED", "-j", "ACCEPT"}}, "Test ACCEPT INCOMING"},
  24. {iptRule{table: iptables.Filter, chain: "FORWARD", args: []string{"-i", DefaultBridgeName, "-o", DefaultBridgeName, "-j", "ACCEPT"}}, "Test enable ICC"},
  25. {iptRule{table: iptables.Filter, chain: "FORWARD", args: []string{"-i", DefaultBridgeName, "-o", DefaultBridgeName, "-j", "DROP"}}, "Test disable ICC"},
  26. }
  27. // Assert the chain rules' insertion and removal.
  28. for _, c := range rules {
  29. assertIPTableChainProgramming(c.rule, c.descr, t)
  30. }
  31. }
  32. func TestSetupIPTables(t *testing.T) {
  33. // Create a test bridge with a basic bridge configuration (name + IPv4).
  34. defer netutils.SetupTestNetNS(t)()
  35. config := getBasicTestConfig()
  36. br := &bridgeInterface{}
  37. createTestBridge(config, br, t)
  38. // Modify iptables params in base configuration and apply them.
  39. config.EnableIPTables = true
  40. assertBridgeConfig(config, br, t)
  41. config.EnableIPMasquerade = true
  42. assertBridgeConfig(config, br, t)
  43. config.EnableICC = true
  44. assertBridgeConfig(config, br, t)
  45. config.EnableIPMasquerade = false
  46. assertBridgeConfig(config, br, t)
  47. }
  48. func getBasicTestConfig() *NetworkConfiguration {
  49. config := &NetworkConfiguration{
  50. BridgeName: DefaultBridgeName,
  51. AddressIPv4: &net.IPNet{IP: net.ParseIP(iptablesTestBridgeIP), Mask: net.CIDRMask(16, 32)}}
  52. return config
  53. }
  54. func createTestBridge(config *NetworkConfiguration, br *bridgeInterface, t *testing.T) {
  55. if err := setupDevice(config, br); err != nil {
  56. t.Fatalf("Failed to create the testing Bridge: %s", err.Error())
  57. }
  58. if err := setupBridgeIPv4(config, br); err != nil {
  59. t.Fatalf("Failed to bring up the testing Bridge: %s", err.Error())
  60. }
  61. }
  62. // Assert base function which pushes iptables chain rules on insertion and removal.
  63. func assertIPTableChainProgramming(rule iptRule, descr string, t *testing.T) {
  64. // Add
  65. if err := programChainRule(rule, descr, true); err != nil {
  66. t.Fatalf("Failed to program iptable rule %s: %s", descr, err.Error())
  67. }
  68. if iptables.Exists(rule.table, rule.chain, rule.args...) == false {
  69. t.Fatalf("Failed to effectively program iptable rule: %s", descr)
  70. }
  71. // Remove
  72. if err := programChainRule(rule, descr, false); err != nil {
  73. t.Fatalf("Failed to remove iptable rule %s: %s", descr, err.Error())
  74. }
  75. if iptables.Exists(rule.table, rule.chain, rule.args...) == true {
  76. t.Fatalf("Failed to effectively remove iptable rule: %s", descr)
  77. }
  78. }
  79. // Assert function which pushes chains based on bridge config parameters.
  80. func assertBridgeConfig(config *NetworkConfiguration, br *bridgeInterface, t *testing.T) {
  81. // Attempt programming of ip tables.
  82. err := setupIPTables(config, br)
  83. if err != nil {
  84. t.Fatalf("%v", err)
  85. }
  86. }