diff --git a/expr/expr.go b/expr/expr.go index c58308b..1326731 100644 --- a/expr/expr.go +++ b/expr/expr.go @@ -287,6 +287,8 @@ const ( NF_NAT_RANGE_PROTO_RANDOM_FULLY = 0x10 // NF_NAT_RANGE_PERSISTENT defines flag for a persistent masquerade NF_NAT_RANGE_PERSISTENT = 0x8 + // NF_NAT_RANGE_PREFIX defines flag for a prefix masquerade + NF_NAT_RANGE_PREFIX = 0x40 ) func (e *Masq) marshal(fam byte) ([]byte, error) { diff --git a/expr/nat.go b/expr/nat.go index 9602c23..4e7df47 100644 --- a/expr/nat.go +++ b/expr/nat.go @@ -40,6 +40,7 @@ type NAT struct { Random bool FullyRandom bool Persistent bool + Prefix bool } // |00048|N-|00001| |len |flags| type| @@ -82,6 +83,9 @@ func (e *NAT) marshal(fam byte) ([]byte, error) { if e.Persistent { flags |= NF_NAT_RANGE_PERSISTENT } + if e.Prefix { + flags |= NF_NAT_RANGE_PREFIX + } if flags != 0 { attrs = append(attrs, netlink.Attribute{Type: unix.NFTA_NAT_FLAGS, Data: binaryutil.BigEndian.PutUint32(flags)}) } @@ -121,6 +125,7 @@ func (e *NAT) unmarshal(fam byte, data []byte) error { e.Persistent = (flags & NF_NAT_RANGE_PERSISTENT) != 0 e.Random = (flags & NF_NAT_RANGE_PROTO_RANDOM) != 0 e.FullyRandom = (flags & NF_NAT_RANGE_PROTO_RANDOM_FULLY) != 0 + e.Prefix = (flags & NF_NAT_RANGE_PREFIX) != 0 } } return ad.Err()