wireguard_integration_test.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package vpn
  2. import (
  3. "github.com/vishvananda/netlink"
  4. "os"
  5. "os/exec"
  6. "path/filepath"
  7. "strings"
  8. "testing"
  9. )
  10. func TestWireGuardEditAndClearingInNamespace(t *testing.T) {
  11. if os.Getenv("DEBTIK_WG_INTEGRATION") != "1" {
  12. t.Skip("isolated mount/network namespaces required")
  13. }
  14. for _, target := range []string{"/etc/proxmox-router/vpn", "/etc/wireguard"} {
  15. if err := exec.Command("mount", "--bind", t.TempDir(), target).Run(); err != nil {
  16. t.Fatal(err)
  17. }
  18. }
  19. bin := t.TempDir()
  20. if err := os.WriteFile(filepath.Join(bin, "systemctl"), []byte("#!/bin/sh\nexit 0\n"), 0755); err != nil {
  21. t.Fatal(err)
  22. }
  23. t.Setenv("PATH", bin+":"+os.Getenv("PATH"))
  24. m := &WireGuardManager{}
  25. req := SaveWireGuardInterfaceRequest{WireGuardInterface: WireGuardInterface{Name: "wg-audit0", Address: "10.99.241.1/30", MTU: 1420}}
  26. if err := m.SaveInterface(req); err != nil {
  27. t.Fatal(err)
  28. }
  29. before, err := netlink.LinkByName("wg-audit0")
  30. if err != nil {
  31. t.Fatal(err)
  32. }
  33. key := m.interfaces[0].PrivateKey
  34. req.Comment = "comment only"
  35. if err := m.SaveInterface(req); err != nil {
  36. t.Fatal(err)
  37. }
  38. after, err := netlink.LinkByName("wg-audit0")
  39. if err != nil {
  40. t.Fatal(err)
  41. }
  42. if before.Attrs().Index != after.Attrs().Index || key != m.interfaces[0].PrivateKey {
  43. t.Fatal("comment edit restarted interface or changed key")
  44. }
  45. psk, pub, err := m.GenerateKeyPair()
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. peer := SaveWireGuardPeerRequest{WireGuardPeer: WireGuardPeer{Interface: "wg-audit0", PublicKey: pub, PresharedKey: psk, AllowedIPs: []string{"192.0.2.0/24"}, EndpointAddress: "192.0.2.1", EndpointPort: 51820, PersistentKeepalive: 25}}
  50. if err := m.SavePeer(peer); err != nil {
  51. t.Fatal(err)
  52. }
  53. peer.PresharedKey = ""
  54. peer.AllowedIPs = nil
  55. peer.EndpointAddress = ""
  56. peer.EndpointPort = 0
  57. peer.PersistentKeepalive = 0
  58. if err := m.SavePeer(peer); err != nil {
  59. t.Fatal(err)
  60. }
  61. for _, field := range []string{"persistent-keepalive", "endpoints", "allowed-ips", "preshared-keys"} {
  62. out, err := exec.Command("wg", "show", "wg-audit0", field).CombinedOutput()
  63. if err != nil {
  64. t.Fatal(field, err)
  65. }
  66. text := string(out)
  67. if field == "persistent-keepalive" {
  68. if !strings.Contains(text, "off") {
  69. t.Fatal("keepalive not cleared")
  70. }
  71. } else if !strings.Contains(text, "(none)") {
  72. t.Fatal(field, "not cleared")
  73. }
  74. }
  75. }