USER Namespace
即进程运行在一个新的namespace中,且该namespace中的User ID和Group IDA在该namespace内外可以不同,可以实现在namspace的用户是root但是对应到宿主机并不是root
Cloneflags增加一个syscall.CLONE_NEWUSER即可
代码
package main
import (
"os/exec"
"os"
"syscall"
"log"
)
func main(){
cmd:=exec.Command("sh")
cmd.SysProcAttr=&syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWUTS|syscall.CLONE_NEWNS|syscall.CLONE_NEWUSER,}
cmd.Stdin=os.Stdin
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
if err:=cmd.Run();err!=nil{
log.Fatal(err)
}
}
NETWORK Namespace
Network Namespace 是用来隔离网络设备、 IP 地址端口 等网络械的 Namespace
即进程在namespace中拥有独立的(虚拟的)网络设备。并且。在宿主机上搭建网桥后,就能很方便地实现容器之间的通信,而且不同容器上的应用可以使用相同的端口
Cloneflags增加syscall.CLONE_ NEWNET即可
发现在network namespace的进程没有网络设备(可能默认就是没有,需要相关初始化),宿主机依然存在网络设备
代码块
package main
import (
"os/exec"
"os"
"syscall"
"log"
)
func main(){
cmd:=exec.Command("sh")
cmd.SysProcAttr=&syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWIPC|syscall.CLONE_NEWPID|syscall.CLONE_NEWUTS|syscall.CLONE_NEWNS|syscall.CLONE_NEWUSER|syscall.CLONE_NEWUSER|syscall.CLONE_NEWNET,}
cmd.Stdin=os.Stdin
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
if err:=cmd.Run();err!=nil{
log.Fatal(err)
}
}