Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何支持keepalived,无法负载到dns2服务器上. #1307

Open
xiaotudoubaba opened this issue Mar 5, 2023 · 25 comments
Open

如何支持keepalived,无法负载到dns2服务器上. #1307

xiaotudoubaba opened this issue Mar 5, 2023 · 25 comments

Comments

@xiaotudoubaba
Copy link

xiaotudoubaba commented Mar 5, 2023

问题现象
搭建keepalived, 用来负载smartdns , 通过nslookup -port=9998 www.baidu.com vip(ip) 来请求另外一台机器dns服务
vip: 172.16.0.100
dns2: 172.16.0.87

返回超时
但是单独请求dns nslookup -port=5300 www.baidu.com 172.16.0.87 可以正常返回

# vip 这台配置.
! Configuration File for keepalived
vrrp_instance ens160_vip {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip  172.16.0.104
    unicast_peer {
        172.16.0.87
    }
    virtual_ipaddress {
       172.16.0.100/24  brd 172.16.0.255  dev eth0 label eth0:vip
    }
}

virtual_server 172.16.0.100 9998 {
    lb_algo rr
    lb_kind NAT
    persistence_timeout 0
    nat_mask 255.255.255.224
    delay_loop 20
    protocol UDP
    real_server 172.16.0.87 5300 {
        weight 5
        MISC_CHECK {
            misc_path "/etc/keepalived/check_dns_server.sh 172.16.0.87 5300"
            misc_timeout 10
        }
    }

   
}

[root@dns4-e8a4-0002 dnstools]# nslookup -port=9998 www.baidu.com 172.16.0.100
;; reply from unexpected source: 172.16.0.87#5300, expected 172.16.0.100#9998
;; reply from unexpected source: 172.16.0.87#5300, expected 172.16.0.100#9998
;; reply from unexpected source: 172.16.0.87#5300, expected 172.16.0.100#9998
;; connection timed out; no servers could be reached

是需要单独配置什么参数吗?

@PikuZheng
Copy link
Contributor

推测是这个问题 #167
要不你先试试vip生效后重启一下smartdns

@xiaotudoubaba
Copy link
Author

xiaotudoubaba commented Mar 6, 2023

vip 先生效,再重启smartdns, 也是同样效果,

image

@xiaotudoubaba
Copy link
Author

这个是smart dns 配置
 bind :5300
 cache-size 4096
 log-level debug
 log-size 100M
 #  配置上游解析DNS
 server 61.132.163.68  -group china
 server 202.96.128.86 -group china
 server 202.96.134.133 -group china
 server 202.101.224.69 -group china
 server 222.172.200.68 -group china
 server 202.106.0.20 -group china
 server 210.22.70.3 -group china

@xiaotudoubaba
Copy link
Author

有点像是 #167

问题应该出在单接口配置了同网段多个ip上。发送请求到 secondary ip 应该是没问题的,但smartdns向上级查询后返回可能是从primary ip 出去的,导致客户端觉得来源不同,丢弃了。
这个有处理办法么?

@PikuZheng
Copy link
Contributor

你这个环境和我用的稍有不同。我用keepalived是直接给设备动态增加了一个ip,不涉及端口转发。

也许可以试试vip和smartdns的ip设在不同的网段,使回包也经过keepalived转发

@PikuZheng
Copy link
Contributor

反正后来我是弃用keepalived了,前端增加了个Mikrotik RouterBOARD做dns代理

@PikuZheng
Copy link
Contributor

找到了,当时的笔记在这里,当时是增加了一条dstnat来使接口ip一致,命令行在这里

@pymumu
Copy link
Owner

pymumu commented Mar 7, 2023

源IP不一致了。
回应的数据包,要刷新源IP地址。lvs是有几种工作模式的,我记得。

@PikuZheng
Copy link
Contributor

源IP不一致了。 回应的数据包,要刷新源IP地址。lvs是有几种工作模式的,我记得。

他回包压根就不经过keepalived,直接从同网段子网出去了。要是修改源ip地址,需要不同网段,keepalived配置为alg网关才行

@xiaotudoubaba
Copy link
Author

xiaotudoubaba commented Mar 7, 2023

vip : 172.16.0.100 
iptables -t nat -A PREROUTING   -p udp -m udp --dport 5300  -m statistic --mode random --probability 0.9 -j DNAT --to-destination 172.16.0.104:5300
iptables -t nat -A PREROUTING  -p udp -m udp --dport 5300  -m statistic --mode random --probability 0.9 -j DNAT --to-destination 172.16.0.87:5300
iptables -t nat -A POSTROUTING  -p udp -m udp --dport 5300  -j SNAT --to-source 172.16.0.100

通过这样操作可以解决;; reply from unexpected source: 问题, 但是性能也降低了一半,原本一台qps 有2.2W, 集群合起来也只有2.4W(性能没提升多少.)

比较奇怪,dnsmasq+keepalived 集群不会出现这个问题,为什么我们的smartdns会出现这个问题呢? 有其他什么建议吗?

@pymumu
Copy link
Owner

pymumu commented Mar 7, 2023

用的最新版本吗?之前解决过源路由问题

@PikuZheng
Copy link
Contributor

PikuZheng commented Mar 8, 2023

用的最新版本吗?之前解决过源路由问题

他不是来源路由的问题,他是不同端口号的端口转发到smartdns,回包没走转发前的ip和端口号。

也许可以试试vip和smartdns的ip设在不同的网段,使回包也经过keepalived转发

这个可行吗@xiaotudoubaba

@xiaotudoubaba
Copy link
Author

用的最新版本吗?之前解决过源路由问题

我用的是smartdns.1.2020.09.08-2235.x86-linux-all.tar.gz版本,回头我试试最新版本

@xiaotudoubaba
Copy link
Author

xiaotudoubaba commented Mar 8, 2023

用的最新版本吗?之前解决过源路由问题
您好,作者, 用最新版本做了下测试,貌似有问题,
我设置2台dns, 都是相同版本, 在一台启动了keepalived vip是172.16.0.100,
通过其他机器nslookup -port=5300 www.baidu.com 172.16.0.100

[root@dns1 new2]# which smartdns
/usr/sbin/smartdns
[root@dns1 new2]# /usr/sbin/smartdns -v
smartdns 1.2023.03.04-1125
如果没有设置iptable的话,报错还是和原来一样,
[root@dns4-e8a4-0001 ~]# nslookup -port=5300 www.baidu.com 172.16.0.100
;; reply from unexpected source: 172.16.0.87#5300, expected 172.16.0.100#5300
;; reply from unexpected source: 172.16.0.87#5300, expected 172.16.0.100#5300
;; reply from unexpected source: 172.16.0.87#5300, expected 172.16.0.100#5300
! Configuration File for keepalived

global_defs {
   notification_email {
     xxx@qq.com
   }
   notification_email_from 121455928@qq.com
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance ens160_vip {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip  172.16.0.104
    unicast_peer {
    }
    virtual_ipaddress {
       172.16.0.100/24  brd 172.16.0.255  dev eth0 label eth0:vip
    }
}

virtual_server 172.16.0.100 5300 {
    lb_algo rr
    lb_kind NAT
    persistence_timeout 0
    nat_mask 255.255.255.224
    delay_loop 20
    protocol UDP
    real_server 172.16.0.104 5300 {
        weight 5
        MISC_CHECK {
            misc_path "/etc/keepalived/check_dns_server.sh 103.65.41.75 5300"
            misc_timeout 10
        }
    }
    real_server 172.16.0.87 5300 {
        weight 5
        MISC_CHECK {
            misc_path "/etc/keepalived/check_dns_server.sh 103.65.41.75 5300"
            misc_timeout 10
        }
    }

}

@pymumu
Copy link
Owner

pymumu commented Mar 8, 2023

发一下nslookup报错时的debug log

@xiaotudoubaba
Copy link
Author

发一下nslookup报错时的debug log
您好, 这个是在172.16.0.20机器上调用nslookup, 调用的时候,两台都有收到日志, 当出现;; reply from unexpected source时, 87这台有日志输出.
image

@pymumu
Copy link
Owner

pymumu commented Mar 8, 2023

看log,smartdns收到请求的ip是172.16.0.20,那么回应的IP也应该是这个。但这个IP没看到是哪里的。
并且nslookup报错的IP是172.16.0.87.

可以用tcpdump在smartdns机器上抓下包看看。

@pymumu
Copy link
Owner

pymumu commented Mar 8, 2023

似乎是,172.16.0.20的udp包直接发送到了172.16.0.87上。然后smartdns处理后,直接将数据包发送到了172.16.0.20的机器。
但172.16.0.20的机器期望的是vip,172.16.0.100这个地址。

看了下,这种情况似乎是keepalive的TUN模式?
最好还是tcpdump看看,请求到smartdns的源IP是否是172.16.0.100

@xiaotudoubaba
Copy link
Author

xiaotudoubaba commented Mar 8, 2023

这个是调用架构图,
image
这个是tcpdump抓包的情况.
image

@xiaotudoubaba
Copy link
Author

xiaotudoubaba commented Mar 8, 2023

似乎是,172.16.0.20的udp包直接发送到了172.16.0.87上。然后smartdns处理后,直接将数据包发送到了172.16.0.20的机器。
但172.16.0.20的机器期望的是vip,172.16.0.100这个地址。

tcpdump抓包看上去是这样.

@pymumu
Copy link
Owner

pymumu commented Mar 8, 2023

你172.16.0.87那个机器,收到的包是来自172.16.0.20的IP,NAT转发给smartdns,保留了源IP,所以smartdns回应也是给172.16.0.20的IP的。但nslookup发送的数据包是给100的地址的。收到了87的数据包,报错了。

这里最大的问题可能就是你的20机器和87机器在同一个网段,导致87发送的数据包,直接到了20那个机器,而没有经过keepalive机器NAT转换。

按理说,dnsmasq这种组网也应该是有问题的。

@xiaotudoubaba
Copy link
Author

我新建了一台机器,让测试机,访问vip的公网, 看上去,问题解决了,
但是都有个time out 超时, 这个要怎么配置吗?
110

@pymumu
Copy link
Owner

pymumu commented Mar 8, 2023

试验了一下,查询两次,有一次成功,另外一次失败,看你用的roundrobin,也就是有一台机器是不成功的。

可能是默认网关没配置?数据包发送不出去?

@xiaotudoubaba
Copy link
Author

好像去172.16.0.87这台查询的请求一直不成功的, 这个是华为云上一台云的服务器,不是很明白需要怎么配置默认网关吗?

@ZqinKing
Copy link

在两台机器上都设置DNAT,应该就可以了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants