52 lines
1.1 KiB
Markdown
52 lines
1.1 KiB
Markdown
|
# netns - network namespaces in go #
|
||
|
|
||
|
The netns package provides an ultra-simple interface for handling
|
||
|
network namespaces in go. Changing namespaces requires elevated
|
||
|
privileges, so in most cases this code needs to be run as root.
|
||
|
|
||
|
## Local Build and Test ##
|
||
|
|
||
|
You can use go get command:
|
||
|
|
||
|
go get github.com/vishvananda/netns
|
||
|
|
||
|
Testing (requires root):
|
||
|
|
||
|
sudo -E go test github.com/vishvananda/netns
|
||
|
|
||
|
## Example ##
|
||
|
|
||
|
```go
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
"runtime"
|
||
|
"github.com/vishvananda/netns"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// Lock the OS Thread so we don't accidentally switch namespaces
|
||
|
runtime.LockOSThread()
|
||
|
defer runtime.UnlockOSThread()
|
||
|
|
||
|
// Save the current network namespace
|
||
|
origns, _ := netns.Get()
|
||
|
defer origns.Close()
|
||
|
|
||
|
// Create a new network namespace
|
||
|
newns, _ := netns.New()
|
||
|
netns.Set(newns)
|
||
|
defer newns.Close()
|
||
|
|
||
|
// Do something with the network namespace
|
||
|
ifaces, _ := net.Interfaces()
|
||
|
fmt.Printf("Interfaces: %v\n", ifaces)
|
||
|
|
||
|
// Switch back to the original namespace
|
||
|
netns.Set(origns)
|
||
|
}
|
||
|
|
||
|
```
|