You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
package nat |
|
|
|
import ( |
|
"errors" |
|
"net" |
|
) |
|
|
|
var ( |
|
// private24BitBlock contains the set of private IPv4 addresses within |
|
// the 10.0.0.0/8 adddress space. |
|
private24BitBlock *net.IPNet |
|
|
|
// private20BitBlock contains the set of private IPv4 addresses within |
|
// the 172.16.0.0/12 address space. |
|
private20BitBlock *net.IPNet |
|
|
|
// private16BitBlock contains the set of private IPv4 addresses within |
|
// the 192.168.0.0/16 address space. |
|
private16BitBlock *net.IPNet |
|
|
|
// ErrMultipleNAT is an error returned when multiple NATs have been |
|
// detected. |
|
ErrMultipleNAT = errors.New("multiple NATs detected") |
|
) |
|
|
|
func init() { |
|
_, private24BitBlock, _ = net.ParseCIDR("10.0.0.0/8") |
|
_, private20BitBlock, _ = net.ParseCIDR("172.16.0.0/12") |
|
_, private16BitBlock, _ = net.ParseCIDR("192.168.0.0/16") |
|
} |
|
|
|
// Traversal is an interface that brings together the different NAT traversal |
|
// techniques. |
|
type Traversal interface { |
|
// ExternalIP returns the external IP address. |
|
ExternalIP() (net.IP, error) |
|
|
|
// AddPortMapping adds a port mapping for the given port between the |
|
// private and public addresses. |
|
AddPortMapping(port uint16) error |
|
|
|
// DeletePortMapping deletes a port mapping for the given port between |
|
// the private and public addresses. |
|
DeletePortMapping(port uint16) error |
|
|
|
// ForwardedPorts returns the ports currently being forwarded using NAT |
|
// traversal. |
|
ForwardedPorts() []uint16 |
|
|
|
// Name returns the name of the specific NAT traversal technique used. |
|
Name() string |
|
} |
|
|
|
// isPrivateIP determines if the IP is private. |
|
func isPrivateIP(ip net.IP) bool { |
|
return private24BitBlock.Contains(ip) || |
|
private20BitBlock.Contains(ip) || private16BitBlock.Contains(ip) |
|
}
|
|
|