2014-08-31 20:47:35 +00:00
|
|
|
# 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 (
|
2016-02-24 14:51:21 +00:00
|
|
|
"fmt"
|
2014-08-31 20:47:35 +00:00
|
|
|
"net"
|
|
|
|
"runtime"
|
2023-01-13 15:20:45 +00:00
|
|
|
|
2016-02-24 14:51:21 +00:00
|
|
|
"github.com/vishvananda/netns"
|
2014-08-31 20:47:35 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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()
|
|
|
|
defer newns.Close()
|
|
|
|
|
2016-04-30 05:37:23 +00:00
|
|
|
// Do something with the network namespace
|
2014-08-31 20:47:35 +00:00
|
|
|
ifaces, _ := net.Interfaces()
|
|
|
|
fmt.Printf("Interfaces: %v\n", ifaces)
|
|
|
|
|
|
|
|
// Switch back to the original namespace
|
|
|
|
netns.Set(origns)
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|