dnsmasq的配置

dnsmasq的配置

起因

在新的项目中,这个项目就是做一个5G CPE,可以简单的理解为可以插卡的路由器,可以使用SIM卡的网络,这样一个设备需要通过网线或wifi给连接的设备分配IP和解析DNS,我们选择使用dnsmasq来完成这部分功能

dnsmasq介绍

DNSmasq是一个小巧且方便地用于配置 DNS 和 DHCP 的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。

它服务那些只在本地适用的域名,这些域名是不会在全球的DNS服务器中出现的。DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,DNSmasq支持静态和动态两种DHCP配置方式。因此如果需要快速搭建一个DNS服务或者DHCP服务,那么可以使用此程序来搭建

配置项介绍

dnsmasq的功能非常多,这里只介绍此次用到的功能及其配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#监听的端口,dns默认53端口,如果设置为0则禁止DNS功能
prot=53
#绑定开关
bind-interfaces
#绑定接口
interface=eth0
#DHCP地址池和租期
dhcp-range=192.168.1.100,192.168.200,24
#dhcp配置遵循RFC 2132
#option1 为子网掩码
dhcp-option=1,255.255.255.255
#option3 网关地址
dhcp-option=3,192.168.1.1
#DNS server的地址列表
dhcp-option=6,192.168.1.1
#当设备请求不在地址池的地址时主动拒绝
dhcp-authoritative
#租期文件地址
dhcp-leasefile=/etc/dnsmasq.leases
#DNS地址文件
resolv-file=/etc/resolv.conf
#自定义域名解析地址
address=/carl.myhome.com/192.168.1.1

这样我们就简单的配置好了拥有DNS和DHCP功能的dnsmasq

应用实例

在项目中,dns和DHCP的配置不是一成不变的,用户可以修改DHCP的配置,DNS也是随着SIM卡驻网而改变,所以我们实现一个配置函数,可以根据用户的配置来更改配置文件,使用C++实现,用户设置的参数已经保存到成员变量,这里实现一个成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//使用到的结构体
typedef struct dhcp_info
{
unsigned int enable;
unsigned int lease;
string ipaddr;
string netmask;
string start_ip;
string end_ip;
} dhcp_info;

int my_lan::dnsmasq_config()
{
FILE *fp;
char cmd[128];

if ((fp = fopen(DNSMASQ_DHCPS_CONFIG_FILE, "w")) != NULL)
{
if(1 == mdhcp_info.enable)
{
fprintf(fp, "port=53\n");

fprintf(fp, "bind-interfaces\n");
fprintf(fp, "interface=%s\n", IFNAME);
fprintf(fp, "dhcp-range=%s,%s,%dh\n", mdhcp_info.start_ip.c_str(), mdhcp_info.end_ip.c_str(), mdhcp_info.lease);
fprintf(fp, "dhcp-option=1,%s\n", mdhcp_info.netmask.c_str());
fprintf(fp, "dhcp-option=3,%s\n", mdhcp_info.ipaddr.c_str());
fprintf(fp, "dhcp-option=6,%s\n", mdhcp_info.ipaddr.c_str());
fprintf(fp, "dhcp-authoritative\n");
fprintf(fp, "dhcp-leasefile=%s\n", LEASES_FILE);
fprintf(fp, "resolv-file=%s\n", DNS_FILE);
fprintf(fp, "address=/%s/%s\n", HOSTNAME, mdhcp_info.ipaddr.c_str());
fflush(fp);
fclose(fp);
}
else
{
fprintf(fp, "port=53\n");
fprintf(fp, "resolv-file=%s\n", DNS_FILE);
fprintf(fp, "address=/%s/%s\n", MYNAME, mdhcp_info.ipaddr.c_str());
fflush(fp);
fclose(fp);
}
}
else
{
printf("open %s failed", DNSMASQ_DHCPS_CONFIG_FILE);
return -1;
}

memset(cmd, 0x00, sizeof(cmd));
sprintf(cmd, "ifconfig %s %s netmask %s", IFNAME, mdhcp_info.ipaddr.c_str(), mdhcp_info.netmask.c_str());
if (system(cmd) == -1)
{
printf("cmd:%s failed", cmd);
return -1;
}

system("killall dnsmasq");

memset(cmd, 0x00, sizeof(cmd));
sprintf(cmd, "/usr/bin/dnsmasq -C %s -k -x %s &", DNSMASQ_DHCPS_CONFIG_FILE, DNSMASQ_PID_FILE);
if (system(cmd) == -1)
{
printf("cmd:%s failed", cmd);
return -1;
}

return 0;
}

用户可以选择是否使用DHCP,配置完成后记得重启才能生效,在项目中是不会这样粗暴的重启,也不会使用printf打印error信息,此处代码仅供参考


dnsmasq的配置
https://carl-5535.github.io/2021/10/17/Linux常用工具/dnsmasq/
作者
Carl Chen
发布于
2021年10月17日
许可协议