On Mon, Mar 7, 2016 at 8:09 PM, Pablo Neira Ayuso <[email protected]> wrote:
> On Fri, Mar 04, 2016 at 03:31:45AM +0530, Shivani Bhardwaj wrote:
>> Add translation for dccp to nftables.
>>
>> Full translation of this match awaits the support for --dccp-option.
>>
>> Examples:
>>
>> $ sudo iptables-translate -A INPUT -p dccp -m dccp --sport 100
>> nft add rule ip filter INPUT dccp sport 100 counter
>>
>> $ sudo iptables-translate -A INPUT -p dccp -m dccp --dport 100:200
>> nft add rule ip filter INPUT dccp dport 100-200 counter
>>
>> $ sudo iptables-translate -A INPUT -p dccp -m dccp ! --dport 100
>> nft add rule ip filter INPUT dccp dport != 100 counter
>>
>> $ sudo iptables-translate -A INPUT -p dccp -m dccp --dport 100 --dccp-types
>> REQUEST,RESPONSE,DATA,ACK,DATAACK,CLOSEREQ,CLOSE,SYNC,SYNCACK
>> nft add rule ip filter INPUT dccp dport 100 dccp type {request, response,
>> data, ack, dataack, closereq, close, sync, syncack} counter
>>
>> Signed-off-by: Shivani Bhardwaj <[email protected]>
>> ---
>> Changes in v3:
>> Return 0 if translation for dccp-option is demanded
>>
>> Changes in v2:
>> Fix bugs and remove invalid dccp type
>>
>> Following is not added in commit message as it is not translation code
>> issue:
>> * Since inversion of set is not possible in nftables, using dccp
>> with rules like
>> ...dccp type != {request, response}..
>> * dccp type reset
>> is going to throw errors.
>>
>> extensions/libxt_dccp.c | 92
>> +++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 92 insertions(+)
>>
>> diff --git a/extensions/libxt_dccp.c b/extensions/libxt_dccp.c
>> index a35cabb..0d4f369 100644
>> --- a/extensions/libxt_dccp.c
>> +++ b/extensions/libxt_dccp.c
>> @@ -277,6 +277,97 @@ static void dccp_save(const void *ip, const struct
>> xt_entry_match *match)
>> }
>> }
>>
>> +static const char *const dccp_pkt_types_xlate[] = {
>> + [DCCP_PKT_REQUEST] = "request",
>> + [DCCP_PKT_RESPONSE] = "response",
>> + [DCCP_PKT_DATA] = "data",
>> + [DCCP_PKT_ACK] = "ack",
>> + [DCCP_PKT_DATAACK] = "dataack",
>> + [DCCP_PKT_CLOSEREQ] = "closereq",
>> + [DCCP_PKT_CLOSE] = "close",
>> + [DCCP_PKT_RESET] = "reset",
>> + [DCCP_PKT_SYNC] = "sync",
>> + [DCCP_PKT_SYNCACK] = "syncack",
>> +};
>> +
>> +static int dccp_type_xlate(const struct xt_dccp_info *einfo,
>> + struct xt_xlate *xl)
>> +{
>> + bool have_type = false, set_need = false;
>> + uint16_t types = einfo->typemask;
>> +
>> + if (types & (1 << DCCP_PKT_INVALID))
>> + return 0;
>> +
>> + xt_xlate_add(xl, "dccp type%s ", einfo->invflags ? " !=" : "");
>> +
>> + if ((types != 0) && !(types == (types & -types))) {
>> + xt_xlate_add(xl, "{");
>> + set_need = true;
>> + }
>> +
>> + while (types) {
>> + unsigned int i;
>> +
>> + for (i = 0; !(types & (1 << i)); i++);
>> +
>> + if (have_type)
>> + xt_xlate_add(xl, ", ");
>> + else
>> + have_type = true;
>> +
>> + xt_xlate_add(xl, "%s", dccp_pkt_types_xlate[i]);
>> +
>> + types &= ~(1 << i);
>> + }
>> +
>> + if (set_need)
>> + xt_xlate_add(xl, "}");
>> +
>> + xt_xlate_add(xl, " ");
>> +
>> + return 1;
>> +}
>> +
>> +static int dccp_xlate(const struct xt_entry_match *match,
>> + struct xt_xlate *xl, int numeric)
>> +{
>> + const struct xt_dccp_info *einfo =
>> + (const struct xt_dccp_info *)match->data;
>> + int ret = 1;
>> +
>> + xt_xlate_add(xl, "dccp ");
>> +
>> + if (einfo->flags & XT_DCCP_SRC_PORTS) {
>> + if (einfo->spts[0] != einfo->spts[1])
>> + xt_xlate_add(xl, "sport%s %u-%u ",
>> + einfo->invflags & XT_DCCP_SRC_PORTS ? "
>> !=" : "",
>> + einfo->spts[0], einfo->spts[1]);
>> + else
>> + xt_xlate_add(xl, "sport%s %u ",
>> + einfo->invflags & XT_DCCP_SRC_PORTS ? "
>> !=" : "",
>> + einfo->spts[0]);
>> + }
>> +
>> + if (einfo->flags & XT_DCCP_DEST_PORTS) {
>> + if (einfo->dpts[0] != einfo->dpts[1])
>> + xt_xlate_add(xl, "dport%s %u-%u ",
>> + einfo->invflags & XT_DCCP_DEST_PORTS ? "
>> !=" : "",
>> + einfo->dpts[0], einfo->dpts[1]);
>> + else
>> + xt_xlate_add(xl, "dport%s %u ",
>> + einfo->invflags & XT_DCCP_DEST_PORTS ? "
>> !=" : "",
>> + einfo->dpts[0]);
>> + }
>> +
>> + if (einfo->flags & XT_DCCP_TYPE)
>> + ret = dccp_type_xlate(einfo, xl);
>> +
>> + if (einfo->flags & XT_DCCP_OPTION)
>> + ret = 0;
>
> Shouldn't you check fot this XT_DCCP_OPTION in first place?
>
> Or you achieve the same effect? I don't remember how this is behaving
> when we already translated many things but just one thing got left
> behind.
>
This gives the same effect.
$ sudo iptables-translate -A INPUT -p dccp -m dccp --sport 100 --dccp-option 1
nft # -A INPUT -p dccp -m dccp --sport 100 --dccp-option 1
Please let me know if you're referring to something else.
>
>> +
>> + return ret;
>> +}
>> static struct xtables_match dccp_match = {
>> .name = "dccp",
>> .family = NFPROTO_UNSPEC,
>> @@ -288,6 +379,7 @@ static struct xtables_match dccp_match = {
>> .save = dccp_save,
>> .x6_parse = dccp_parse,
>> .x6_options = dccp_opts,
>> + .xlate = dccp_xlate,
>> };
>>
>> void _init(void)
>> --
>> 1.9.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html