2019-04-17 13:54:10 -04:00
|
|
|
package portmapper
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"sync"
|
|
|
|
|
2021-04-05 20:24:47 -04:00
|
|
|
"github.com/docker/docker/libnetwork/iptables"
|
|
|
|
"github.com/docker/docker/libnetwork/portallocator"
|
2019-04-17 13:54:10 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
// PortMapper manages the network address translation
|
|
|
|
type PortMapper struct {
|
|
|
|
bridgeName string
|
|
|
|
|
|
|
|
// udp:ip:port
|
|
|
|
currentMappings map[string]*mapping
|
|
|
|
lock sync.Mutex
|
|
|
|
|
|
|
|
proxyPath string
|
|
|
|
|
|
|
|
Allocator *portallocator.PortAllocator
|
|
|
|
chain *iptables.ChainInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetIptablesChain sets the specified chain into portmapper
|
|
|
|
func (pm *PortMapper) SetIptablesChain(c *iptables.ChainInfo, bridgeName string) {
|
|
|
|
pm.chain = c
|
|
|
|
pm.bridgeName = bridgeName
|
|
|
|
}
|
|
|
|
|
|
|
|
// AppendForwardingTableEntry adds a port mapping to the forwarding table
|
|
|
|
func (pm *PortMapper) AppendForwardingTableEntry(proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
|
|
|
|
return pm.forward(iptables.Append, proto, sourceIP, sourcePort, containerIP, containerPort)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeleteForwardingTableEntry removes a port mapping from the forwarding table
|
|
|
|
func (pm *PortMapper) DeleteForwardingTableEntry(proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
|
|
|
|
return pm.forward(iptables.Delete, proto, sourceIP, sourcePort, containerIP, containerPort)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pm *PortMapper) forward(action iptables.Action, proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
|
|
|
|
if pm.chain == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return pm.chain.Forward(action, sourceIP, sourcePort, proto, containerIP, containerPort, pm.bridgeName)
|
|
|
|
}
|