AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 747763
Accepted
Svetoslav
Svetoslav
Asked: 2023-06-02 04:22:13 +0800 CST2023-06-02 04:22:13 +0800 CST 2023-06-02 04:22:13 +0800 CST

ipset 替代品或某种通配符的聪明想法

  • 772

这里的高级程序员但讨厌 linux 网络限制,与所有编程语言相比,这使事情变得困难。

实际上,我需要制定基于策略的路由,允许特定的 lan ip 地址选择特定的传出接口(比如 eth5)。在我的情况下,即使是 ipset 也不够强大。我想允许第一个八进制为“10”而最后一个八进制以“9”结尾的所有 lan ip。那将是10.*.*.??9或在javascript中if(ip.match("\10\..*\.(\d+9|9)\g")) ...USE eth5

有谁知道实现这一目标的某种技巧?如果我们必须坚持使用 CIDR,那可能会有数千个 IP CIDR,这太疯狂了。

谢谢

routing
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2023-06-02T07:00:21+08:002023-06-02T07:00:21+08:00

    我不会将我的答案限制在算法的一小部分,因为 OP 也达到了实现限制。答案必须与他们合作。


    路由堆栈是 Linux 网络堆栈的一部分,仅限于处理相当于 /32 (/255.255.255.255) 到 /0 (/0.0.0.0) 的33 个 CIDR 网络掩码。

    网络堆栈的其他部分,例如一些防火墙设施,则不受此限制。通过使用诸如 255.0.0.255 之类的网络掩码,可以忽略 IPv4 地址中的 2 个中间数字部分。las,网络掩码可以轻松处理二的幂或二的幂除法的余数,但无法帮助模 10(除以 10 的余数),并且除以 10 在数据包处理中不可用。所以仍然有 9 到 249 之间的 25 个值需要检查,并且需要这些值的列表。唉,另外ipset也被限制为 CIDR netmasks,并且iptables对ipset的使用不允许一起使用不受限制的网络掩码:根本不能使用ipset 。

    要么使用 ~ 25 个iptables规则(不是那么多),要么使用更灵活的nftables和set。

    使用iptables

    仅使用网络掩码 255.0.0.0 来检查 IPv4 地址的开头10.并检查最后一部分的 25 种可能性。根据要解决的确切问题,可以添加对要考虑的传入接口的额外限制。

    iptables -t mangle -N specialrouting
    iptables -t mangle -A PREROUTING -s 10.0.0.0/255.0.0.0 -j specialrouting
    

    要使用 25 种可能性填充用户链,specialrouting例如使用此bash脚本:

    #!/bin/bash
    
    iptables -t mangle -F specialrouting # for idempotence
    for i in {9..255..10}; do
        iptables -t mangle -A specialrouting -s 10.0.0.$i/255.0.0.255 -j MARK --set-mark 0xcafe
    done
    

    最后,2^16(对于两个被忽略的中间字节)x 25 = 1638400 的可能性将得到一个标记。

    如果模为 16(2 的幂),从而过滤 16 个值 9、25、41、57 ... 249 而不是 25 个模 10 值,那么上面的所有内容都可以用单个规则替换,因为网络掩码可以处理任何 2 的幂的模数。这里的网络掩码 255.0.0.15 (0xff00000f) 可以与下面的单个规则一起使用:

    iptables -t mangle -A PREROUTING -s 10.0.0.9/255.0.0.15 -j MARK -set-mark 0xcafe
    

    或者使用nftables

    使用类似于上面的脚本预先计算的集合元素列表,具有模 10 案例的规则集将是(加载nft -f specialrouting.nft):

    specialrouting.nft:

    table ip specialrouting         # for idempotence
    delete table ip specialrouting  # for idempotence
    
    table ip specialrouting {
        set modulo10 {
            type ipv4_addr
            flags constant
            elements = { 10.0.0.9, 10.0.0.19,
                     10.0.0.29, 10.0.0.39,
                     10.0.0.49, 10.0.0.59,
                     10.0.0.69, 10.0.0.79,
                     10.0.0.89, 10.0.0.99,
                     10.0.0.109, 10.0.0.119,
                     10.0.0.129, 10.0.0.139,
                     10.0.0.149, 10.0.0.159,
                     10.0.0.169, 10.0.0.179,
                     10.0.0.189, 10.0.0.199,
                     10.0.0.209, 10.0.0.219,
                     10.0.0.229, 10.0.0.239,
                     10.0.0.249 }
        }
    
        chain prerouting {
            type filter hook prerouting priority -150; policy accept;
            ip saddr & 255.0.0.255 == @modulo10 meta mark set 0xcafe
        }
    }
    

    对于模 16,单个nftables规则(没有样板)将类似于上面的单个iptables规则:

    ip saddr & 255.0.0.15 == 10.0.0.9 meta mark set 0xcafe
    

    使用标记进行路由

    数据包上设置的标记(仅在 Linux 网络堆栈中此数据包的内部生命周期内)可以用作路由堆栈的消息,并与路由规则匹配以使用备用路由表:

    ip rule add fwmark 0xcafe lookup 100
    

    其次是表 100 中的路由,其中​​包括最重要的路由dev eth5,此外还包括从主路由表复制的任何其他相关路由:

    ip route add ... dev eth5 table 100
    ...
    

    来自eth5的返回流量应该使用同一张表:

    ip rule add iif eth5 lookup 100
    

    补充笔记

    至少在测试时,为了避免由于路由不完整而导致流量下降,不应启用SRPF,即,以防分发默认启用它:rp_filter

    for i in $(sysctl -N -ar 'net\.ipv4\.conf\..*\.rp_filter'); do sysctl -w $i=0; done
    

    使用标记时还有其他可能性,例如将标记存储在流的 conntrack 条目中,但如果没有设置的精确描述,我不知道这里需要什么。这个博客有几个例子:到 Linux 及以后!Netfilter 康马克。

    请注意,涉及重新路由本地启动(或相同的本地终止)流量而不是转发/路由流量的标记会遇到极端情况(UDP 比 TCP 更多),所以我什至没有尝试解决这种情况。

    • 1

相关问题

  • iptables:透明 tcp 流量代理

  • iptables -j REDIRECT *actually* 对数据包头做了什么?

  • 永久更改接口的指标

  • 任何为第 3 层交换/路由构建的发行版?

  • Debian 9;为 www 服务器设置网络设备

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve