标签: dnsmasq

  • dnsmasq配置dhcpv6

    dnsmasq开启dhcpv6需要开启以下两项配置

    enable-ra
    启用icmpv6 ra报文发送功能,这是SLAAC所必须的,实测开不开这一项都会发送ra报文

    dhcp-range=::1,::1000,constructor:br-lan,ra-names
    要开始dhcpv6必须指定起始和结束主机号,这里是::1和::1000,据我测试指定::或单独一个::1都无法启用dhcpv6,不用担心指定主机号范围后无法使用SLAAC功能,实际上指定主机号范围后SLAAC和DHCPV6是同时开启的。
    constructor:br-lan这一项是指定绑定的网卡
    ra-names 这一项是利用dhcpv4的主机名来推导ipv6的主机名,可以与其它mode合并使用
    不指定结束主机号且无其它mode M:0,O:0,仅使用SLAAC,dhcp服务不启动
    指定结束主机号 slaac和dhcpv6同时生效,M:1,O:1
    slaac 实测没有效果
    ra-only 实测没有效果
    ra-stateless M:0,O:1,使用无状态dhcpv6,并禁用有状态dhcpv6,dhcpv6应答会显示无可用地址

    如果是openwrt系统,创建/etc/dnsmasq.d/ipv6.conf,添加以下两行

    enable-ra
    dhcp-range=::1,::1000,constructor:br-lan,ra-names
    

    openwrt系统开启dnsmasq的dhcpv6功能后需要关闭openwrt自带的dhcpv6功能
    merlin系统则可以在/jffs/configs目录下修改dnsmasq配置

    查看租约信息
    cat /var/dhcp.lease

    这样能通过主机名访问到的就是IPv6地址了

    更多的语法参考这里:
    https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
    RDNSS:
    https://datatracker.ietf.org/doc/rfc8106/
    dnsmasq实现的RDNSS只有dns server list,没有dns search list

    Views: 3

  • IPV6实现内网主机名动态解析

    根据RFC4704的说明,只有dhcpv6 statefull才支持主机名解析,也就是dhcp请求报文中的option39字段,stateless及SLAAC都是不支持的,这给主机名解析带来了一些难度,要实现主机名解析可以从以下两个方面入手:
    1. 使用dhcpv6 statefull
    dnsmasq和odhcpd都支持statefull功能,还需要注意以下方面
    – 把RA报文的M和O位设置为1
    其实不是也有的客户端都严格按照RA报文的标志来处理,像Windows10上就是始终会执行SLAAC 和DHCPv6两种请求
    – 客户端请求报文携带option 39字段
    在Windows上保持默认即可,部分Linux系统(Debian)需要在/etc/dhcp/dhclient.conf中 添加send fqdn.fqdn = gethostname();
    据我测试macos上也存在这个问题,目前没有解决办法。

    statefull和slaac是可以同时使用的,RA通告前缀的同时使用dhcpv6提供地址分配,这样客户端会     获得两个IP地址
    
    1. 使用dnsmasq ra-names功能
      ra-names是根据dhcpv4中的主机名再结合mac地址计算出主机名与ipv6地址的绑定关系
      这种方式有两个缺点:
      一是,推算出来的ipv6地址不一定100%正确
      二是,要通过DHCP获取ipv4地址,这对于单栈网络或静态配置的IP地址就不行。
      好在statefull和ra-names功能是可以同时使有的,可以弥补彼此的不足

    参考:
    https://datatracker.ietf.org/doc/rfc4704/
    https://serverfault.com/questions/1033682/dhclient-is-sending-host-name-for-ipv4-but-not-ipv6

    Views: 3

  • 使用dnsmasq做GFW流量分流(merlin)

    • 生成dnsmasq用的配置文件
      写一个脚本,内容如下
    #/bin/sh
    export HTTPS_PROXY=172.29.0.24:3128
    data_dir=/jffs/configs
    python3 -m genpac --format=dnsmasq --user-rule-from={data_dir}/user-rule.txt -o{data_dir}/gfwlist.conf --dnsmasq-dns="172.29.0.1#5354"
    export HTTPS_PROXY=
    

    需要在172.29.0.1(镜外主机)上部署一个dns服务器,并且禁用ipv6解析(因为vpn设备ipv6比较麻烦)
    – 部署dns服务器
    编写/etc/coredns/Corefile文件

    .:5354 {
      errors
      log
      template IN AAAA .
      forward . 127.0.0.1
    }
    

    启动dns
    /usr/local/bin/coredns -conf=/etc/coredns/Corefile
    – 配置dnsmasq
    /jfss/configs/dnsmasq.conf.add中添加一行

    “`conf-file=/jffs/configs/gfwlist.conf“`
    service restart_dnsmasq
    – 配置iptables
    ipset create GFWLIST hash:ip
    iptables -t mangle -A PREROUTING -m set –match-set GFWLIST dst -j MARK –set-mark 100
    iptables -t mangle -A OUTPUT -m set –match-set GFWLIST dst -j MARK –set-mark 100
    – 配置wireguard路由
    在/jffs/scripts/wgclient-start中添加以下内容

    #!/bin/sh
    dev_name=wgc{1}
    ip route add default devdev_name table 1
    ip route add 10.12.0.1/32 dev dev_name
    ip route add 172.29.0.0/24 devdev_name
    ip rule add fwmark 100 table 1
    
    • 关闭rp_filter
      不做这一步策略路由不生效
      在/jffs/scripts/firewall-start 中添加
    if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then
       for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
          echo 0 > $i
       done
    fi
    

    以上完。
    关于wireguard部分后面有空再说

    Views: 148

  • dnsmasq解析本地域名的若干方法

    写这个主要是因为如果在公网上配置了IPv6地址的话本地IPV4解析就失效了
    – 方法1,用–address
    2.86版本以后改变了–address=/example.com/1.2.3.4配置的行为,A记录以外的其它记录类型仍然 会向上游转发,这在以前版本是不会的,要保持与以前相同的行为要使用如下写法:
    --address=/example.com/1.2.3.4 --local=/example.com/
    – 方法2,用hosts
    --server=/example.com/
    然后在hosts文件中添加
    1.2.3.4 example.com
    在华硕路由器上的hosts文件是/jffs/configs/hosts.add
    – 方法3,用–dynamic-host添加动态IPV6地址
    –dynamic-host example.com,0::1.2.3.4,br0
    dnsmasq会从br0上获取接口地址添加到ip地址前缀中

    Views: 86