Documentation ¶
Overview ¶
Package network defines Gostwire's virtual network configuration and topology model and implements the discovery.
Network configuration covers (not only) IP address and route configuration, but also “netstat on drugs”: discovery of open ports and then relating them not only to processes (as “netstat” and “showsocket” do; the latter has a condemnable short name without any understanding of history, really) but also to containers.
The topology model bases on conveniently post-processed RT netlink data, taking care of netlink glitches especially with interface indices in other network namespaces. The in-memory model allows for quick topology traversal using simple pointer dereferencing.
And finally, Gostwire is fully dual-stack IPv4/IPv6 aware.
Basics ¶
In any case, any Gostwire discovery turns up a set of network namespaces, represented by type NetworkNamespace. Please note that network namespaces are flat and thus do not form any kind of hierarchy.
Each NetworkNamespace lists the network interfaces assigned to it, where the interfaces are represented by the aptly-named type Interface. NetworkNamespace also holds the IP routes (sic!) as well as open transport ports. Finally, a NetworkNamespace lists the “tenants” attached to this network stack. Here, a “tenant” is either a process at the top of a process sub-tree, still attached to this network stack, or the initial process of a container.
Depending on system configuration and process state, multiple tenants might be present. A most prominent example are the containers of a single Kubernetes pod sharing the same single network stack between themselves.
Only Interface provides information about the configured (or “assigned”) IP addresses. In contrast, routes, belong to a network stack and thus a NetworkNamespace, but not to any Interface.
Index ¶
- Constants
- func Exploded(ip net.IP) string
- func ResolveForwardedPort(forwardedPort *ForwardedPort, netns *NetworkNamespace)
- type Address
- type AddressFamily
- type Addresses
- type Bridge
- type BridgeAttrs
- type DnsConfiguration
- type ForwardedPort
- type IP
- type Interface
- type Interfaces
- type Macvlan
- type MacvlanAttrs
- type MacvlanMode
- type NSID
- type NetworkNamespace
- func (n *NetworkNamespace) DisplayName() string
- func (n *NetworkNamespace) NifInBridgedNetwork(bridge Interface, addr net.IP) Interface
- func (n *NetworkNamespace) NifList() Interfaces
- func (n *NetworkNamespace) NifWithAddress(addr net.IP) Interface
- func (n *NetworkNamespace) NifsString() string
- func (n *NetworkNamespace) OpenEthtool() (fd int, err error)
- func (n *NetworkNamespace) OpenInNetworkNamespace(opener func() error) error
- func (n *NetworkNamespace) OpenNetlink() (*netlink.Handle, error)
- func (n *NetworkNamespace) WhereIs(destIP net.IP) (*NetworkNamespace, Interface)
- type NetworkNamespaceList
- type NetworkNamespaces
- type NifAttrs
- func (n *NifAttrs) AddLabels(labels model.Labels)
- func (n *NifAttrs) HasAddress(ip net.IP) bool
- func (n *NifAttrs) Init(nlh *netlink.Handle, netns *NetworkNamespace, link netlink.Link)
- func (n *NifAttrs) Interface() Interface
- func (n *NifAttrs) Nif() *NifAttrs
- func (n *NifAttrs) ResolveRelations(allns NetworkNamespaces)
- func (n *NifAttrs) SysfsBusPath() string
- type NifDriverInfo
- type NifMaker
- type OperState
- type ProcessSocket
- type ProcessSockets
- type Protocol
- type Route
- type RouteType
- type SRIOVRole
- type SocketSimplifiedState
- type SocketState
- type Tenant
- type Tenants
- type TunTap
- type TunTapAttrs
- type TunTapMode
- type Veth
- type VethAttrs
- type Vlan
- type VlanAttrs
- type Vxlan
- type VxlanAttrs
Constants ¶
const ( UDP_ESTABLISHED = TCP_ESTABLISHED // UDP socket is connected UDP_LISTEN = TCP_CLOSE // sic! arguably semantically not 100% correct... )
UDP socket states are not defined explicitly, but instead the udp.c Linux kernel module reuses a few TCP socket states; for instance, see: https://elixir.bootlin.com/linux/v5.13.13/source/net/ipv4/udp.c#L786
const ( Unconnected = SocketSimplifiedState(0) // undefined state Connected = SocketSimplifiedState(TCP_ESTABLISHED) // both TCP and UDP sockets Listening = SocketSimplifiedState(TCP_LISTEN) // both TCP and UDP sockets )
Gostwire's simplified socket states; please note that the concept of "connected" versus "listen" really doesn't map well onto UDP socket. What Gostwire considers to be a "listening" UDP socket is any open UDP socket that isn't connected to a specific remote socket. Connecting a UDP socket here means that the remote peer address has been set and the network stack filters out (throws away) any UDP packets reaching the socket but originating from sources other than the set remote peer address.
const GostwireInternalBridgeKey = "gostwire/bridge/internal"
GostwireInternalBridgeKey specifies the label key indicating if a bridge belongs to a Docker network that has been configured as "internal". If present, it has an empty value.
const NSID_NONE = ^NSID(0)
NSID_NONE is the Linux' kernel telling us that there ain't no such peer network namespace.
Variables ¶
This section is empty.
Functions ¶
func Exploded ¶
Exploded returns the textural IP address representation with 0 padding and without any compression. For instance, "000.000.000.000" and "0000:0000:0000:0000:0000:0000:0000:0000". The exploded form is mainly of use when sorting IP addresses, as this avoids the need for (hex) number-aware sorting functions.
func ResolveForwardedPort ¶
func ResolveForwardedPort(forwardedPort *ForwardedPort, netns *NetworkNamespace)
ResolveForwardedPort attempts to fill in the missing pieces of information for forwarded ports:
- network namespace of (rewritten) destination IP,
- network interface related to the (rewritten) destination IP,
- the processes (and PIDs) with socket(s) willing to serve the forwarded port.
Types ¶
type Address ¶
type Address struct { Family int `json:"family"` Address net.IP `json:"address"` PrefixLength uint `json:"prefixlen"` PreferredLifetime uint32 `json:"preferred-lifetime"` ValidLifetime uint32 `json:"valid-lifetime"` Scope int `json:"scope"` Index int `json:"index"` // index of network interface the address is assigned to. }
Address represents a network-layer address with associated information.
func (Address) Exploded ¶
Exploded returns the textural IP address representation with 0 padding and without any compression. For instance, "000.000.000.000" and "0000:0000:0000:0000:0000:0000:0000:0000". The exploded form is mainly of use when sorting IP addresses, as this avoids the need for (hex) number-aware sorting functions.
type AddressFamily ¶
type AddressFamily int
AddressFamily represents an AF_ address family. Additionally, AdressFamily can be String-ified into the text strings "IPv4" or "IPv6".
func (AddressFamily) String ¶
func (af AddressFamily) String() string
String returns either "IPv4" or "IPv6" for an AF_INET(6) address family.
type Addresses ¶
type Addresses []Address
Addresses is an unordered list of Address elements.
func (Addresses) Sort ¶
func (as Addresses) Sort()
Sort sorts a list of Addresses in-place. IPv4 addresses are always sorted before IPv6 addresses. IP addresses within the same family (v4 or v6) are sorted based on their Exploded form. An address with a shorter prefix length sort before the same address with a longer prefix length.
type Bridge ¶
type Bridge interface { Interface Bridge() *BridgeAttrs // returns the bridge attributes. }
Bridge represents a bridge network interface, and especially the bridge-port relationships.
type BridgeAttrs ¶
type BridgeAttrs struct { NifAttrs Ports []Interface // "enslaved" network interfaces acting as bridge ports }
BridgeAttrs represents the attributes of a bridge network interface.
func (*BridgeAttrs) Bridge ¶
func (n *BridgeAttrs) Bridge() *BridgeAttrs
Bridge returns the bridge attributes.
func (*BridgeAttrs) Init ¶
func (n *BridgeAttrs) Init(nlh *netlink.Handle, netns *NetworkNamespace, link netlink.Link)
Init initializes this Bridge Nif from information specified in the NetworkNamespace and lots of netlink.Link information.
func (*BridgeAttrs) Nif ¶
func (n *BridgeAttrs) Nif() *NifAttrs
Nif returns the common network interface attributes.
func (*BridgeAttrs) ResolveRelations ¶
func (n *BridgeAttrs) ResolveRelations(allns NetworkNamespaces)
ResolveRelations resolves relations to the enslaved "port" network interfaces. Please note that as only the ports of a bridge indicate their bridge, resolving these relations can only and mut be done in the generic resolution of the Nif base type.
type DnsConfiguration ¶
type DnsConfiguration struct { Hostname string `json:"uts-hostname"` // nodename returned by uname(2) and usually used instead of the gethostname() syscall. EtcHostname string `json:"etc-hostname"` // host name read from /etc/hostname, if present. EtcDomainname string `json:"domainname"` // domain name read from /etc/domainname, if present. Hosts map[string]net.IP `json:"etc-hosts"` // (host)name to IP address mapping, as read from /etc/hosts. Nameservers []net.IP `json:"nameservers"` // list of name server IP addresses. Searchlist []string `json:"searchlist"` // list of domain names to use in resolving names to IP addresses. }
DnsConfiguration contains DNS/name resolution-related configuration information.
type ForwardedPort ¶
type ForwardedPort struct { portfinder.ForwardedPortRange // "general" port forwarding information incl. protocol, et cetera. Protocol Protocol // transport-layer protocol, such as syscall.IPPROTO_TCP, etc. DestinationNetns *NetworkNamespace // network namespace where the IP forwarded to is. PIDs []model.PIDType // processes having a listening/open socket for the port forwarded to. Processes []*model.Process // processes having a listening/open socket for the port forwarded to. Nifs Interfaces // network interfaces the traffic is forwarded to. }
ForwardedPort is Gostwire's view on forwarded ports (actually port ranges) inside a particular network namespace. The rewritten destinations the traffic should be forwarded to can be in other network namespaces, as long as packets can be properly forwarded to these new destinations.
Please note that under less-than-ideal circumstances we might end up with traffic to a host port getting forwarded into a particular network namespace (which we identify based on the network interfaces' configured IP addresses), yet there isn't any open socket handling the forwarded traffic. In this situation, only DestinationNetns will be set and PIDs/Processes are empty.
type IP ¶
IP is a net.IP that returns its IPv6 address textual representation in square bracket notation "[textual-ipv6-address]". This is useful in "ip:port" output contexts, as it is common practise to then render IPv6 addresses as "[ipv6]:port" in order to be able to clearly see the port number, which otherwise could be mistaken for the final address group.
type Interface ¶
type Interface interface { Nif() *NifAttrs // returns the common network interface attributes. Interface() Interface // returns the NetworkInterface interface for this, erm, network interface. }
Interface represents Gostwire's perspective on the common properties of a network interface inside a network namespace. For some (virtual) type of network interfaces, additional nif type-specific interfaces give more details, such as the Peer interface about the peer relations between the two VETH ends of an VETH "wire".
Due to the design of Go interfaces versus (pointer) receivers we have to deal with the ugly situation were in a (pointer) receiver method with a *NifAttrs receiver and we need the Interface instead to whatever "derived" type like VethAttrs is implementing it. The Interface() method is a convience to encapsulate our work-around that looks up the original Interface from the nif list of the owning NetworkNamespace.
func NewInterface ¶
NewInterface returns a new network.Interface that is Gostwire's view take on network interfaces in network namespaces. The network interface returned has the correct underlying Go type (such as BridgeAttrs, VethAttrs, ...) based on the specific kind of link. If there is no dedicated Gostwire type, then the generic NifAttr type is created and returned instead.
type Interfaces ¶
type Interfaces []Interface
Interfaces is a list of network Interface elements, and can optionally be sorted in-place.
func (Interfaces) OfKind ¶
func (i Interfaces) OfKind(kind string) Interfaces
OfKind returns only the Interfaces of the specified kind.
func (Interfaces) Sort ¶
func (i Interfaces) Sort()
Sort sorts the list of Interface elements in-place.
type Macvlan ¶
type Macvlan interface { Interface Macvlan() *MacvlanAttrs // returns the macvlan attributes. }
Macvlan represents a MACVLAN network interface with quite some gory configuration details and the relation to it "master" network interface (a "hardware") interface.
type MacvlanAttrs ¶
type MacvlanAttrs struct { NifAttrs Master Interface // master (hardware) network interface Mode MacvlanMode }
MacvlanAttrs represents the attributes of a MACVLAN network interface.
func (*MacvlanAttrs) Init ¶
func (n *MacvlanAttrs) Init(nlh *netlink.Handle, netns *NetworkNamespace, link netlink.Link)
Init initializes this MACVLAN Nif from information specified in the NetworkNamespace and lots of netlink.Link information.
func (*MacvlanAttrs) Macvlan ¶
func (n *MacvlanAttrs) Macvlan() *MacvlanAttrs
Macvlan returns the macvlan attributes.
func (*MacvlanAttrs) Nif ¶
func (n *MacvlanAttrs) Nif() *NifAttrs
Nif returns the common network interface attributes.
func (*MacvlanAttrs) ResolveRelations ¶
func (n *MacvlanAttrs) ResolveRelations(allns NetworkNamespaces)
ResolveRelations resolves relations to the master network interface.
type MacvlanMode ¶
type MacvlanMode netlink.MacvlanMode
MacvlanMode specifies the switching mode with respect to other MACVLANs and the rest of the world, excluding the master network interface though.
func (MacvlanMode) String ¶
func (m MacvlanMode) String() string
String returns a short text for this MACVLAN (switching) mode.
type NSID ¶
type NSID uint32
NSID is the Linux-kernel type for network "namespace IDs", which must not be confused with the general network identifiers (consisting of device ID and inode number). NSIDs are 32bit unsigned int identifiers associated with a peer network namespace and can be either set explicitly or implicitly by the kernel when needed. NSIDs are scoped to the network namespace they are defined in. NSIDs cannot be changed anymore after they have been assigned for the first time.
type NetworkNamespace ¶
type NetworkNamespace struct { model.Namespace // discovered namespace details courtesy of lxkns. Nifs map[int]Interface // map of network interfaces by index number. NamedNifs map[string]Interface // map of network interfaces indexed by name. Tenants Tenants // tenants of this network namespace (=processes/containers with additional information). Routesv4 []Route // IPv4 routes Routesv6 []Route // IPv6 routes Portsv4 []ProcessSocket // sockets/open ports for IPv4 (including IPv6 sockets!) Portsv6 []ProcessSocket // sockets/open ports for IPv6 ForwardedPortsv4 []ForwardedPort // IPv4 ports forwarded into other network namespaces ForwardedPortsv6 []ForwardedPort // IPv6 ports forwarded into other network namespaces // contains filtered or unexported fields }
NetworkNamespace represents a particular Linux network namespace together with its network interfaces, routes, open ports, et cetera. It additionally references the containers and non-container processes attached to this NetworkNamespace. Sets of containers (=initial process of container) as well as stand-alone (=non-container) processes are referred to as "tenants".
func NewNetworkNamespace ¶
func NewNetworkNamespace(netns model.Namespace, tenantProcs []*model.Process) *NetworkNamespace
NewNetworkNamespace returns a new NetworkNamespace, based on the lxkns namespace discover information. The new NetworkNamespace will have its network interfaces and routes discovered. However, the relations between network interfaces remain unresolved at this time.
func (*NetworkNamespace) DisplayName ¶
func (n *NetworkNamespace) DisplayName() string
DisplayName returns a "simplified" name for "simple" display use cases, where it is desirable to identify network namespaces by the names of their tenants (containers and stand-alone processes). In case of multiple tenants, the display name will be the lexicographically first tenant name, or the name of the process with PID 1, if present.
func (*NetworkNamespace) NifInBridgedNetwork ¶
func (n *NetworkNamespace) NifInBridgedNetwork(bridge Interface, addr net.IP) Interface
NifInBridgeNetwork returns the network Interface with the specified IP address connected somehow to the specified bridge; otherwise, nil.
func (*NetworkNamespace) NifList ¶
func (n *NetworkNamespace) NifList() Interfaces
NifList returns the (unordered) list of NetworkInterfaces in this network namespace.
func (*NetworkNamespace) NifWithAddress ¶
func (n *NetworkNamespace) NifWithAddress(addr net.IP) Interface
NifWithAddress returns the network Interface in this network namespace that has the specified IP address assigned to it, or nil if none could be found.
func (*NetworkNamespace) NifsString ¶
func (n *NetworkNamespace) NifsString() string
NifsString returns the display name of this network namespace together with the names of its network interface (and interface indices).
func (*NetworkNamespace) OpenEthtool ¶
func (n *NetworkNamespace) OpenEthtool() (fd int, err error)
OpenEthtool open a socket in this network namespace that is suitable for ethtool-related ioctl's. Somewhat deviating from the standard Go error return pattern, it doesn't return a zero fd on error, but a -1 fd ... which is guaranteed to be an invalid fd, whereas 0 most probably is valid.
func (*NetworkNamespace) OpenInNetworkNamespace ¶
func (n *NetworkNamespace) OpenInNetworkNamespace(opener func() error) error
OpenInNetworkNamespace calls the supplied opener function in the context of this network namespace.
func (*NetworkNamespace) OpenNetlink ¶
func (n *NetworkNamespace) OpenNetlink() (*netlink.Handle, error)
OpenNetlink returns a netlink (route) handle for netlink queries and operations on this network namespace. The caller is responsible for releasing the resources associated with the returned netlink handle by calling Delete(!) on it when not needed anymore.
func (*NetworkNamespace) WhereIs ¶
func (n *NetworkNamespace) WhereIs(destIP net.IP) (*NetworkNamespace, Interface)
WhereIs determines the network namespace the specified IP address is located in and at the same time reachable from the current network namespace. It returns the matching network namespace and network interface, or nil if nothing suitable was found.
type NetworkNamespaceList ¶
type NetworkNamespaceList []*NetworkNamespace
NetworkNamespaceList contains NetworkNamespace elements, and optionally can be sorted in-place using its Sort method.
func (NetworkNamespaceList) Sort ¶
func (n NetworkNamespaceList) Sort()
Sort (stably) sorts the list of NetworkNamespace elements in-place. Please note that the network namespace with the initial process PID 1 will always come first.
type NetworkNamespaces ¶
type NetworkNamespaces map[species.NamespaceID]*NetworkNamespace
NetworkNamespaces maps all NetworkNamespace objects known to us.
func NewNetworkNamespaces ¶
func NewNetworkNamespaces( allnetns model.NamespaceMap, allprocs model.ProcessTable, containers model.Containers, ) NetworkNamespaces
NewNetworkNamespaces takes a set of discovered network namespaces and creates the Gostwire-specific NetworkNamespace objects wrapping them and supplying network layer-related information not discovered by lxkns.
func (NetworkNamespaces) ByContainer ¶
func (m NetworkNamespaces) ByContainer(cntr *model.Container) *NetworkNamespace
ByContainer looks up the NetworkNamespace for the given model.Container. If not found, returns nil.
func (NetworkNamespaces) ByProcess ¶
func (m NetworkNamespaces) ByProcess(proc *model.Process) *NetworkNamespace
ByProcess looks up the NetworkNamespace for the given model.Process. If not found, returns nil.
func (NetworkNamespaces) Sorted ¶
func (m NetworkNamespaces) Sorted() NetworkNamespaceList
Sorted returns the (stable) sorted list of NetworkNamespace elements.
func (NetworkNamespaces) String ¶
func (m NetworkNamespaces) String() string
String returns a textual representation of the network namespaces map consisting of the (sorted) network namespaces' display names.
type NifAttrs ¶
type NifAttrs struct { Netns *NetworkNamespace // network namespace this interface belongs to. Kind string // kind of interface. Name string // interface name. Alias string // alias name. Index int // interface index. State OperState // operational state. Physical bool // or more metaphorical: it has an associated driver. DriverInfo NifDriverInfo // ethtool-derived nif driver information. Promiscuous bool // does snoop all traffic? Labels model.Labels // optional labels attached by Gostwire decorators. L2Addr net.HardwareAddr // data-link layer (aka "hardware") address. Addrsv4 Addresses // assigned IPv4 network addresses. Addrsv6 Addresses // assigned IPv6 network addresses. SRIOVRole SRIOVRole // ...when network interface is an SR-IOV PF or VF. // Relations with other network interfaces Bridge Interface // when interface is a "port" of a bridge interface. Slaves Interfaces // MACVLANs, VXLANs, VFs, others (but not VETH peers). PF Interface // when interface is an SR-IOV VF. // Low-level, not available after unmarshalling. Link netlink.Link // low-level netlink information about this interface. }
NifAttrs defines Gostwire's view on the common attributes of any network interface. This also includes some relations between network interfaces.
func (*NifAttrs) AddLabels ¶
AddLabels adds in (merges) the passed labels with the existing labels assigned to this network interface. Added labels take precedence over existing labels, replacing them in case of conflict.
func (*NifAttrs) HasAddress ¶
HasAddress returns true if the specified IP address is one of the addresses assigned to this interface, else false. The specified address is expected to be in canonical format, that is of length 4 for an IPv4 address (and being an IPv4-mapped IPv6 address).
func (*NifAttrs) Init ¶
Init initializes this Nif from information specified in the NetworkNamespace and lots of netlink.Link information.
func (*NifAttrs) Interface ¶
Interface returns the network.Interface for this network.Interface (sic!). This is specific to Go, due to the Go design with its interfaces versus (pointer) receivers.
func (*NifAttrs) ResolveRelations ¶
func (n *NifAttrs) ResolveRelations(allns NetworkNamespaces)
ResolveRelations resolves relations to other network interfaces. Please note that this doesn't include the PF-VF topology, as we're to resolve that topology separately.
func (*NifAttrs) SysfsBusPath ¶
SysfsBusPath returns a device directory path for the physical device of this network interface somewhere deeper inside /sys/bus/.
Note: this is currently needed only for PCI(e) devices and thus does not work correctly for other busses, such as USB.
type NifDriverInfo ¶ added in v2.2.0
type NifDriverInfo struct { Driver string `json:"driver"` // Driver short name, cannot be empty, except that it can. Version string `json:"version,omitempty"` // Driver version string, but can be empty. FwVersion string `json:"fwversion,omitempty"` // Driver-specific firmware version string, can be empty, except that it might show "N/A" instead. BusInfo string `json:"businfo,omitempty"` // Device bus address, but may be empty. EromVersion string `json:"eromversion,omitempty"` // Driver-specific expansion ROM version string, can be empty. }
NifDriverInfo contains some of the general driver and device information returned by the ethtool API.
The Driver name is empty in case of severl kinds of virtual devices. However, we've seen “taptun” kinds in the wild that are actually (pseudo) “HW” virtual devices that otherwise act like the Linux kernel's “taptun”'s, such as in WSL2 configurations, where they wire up the Linux VM with its Windows host.
The fields mirror some, but not all, of the ethtoo_drvinfo fields, see also: https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/ethtool.h#L185
type NifMaker ¶
type NifMaker func() Interface
NifMaker returns an instance of something implementing network.Interface.
type OperState ¶
type OperState uint8
OperState indicates the operational state of a network interface.
const ( Unknown OperState = iota // operational state hasn't been specified by driver or userspace. NotPresent // unused in Linux kernel. Down // interface is unable to transfer data on "physical" level. LowerLayerDown // an interface onto which this interface is stacked is in Down state. Testing // unused in Linux kernel. Dormant // physical layer is up, but waiting for external event (Godot?). Up // interface is operational up and can be used. )
Operational states of network interfaces. See also: https://www.kernel.org/doc/Documentation/networking/operstates.txt
func (OperState) TerminalIcon ¶
TerminalIcon returns a Unicode "icon" for the given operational state.
type ProcessSocket ¶
type ProcessSocket struct { Family AddressFamily // address family, such as unix.AD_INET6, ... Protocol Protocol // transport protocol, such as syscall.IPPROTO_TCP, ... LocalIP net.IP // local IP address; IPv4 addresses are in .To4() format. LocalPort uint16 // local TCP/UDP port RemoteIP net.IP // remote IP address; IPv4 addresses are in .To4() format. RemotePort uint16 // remote TCP/UDP port State SocketState // (detailed) socket state SimplifiedState SocketSimplifiedState // simplified state: either listening or connected (both TCP and UDP) PIDs []model.PIDType // processes using this socket Processes []*model.Process // processes using this socket IPv4Mapped bool // IPv6 socket handling IPv4 traffic? Nifs Interfaces // network interfaces handling this traffic, based on address/routing data. }
ProcessSocket describes the communication parameters of a network socket and which process is using it. Please note that the same socket can be used by multiple processes by sharing its file descriptor.
type ProcessSockets ¶
type ProcessSockets []ProcessSocket
ProcessSockets is a list of ProcessSocket elements, that optionally can be sorted in-place.
func (ProcessSockets) Sort ¶
func (p ProcessSockets) Sort()
Sort sorts a list of ProcessSocket elements: - local port, - transport protocol, - (reverse) connection state -- to show listening ports before connected ports, - IPv4 before IPv6, - local address, - remote address, - remote port.
type Protocol ¶
type Protocol int
Protocol represents a (transport) protocol number for TCP or UDP. Additionally, Protocol can be String-ified into the text strings "TCP" and "UDP".
type Route ¶
type Route struct { Family AddressFamily Type RouteType Destination net.IPNet DestinationPrefixLen int NextHop net.IP Index int Nif Interface Table int Priority int Preference uint8 // TODO: support from vishvananda/netlink missing }
Route is Gostwire's view on network stack routes.
type RouteType ¶
type RouteType uint8
RouteType represents the type of route and allows converting it to a string, such as "unicast", "local", et cetera; this mimics pyroute2's behavior.
type SRIOVRole ¶
type SRIOVRole uint8
SRIOVRole identifies network interfaces that are SR-IOV PFs or VFs.
type SocketSimplifiedState ¶
type SocketSimplifiedState uint8
SocketSimplifiedState indicates whether a TCP or UDP socket is listening or connected, and nothing else; this hides all the gory details of SocketState.
func (SocketSimplifiedState) String ¶
func (s SocketSimplifiedState) String() string
String returns a clear-text socket simplified status message.
type SocketState ¶
type SocketState uint8
SocketState is a TCP's or UDP's socket state, such as listening, connected ("established"), et cetera.
const ( TCP_ESTABLISHED SocketState = iota + 1 TCP_SYN_SENT TCP_SYN_RECV TCP_FIN_WAIT1 TCP_FIN_WAIT2 TCP_TIME_WAIT TCP_CLOSE TCP_CLOSE_WAIT TCP_LAST_ACK TCP_LISTEN TCP_CLOSING TCP_NEW_SYN_RECV )
TCP socket state codes are defined in https://elixir.bootlin.com/linux/v5.13.13/source/include/net/tcp_states.h
func (SocketState) String ¶
func (s SocketState) String() string
String returns a clear-text socket status message.
type Tenant ¶
type Tenant struct { Process *model.Process // associated ealdorman process BoundingCaps []byte // bounding capabilities in form of a byte string with lsb being bit 0 of the last byte. DNS DnsConfiguration // DNS and name resolution configuration }
Tenant represents a process or even a container together with its application-layer specific communication configuration, namely configuration of the name resolution/DNS.
type Tenants ¶
type Tenants []*Tenant
Tenants is a list of Tenant elements; it allows for in-place sorting using its Sort method.
type TunTap ¶ added in v2.1.9
type TunTap interface { Interface TunTap() *TunTapAttrs // returns the TUN/TAP attributes }
type TunTapAttrs ¶ added in v2.1.9
type TunTapAttrs struct { NifAttrs Mode TunTapMode Processors []*model.Process }
TunTapAttrs represents the attributes of a TUN/TAP network interface.
func (*TunTapAttrs) Init ¶ added in v2.1.9
func (n *TunTapAttrs) Init(nlh *netlink.Handle, netns *NetworkNamespace, link netlink.Link)
Init initializes this TUN/TAP Nif from information specified in the NetworkNamespace and lots of netlink.Link information.
func (*TunTapAttrs) Nif ¶ added in v2.1.9
func (n *TunTapAttrs) Nif() *NifAttrs
Nif returns the common network interface attributes.
func (*TunTapAttrs) TunTap ¶ added in v2.1.9
func (n *TunTapAttrs) TunTap() *TunTapAttrs
TunTap returns the TAP/TUN attributes.
type TunTapMode ¶ added in v2.1.9
type TunTapMode int
const ( TunTapModeTun TunTapMode = TunTapMode(netlink.TUNTAP_MODE_TUN) TunTapModeTap TunTapMode = TunTapMode(netlink.TUNTAP_MODE_TAP) )
type Veth ¶
Veth represents an VETH network interface, and especially the peer-to-peer relationships between exactly two Veths. However, beware that since network discovery will never be an atomic operation, be prepared to trip upon an Veth without a peer (nil peer).
type VethAttrs ¶
VethAttrs represents the attributes of an VETH peer-to-peer network interface (one end of the pair).
func (*VethAttrs) Init ¶
Init initializes this VETH Nif from information specified in the NetworkNamespace and lots of netlink.Link information.
func (*VethAttrs) ResolveRelations ¶
func (n *VethAttrs) ResolveRelations(allns NetworkNamespaces)
ResolveRelations resolves relations to the other peer network interface.
type Vlan ¶
Vlan represents a VLAN network interface that in turn represents a specific IEEE 802.1Q VLAN ID.
type VlanAttrs ¶
type VlanAttrs struct { NifAttrs Master Interface // master network interface VID uint16 // VLAN ID 1..4094 VlanProtocol netlink.VlanProtocol }
VlanAttrs represents the attributes of a VLAN network interface.
func (*VlanAttrs) Init ¶
Init initializes this VLAN Nif from information specified in the NetworkNamespace and lots of netlink.Link information.
func (*VlanAttrs) ResolveRelations ¶
func (n *VlanAttrs) ResolveRelations(allns NetworkNamespaces)
ResolveRelations resolves relations to the master (underlay) network interface.
type Vxlan ¶
type Vxlan interface { Interface Vxlan() *VxlanAttrs // returns the vxlan attributes. }
Vxlan represents a VXLAN overlay network interface with quite some gory configuration details and the relation to it "master" network interface.
type VxlanAttrs ¶
type VxlanAttrs struct { NifAttrs Master Interface // master network interface VID uint32 // VXLAN ID Groupv4 net.IP Groupv6 net.IP Sourcev4 net.IP Sourcev6 net.IP DestinationPort uint16 SourcePortLow uint16 SourcePortHigh uint16 TTL uint8 TOS uint8 ArpProxy bool }
VxlanAttrs represents the attributes of a VXLAN network interface.
func (*VxlanAttrs) Init ¶
func (n *VxlanAttrs) Init(nlh *netlink.Handle, netns *NetworkNamespace, link netlink.Link)
Init initializes this VXLAN Nif from information specified in the NetworkNamespace and lots of netlink.Link information.
func (*VxlanAttrs) Nif ¶
func (n *VxlanAttrs) Nif() *NifAttrs
Nif returns the common network interface attributes.
func (*VxlanAttrs) ResolveRelations ¶
func (n *VxlanAttrs) ResolveRelations(allns NetworkNamespaces)
ResolveRelations resolves relations to the master (underlay) network interface.
func (*VxlanAttrs) Vxlan ¶
func (n *VxlanAttrs) Vxlan() *VxlanAttrs
Vxlan returns the macvlan attributes.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package portfwd defines a plugin interface for detecting forwarded ports from nftables.
|
Package portfwd defines a plugin interface for detecting forwarded ports from nftables. |
all
Package all pulls in all Gostwire port forwarding detectors (plugins).
|
Package all pulls in all Gostwire port forwarding detectors (plugins). |
docker
Package docker implements port forwarding detection for iptables (nft) rules managed by the Docker daemon.
|
Package docker implements port forwarding detection for iptables (nft) rules managed by the Docker daemon. |
kubeproxy
Package kubeproxy implements port forwarding detection for iptables (nft) rules managed by Kubernete's kube-proxy.
|
Package kubeproxy implements port forwarding detection for iptables (nft) rules managed by Kubernete's kube-proxy. |
nftget
Package nftget help with conveniently retrieving information from nftable expressions.
|
Package nftget help with conveniently retrieving information from nftable expressions. |