V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yyfdsz
V2EX  ›  DNS

如何实现 dnsmasq 按用户 IP 段做条件转发

  •  
  •   yyfdsz · 177 天前 · 1269 次点击
    这是一个创建于 177 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现状: 企业内网建有一台 dnsmasq 接收本厂区所有用户请求, 上游是公共 DNS. 网络有电信、移动双线按部门网段分流, 而 dnsmasq 走的是电信, 解析结果对走移动的用户不友好, 为了实现多 AD 域转发和自定义解析又不能直接使用外部 DNS. 如何实现一个内网 DNS 针对不同内网网段的请求, 返回不同运营商的解析结果? 实现方式不限, 服务器数量不限. 我的设想:

    1. dnsmasq 改双网卡或使用不同公共 DNS+防火墙设置目的地址策略路由实现指定运营商解析, 但 DNS 上没找到匹配用户网段做条件转发的相关配置, 以及系统层面能否做到.
    2. 后端新建走电信、移动的两台 DNS, 原 DNS 依然需要匹配用户网段做条件转发. 端口转发也可, 如何实现?
    12 条回复    2024-01-28 17:15:19 +08:00
    wheat0r
        1
    wheat0r  
       177 天前
    最简单的方法,装两台 dnsmasq
    tomczhen
        2
    tomczhen  
       177 天前 via Android
    mosdns
    yaott2020
        3
    yaott2020  
       177 天前 via Android
    两个 dnsmasq 监听不同端口,分别设置不同上游,用 iptables 根据源 ip 重定向到不同端口
    zzlyzq
        4
    zzlyzq  
       177 天前
    把当前 dnsmasq 变成 haproxy ,然后用两个 dnsmasq 服务器分别对应移动和电信,然后 haproxy 采用 round-robin 进行负载。
    aogg
        5
    aogg  
       177 天前
    coredns
    GeekGao
        6
    GeekGao  
       177 天前
    在 dnsmasq 配置文件中定义不同的地址段,并为每个地址段分配一个 tag 。然后,可以使用“server”指令为每个 tag 指定不同的上游 DNS 服务器, 使用“dhcp-option”指令为每个 tag 设置不同的 DNS 服务器。
    这样就能根据用户的 IP 地址段将 DNS 查询转发到不同的上游 DNS 服务器了。
    kursk
        7
    kursk  
       177 天前
    dnsmasq 只能基于域名区别,不能基于源 ip ,iptables 才能干这个

    我是一个企业用户,有两个互联网的出口,假设 ip 分别为 10.1.0.1 和 10.2.0.1 ,如何用 Iptables 实现根据内部用户的 ip 地址,分别从不同的出口出去

    为了根据内部用户的 IP 地址使流量通过不同的网络出口,可以使用 Linux 的 iptables 和 iproute2 工具。下面的示例假设您的两个互联网出口接口分别为 eth1 和 eth2 ,内部网络接口为 eth0 。

    创建路由表:
    首先,在/etc/iproute2/rt_tables 文件中添加两个新的路由表,例如 table1 和 table2:
    plaintext
    Copy code
    echo "200 table1" >> /etc/iproute2/rt_tables
    echo "201 table2" >> /etc/iproute2/rt_tables
    配置路由:
    为每个表添加路由。假设默认网关为 10.1.0.1 和 10.2.0.1:
    bash
    Copy code
    ip route add default via 10.1.0.1 table table1
    ip route add default via 10.2.0.1 table table2
    配置规则:
    基于源 IP 地址添加规则,将特定的流量定向到正确的表:
    bash
    Copy code
    ip rule add from 192.168.1.0/24 table table1
    ip rule add from 192.168.2.0/24 table table2
    在上面的例子中,所有从 192.168.1.0/24 网络来的流量将通过 10.1.0.1 出口,所有从 192.168.2.0/24 网络来的流量将通过 10.2.0.1 出口。

    配置 iptables:
    如果需要,还可以使用 iptables 来管理、过滤或修改流量:
    bash
    Copy code
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
    iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth2 -j MASQUERADE
    上面的命令将确保从指定网络发出的所有数据包都会经过正确的网络接口,并且会应用正确的源地址伪装( NAT )。

    这样,您就可以根据内部用户的 IP 地址,将流量路由到不同的网络出口。请注意,这个配置可能需要根据您的实际网络环境和需求进行调整。
    Dzsss
        8
    Dzsss  
       177 天前
    超 DNSMASQ 纲了,换用 RouterOS 。
    renothing
        9
    renothing  
       177 天前
    楼主的需求可以看看 blocky , 针对不同 clients 使用不同的 upstream
    yyfdsz
        10
    yyfdsz  
    OP
       177 天前
    感谢大家的回复,我来测试
    hyyNull
        11
    hyyNull  
       176 天前
    还有一个 SmartDNS 跟 MosDNS 这俩都是标榜多运营商多线路 DNS 优选的,建议开这个然后再 dnsmasq 里给不同网段 dhcp 下放不同的 DNS
    zwyyy456
        12
    zwyyy456  
       90 天前
    @GeekGao 请问一下,定义不同的地址段并为每个地址段分配一个 tag 之后,仅使用 "server" 指令为每个 tag 指定不同的上游 dns 服务器可以吗?
    "使用“dhcp-option”指令为每个 tag 设置不同的 DNS 服务器" 这一步是必须的嘛?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1620 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:42 · PVG 00:42 · LAX 09:42 · JFK 12:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.