123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package portmapper
- import (
- "net"
- "sync"
- "github.com/docker/libnetwork/iptables"
- "github.com/docker/libnetwork/portallocator"
- )
- // 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)
- }
- // checkIP checks if IP is valid and matching to chain version
- func (pm *PortMapper) checkIP(ip net.IP) bool {
- if pm.chain == nil || pm.chain.IPTable.Version == iptables.IPv4 {
- return ip.To4() != nil
- }
- return ip.To16() != nil
- }
|