分类目录归档:linux

fredzeng与你一起对linux,linux操作系统,linux命令大全,linux查看磁盘空间学习相关知识及探讨!

systemctl管理双redis启动、停止、开机自动启动

systemctl管理双redis启动、停止、开机自动启动
1. 创建服务
用service来管理服务的时候,是在/etc/init.d/目录中创建一个脚本文件,来管理服务的启动和停止,在systemctl中,也类似,文件目录有所不同,在/lib/systemd/system目录下创建一个脚本文件redis_6379.service,里面的内容如下:

[Unit]
Description=Redis
After=network.target

[Service]
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis_6379.conf  –daemonize no
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown

[Install]
WantedBy=multi-user.target
[Unit] 表示这是基础信息 
Description 是描述
After 是在那个服务后面启动,一般是网络服务启动后启动
[Service] 表示这里是服务信息 
ExecStart 是启动服务的命令
ExecStop 是停止服务的指令
[Install] 表示这是是安装相关信息 
WantedBy 是以哪种方式启动:multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
更详细的service文件说明请访问:这里

2. 创建软链接
创建软链接是为了下一步系统初始化时自动启动服务

ln -s /lib/systemd/system/redis_6379.service /etc/systemd/system/multi-user.target.wants/redis_6379.service
1
创建软链接就好比Windows下的快捷方式 
ln -s 是创建软链接 
ln -s 原文件 目标文件(快捷方式的决定地址)

如果创建软连接的时候出现异常,不要担心,看看/etc/systemd/system/multi-user.target.wants/ 目录是否正常创建软链接为准,有时候报错只是提示一下,其实成功了。

$ ll /etc/systemd/system/multi-user.target.wants/
total 8
drwxr-xr-x  2 root root 4096 Mar 30 15:46 ./
drwxr-xr-x 13 root root 4096 Mar 13 14:18 ../
lrwxrwxrwx  1 root root   31 Nov 23 14:43 redis_6379.service -> /lib/systemd/system/redis_6379.service
…略…

3. 刷新配置
刚刚配置的服务需要让systemctl能识别,就必须刷新配置

$ systemctl daemon-reload
如果没有权限可以使用sudo
$ sudo systemctl daemon-reload
4. 启动、重启、停止
启动redis

$ systemctl start redis_6379
重启redis

$ systemctl restart redis_6379 
停止redis

$ systemctl stop redis_6379
1
5. 开机自启动
redis服务加入开机启动

$ systemctl enable redis_6379
1
禁止开机启动

$ systemctl disable redis_6379
1
6. 查看状态
查看状态

$ systemctl status redis

● redis_6379.service – Redis
   Loaded: loaded (/usr/lib/systemd/system/redis_6379.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2018-11-12 14:32:32 CST; 2min 30s ago
  Process: 305 ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown (code=exited, status=0/SUCCESS)
 Main PID: 335 (redis-server)
   CGroup: /system.slice/redis_6379.service
           └─335 /usr/local/redis/bin/redis-server 127.0.0.1:6379

Nov 12 14:32:32 10-13-35-210 systemd[1]: Started Redis.
Nov 12 14:32:32 10-13-35-210 systemd[1]: Starting Redis…

其他端口,复制一份

redis_6379

centos7 系统 df 无反应问题处理说明

问题描述

近期陆续碰到几台主机 df 卡住的问题, 监控程序由于超时引起相关的警报, 系统环境和 strace df 如下所示:

kernel-3.10.0-514.21.2
systemd-219-57 

strace 显示卡在了 /proc/sys/fs/binfmt_misc 状态中:

# strace df
execve("/usr/bin/df", ["df"], [/* 29 vars */]) = 0
brk(0)                                  = 0x1731000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa7720a7000
access("/etc/ld.so.preload", R_OK)      = 0
open("/etc/ld.so.preload", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0
......
stat("/sys/fs/cgroup/memory", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/kernel/config", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
stat("/proc/sys/fs/binfmt_misc", 

在 systemd 服务中, 挂载 /proc/sys/fs/binfmt_misc 的只有两个 unit, 分别为 proc-sys-fs-binfmt_misc.automount 和 proc-sys-fs-binfmt_misc.mount, 查看几台问题机器系统服务状态, 仅有 automount 服务启动:

 proc-sys-fs-binfmt_misc.automount             loaded    active   running   Arbitrary Executable File Formats File System Automount Point
  proc-sys-fs-binfmt_misc.mount                 loaded    inactive dead      Arbitrary Executable File Formats File System
  systemd-binfmt.service                        loaded    inactive dead      Set Up Additional Binary Formats 

问题机器分别进行过触发 mount 的操作, 但是没有进行过 systemctl stop proc-sys-fs-binfmt_misc.mount 操作:

May 30 17:34:53 cz1 systemd: Got automount request for /proc/sys/fs/binfmt_misc, triggered by 292977 (sysctl)
May 30 17:34:53 cz1 systemd: Mounting Arbitrary Executable File Formats File System...
May 30 17:34:53 cz1 systemd: Mounted Arbitrary Executable File Formats File System.
May 31 10:45:00 cz1 systemd: Unmounting Arbitrary Executable File Formats File System...
May 31 10:45:00 cz1 systemd: Unmounted Arbitrary Executable File Formats File System. 

查看 snoopy 日志, unmount 操作由 pid 13573 进程操作, 该 pid 的 sid 为 1, pid 为 1 的进程为 /usr/lib/systemd/systemd --switched-root --system --deserialize 22, snoopy 行为等同 automount 超时自动 unmount :

May 31 10:45:00 cz1 systemd[1]: Unmounting Arbitrary Executable File Formats File System...
May 31 10:45:00 cz1 snoopy[13573]: [uid:0 sid:1 tty:(none) cwd:/ filename:/bin/umount]: /bin/umount /proc/sys/fs/binfmt_misc
May 31 10:45:00 cz1 systemd[1]: Unmounted Arbitrary Executable File Formats File System. 

问题机器的 mount 信息包含如下, timeout 为 300, 这个是 systemd-219-32 之前版本的默认参数, 实际上在 219-32 版本之前红帽还未引入超时功能, 所以超过 300s 之后 automount 不会自动进行 unmount 操作, 下面的内容仅有一条 binfmt 信息, 也意味着两台机器中没有访问 /proc/sys/fs/binfmt_misc 目录的行为:

systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=30,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0 

备注: 问题主机由于在 yum 安装 perl 依赖的过程中更新了 systemd 到 219-57 新版, 但是没有做重启操作, 所以 mount 显示的 timeout 值还是 300, 重新 reload systemd 或 重启主机后新版 systemd 生效, timeout 值会变为默认 0.

automount 如何工作

systemd 通过 automount 实现了对文件系统挂载点进行自动挂载和控制的特性, 在用户访问指定目录的时候, 由 automount 判断自动进行挂载, nfs, sshfs 等使用较多, 目前为止在 centos7 系统中我们仅发现 binfmt_msic 类型是操作系统需要自动挂载的. 详见 systemd.automount

原因说明

从上述搜集信息来看, 更像是 systemd 认为 proc-sys-fs-binfmt_misc.mount 已经关闭, 不过系统或内核还持有 /proc/sys/fs/binfmt_misc 挂载点, 引起竞争, 这样 df 在访问挂载点的时候则一直处于挂起状态. 这个问题类似 nfs 服务端异常断掉, client 端直接访问挂载点也会挂起一样. 没有做超时处理则 df 一直处于等待状态.
详见: 1534701

触发条件

由于出现问题之前几台问题主机都有 unmount 行为, 所以不能按照下面两个 bug 来概述我们出现的问题:
1498318
1534701

不过目前已知的触发条件包含以下两种方式:

第一种

人为制造异常:

1. 修改 proc-sys-fs-binfmt_misc.automount 的 TimeoutIdleSec 为大于 0 的值, 219-30 版本默认300, 不用修改;
2. 访问 /proc/sys/fs/binfmt_misc/ 目录触发 aumount 自动挂载;
3. 在1中还没有超时的时候执行 systemctl stop proc-sys-fs-binfmt_misc.mount, 手动 unmount 掉挂载点; 

在执行第三步的时候 systemd 报以下异常, unmount 操作不能注册, 而系统内核会继续持有挂载点, 进而引起 df 卡住. 另外在默认 timeout 为 0 的情况下人为制造的异常不会引起 hang 住:

Jun  6 21:19:50 cz1 snoopy[162749]: [time_ms:357 login:root uid:0 pid:162749 ppid:162676 sid:162676 tty:/dev/pts/0 cwd:/root filename:/usr/bin/systemctl username:root]: systemctl stop proc-sys-fs-binfmt_misc.mount
Jun  6 21:19:50 cz1 snoopy[162750]: [time_ms:359 login:root uid:0 pid:162750 ppid:162749 sid:162676 tty:/dev/pts/0 cwd:/root filename:/usr/bin/systemd-tty-ask-password-agent username:root]: /usr/bin/systemd-tty-ask-password-agent --watch
Jun  6 21:19:50 cz1 snoopy[162751]: [time_ms:359 login:root uid:0 pid:162751 ppid:162749 sid:162676 tty:/dev/pts/0 cwd:/root filename:/usr/bin/pkttyagent username:root]: /usr/bin/pkttyagent --notify-fd 5 --fallback
Jun  6 21:19:50 cz1 polkitd[1036]: Registered Authentication Agent for unix-process:162749:2586612889 (system bus name :1.232140 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Jun  6 21:19:50 cz1 snoopy[162755]: [time_ms:371 login:(unknown) uid:0 pid:162755 ppid:1 sid:1 tty:(none) cwd:/ filename:/bin/umount username:root]: /bin/umount /proc/sys/fs/binfmt_misc
Jun  6 21:19:50 cz1 polkitd[1036]: Unregistered Authentication Agent for unix-process:162749:2586612889 (system bus name :1.232140, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus) 

执行 systemctl restart proc-sys-fs-binfmt_misc.automount 即可恢复所有堵住的命令. 另外在 TimeoutIdleSec 为 0 的情况下不会复现此问题, 在 TimeoutIdleSec 大于 0 的情况下, 给 systemd 发送 kill 信号的时候会导致 timeout 失效.

第二种

如下日志:

May 31 10:45:00 cz1 systemd[1]: Unmounting Arbitrary Executable File Formats File System...
May 31 10:45:00 cz1 snoopy[6313]: [uid:0 sid:1 tty:(none) cwd:/ filename:/bin/umount]: /bin/umount /proc/sys/fs/binfmt_misc
May 31 10:45:00 cz1 systemd[1]: Unmounted Arbitrary Executable File Formats File System. 

我们以 snoopy 日志的 umount 操作为出发点, 在 systemd 源文件中查找对应行为的触发条件, 以 systemd-219-31 版本为例, 只有 mount_enter_unmounting 函数进行了 /bin/umount 操作, 详见 src/core/mount.c 文件:

static void mount_enter_unmounting(Mount *m) {
...
   r = exec_command_set(m->control_command, "/bin/umount", m->where, NULL);
...
} 

而 mount_enter_unmounting 函数仅被两个函数调用, 分别为正常 stop 操作的响应函数 mount_stop 和信号事件处理函数 mount_sigchld_event :

...
#define RETRY_UMOUNT_MAX 32
...
static int mount_stop(Unit *u) {
...
        mount_enter_unmounting(m);
        return 1;
}

static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
...
        MountResult f;
...
        if (is_clean_exit(code, status, NULL))
                f = MOUNT_SUCCESS;
        else if (code == CLD_EXITED)
                f = MOUNT_FAILURE_EXIT_CODE;
        else if (code == CLD_KILLED)
                f = MOUNT_FAILURE_SIGNAL;
        else if (code == CLD_DUMPED)
                f = MOUNT_FAILURE_CORE_DUMP;
        else
                assert_not_reached("Unknown code");
...
        case MOUNT_UNMOUNTING:
        case MOUNT_UNMOUNTING_SIGKILL:
        case MOUNT_UNMOUNTING_SIGTERM:

                if (f == MOUNT_SUCCESS) {

                        if (m->from_proc_self_mountinfo) {

                                /* Still a mount point? If so, let's
                                 * try again. Most likely there were
                                 * multiple mount points stacked on
                                 * top of each other. Note that due to
                                 * the io event priority logic we can
                                 * be sure the new mountinfo is loaded
                                 * before we process the SIGCHLD for
                                 * the mount command. */

                                if (m->n_retry_umount < RETRY_UMOUNT_MAX) {
                                        log_unit_debug(u->id, "%s: mount still present, trying again.", u->id);
                                        m->n_retry_umount++;
                                        mount_enter_unmounting(m);
                                } else {
                                        log_unit_debug(u->id, "%s: mount still present after %u attempts to unmount, giving up.", u->id, m->n_retry_umount);
                                        mount_enter_mounted(m, f);
                                }
                        } else
                                mount_enter_dead(m, f); 

在 src/core/manager.c 函数中可以看到仅有函数 invoke_sigchild_event 调用了 sigchld_event 函数, invoke_sigchild_event 函数则仅在子进程退出(CLD_EXITED) 或子进程被杀(CLD_KILLED) 或子进程异常中断(CLD_DUMPED) 的时候才会被 manager_dispatch_sigchild 函数调用, manager_dispatch_sigchild 函数分别在 manager_loop 和 manager_dispatch_signal_fd 中调用.

static void invoke_sigchld_event(Manager *m, Unit *u, siginfo_t *si) {
......
        UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
}

static int manager_dispatch_sigchld(Manager *m) {
...
                if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
                ...
                        if (u1)
                                invoke_sigchld_event(m, u1, &si);
                        u2 = hashmap_get(m->watch_pids1, LONG_TO_PTR(si.si_pid));
                        if (u2 && u2 != u1)
                                invoke_sigchld_event(m, u2, &si);
                        u3 = hashmap_get(m->watch_pids2, LONG_TO_PTR(si.si_pid));
                        if (u3 && u3 != u2 && u3 != u1)
                                invoke_sigchld_event(m, u3, &si);
                }
...
}

int manager_loop(Manager *m) {
...
        /* There might still be some zombies hanging around from
         * before we were exec()'ed. Let's reap them. */
        r = manager_dispatch_sigchld(m);
}

static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
...
        if (sigchld)
                manager_dispatch_sigchld(m);
....
} 

问题主机的 umount 日志显示不是正常的 stop 操作, 但也未看找到相关的信号信息. 不过从整个 systemd 日志来看 umount 操作更像是属于上述 mount_sigchld_event 函数的行为, 即在子进程为 CLD_EXITED 或 CLD_KILLED 或 CLD_DUMPED 的时候, 调用 mount_sigchld_event 函数, 这时 systemd 的状态为 UNMOUNTING, 或者收到 SIGKILL, SIGTERM 信号的时候, 而系统或内核认为当前状态为 SUCCESS (f 变量), 在从 /etc/mtab(mtab 为 /proc/self/mountinfo 的软链) 读取到 mount 信息的时候, 当前的重试次数(n_retry_umount) 小于 RETRY_UMOUNT_MAX (32) 的时候则进行一次 mount_enter_unmounting 函数调用. 另外现在也并没有找到系统内核会和 systemd 的状态相反, 可能是子进程退出或子进程异常终止.

这种方式没有好的重现方法, 不过处理方式应该和第一种一样, 重启 proc-sys-fs-binfmt_misc.automount 即可.

解决方式

目前并没有找到真正的触发条件, 不过我们认为 df 卡住问题在本质上还是由于 systemd 和 kernel 之间存在竞争而引起的, 导致其它程序访问挂载点的时候出现 hang 住的现象, 根据 redhat bugzilla 的描述, 只要解决掉 mount 和 automount 过程中可能产生的竞争即可, 我们可以通过关闭 proc-sys-fs-binfmt_misc.automount 释放已经存在的竞争来解决 df hang 住的问题, 所以整体上包含以下三种解决方式:

1. systemctl restart proc-sys-fs-binfmt_misc.automount;
2. 升级到最新 systemd-219-57 版本; 
3. 按照红帽知识库的步骤对 proc-sys-fs-binfmt_misc.automount 进行 mask 操作, 只进行静态的 mount 操作; 

这几种方式对应用程序无害, 第一种方式影响最小. 不过我们在排错的过程中发现了一些其它相关的 bug, 所以采取第二种方式会更稳妥,新版的 systemd 对 1354410 和 1498318 两个 bug 做了状态反馈处理, 即便有问题也不会出现 hang 住的现象, 另外默认超时时间为 0, 对程序来讲相当于只做了重启操作, 不过后续的版本可能存在变更的可能, 所以保险起见可以将在 proc-sys-fs-binfmt_misc.automount 配置中指定 TimeoutIdleSec=0 参数值, 避免自动进行 unmount 操作. 最后重启机器即可; 第三种操作则可能影响其它有 automount 需求的软件(比如新版本的 postgresql), 不过很多软件在检测到没有启动 automount 的情况下会进行额外的 mount 操作, 不会有严重的影响.

参考链接:

1498318
1534701
1709649
github-5916
github-commit

红帽知识库

3346491 与我们的触发条件不一样, 并不是重新激活已经 mask 的 unit 问题引起的, 仅提供了类似问题的解决方法.

其它问题

在查找根源的过程中发现了几个相关的问题, 这些问题随 systemd 版本的变更进行了修复:

219-32
- automount: add expire support(TimeoutIdleSec) (#1354410)
219-46
- automount: if an automount unit is masked, don't react to activation anymore (#5445) (#1498318)
219-57
- BZ - 1498318 - du/df hang indefinitely (RHEL Atomic Host 7.4) 
https://arstercz.com/centos7-%E7%B3%BB%E7%BB%9F-df-hang-%E9%97%AE%E9%A2%98%E5%A4%84%E7%90%86%E8%AF%B4%E6%98%8E/

php安装IMAP依赖

[root@hexu.org imap]$ yum install -y libc-client-devel

[root@hexu.org imap]$ ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.so

3. 进行安装

[root@hexu.org imap]$ /usr/local/php/bin/phpize

[root@hexu.org imap]$ ./configure –with-php-config=/usr/local/php/bin/php-config –with-imap –with-imap-ssl –with-kerberos

[root@hexu.org imap]$ make && make install

4. 最后调整php.ini

[root@hexu.org imap]$ vi /usr/local/php/lib/php.ini

##vi php.ini add following config

[imap]

extension = imap.so

5. 检查是否安装成功

[root@hexu.org imap]# php -v

PHP 5.3.23 (cli) (built: Apr  7 2013 23:20:21) 

Copyright (c) 1997-2013 The PHP Group

Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

[root@hexu.org imap]# php -m | grep imap

imap ## 看到这里,说明成功安装了

按上面顺序安装应该不会有报错,如果发现错误根据提示找相应的依赖包安装即可,下面举例安装过程遇到的2个error.

1. 没有安装libc-client-devel导致,按上面第一步安装即可, Error info:

checking for utf8_mime2text signature… new

checking for U8T_DECOMPOSE… 

configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.

2. 找不到libc-client.a library, 需要手动添加文件link, Errof info:

checking for crypt in -lcrypt… yes

configure: error: Cannot find imap library (libc-client.a). Please check your c-client installation.

解决方法:

# ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.so

如果出现 Cannot find imap library (libc-client.a).

我们只要执行

# yum install libc-client-devel.x86_64

# ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.so

python版本问题,iotop执行错误except ImportError, e:解决

# iotop 
  File “/usr/sbin/iotop”, line 10
    except ImportError, e:
                      ^
SyntaxError: invalid syntax
[root@eanquan ~]# vi /usr/sbin/iotop 
#!/usr/bin/python
# iotop: Display I/O usage of processes in a top like UI
# Copyright (c) 2007, 2008 Guillaume Chazarain <guichaz@gmail.com>, GPLv2
# See iotop –help for some help

import sys

try:
    from iotop.ui import main
except ImportError, e:
    print e
    print ‘To run an uninstalled copy of iotop,’
    print ‘launch iotop.py in the top directory’
else:
    try:
        main()
    except KeyboardInterrupt:
        pass

    sys.exit(0)

# ll /usr/bin/python2*0 B/s  0.00 %  0.00 % [md/1]
lrwxrwxrwx. 1 root root       6 Jul  8  2016 /usr/bin/python2 -> python
-rwxr-xr-x. 2 root root    4864 Jan 22  2014 /usr/bin/python2.6
-rwxr-xr-x  1 root root 6273947 Dec  4  2017 /usr/bin/python2.7

执行python的#!/usr/bin/python 改为

#!/usr/bin/python2.6就可以

MQ产品比较-ActiveMQ-RocketMQ

几种MQ产品说明:

ZeroMQ : 扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码

RabbitMQ: 结合erlang语言本身的并发优势,性能较好,但是不利于做二次开发和维护

ActiveMQ: 历史悠久的开源项目,已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,不够轻巧(源代码比RocketMQ多).,支持持久化到数据库,对队列数较多的情况支持不好,不过我们的项目中并不会建很多的队列.

Redis: 做为一个基于内存的K-V数据库,其提供了消息订阅的服务,可以当作MQ来使用,目前应用案例较少,且不方便扩展

RocketMQ: 阿里巴巴的MQ中间件,在其多个产品下使用,并能够撑住双十一的大流量,他并没有实现JMS规范,使用起来很简单。部署由一个 命名服务(nameserver)和一个代理(broker)组成,nameserver和broker以及producer都支持集群,队列的容量受机器硬盘的限制,队列满后可以支持持久化到硬盘(也可以自己适配代码,将其持久化到NOSQL数据库中),队列满后会影响吞吐量,可以采用主备来保证稳定性,支持回溯消费,可以在broker端进行消息过滤.

针对消息中间件的选择可以从以下方面进行考虑:(主要对比ActiveMQ和RocketMQ)

  • 优先级:我们的项目对此需求不是特别明显,RocketMQ需要新建一个特殊队列来接收优先级高的队列,无法实现从0-65535这种细粒度的控制,ActiveMQ可以精细控制

  • 顺序:我们的消息总线中的消息应该都是无状态的,所以对消息的处理顺序没有严格的要求,如果有特殊要求的话可以在业务层进行控制,activeMQ无法保证严格的顺序,RocketMQ可以保证严格的消费顺序

  • 持久化:都支持

  • 稳定性:RoketMQ在稳定性上可能更值得信赖,支持多种集群方案,毕竟已经撑过几个双十一

  • 消息过滤:ActiveMQ仅支持在客户端消费的时候进行判断是否是自己需要的消息,RocketMQ可以在broker端进行过滤,对于我们的消息总线,这里可以节省大量的网络传输是否会有消息重发造成的重复消费:RocketMQ可以保证,ActiveMQ无法保证

  • 回溯消费:即重新将某一个时刻之前的消息重新消费一遍,我们对于这种需求应该很少,RocketMQ支持,ActiveMQ不支持(RocketMQ的队列是持久化到硬盘的,定期进行清除

  • 事务:都支持

  • 定时消费:RocketMQ支持

  • 消息堆积:就是当缓存消息的内存满了之后的解决方案,一种是丢弃策略,这种不会影响吞吐量,还有一种就是将消息持久化到磁盘,这种会影响吞吐量,在评估影响程度上,RocketMQ的成绩稍微好一点

  • 客户端不在线:RocketMQ可以在客户端上线后继续将未消费的消息推送到客户端

    目前比较活跃的几种MQ中间件产品的对比如下:(仅统计开源的项目)

ActiveMQ RabbitMQ RocketMq ZeroMQ
关注度
成熟度 成熟 成熟 比较成熟 不成熟
所属社区/公司 Apache Mozilla Public License Alibaba
社区活跃度
文档
特点 功能齐全,被大量开源项目使用 由于Erlang 语言的并发能力,性能很好 各个环节分布式扩展设计,主从 HA;支持上万个队列;多种消费模式;性能很好 低延时,高性能,最高 43万条消息每秒
授权方式 开源 开源 开源 开源
开发语言 Java Erlang Java C
支持的协议 OpenWire、STOMP、REST、XMPP、AMQP AMQP 自己定义的一套(社区提供JMS–不成熟) TCP、UDP
客户端支持语言 Java、C、C++、Python、PHP、Perl、.net 等 Java、C、C++、Python、 PHP、Perl 等 Java C++(不成熟) python、 java、 php、.net 等
持久化 内存、文件、数据库 内存、文件 磁盘文件 在消息发送端保存
事务 支持 支持 支持 不支持
集群 支持 支持 支持 不支持
负载均衡 支持 支持 支持 不支持
管理界面 一般
部署方式 独立、嵌入 独立 独立 独立
评价 优点:成熟的产品,已经在很多公司得到应用(非大规模场景)。有较多的文档。各种协议支持较好,有多重语言的成熟的客户端;缺点:根据其他用户反馈,会出莫名其妙的问题,切会丢失消息。 其重心放到activemq6.0 产品—apollo 上去了,目前社区不活跃,且对 5.x 维护较少;Activemq 不适合用于上千个队列的应用场景 优点: 由于erlang语言的特性,mq 性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;支持amqp系诶,有多中语言且支持 amqp 的客户端可用缺点:erlang语言难度较大。集群不支持动态扩展。 优点:模型简单,接口易用(JMS 的接口很多场合并不太实用)。在阿里大规模应用。目前支付宝中的余额宝等新兴产品均使用rocketmq。集群规模大概在50 台左右,单日处理消息上百亿;性能非常好,可以大量堆积消息在broker 中;支持多种消费,包括集群消费、广播消费等。开发度较活跃,版本更新很快。缺点:没有在 mq 核心中去实现JMS 等接口
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dreamsunday/article/details/52223288

centos 7 开机自动挂载Windows共享文件夹

命令行中挂载Windows共享文件,重启后失效

#mount -t cifs -o username=linux,password=passwd //192.168.121.121/share /mnt/share



开机自动挂载,则需要在/etc/fstab中加入下面一行即可

//192.168.121.122/share /mnt/share cifs username=linux,password=passwd 0 0



取消挂载 umount

如果密码有特殊符号,一个从左上到右下的斜杠\即可,例如\&  \’,即可(开机自动挂载不用加斜杠)

如果在修改/etc/fstab文件后,运行mount -a命令验证一下配置是否正确,则可以避免重启移除此类问题。如果还是不行就要特殊字符吧。

问题的解决过程中,重新mount /是比较关键的一步(mount -o remount,rw /)。如果没有此步操作,则文件系统处于只读状态,导致不能修改配置文件并保存

centos6.5升级安装openssl 1.0.1u(最后更新版本,官网不再维护)

1、查看源版本
[root@zj ~]# openssl version -a
OpenSSL 1.0.1e
2、下载openssl-1.0.1u.tar.gz
wget wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz
3、更新zlib
yum install -y zlib
4、解压安装
tar zxf openssl-1.0.1u.tar.gz
cd openssl-1.0.1u.tar.gz
./config shared zlib
make
make install
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
echo /usr/local/ssl/lib” >> /etc/ld.so.conf
ldconfig -v
5、查看是否升级成功
[root@zj ~]# openssl version -a
OpenSSL 1.0.1u  22 Sep 2016
built on: Tue May  8 11:13:07 2018
platform: linux-x86_64
options:  bn(64,64) rc4(8x,char) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -I. -I.. -I../include  -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM

OPENSSLDIR: "/usr/ssl"


wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz;tar -zxvf openssl-1.0.1u.tar.gz ;cd openssl-1.0.1u;./config --prefix=/usr;make;make install;ldconfig -v;openssl version -a

dnsmasq 是一个轻量级的DNS

dnsmasq [选项] …  

描述

dnsmasq 是一个轻量级的DNS,TFTP,PXE,路由器通告和DHCP服务器。它旨在为LAN提供耦合的DNS和DHCP服务。

Dnsmasq接受DNS查询,并从一个小的本地缓存中回答它们,或者将它们转发给一个真正的递归DNS服务器。它加载/ etc / hosts的内容,以便可以解析未出现在全局DNS中的本地主机名,并且还可以解答DHCP配置主机的DNS查询。它也可以充当一个或多个域的权威DNS服务器,允许本地名称出现在全球DNS中。它可以配置为进行DNSSEC验证。

dnsmasq DHCP服务器支持静态地址分配和多个网络。它会自动发送一组合理的默认DHCP选项,并且可以配置为发送任何所需的一组DHCP选项,包括供应商封装的选项。它包括一个安全的只读TFTP服务器,允许DHCP主机进行net / PXE引导,并支持BOOTP。PXE支持功能全面,包括向客户端提供PXE信息的代理模式,而DHCP地址分配则由另一台服务器完成。

dnsmasq DHCPv6服务器提供了与DHCPv4服务器相同的一组功能,此外,它还包含路由器通告和一个整洁的功能,它允许为使用DHCPv4的客户端命名,而仅为IPv6配置使用无状态自动配置。支持从通过DHCPv6前缀委托动态委派的子网进行地址分配(DHCPv6和RA)。

Dnsmasq考虑了小型嵌入式系统。它旨在尽可能小的内存空间与所支持的功能兼容,并允许在编译后的二进制文件中省略不需要的功能。  

OPTIONS

请注意,通常缺少参数是允许的并关闭函数,例如“–pid-file”禁止写入PID文件。在BSD上,除非链接GNU getopt库,否则选项的长形式在命令行上不起作用; 它仍然在配置文件中被识别。

– 测试
阅读和语法检查配置文件。如果一切正常,则退出代码0,否则退出非零代码。不要启动dnsmasq。
-w, – 帮助
显示所有命令行选项。 –help dhcp 将显示已知的DHCPv4配置选项,– help dhcp6 将显示DHCPv6选项。
-h, – 无主机
不要读取/ etc / hosts中的主机名。
-H,–addn-hosts = <file>
其他主机文件。读取指定的文件以及/ etc / hosts。如果给出-h,则只读取指定的文件。此选项可能会重复多个其他主机文件。如果给出了一个目录,那么读取该目录中包含的所有文件。
–hostsdir = <路径>
读取目录中包含的所有主机文件。新的或更改的文件会自动读取。有关详细信息,请参阅–dhcp-hostsdir。
-E,–expand-hosts
将域添加到/ etc / hosts中的简单名称(没有句点),方法与DHCP派生名称相同。请注意,这不适用于cnames,PTR记录,TXT记录等中的域名。
-T,–local-ttl = <时间>
当使用来自/ etc / hosts或配置的信息或DHCP租用文件dnsmasq进行回复时,默认情况下会将生存时间字段设置为零,这意味着请求者不应该自己缓存信息。这在几乎所有情况下都是正确的。该选项允许为这些回复提供生存时间(以秒为单位)。这会减少服务器上的负载,但会损害在某些情况下使用陈旧数据的客户端。
–dhcp-TTL = <时间>
至于–local-ttl,但只影响来自DHCP租约的信息。如果两者都给出,则–dhcp-ttl适用于DHCP信息, – – local-ttl适用于其他方式。将其设置为零可以消除DHCP的–local-ttl的影响。
–neg-TTL = <时间>
上游服务器的否定回复通常包含dnsmasq用于缓存的SOA记录中的生存时间信息。如果来自上游服务器的回复省略了此信息,则dnsmasq不会缓存回复。此选项为dnsmasq用于缓存否定响应(即使没有SOA记录)的生存时间(以秒为单位)提供默认值。
–max-TTL = <时间>
设置将分配给客户端的最大TTL值。如果指定的最大TTL较低,则将给予客户端而不是真正的TTL值。但是真正的TTL值保存在缓存中以避免洪泛上游DNS服务器。
–max缓存-TTL = <时间>
为高速缓存中的条目设置最大TTL值。
–min缓存-TTL = <时间>
将短TTL值扩展到缓存时的时间。请注意,人为地扩展TTL值通常是一个糟糕的主意,除非您有充分的理由,并明白自己在做什么,否则不要这样做。除非重新编译,否则Dnsmasq会将此选项的值限制为一小时。
–auth-TTL = <时间>
设置授权服务器答复中返回的TTL值。
-k, – 保持在前景
不要在启动时进入后台,否则照常运行。这适用于在daemontools或launchd下运行dnsmasq时使用。
-d,–no-daemon
调试模式:不要叉到后台,不要写pid文件,不要更改用户ID,在SIGUSR1上收到时生成一个完整的缓存转储,记录到stderr以及syslog,不要fork新进程处理TCP查询。请注意,此选项仅用于调试,以停止生产中的dnsmasq守护进程,请使用 -k。
-q,–log-queries
记录由dnsmasq处理的DNS查询的结果。收到SIGUSR1后启用完整缓存转储。如果提供参数“extra”,即 –log-queries = extra, 那么日志在每行的开始处都有额外的信息。它由一个序列号组成,该序列号将与单个查询关联的日志行与请求者的IP地址绑定在一起。
-8,–log-facility = <facility>
设置dnsmasq将发送系统日志条目的设备,默认设置为DAEMON,当调试模式运行时设置为LOCAL0。如果给定的设施至少包含一个’/’字符,则它被视为文件名,并且dnsmasq将记录到给定文件,而不是syslog。如果设施是’ – ‘,那么dnsmasq记录到stderr。(读取配置时的错误仍会转到syslog,但所有成功启动的输出以及运行时的所有输出将专门用于该文件。)在记录到文件时,当接收到SIGUSR2时,dnsmasq将关闭并重新打开该文件。这允许日志文件在不停止dnsmasq的情况下进行旋转。
–log-异步[= <线>]
启用异步日志记录,并且可选地设置写入syslog时将由dnsmasq排队的行数限制较慢。Dnsmasq可以异步登录:这可以让它在不被syslog阻塞的情况下继续工作,并允许syslog为DNS查询使用dnsmasq而不会造成死锁。如果日志队列变满,dnsmasq会记录溢出,并且丢失的消息数量。默认队列长度为5,理智值为5-25,最大值为100。
-x,–pid-file = <path>
为dnsmasq指定一个备用路径来记录其进程ID。通常是/var/run/dnsmasq.pid。
-u,–user = <username>
指定启动后dnsmasq将更改的用户标识。Dnsmasq通常必须以root用户身份启动,但它会在启动后通过将id更改为另一个用户来删除root权限。通常情况下,这个用户是“没有人”,但是可以用这个开关覆盖。
-g,–group = <组名>
指定dnsmasq将运行的组。默认为“dip”(如果可用),以方便访问通常不具有世界可读性的/etc/ppp/resolv.conf。
-v,–version
打印版本号。
-p,–port = <port>
在<port>上监听,而不是标准的DNS端口(53)。将其设置为零可以完全禁用DNS功能,只保留DHCP和/或TFTP。
-P,–edns-packet-max = <size>
指定DNS转发器支持的最大EDNS.0 UDP数据包。默认为4096,这是RFC5625推荐的大小。
-Q,–query-port = <query_port>
从特定UDP端口<query_port>发送出站DNS查询,并侦听它们的回复,而不是使用随机端口。请注意,使用此选项将使dnsmasq对DNS欺骗攻击的安全性降低,但它可能会更快并且使用更少的资源。将此选项设置为零会使dnsmasq使用操作系统分配给它的单个端口:这是2.43之前版本中的默认行为。
–min端口= <端口>
不要使用小于指定的端口作为出站DNS查询的源。Dnsmasq选择随机端口作为出站查询的来源:当给出此选项时,使用的端口将始终大于指定的端口。对防火墙后面的系统有用。如果未指定,则默认为1024。
–max端口= <端口>
使用低于给定的端口作为出站DNS查询的源。Dnsmasq选择随机端口作为出站查询的来源:当给出此选项时,使用的端口将始终低于指定的端口。对防火墙后面的系统有用。
-i,–interface = <接口名称> 只在指定的接口上进行监听。当使用–interface 选项时,Dnsmasq会自动将环回(本地)接口添加到要使用的接口列表中 如果没有 给出–interface 或 –listen -address选项,则除了–except-interface 选项中给出的任何接口外,dnsmasq会侦听所有可用接口 在Linux上,当 –bind-interfaces 或 –bind-dynamic 实际上是检查IP别名接口标签(例如“eth1:0”),而不是接口名称。在退化的情况下,当一个接口有一个地址时,这相当于同样的事情,但是当一个接口有多个地址时,它允许控制哪些地址被接受。通过使用–listen-address,可以在默认模式下实现相同的效果  可以在–interface 和 –except-interface 选项中使用包含尾部’*’的简单通配符 
-I,–except-interface = <接口名称>
不要在指定的界面上监听。请注意,— listen -address –interface 和 –except-interface 选项的顺序 无关紧要,并且 –except-interface 选项总是覆盖其他选项。关于–listen-address的接口标签的评论 适用于此处。
–auth服务器= <域>,<接口> | <IP地址>
为到达接口或地址的查询启用DNS授权模式。请注意,无需在–interface 或 –listen -address 配置中提及接口或地址,事实上–auth-server 将覆盖这些接口或地址 , 并在指定的接口上提供不同的DNS服务。<domain>是“胶水记录”。它应该在全局DNS中解析指向地址dnsmasq正在监听的A和/或AAAA记录。当指定接口时,可以使用“/ 4”或“/ 6”进行限定,以仅指定与该接口关联的IPv4或IPv6地址。
–local服务
仅接受来自地址位于本地子网上的主机的DNS查询,即服务器上存在接口的子网。如果没有–interface –except-interface,–listen-address或–auth-server选项,此选项才有效。它旨在设置为安装时的默认值,以允许未配置的安装有用,但也可安全地用于DNS放大攻击。
-2,–no-dhcp-interface = <接口名称>
不要在指定的接口上提供DHCP或TFTP,但要提供DNS服务。
-a,–listen-address = <ipaddr>
监听给定的IP地址。既 –interface 和 –listen地址 选项可以被给予,在这种情况下,组两个接口和地址被使用。请注意,如果没有 给出–interface选项,但是 –listen-address 是,则dnsmasq将不会自动侦听回送接口。为了达到这个目的,它的IP地址127.0.0.1必须作为–listen-address 选项明确给出 
-z,–bind-interfaces
在支持它的系统上,即使只在某些接口上侦听,dnsmasq也会绑定通配符地址。然后它丢弃它不应该回复的请求。即使接口来去变更地址,这也具有工作的优点。该选项强制dnsmasq真正绑定它正在监听的接口。关于唯一有用的时间是在同一台计算机上运行另一个名称服务器(或另一个dnsmasq实例)。设置此选项还会启用提供DHCP服务的多个dnsmasq实例在同一台计算机上运行。
–bind动态
启用网络模式,该模式是–bind-interfaces 和默认模式之间的混合模式 Dnsmasq绑定各个接口的地址,允许多个dnsmasq实例,但是如果出现新的接口或地址,它会自动侦听这些接口(受限于任何访问控制配置)。这使得动态创建的接口的工作方式与默认相同。实现这个选项需要非标准的网络API,它只能在Linux下使用。在其他平台上,它会回落到–bind-interfaces模式。
-y, – 本地化查询
返回来自/ etc / hosts和–interface-name的DNS查询的答案,这取决于接收查询的接口。如果名称有多个地址与其关联,并且这些地址中的至少一个与发送查询的接口在同一子网上,则只返回该子网上的地址。这允许服务器在每个接口对应的/ etc / hosts中有多个地址,并且主机将根据它们所连接的网络来获取正确的地址。目前该设施仅限于IPv4。
-b,–bogus-priv
伪装私人反向查找。对于在/ etc / hosts或DHCP租约文件中找不到的专用IP范围(即192.168.xx等)的所有反向查找,将以“无此域”进行回答,而不是向上游转发。受影响的前缀集是RFC6303中给出的IPv4和IPv6列表。
-V,–alias = [<old-ip>] | [<start-ip> – <end-ip>],<new-ip> [,<mask>]
修改从上游名称服务器返回的IPv4地址; old-ip被new-ip替换。如果给出了可选的掩码,那么与被掩码的old-ip相匹配的任何地址都将被重写。因此,例如 –alias = 1.2.3.0,6.7.8.0,255.255.255.0 将映射1.2.3.56到6.7.8.56和1.2.3.67到6.7.8.67。这是Cisco PIX路由器称之为“DNS修复”的原因。如果旧IP是作为范围给出的,则只重写该范围内的地址,而不是整个子网。所以 –alias = 192.168.0.10-192.168.0.40,10.0.0.0,255.255.255.0 maps 192.168.0.10-> 192.168.0.40 to 10.0.0.10-> 10.0.0.40
-B,–bogus-nxdomain = <ipaddr>
将包含IP地址的回复转换为“无此域”回复。这旨在抵消Verisign在2003年9月做出的迂回举动,当时他们开始返回广告网页的地址以响应未注册名称的查询,而不是正确的NXDOMAIN响应。该选项告诉dnsmasq在看到此行为时会伪造正确的响应。截至2003年9月,Verisign返回的IP地址为64.94.110.11
– 忽略地址= <IP地址>
忽略对包含指定地址的A记录查询的答复。没有错误产生,dnsmasq只是继续听另一个答复。这对于在正确答案到达之前打败依赖于快速提供针对某个域的DNS请求的伪造答案的阻止策略很有用。
-f,–filterwin2k
后来的Windows版本会定期发出DNS请求,这些请求不会从公共DNS获得明智的答案,并可能通过触发按需拨号链接导致问题。该标志打开一个选项来过滤这些请求。阻止的请求是针对SOA和SRV类型的记录,并键入ANY(其中请求的名称具有下划线)以捕获LDAP请求。
-r,–resolv-file = <文件>
从<file>中读取上游名称服务器的IP地址,而不是/etc/resolv.conf。有关此文件的格式,请参阅 resolv.conf(5)。唯一与dnsmasq相关的行是nameserver。可以通知Dnsmasq轮询多个resolv.conf文件,指定的第一个文件名将覆盖默认值,随后的文件名将添加到列表中。这仅在轮询时才被允许; 具有当前最新修改时间的文件是使用的文件。
-R, – 无分解
不要读取/etc/resolv.conf。仅从命令行或dnsmasq配置文件获取上游服务器。
-1,–enable-dbus [= <服务名称>]
允许通过DBus方法调用更新dnsmasq配置。可以更改的配置是上游DNS服务器(和相应的域)和缓存清除。需要使用DBus支持构建dnsmasq。如果给出服务名称,则dnsmasq以该名称提供服务,而不是默认的服务名称为 uk.org.thekelleys.dnsmasq
-o, – 严格顺序
默认情况下,dnsmasq会将查询发送到任何它知道的上游服务器,并尝试使用已知启动的服务器。设置此标志会强制dnsmasq严格按照它们在/etc/resolv.conf中出现的顺序尝试每个服务器的每个查询
– 全服务器
默认情况下,当dnsmasq有多个上游服务器可用时,它将只向一台服务器发送查询。设置此标志将强制dnsmasq将所有查询发送到所有可用的服务器。来自首先回答的服务器的回复将被返回给原始请求者。
–dns – 环 – 检测
启用代码来检测DNS转发循环; 即发送给上游服务器之一的查询最终作为新查询返回给dnsmasq实例的情况。该过程通过生成<hex> .test格式的TXT查询并将它们发送到每个上游服务器来工作。十六进制是一个UID,它编码发送查询的dnsmasq实例和发送它的上游服务器。如果查询返回到发送它的服务器,则发送它的上游服务器将被禁用,并记录此事件。每当上游服务器组发生更改时,测试将在所有这些服务器上重新运行,其中包括先前禁用的服务器。
–stop-DNS-重新绑定
拒绝(和记录)来自位于专用IP范围内的上游名称服务器的地址。这可以阻止使用防火墙后面的浏览器探测本地网络上的计算机的攻击。
–rebind-本地主机-OK
从重新绑定检查中免除127.0.0.0/8。此地址范围由实时黑洞服务器返回,因此阻止它可能会禁用这些服务。
–rebind域-OK = [<域>] | [[/ <域> / [<域> /]
不要在对这些域的查询中检测并阻止dns-rebind。参数可以是单个域,也可以是包含’/’的多个域,如–server语法,例如。 –rebind域-OK = /域1 /域2 / DOMAIN3 /
-n,–no-poll
不要轮询/etc/resolv.conf以进行更改。
– 清除上重装
无论何时重新读取/etc/resolv.conf或通过DBus设置上游服务器,请清除DNS缓存。当新的名称服务器可能具有与缓存中保存的数据不同的数据时,这很有用。
-D, – 域需要
告诉dnsmasq永远不会将没有点或域部分的普通名称的A或AAAA查询转发给上游名称服务器。如果从/ etc / hosts或DHCP中未知该名称,则返回“未找到”答案。
-S,–local,–server = [/ [<domain>] / [domain /]] [<ipaddr> [#<port>] [@ <source-ip> | <interface> ]]
直接指定上游服务器的IP地址。设置这个标志不会禁止读取/etc/resolv.conf,使用-R来做到这一点。如果给出一个或多个可选域,则该服务器仅用于这些域,并且仅使用指定的服务器查询它们。这是为私人域名服务器设计的:如果你的网络上有一个名称服务器,它处理的形式是xxx.internal.thekelleys.org.uk,名字是192.168.1.1,然后给出标志 -S /internal.thekelleys.org.uk/ 192.168.1.1 将把内部机器的所有查询发送到该名称服务器,其他所有内容将发送到/etc/resolv.conf中的服务器。对于这些专用名称服务器,将关闭DNSSEC验证,除非 为有问题的域指定了 –trust-anchor一个空的域名规范, // 具有“非限定名称”的特殊含义,即名称中没有任何点。可以使用#字符将非标准端口指定为IP地址的一部分。允许多个-S标志,并根据需要重复使用域名或ipaddr部分。

更具体的域优先于不太具体的域,因此:– server = / google.com / 1.2.3.4 –server = / www.google.com /2.3.4.5 将* .google.com的查询发送到1.2。 3.4,除了* www.google.com,这将去2.3.4.5

特殊服务器地址’#’表示“使用标准服务器”,因此 –server = / google.com / 1.2.3.4 –server = / www.google.com /# 将发送对* .google.com的查询到1.2.3.4,除了* www.google.com将像往常一样转发。

同样允许的是一个给出一个域但没有IP地址的-S标志; 这告诉dnsmasq一个域是本地的,它可以回答来自/ etc / hosts或DHCP的查询,但不应该将该域上的查询转发给任何上游服务器。 本地 是服务器 在这种情况下使配置文件更清晰的同义词 

IPv6地址可能包含%interface scope-id,例如fe80 :: 202:a412:4512:7bbf%eth0。

@字符后面的可选字符串告诉dnsmasq如何将查询源设置到此名称服务器。它可以是IP地址,接口名称或两者。IP地址应该属于运行dnsmasq的机器,否则该服务器行将被记录并被忽略。如果给出接口名称,则通过该接口强制向服务器进行查询; 如果给出了一个IP地址,则查询的源地址将被设置为该地址; 如果两者都给出,则将使用ip地址和接口名称的组合来引导请求到服务器。对于指定了源地址但可直接将端口指定为源地址的一部分的任何服务器,查询端口标志将被忽略。在dnsmasq支持的所有平台上不实施对接口的查询。

–rev服务器= <IP地址> / <前缀-LEN>,<IPADDR> [#<端口>] [@ <源-IP> | <接口> [#<端口>]]
这在功能上与–server相同  但提供了一些语法糖来指定地址到名称查询更容易。例如 –rev-server = 1.2.3.0 / 24,192.168.0.1 完全等同于 –server = / 3.2.1.in-addr.arpa / 192.168.0.1
-A,–address = / <域> [/ <域> …] / [<ipaddr>]
指定给定域中的任何主机返回的IP地址。域中的查询永远不会转发,并且始终使用指定的IP地址(可能是IPv4或IPv6)进行回复。要为域提供IPv4和IPv6地址,请使用重复的-A标志。要为单个查询包含多个IP地址,请改用 –addn-hosts = <path>请注意,/ etc / hosts和DHCP租约会覆盖个别名称。这样做的一个常见用途是将整个doubleclick.net域重定向到一些友好的本地Web服务器,以避免横幅广告。域规范的工作原理与–server相同,其中的附加功能可以与/#/匹配任何域。因此 –address = /#/ 1.2.3.4将一直返回1.2.3.4对于任何未从/ etc / hosts或DHCP获得回答的查询,并且不通过更具体的–server指令发送到上游名称服务器至于 –server,没有地址的一个或多个域返回一个没有这样的域的答案,所以–address = / example.com /相当于 –server = / example.com /并返回NXDOMAIN。 com及其所有子域名。
–ipset = / <域> [/ <域> …] / <IPSET> [,<IPSET> …]
将解析的一个或多个域的查询IP地址放在指定的Netfilter IP集中。如果给出多个setname,则根据IP组的限制(IPv4地址不能存储在IPv6 IP组中,反之亦然),将地址放在其中的每一个中。域和子域的匹配方式与 – 地址相同 这些IP集合必须已经存在。有关更多详细信息,请参阅 ipset(8)。
-m,–mx-host = <mx名称> [[,<主机名>],<首选项>]
返回一个名为<mx name>的MX记录,指向给定的主机名(如果给出)或者在–mx-target开关中指定的主机,或者如果没有给出该开关,则返回运行dnsmasq的主机。默认值对于将邮件从LAN上的系统导向中央服务器很有用。首选项值是可选的,如果没有给出,则默认值为1。主机可能会有多个MX记录。
-t,–mx-target = <主机名>
指定由dnsmasq返回的MX记录的默认目标。请参阅–mx-host。如果给定了-mx-target,而不是-mx-host,则dnsmasq将返回一个MX记录,该记录包含运行dnsmasq的机器的主机名上的MX查询的MX目标。
-e,–selfmx
为每台本地机器返回指向自己的MX记录。本地机器是在/ etc / hosts或DHCP租约中的机器。
-L,–localmx
为每台本地机器返回指向由mx-target(或运行dnsmasq的机器)给出的主机的MX记录。本地机器是在/ etc / hosts或DHCP租约中的机器。
-w,–srv-host = <_ service>。<_ prot>。[<domain>],[<target> [,<port> [,<priority> [,<weight>]]]]
返回SRV DNS记录。有关详细信息,请参阅RFC2782。如果未提供,则该域默认为–domain所给出的域  目标域的默认值为空,端口的默认值为1,重量和优先级的默认值为零。如果转换来自BIND区域文件的数据,请小心:端口,重量和优先级号码的顺序不同。给定服务/域的多个SRV记录是允许的,所有匹配的都会返回。
–host记录= <名称> [,<名称> ….],[<IPv4的地址>],[<IPv6的地址>] [,<TTL>]
将A,AAAA和PTR记录添加到DNS。这会将一个或多个名称添加到具有关联IPv4(A)和IPv6(AAAA)记录的DNS。名称可能会出现在多个 主机记录中 ,因此会被分配多个地址。只有第一个地址创建一个将地址链接到名称的PTR记录。这与读取主机文件时使用的规则相同。 主机记录 选项被认为是在主机文件之前被读取的,因此如果在主机文件中出现名称,那么出现的名称会抑制PTR记录的创建。与主机文件不同,即使扩展主机 有效,名称也不会扩展 短名和长名可能出现在同一 主机记录中, 例如。 –host记录=笔记本电脑,laptop.thekelleys.org,192.168.0.1,1234 :: 100

如果给出生存时间,它将覆盖缺省值,该缺省值为零或–local-ttl的值。该值是一个正整数,并以秒为单位给出生存时间。

-Y,–txt-record = <name> [[,<text>],<text>]
返回TXT DNS记录。TXT记录的值是一组字符串,因此可以包含任何数字,用逗号分隔; 使用引号将逗号放入字符串中。请注意,单个字符串的最大长度是255个字符,更长的字符串被分成255个字符块。
–ptr记录= <名称> [,<目标>]
返回PTR DNS记录。
–naptr记录= <名称>,<顺序>,<偏好>,<标记>,<服务>,<正则表达式> [,<更换>]
按RFC3403中的规定返回NAPTR DNS记录。
–cname = <CNAME>,[<CNAME>,<目标> [,<TTL>]
返回一个指示<cname>确实是<target>的CNAME记录。目标有很大的局限性; 它必须是来自/ etc / hosts(或其他主机文件)的dnsmasq,来自DHCP的来自–interface-name或另一个–cname的DNS名称  如果目标不符合此标准,则整个cname将被忽略。cname必须是唯一的,但允许多个cname指向同一个目标。实际上,可以在一行中向目标声明多个cname,如下所示:– cname = cname1,cname2,target

如果给出生存时间,它将覆盖缺省值,该缺省值为零或-local-ttl的值。该值是一个正整数,并以秒为单位给出生存时间。

–dns-rr = <名称>,<RR-number>,[<十六进制数据>]
返回任意的DNS资源记录。数字是记录的类型(始终在C_IN类中)。记录的值由十六进制数据给出,十六进制数据的形式可以是01:23:45或01 23 45或012345或这些的任意组合。
–interface名= <名称>,<接口> [/ 4 | / 6]
返回将名称与给定接口的地址相关联的DNS记录。此标志以与/ etc / hosts行相同的方式为给定名称指定A或AAAA记录,但地址不是常量,而是从给定接口获取。该接口后面可以跟着“/ 4”或“/ 6”来指定只应使用该接口的IPv4或IPv6地址。如果接口关闭,未配置或不存在,则返回空记录。匹配的PTR记录也被创建,将接口地址映射到名称。通过重复该标志,多个名称可以与接口地址相关联; 在这种情况下,第一个实例用于反向地址到名称映射。请注意,在–interface-name中使用的名称可能不会出现在/ etc / hosts中。
–synth-domain = <域>,<地址范围> [,<前缀> [*]]
为地址范围创建人工A / AAAA和PTR记录。记录可以是序列号或地址,以破折号代替句号(或用于IPv6的冒号)。

一个例子应该更清楚。第一个连续数字。 –synth-domain = thekelleys.org.uk,192.168.0.50,192.168.0.70,internal- * 的名称为internal-0.thekelleys.org.uk。返回192.168.0.50,internal-1.thekelleys.org.uk返回192.168.0.51等等。(注意*)同样的原则适用于IPv6地址(数字可能非常大)。从地址到名称的反向查找按预期行事。

其次,– synth-domain = thekelleys.org.uk,192.168.0.0 / 24,internal-(no *) 将导致对internal-192-168-0-56.thekelleys.org.uk的查询返回192.168。 0.56,反向查询反之亦然。这同样适用于IPv6,但IPv6地址可能以’::’开头,但DNS标签不能以’ – ‘开头,所以在这种情况下,如果没有配置前缀,则会在标签前添加零。:: 1变为0–1。

V4映射的IPv6地址,其具有类似于:: ffff:1.2.3.4的表示被专门处理,并且变得像0 – ffff-1-2-3-4

在这两种选项中,地址范围可以是<ip address>,<ip address>或<ip address> / <netmask>形式。

–add-MAC [= BASE64 |文本]
将请求者的MAC地址添加到上游转发的DNS查询中。这可以用于上游服务器的DNS过滤。只有当请求者与dnsmasq服务器位于同一子网中时,才能添加MAC地址。请注意,用于实现此目的的机制(EDNS0选项)尚未标准化,因此应视为实验性的。另请注意,以这种方式公开MAC地址可能会对安全和隐私产生影响。–add-subnet给出的缓存警告也适用于–add-mac。通过添加“base64”参数,MAC的替代编码为base64,通过添加“text”参数启用了十六进制和冒号的人类可读编码。
–add-CPE-ID = <字符串>
向上游转发的o个DNS查询添加一个任意标识字符串。
–add-subnet [[= [<IPv4地址> /] <IPv4前缀长度>] [,[<IPv6地址> /] <IPv6前缀长度>]]
向上游转发的DNS查询添加一个子网地址。如果在标志中指定了一个地址,它将被使用,否则将使用请求者的地址。转发地址的数量取决于前缀长度参数:32(128代表IPv6)转发整个地址,零转发任何一个,但仍然标记请求,以便上游名称服务器也不会添加客户端地址信息。IPv4和IPv6的默认值均为零。请注意,可以将上游名称服务器配置为根据此信息返回不同的结果,但dnsmasq缓存不包括在内。如果配置了dnsmasq实例以便可能遇到不同的结果,则应禁用缓存。

例如,– add-subnet = 24,96 将分别为IPv4和IPv6请求者添加请求者的/ 24和/ 96子网。 –add-subnet = 1.2.3.4 / 24 会为IPv4请求者添加1.2.3.0/24,为IPv6请求者添加:: / 0。 –add-subnet = 1.2.3.4 / 24,1.2.3.4 / 24 将为IPv4和IPv6请求者添加1.2.3.0/24。

-c,–cache-size = <cachesize>
设置dnsmasq缓存的大小。默认值是150个名称。将缓存大小设置为零将禁用缓存。
-N, – 无negcache
禁用否定缓存。负面缓存允许dnsmasq记住上游域名服务器的“没有这样的域”答案,并回答相同的查询而不再转发它们。
-0,–dns-forward-max = <查询>
设置最大并发DNS查询数。默认值是150,对大多数设置来说应该没问题。唯一需要增加的已知情况是使用web-server日志文件解析程序,它可以生成大量的并发查询。
–dnssec
验证DNS回复并缓存DNSSEC数据。在转发DNS查询时,dnsmasq会请求验证回复所需的DNSSEC记录。回复被验证,结果作为DNS数据包中的验证数据位返回。此外,DNSSEC记录存储在缓存中,使客户端的验证效率更高。请注意,客户端验证是最安全的DNSSEC模式,但对于无法进行验证的客户端,只要dnsmasq服务器和客户端之间的网络可信,使用由dnsmasq设置的AD位就很有用。必须在启用HAVE_DNSSEC的情况下编译Dnsmasq,并提供DNSSEC信任锚,请参阅 –trust-anchor。 由于DNSSEC验证过程使用缓存,因此在启用DNSSEC时,不允许将缓存大小降低到默认值以下。dnsmasq上游的名称服务器必须具有DNSSEC功能,即能够将DNSSEC记录与数据一起返回。如果它们不是,那么dnsmasq将无法确定答案的可信状态。在默认模式下,这意味着所有回复将被标记为不可信。如果设置了 –dnssec-check-unsigned 并且上游服务器不支持DNSSEC,则DNS服务将完全中断。
–trust锚= [<类>],<域>,<键标签>,<算法>,<消化型>,<消化>
提供DS记录以作为DNSSEC验证的信任锚。通常,这些将是根区域的密钥签名密钥(KSK)的DS记录,但也可以使用受限域的信任锚。当前根区域信任锚点可以从https://data.iana.org/root-anchors/root-anchors.xml下载
–dnssec检查,无符号
默认情况下,dnsmasq不检查未签名的DNS答复是否合法:它们被认为是有效的并且传递(当然,没有设置“真实数据”位)。这并不能防止攻击者伪造签名DNS区域的未签名回复,但速度很快。如果设置了此标志,dnsmasq将检查未签名回复的区域,以确保在这些区域中允许未签名的回复。这样做的代价是更多上游查询和更慢的性能。另请参阅–dnssec部分中关于上游服务器的警告
–dnssec-NO-timecheck
DNSSEC签名仅对指定的时间窗口有效,并应在这些窗口之外被拒绝。这对没有硬件实时时钟的机器产生了一个有趣的鸡与蛋问题。为了确定这些机器的正确时间,通常需要使用NTP并因此使用DNS,但是验证DNS需要知道正确的时间。设置此标志将删除时间窗口检查(但不包括其他DNSSEC验证),直到dnsmasq进程收到SIGINT。意图是,当平台确定当前不可用时,dnsmasq应该以此标志开始。只要建立可靠的时间,就应该将SIGINT发送到dnsmasq,它可以进行时间检查,并清除尚未彻底检查的DNS记录的缓存。

早期版本的dnsmasq重载SIGHUP(重新读取多个配置)以启用时间验证。

如果dnsmasq以调试模式运行(-d标志),则SIGINT保留其终止dnsmasq进程的通常含义。

–dnssec时间戳= <路径>
启用另一种检查DNSSEC系统时间有效性的方法(请参阅–dnssec-no-timecheck)。在这种情况下,一旦系统时间晚于指定文件上的时间戳,系统时间就被认为是有效的。该文件被创建并且它的时间戳由dnsmasq自动设置。该文件必须存储在永久文件系统中,以便它和它的mtime通过系统重新启动。时间戳文件是在dnsmasq删除根后创建的,因此它必须位于dnsmasq运行时的非特权用户可写的位置。
–proxy-DNSSEC
将来自上游服务器的DNSSEC认证数据位复制到下游客户端并进行缓存。这是使dnsmasq验证DNSSEC的替代方法,但它取决于dnsmasq和上游服务器之间的网络安全性以及上游服务器的可信性。
–dnssec调试
为DNSSEC验证设置调试模式,在上游查询中设置Checking Disabled位,并且不要将不验证的答复转换为SERVFAIL返回码的响应。请注意,设置此操作可能会影响DNS行为,但这不是一个额外的日志记录标志,不应在生产中进行设置。
–auth-zone = <domain> [,<subnet> [/ <prefix length>] [,<subnet> [/ <prefix length>] …..] [,exclude:<subnet> [/ <prefix长度>]] …..]
定义dnsmasq充当权威服务器的DNS区域。域中的本地定义的DNS记录将被提供。如果给出子网,则A和AAAA记录必须位于指定的子网之一中。

作为直接指定子网的替代方法,可以给出接口的名称,在这种情况下,使用该接口的配置地址和子网掩码/前缀长度暗示的子网; 这在使用构造的DHCP范围时很有用,因为实际地址是动态的,并且在配置dnsmasq时不知道。接口地址可能仅限于使用<interface> / 6的IPv6地址或仅限于使用<interface> / 4的IPv4。当接口动态确定应该出现在区域中的全局IPv6地址时,这很有用,但是RFC1918 IPv4地址不应该。接口名称和地址字面子网规范可以在相同的 – 真实区域声明中自由使用。

可以从响应中排除某些IP地址。可以使用它来确保答案仅包含全局可路由IP地址(通过排除回送,RFC1918和ULA地址)。

子网也用于定义用于反向DNS查询的in-addr.arpa和ip6.arpa域。如果未指定,则IPv4的前缀长度默认为24,IPv6的默认值为64。对于IPv4子网,前缀长度应该为8,16或24,除非您熟悉RFC 2317并相应地安排了in-addr.arpa委派。请注意,如果未指定任何子网,则不会回答任何反向查询。

–auth-SOA = <串行> [,<hostmaster> [,<刷新> [,<重试> [,<期满>]]]]
指定与权威区域相关联的SOA记录中的字段。请注意,这是可选的,所有的值都设置为理智的默认值。
–auth仲服务器= <域> [,<域> [,<域> …]]
为dnsmasq具有权威性的区域指定任何辅助服务器。这些服务器必须配置为通过区域传输从dnsmasq获取区域数据,并回答与dnsmasq相同的权威区域的查询。
–auth等= <IP地址> [,<IP地址> [,<IP地址> …]]
指定允许对dnsmasq具有权威性的区域发起区域传输(AXFR)请求的辅助服务器的地址。如果没有给出这个选项,那么AXFR请求将被任何二级接受。
–conntrack
阅读与传入的DNS查询关联的Linux连接跟踪标记,并在用于回答这些查询的上游流量上设置相同的标记值。这允许由dnsmasq生成的流量与导致该流量的查询相关联,这对带宽记帐和防火墙很有用。Dnsmasq必须具有编译的conntrack支持,并且内核必须包含和配置conntrack支持。该选项不能与–query-port结合使用。
-f,–dhcp-range = [tag:<tag> [,tag:<tag>],] [set:<tag>,] <start-addr> [,<end-addr> | <mode>] [,<网络掩码> [,<广播>]] [,<租用时间>]
-f,–dhcp-range = [tag:<tag> [,tag:<tag>],] [set:<tag>,] <start-IPv6addr> [,<end-IPv6addr> |构造函数:<interface >] [,<mode>] [,<prefix-len>] [,<租赁时间>]

启用DHCP服务器。地址将从<start-addr>到<end-addr>范围以及dhcp-host 选项中给出的静态定义地址发出 如果给定租约时间,那么租约将在这段时间内给出。租约时间以秒或分钟(例如45米)或小时(例如1小时)或“无限”为单位。如果没有给出,则默认租约时间为一小时。最短租赁时间为两分钟。对于IPv6范围,租用时间可能“不赞成”; 这会将在DHCP租约或路由器通告中发送的首选生命周期设置为零,这会导致客户端将新连接的其他地址(如果可用)用作重新编号的前奏。

该选项可以重复使用不同的地址,以启用到多个网络的DHCP服务。对于直接连接的网络(即运行dnsmasq的机器具有接口的网络),网络掩码是可选的:dnsmasq将从接口配置中确定它。对于通过中继代理接收DHCP服务的网络,dnsmasq无法确定网络掩码本身,因此应该指定它,否则dnsmasq将根据网络地址的类(A,B或C)进行猜测。广播地址始终是可选的。总是允许在一个子网中拥有多个dhcp范围。

对于IPv6,参数略有不同:不是网络掩码和广播地址,而是有一个可选的前缀长度,它必须等于或大于本地接口上的前缀长度。如果未给定,则默认为64.与IPv4不同,前缀长度不会自动从接口配置派生。前缀长度的最小大小是64。

IPv6(仅)支持另一种类型的范围。在这里,起始地址和可选结束地址只包含网络部分(即:: 1),后面跟着 构造函数:<interface>。 这形成了一个模板,它根据分配给接口的地址来描述如何创建范围。例如

–dhcp范围= :: 1,:: 400,构造函数中:eth0

将在eth0上查找地址,然后创建从<network> :: 1到<network> :: 400的范围。如果接口分配了多个网络,则相应的范围将自动创建,然后不推荐使用,并最终再次移除,因为该地址已被弃用,然后被删除。接口名称可能有最终的“*”通配符。请注意,eth0上的任何地址都不会这样做:它不能是自动配置或隐私地址,或者不推荐使用。

如果dhcp范围仅用于无状态DHCP和/或SLAAC,则地址可以简单地为::

–dhcp范围= ::,构造函数中:eth0

可选 集:<tag> 设置标记此网络的字母数字标签,以便可以基于每个网络指定dhcp选项。当它以“tag:”作为前缀时,其含义就会从设置标签变为匹配。只能设置一个标签,但可以匹配多个标签。

可选的<mode>关键字可能是 静态的 ,它告诉dnsmasq为指定的网络启用DHCP,但不能动态分配IP地址:只有通过dhcp-host 或/ etc / ethers 提供静态地址 的主机才会被提供服务。一个地址全零的纯静态子网可以用作“全部捕获”地址,以便对提供了无状态DHCPv6的子网(即–dhcp-range = ::,static)上的所有信息请求数据包进行 应答

对于IPv4,<mode>可以是 代理, 在这种情况下,dnsmasq将在指定的子网上提供代理DHCP。(有关 详细信息,请参见 pxe-prompt 和 pxe-service。)

对于IPv6,模式可能是 ra-only,slaac,ra-name,ra-stateless,ra-advrouter,off-link的组合。

ra-only会 告诉dnsmasq仅在此子网上提供路由器公告,而不是DHCP。

slaac 告诉dnsmasq在该子网上提供路由器公告,并在路由器通告中设置A位,以便客户端使用SLAAC地址。当与DHCP范围或静态DHCP地址一起使用时,这会导致客户端同时拥有DHCP分配地址和SLAAC地址。

ra-stateless 通过设置O和A位发送路由器通告,并提供无状态的DHCP服务。客户端将使用SLAAC地址,并将DHCP用于其他配置信息。

ra-names 启用了一种模式,它将DNS名称提供给为IPv6执行SLAAC的双堆栈主机。Dnsmasq使用主机的IPv4租约来派生名称,网段和MAC地址,并假定主机也将在同一网段上使用SLAAC算法计算IPv6地址。该地址被ping,如果收到回复,则为该IPv6地址添加一条AAAA记录到DNS。请注意,这只会发生在直接连接的网络中,(而不是通过中继进行DHCP),并且如果主机使用隐私扩展,它将不起作用。 ra名称 可以与ra-stateless 和 slaac结合使用 

ra-advrouter 启用了一种模式,其中路由器地址而不是前缀(es)被包括在广告中。这在RFC-3775第7.2节中描述,并用于移动IPv6。在这种模式下,还包括间隔选项,如RFC-3775第7.3节所述。

off-link 指示dnsmasq在没有设置在链接(又名L)位的情况下通告前缀。

-G,–dhcp-host = [<hwaddr>] [,id:<client_id> | *] [,set:<tag>] [,<ipaddr>] [,<hostname>] [,<lease_time>] [,忽视]
指定DHCP服务器的每个主机参数。这允许具有特定硬件地址的机器始终分配相同的主机名,IP地址和租用时间。这样指定的主机名将覆盖机器上的DHCP客户端提供的任何主机名。也可以省略硬件地址并包含主机名,在这种情况下,IP地址和租约时间将适用于声明该名称的任何计算机。例如 –dhcp-host = 00:20:e0:3b:13:af,wap,infinite 告诉dnsmasq为机器提供硬件地址00:20:e0:3b:13:af名称为wap, DHCP租约。 –dhcp-host = lap,192.168.0.199 告诉dnsmasq总是分配机器圈IP地址192.168.0.199。

如此分配的地址不受限于-dhcp-range选项给出的范围,但它们必须与某个有效的dhcp范围处于同一个子网中。对于不需要动态分配地址池的子网,请在dhcp-range声明中使用“static”关键字。

允许使用客户端标识符(在IPv6-land中称为客户端DUID)而不是硬件地址通过以’id:’作为前缀标识主机。因此:– dhcp-host = id:01:02:03:04,…..表示 客户端标识符为01:02:03:04的主机。它也被允许指定客户端ID为文本,如下所示:– dhcp-host = id:clientidastext,…..

单个 dhcp-host 可以包含IPv4地址或IPv6地址,或者两者兼有。IPv6地址必须由方括号从而进行包围曝光: –dhcp主机=笔记本电脑,[1234:56] IPv6地址可以仅含有主机标识符部分: –dhcp主机=笔记本电脑,[:56] 其中在构建的dhcp范围内,它们充当通配符,插入适当的网络部分。请注意,在IPv6 DHCP中,硬件地址可能不可用,尽管它通常用于直接连接的客户端,或者使用支持RFC 6939的DHCP中继的客户端。

对于DHCPv4,特殊选项id:*表示“忽略任何客户端ID并仅使用MAC地址”。当客户端有时显示客户端ID而不是其他客户端时,这非常有用。

如果名称出现在/ etc / hosts中,则相关地址可以分配给DHCP租用,但前提是 指定名称的 –dhcp-host选项也存在。dhcp-host 选项中只能给出一个主机名 ,但通过使用CNAME可以使用别名。(请参阅 –cname )。

特殊关键字“ignore”告诉dnsmasq永远不会向机器提供DHCP租约。该机器可以通过硬件地址,客户端ID或主机名来指定,例如 –dhcp-host = 00:20:e0:3b:13:af,ignore 当网络上有另一台DHCP服务器时,一些机器使用。

set:<tag>结构设置标签,只要这个dhcp-host指令被使用。这可以用来为这个主机有选择地发送DHCP选项。可以在dhcp-host伪指令中设置多个标记(但不允许在其中允许使用“set:<tag>”的其他位置)。当主机匹配任何dhcp-host指令(或由/ etc / ethers暗示的指令)时,将设置特殊标记“已知”。这允许将dnsmasq配置为使用–dhcp-ignore = tag:!忽略来自未知机器的请求 。已知 如果主机仅匹配由于指定不同子网上的地址而无法使用的dhcp-host指令,则标记“已知-othernet“被设置。以太网地址(但不是客户端ID)可能有通配符字节,例如 –dhcp-host = 00:20:e0:3b:13:*,忽略会导致dnsmasq忽略一系列硬件地址。请注意,需要在命令行上转义或引用“*”,但不在配置文件中。

硬件地址通常与任何网络(ARP)类型匹配,但可以通过在ARP类型(以十六进制表示)和“ – ”之前将其限制为单个ARP类型。所以 –dhcp-host = 06-00:20:e0:3b:13:af ,因为令牌环的ARP地址类型是6,所以1.2.3.4将仅匹配令牌环硬件地址。

作为一种特殊情况,在DHCPv4中,可能包含多个硬件地址。例如:– dhcp-host = 11:22:33:44:55:66,12:34:56:78:90:12,192.168.0.2 这允许一个IP地址与多个硬件地址关联,并给出dnsmasq权限当另一个人要求租约时,放弃DHCP租约到其中一个硬件地址。请注意,这是一件危险的事情,它只会在任何时候只有一个硬件地址处于活动状态并且dnsmasq无法执行此操作时才可靠运行。例如,为具有有线和无线接口的笔记本电脑分配稳定的IP地址非常有用。

–dhcp-hosts文件= <路径>
从指定文件读取DHCP主机信息。如果给出了一个目录,那么读取该目录中包含的所有文件。该文件包含每行一台主机的信息。一行的格式与–dhcp-host中的’=’右侧的文本相同。将DHCP主机信息存储在此文件中的优点是可以在不重新启动dnsmasq的情况下更改它:当dnsmasq收到SIGHUP时,将重新读取文件。
–dhcp-optsfile = <路径>
从指定文件读取DHCP选项信息。如果给出了一个目录,那么读取该目录中包含的所有文件。使用此选项的优点与–dhcp-hostsfile相同:当dnsmasq收到SIGHUP时,将重新读取dhcp-optsfile。请注意,可以 使用选项名称bootfile-name,server-ip-address和tftp-server 将信息编码为 –dhcp-boot标志作为DHCP选项。这允许这些被包含在dhcp-opts文件中。
–dhcp-hostsdir = <路径>
这相当于dhcp-hostsfile,除了以下内容。该路径必须是一个目录,而不是一个单独的文件。目录中的更改或新文件会自动读取,而不需要发送SIGHUP。如果一个文件在被dnsmasq读取后被删除或更改,那么它所包含的主机记录将一直保留到dnsmasq收到SIGHUP或重新启动; 即主机记录只能动态添加。
–dhcp-optsdir = <路径>
这相当于dhcp-optsfile,其差别在于–dhcp-hostsdir。
-Z, – 读取醚
有关DHCP服务器主机的信息,请阅读/ etc / ethers。/ etc / ethers的格式是一个硬件地址,后跟一个主机名或虚线四个IP地址。当通过dnsmasq读取时,这些行与 包含相同信息的–dhcp-host选项具有完全相同的效果 当dnsmasq收到SIGHUP时,会重新读取/ etc / ethers。IPv6地址不从/ etc / ethers读取。
-O,–dhcp-option = [tag:<tag>,[tag:<tag>,]] [encap:<opt>,] [vi-encap:<enterprise>,] [vendor:[<vendor-类>],] [<停用> |选项:<停用名> |选项6:<选择> |选项6:<停用名称>],[<值> [,<值>]]
为DHCP客户端指定不同或额外的选项。默认情况下,dnsmasq向DHCP客户端发送一些标准选项,网络掩码和广播地址设置为与运行dnsmasq的主机相同,DNS服务器和默认路由设置为运行dnsmasq的机器的地址。(等效规则适用于IPv6。)如果设置了域名选项,则发送该选项。此配置允许覆盖这些默认值或指定其他选项。要发送的选项可以以十进制数字或“选项:<选项名称>”的形式给出。选项编号在RFC2132和后续RFC中指定。通过运行“dnsmasq –help dhcp”可以发现dnsmasq已知的一组选项名称。例如,要将默认路由选项设置为192.168.4.4,请执行 –dhcp-option = 3,192.168.4。–dhcp-option = option:router,192.168.4.4 并将时间服务器地址设置为192.168.0.4,执行 –dhcp-option = 42,192.168.0.4 或 –dhcp-option = option:ntp-server,192.168 .0.4 特殊地址0.0.0.0表示“运行dnsmasq的机器的地址”。

允许的数据类型为逗号分隔的点分形式IPv4地址,[]包装的IPv6地址,十进制数字,冒号分隔的十六进制数字和文本字符串。如果给出了可选标签,那么只有当所有标签匹配时才会发送此选项。

对选项119的文本参数进行特殊处理,以符合RFC 3397.作为选项120的参数的文本或点四元IP地址按照RFC 3361进行处理。虚线四元IP地址,后跟斜杠,然后网络掩码大小按照RFC 3442中的描述进行编码。

IPv6选项使用option6: 关键字指定 ,后跟选项编号或选项名称。IPv6选项名称空间与IPv4选项名称空间不相交。选项中的IPv6地址必须用方括号括起来,例如。 –dhcp-option = option6:ntp-server,[1234 :: 56] 对于IPv6,[::]表示“运行dnsmasq的机器的全局地址”,而[fd00 ::]替换为ULA,if它存在,并且[fe80 ::]和链路本地地址。

注意:没有检查发送选项号码的正确类型的数据,很可能说服dnsmasq在不恰当地使用此标志的情况下生成非法的DHCP数据包。当该值是十进制数时,dnsmasq必须确定数据项的大小。它通过检查选项号和/或值来完成此操作,但可以通过附加单个字母标志来覆盖,如下所示:b =一个字节,s =两个字节,i =四个字节。这对封装的供应商类选项非常有用(见下文),其中dnsmasq无法从选项编号中确定数据大小。仅由时段和数字组成的选项数据将由dnsmasq解释为IP地址,并插入到选项中。要强制使用文字字符串,请使用引号。 –dhcp选项= 66, “1.2.3.4”

也可以使用–dhcp-option指定封装的供应商类选项(仅限IPv4):例如 –dhcp-option = vendor:PXEClient,1.0.0.0.0 发送封装的供应商类特定选项“mftp-address = 0.0.0.0“与供应商级别与”PXEClient“匹配的任何客户端。供应商级匹配是基于子字符串的(有关详细信息,请参阅–dhcp-vendorclass)。如果dnsmasq发送供应商级选项(编号60),则用于选择优先于客户端发送的封装选项。可以完全省略供应商类别; –dhcp-option = vendor:,1,0.0.0.0, 在这种情况下总是发送封装选项。

选项可以被封装(仅限IPv4)在其他选项中:例如 –dhcp-option = encap:175,190,iscsi-client0 将发送选项175,其中是选项190.如果给出多个选项被封装相同的选项编号,那么它们将被正确地组合成一个封装选项。encap:和vendor:都不能在同一个dhcp选项中设置。

封装选项的最后一种变体是RFC3925规定的“供应商 – 识别供应商选项”。这些标记如下所示:– dhcp-option = vi-encap: 2,10,text vi-encap:部分中的数字是用于标识此选项的IANA企业编号。IPv6中支持这种形式的封装。 
  地址0.0.0.0未在封装选项中专门处理。

–dhcp选项力= [标记:<标签>,[标签:<标签>,]] [ENCAP:<选择>,] [VI-ENCAP:<企业>,] [供应商:[<供应商的类>],] <选择>,[<值> [,<值>]]
这与–dhcp-option的工作方式完全相同, 只是该选项将始终发送,即使客户端没有在参数请求列表中要求它。有时需要这样做,例如,在向PXELinux发送选项时。
–dhcp-无覆盖
(仅限IPv4)禁用DHCP服务器名称和文件名字段作为额外选项空间的重用。如果可以的话,dnsmasq将引导服务器和文件名信息(从dhcp-boot)移出它们专用的字段到DHCP选项中。这为DHCP选项提供了额外的空间用于选项,但很少会混淆旧的或损坏的客户端。这个标志强制“简单和安全”的行为,以避免在这种情况下的问题。
–dhcp-relay = <本地地址>,<服务器地址> [,<接口]
配置dnsmasq做DHCP中继。本地地址是分配给运行dnsmasq的主机上的接口的地址。所有到达该接口的DHCP请求都将通过服务器地址中继到远程DHCP服务器。通过使用多个具有相同本地地址和不同服务器地址的dhcp-relay配置,可以从单个本地地址中继到多个远程服务器。服务器地址必须是IP文字地址,而不是域名。对于DHCPv6,服务器地址可能是ALL_SERVERS多播地址ff05 :: 1:3。在这种情况下,必须给出接口,而不是通配符,并且用于将多播引导到正确的接口以到达DHCP服务器。

对DHCP客户端的访问控制具有与DHCP服务器相同的规则,请参阅–interface,–except-interface等。在dhcp-relay配置中的可选接口名称具有不同的功能:它控制哪个接口DHCP答复从服务器将被接受。这适用于具有三个接口的配置:一个接口被中继,第二个接口连接DHCP服务器,第三个不可信网络(通常是更广泛的互联网)。它避免了通过第三个接口到达的恶意回复的可能性。

允许dnsmasq在一组接口上充当DHCP服务器,并从不相交的一组接口中继。请注意,尽管可以在同一接口上编写似乎充当服务器和中继的配置,但不支持:中继功能将优先。

支持DHCPv4和DHCPv6中继。无法将DHCPv4中继到DHCPv6服务器,反之亦然。

-U,–dhcp-vendorclass = set:<tag>,[enterprise:<IANA-enterprise number>,] <vendor-class>
从供应商级字符串映射到标签。大多数DHCP客户端提供“供应商类别”,这在某种意义上代表了主机类型。此选项将供应商类别映射到标签,以便DHCP选项可以选择性地交付给不同类别的主机。例如,dhcp-vendorclass = set:printers,Hewlett-Packard JetDirect 将允许仅为HP打印机设置选项,如下所示:– dhcp-option = tag:printers,3,192.168.4.4 vendor-class字符串与子字符串匹配由客户提供的供应商级,以允许模糊匹配。set:前缀是可选的,但允许一致性。

请注意,仅在IPv6中,供应商类名称间隔为IANA分配的企业编号。这与enterprise:keyword一起给出,并且指定只应搜索与指定编号匹配的供应商类。

-j,–dhcp-userclass = set:<tag>,<user-class>
从用户级字符串映射到标记(使用子字符串匹配,如供应商类)。大多数DHCP客户端提供可配置的“用户类”。此选项将用户类映射到标记,以便DHCP选项可以选择性地传递到不同类的主机。例如,可以使用它为类“accounts”中的主机设置不同的打印机服务器,而不是“engineering”类中的主机。
-4,–dhcp-mac = set:<tag>,<MAC地址>
从MAC地址映射到标记。MAC地址可能包含通配符。例如 –dhcp-mac = set:3com,01:34:23:*:*:* 将为其MAC地址与模式匹配的任何主机设置标记“3com”。
–dhcp-circuitid = set:<tag>,<circuit-id>,–dhcp-remoteid = set:<tag>,<remote-id>
从RFC3046中继代理选项映射到标记。这些数据可能由DHCP中继代理提供。circuit-id或remote-id通常以冒号分隔的十六进制给出,但也可以是简单的字符串。如果在电路或代理ID与中继代理提供的ID完全匹配,则设置标签。

dhcp-remoteid (但不是dhcp-circuitid)在IPv6中受支持。

–dhcp-subscrid =组:<标签>,<订户-ID>
(IPv4和IPv6)将RFC3993用户标识中继代理选项映射到标记。
–dhcp-proxy [= <ip addr>] ……
(仅限IPv4)正常的DHCP中继代理仅用于将DHCP交互的初始部分转发给DHCP服务器。一旦客户端被配置,它就直接与服务器通信。如果中继剂添加额外的信息到DHCP报文,诸如由用于这是不希望DHCP-circuitid 和 DHCP-remoteid。 完整的中继实现可以使用RFC 5107的serverid-override选项来强制DHCP服务器使用中继作为完整代理,所有数据包都通过它。此标志为不支持RFC 5107的中继提供了另一种做同样事情的方法。单独给出,它将通过中继操纵所有交互的服务器标识。如果给出了IP地址列表,则只有通过这些地址上的中继进行的交互才会受到影响。
–dhcp-match = set:<tag>,<option number> | option:<option name> | vi-encap:<enterprise> [,<value>]
如果没有值,请在客户端发送给定号码或名称的DHCP选项时设置标签。给定值时,只有在发送选项并匹配该值时才设置标签。值的形式可以是“01:ff:*:02”,在这种情况下,值必须匹配(除了通配符外),但发送的选项可能在值的末尾有不匹配的数据。该值也可以与dhcp-option 中的形式相同, 在这种情况下,发送的选项被视为数组,并且一个元素必须匹配,所以

–dhcp匹配=组:EFI-IA32,选项:客户拱,6

如果数字6出现在客户端在选项93中发送的体系结构列表中,将设置标签“efi-ia32”(详情请参阅RFC 4578)。如果值是字符串,则使用子字符串匹配。

vi-encap的特殊形式:<企业编号>与指定企业的供应商识别供应商类别匹配。请参阅RFC 3925了解这些罕见和有趣的野兽的更多细节。

–tag-IF =组:<标签> [,设置:<标签> [,标记:<标签> [,标记:<标签>]]]
对标签执行布尔运算。如果设置了所有以<tag>标签出现的标签,(或者使用tag:<<tag>时取消设置),则设置显示为<tag>的任何标签:如果没有标签:<tag>出现设置:<标签>标签无条件设置。任何数量的集合:和标签:表单可以以任何顺序出现。Tag-if行是按顺序执行的,所以如果tag <tag>中的tag是另一个tag设置的tag,if设置 tag 的行必须在测试它的行之前。
-J,–dhcp-ignore = tag:<tag> [,tag:<tag>]
当所有给定标签出现在标签集中时,忽略主机并且不为其分配DHCP租约。
–dhcp-忽略-名称[=标记:<标签> [,标记:<标签>]]
当所有给定的标签出现在标签集中时,忽略主机提供的任何主机名。请注意,与dhcp-ignore不同,允许不提供标记,在这种情况下,始终忽略DHCP客户端提供的主机名,并且仅使用dnsmasq中的dhcp-host配置将DNS主机添加到DNS中,并且/ etc的内容/ hosts和/ etc / ethers。
–dhcp-生成-名称=标记:<标签> [,标记:<标签>]
(仅适用于IPv4)使用以十六进制表示的MAC地址,用破折号分隔,为没有其他DHCP客户端的DHCP客户端生成一个名称。请注意,如果主机提供名称,则将优先使用该名称,除非设置了 –dhcp-ignore-names 。
–dhcp广播[=标记:<标签> [,标记:<标签>]]
(仅限IPv4)当标签集中出现所有给定标签时,请始终使用广播与未配置主机进行通信。允许不提供标签,在这种情况下,这是无条件的。大多数需要广播回复的DHCP客户端在其请求中设置了一个标志,以便自动发生,一些旧的BOOTP客户端不会。
-M,–dhcp-boot = [tag:<tag>,] <filename>,[<servername> [,<服务器地址> | <tftp_servername>]]
(仅限IPv4)设置DHCP服务器返回的BOOTP选项。服务器名称和地址是可选的:如果未提供,名称保留为空,地址设置为运行dnsmasq的机器的地址。如果dnsmasq提供TFTP服务(请参阅 –enable-tftp),那么只需要文件名即可启用网络引导。如果给出了可选标签,则它们必须匹配才能发送此配置。TFTP服务器地址可以作为在/ etc / hosts中查找的域名给出,而不是IP地址。该名称可以在/ etc / hosts中与多个IP地址相关联,这些IP地址是循环使用的。该工具可用于在一组服务器之间平衡tftp负载。
–dhcp顺序-IP
Dnsmasq旨在使用客户端MAC地址的散列来为DHCP客户端选择IP地址。这通常允许客户端的地址长期保持稳定,即使客户端有时允许其DHCP租约过期。在这种默认模式下,IP地址在整个可用地址范围内被伪随机分配。在某些情况下(通常是服务器部署),从最低可用地址开始顺序分配IP地址更为方便,并且设置此标志将启用此模式。请注意,在顺序模式下,允许租约到期的客户端更有可能移动IP地址; 出于这个原因,它不应该被普遍使用。
–pxe-service = [tag:<tag>,] <CSA>,<menu text> [,<basename> | <bootservicetype>] [,<server address> | <server_name>]
大多数PXE引导ROM的使用只是允许PXE系统获取IP地址,然后下载由dhcp-boot指定的文件 并执行它。但是,如果受适当的DHCP服务器支持,PXE系统可以实现更复杂的功能。

这指定了一个可能出现在PXE启动菜单中的启动选项。<CSA>是客户端系统类型,只有正确类型的服务才会出现在菜单中。已知的类型是x86PC,PC98,IA64_EFI,Alpha,Arc_x86,Intel_Lean_Client,IA32_EFI,X86-64_EFI,Xscale_EFI,BC_EFI,ARM32_EFI和ARM64_EFI; 一个整数可以用于其他类型。菜单文本后面的参数可能是文件名,在这种情况下,dnsmasq充当引导服务器,并指示PXE客户端通过TFTP从本身下载文件( enable-tftp 必须为此设置)或其他TFTP服务器(如果给出了最终的服务器地址/名称)。请注意,“层”后缀(通常为“.0”)由PXE提供,不需要添加到基本名称。或者,基本名称可以是文件名,并带有后缀,在这种情况下,不会添加层后缀。如果给出了整数引导服务类型而非基本名称,则PXE客户端将在网络上搜索适合该类型的引导服务。该搜索可以通过广播完成,或者如果其IP地址/名称被提供,则直接到服务器。如果未提供引导服务类型或文件名(或指定了引导服务类型0),则菜单条目将中止网络引导过程并继续从本地媒体引导。服务器地址可以作为在/ etc / hosts中查找的域名给出。

–pxe提示符= [标记:<标签>,<提示> [,<超时>]
设置此提供一个提示,以便在PXE引导后显示。如果超时时间已过,那么在没有键盘输入的情况下超时已过,第一个可用的菜单选项将自动执行。如果超时为零,则第一个可用菜单项将立即执行。如果 pxe-prompt 被忽略,如果菜单中有多个项目,系统将等待用户输入,但如果只有一个,则立即启动。有关 菜单项的详细信息,请参阅 pxe-service

Dnsmasq支持PXE“proxy-DHCP”,在这种情况下,网络上的另一台DHCP服务器负责分配IP地址,而dnsmasq只是提供pxe-prompt 和 pxe-service中给出的信息 以允许网络启动。此模式 在dhcp-range中使用代理关键字 启用 

-X,–dhcp-lease-max = <number>
将dnsmasq限制为指定的最大DHCP租约数。默认值为1000.此限制旨在防止创建数千个租约并在dnsmasq进程中使用大量内存的主机发生DoS攻击。
-K,–dhcp权威
当dnsmasq绝对是网络上唯一的DHCP服务器时应该设置。对于DHCPv4,它会改变严格的RFC合规性行为,以便不会忽略来自未知主机的未知租赁的DHCP请求。这使得新主机在任何情况下都可以获得租约而不会出现繁琐的超时。它还允许dnsmasq在没有每个客户端需要重新获得租约的情况下重建其租赁数据库,如果数据库丢失的话。对于DHCPv6,它将响应中的优先级设置为255(最大值)而不是0(最小值)。
–dhcp-alternate-port [= <服务器端口> [,<客户端端口>]]
(仅限IPv4)从默认值更改用于DHCP的端口。如果单独给出此选项而没有参数,则将用于DHCP的端口从67和68更改为1067和1068.如果给出单个参数,则将该端口号用于服务器,端口号加上用于客户。最后,两个端口号允许任意指定DHCP的服务器和客户端端口。
-3,–bootp-dynamic [= <network-id> [,<network-id>]]
(仅限IPv4)为BOOTP客户端启用IP地址的动态分配。请谨慎使用,因为分配给BOOTP客户端的每个地址都永久租用,因此永久不可供其他主机重新使用。如果没有标签给出,则无条件启用动态分配。带标签,只有标签全部设置。它可以用不同的标签集重复。
-5, – 不 – 平
(仅限IPv4)默认情况下,DHCP服务器会在将其分配给主机之前尝试确保地址未被使用。它通过向有问题的地址发送一个ICMP回应请求(又名“ping”)来完成此操作。如果它得到答复,那么地址必须已经被使用,并且另一个被尝试。此标志禁用此检查。谨慎使用。
–log-DHCP
DHCP的额外日志记录:记录发送给DHCP客户端的所有选项以及用于确定它们的标签。
–quiet-dhcp,–quiet-dhcp6,–quiet-ra
禁止记录这些协议的日常操作。错误和问题仍将被记录。–quiet-dhcp和quiet-dhcp6被–log-dhcp覆盖。
-l,–dhcp-leasefile = <路径>
使用指定的文件来存储DHCP租赁信息。
–dhcp-DUID = <企业-ID>,<UID>
(仅限IPv6)指定DHCPv6服务器将使用的服务器持久性UID。这个选项通常不需要,因为当第一次需要时,dnsmasq会自动创建一个DUID。当给定时,这个选项为dnsmasq提供创建DUID-EN类型DUID所需的数据。请注意,一旦设置,DUID将存储在租赁数据库中,因此要在DUID-EN和自动创建的DUID之间进行更改(反之亦然),必须重新初始化租赁数据库。企业ID由IANA分配,uid是特定设备特有的十六进制字节串。
-6 –dhcp-script = <路径>
无论何时创建新的DHCP租约或销毁旧的租约或完成TFTP文件传输,都会运行此选项指定的可执行文件。<path>必须是绝对路径名,不会发生PATH搜索。过程的参数是“add”,“old”或“del”,主机的MAC地址(或IPv6的DUID),IP地址和主机名(如果已知)。“add”意味着已经创建了一个租约,“del”意味着它已经被销毁,“old”是在dnsmasq启动时的现有租赁通知或者现有租赁的MAC地址或主机名的变更(同样,租约长度或expiry和client-id,如果设置了leasefile-ro)。如果MAC地址来自以太网以外的其他网络类型,则它将具有前缀的网络类型,例如令牌环的“06-01:23:45:67:89:ab”。

环境从dnsmasq的调用者继承,并添加了一些或所有以下变量

对于IPv4和IPv6:

DNSMASQ_DOMAIN如果主机的完全限定域名已知,则将其设置为域部分。(请注意,作为参数传递给脚本的主机名永远不会被完全限定。)

如果客户端提供主机名称,则为DNSMASQ_SUPPLIED_HOSTNAME

如果客户端提供用户类,则DNSMASQ_USER_CLASS0..DNSMASQ_USER_CLASSn

如果使用HAVE_BROKEN_RTC编译dnsmasq,则租约的长度(以秒为单位)存储在DNSMASQ_LEASE_LENGTH中,否则租约到期时间将存储在DNSMASQ_LEASE_EXPIRES中。直到租约到期的秒数始终存储在DNSMASQ_TIME_REMAINING中。

如果一个租约曾经有一个主机名被删除,那么会产生一个“旧”事件,这个新的状态是租约的新状态,也就是没有名称,而前一个名称是在环境变量DNSMASQ_OLD_HOSTNAME中提供的。

DNSMASQ_INTERFACE存储请求到达的接口的名称; 当dnsmasq重新启动时,这不是针对“旧”操作设置的。

如果客户端使用DHCP中继与dnsmasq联系并且中继的IP地址已知,则设置DNSMASQ_RELAY_ADDRESS。

DNSMASQ_TAGS包含在DHCP事务期间设置的所有标记,用空格分隔。

如果–log-dhcp有效,则设置DNSMASQ_LOG_DHCP 

仅适用于IPv4:

DNSMASQ_CLIENT_ID(如果主机提供了客户端ID)。

DNSMASQ_CIRCUIT_ID,DNSMASQ_SUBSCRIBER_ID,DNSMASQ_REMOTE_ID(如果DHCP中继代理添加了这些选项中的任何一个)。 
  如果客户端提供供应商类别DNSMASQ_VENDOR_CLASS。

DNSMASQ_REQUESTED_OPTIONS一个字符串,其中包含参数请求列表选项中的十进制值,逗号分隔,如果参数请求列表选项由客户端提供。

仅限IPv6:

如果客户端提供包含该类的IANA企业ID的供应商类别DNSMASQ_VENDOR_CLASS_ID,并为数据提供DNSMASQ_VENDOR_CLASS0..DNSMASQ_VENDOR_CLASSn。

包含服务器DUID的DNSMASQ_SERVER_DUID:每次调用脚本时都是一样的。

包含租约的IAID的DNSMASQ_IAID。如果租约是临时分配,则以“T”为前缀。

包含客户端MAC地址的DNSMASQ_MAC(如果知道)。

请注意,当主机恢复现有租约时,所提供的主机名,供应商类和用户类数据仅用于“添加”操作或“旧”操作,因为这些数据不保存在dnsmasq的租赁数据库中。

除stdin(打开/ dev / null)和stdout和stderr之外,所有文件描述符都是关闭的,stdin和stderr捕获由dnsmasq记录的输出。(在调试模式下,stdio,stdout和stderr文件保留为从dnsmasq的调用者继承的文件)。

该脚本不会被同时调用:至多有一个脚本实例正在运行(dnsmasq会在运行下一个脚本之前等待脚本实例退出)。对租赁数据库所做的更改需要调用脚本,以便排队等待正在运行的实例的退出。如果此排队允许在脚本可以运行之前对单个租约发生多个状态更改,则会丢弃较早的状态,并在脚本最终运行时反映该租约的当前状态。

在dnsmasq启动时,将从租赁文件中读取所有现有租赁时调用该脚本。过期租约将被称为“del”,其他与“old”被称为。当dnsmasq接收到一个HUP信号时,脚本将被调用用于具有“旧”事件的现有租约。

还有四个进一步的动作可能会作为脚本的第一个参数,“init”,“arp-add”,“arp-del”和“tftp”出现。将来可能会增加更多,因此应该编写脚本以忽略未知操作。“init”在以下文件中进行了描述 –leasefile-ro 当TFTP文件传输完成时,将调用“tftp”操作:参数是文件大小(以字节为单位),文件发送到的地址以及文件的完整路径名文件。 
  只有使用–script-arp启用时,才会调用“arp-add”和“arp-del”操作。 它们以MAC地址和IP地址作为参数提供。“arp-add”表示ARP或邻居表中新条目的到达,“arp-del”

–dhcp-luascript = <路径>
指定一个用Lua编写的脚本,当租约被创建,销毁或更改时运行。要使用此选项,必须使用正确的支持编译dnsmasq。当dnsmasq启动时,Lua解释器被初始化一次,以便全局变量在租赁事件之间持续存在。Lua代码必须定义一个 租约 函数,并且可以 在dnsmasq启动和终止时提供 被调用的init 和 shutdown函数,而不带参数。它也可能提供一个 tftp 功能。

该 租赁 功能接收的详细信息 –dhcp脚本。 它有两个参数,首先是动作,它是一个包含“add”,“old”或“del”的字符串,其次是一个标签值对表。标签大部分对应于上面详细介绍的环境变量,例如标签“domain”与环境变量DNSMASQ_DOMAIN保持相同的数据。有一些额外的标签可以将数据作为参数提供给 –dhcp-script。 这些是 IPv4的mac_address,ip_address 和 hostname,以及 IPv6的client_duid,ip_address 和 hostname

该 TFTP 函数被调用以同样的方式为租赁功能,并表所拥有的标签 的destination_address, FILE_NAME 和 FILE_SIZE。

该 ARP 和 ARP岁 的时候启用功能仅称为 –script-ARP 和具有保持标签的表 MAC_ADDRESS 和 CLIENT_ADDRESS。

–dhcp-scriptuser
指定要运行租赁更改脚本或Lua脚本的用户。默认为root,但可以使用此标志更改为其他用户。
–script-ARP
启用dhcp-script和dhcp-luascript中的“arp”和“arp-old”功能。
-9,–leasefile-ro
完全禁止使用租赁数据库文件。该文件不会被创建,读取或写入。更改租赁变更脚本(如果提供了租用变更脚本)的调用方式,以便租赁数据库可以由脚本在外部存储中维护。除了在–dhcp-script中给出的调用之外 ,在dnsmasq启动时仅调用一次租约更改脚本,并使用单个参数“init”。当像这样调用时,脚本应该使用dnsmasq leasefile格式将租约数据库的已保存状态写入标准输出并以零退出代码退出。设置此选项还会强制更改客户端ID和租约长度和到期时间,以调用leasechange脚本。
–bridge接口= <接口>,<别名> [,<别名>]
将DHCP(v4和v6)请求和IPv6路由器请求数据包视为抵达任何<alias>接口,就好像它们已到达<interface>一样。该选项允许dnsmasq通过无地址和无桥接的以太网接口(例如在OpenStack计算主机上提供DHCP和RA服务,其中每个这样的接口是到VM的TAP接口),或者在BSD平台上的“旧式桥接”。每个<别名>中都可以使用尾随的“*”通配符。

由于–bridge-interface = int1,alias1,alias2完全等同于–bridge-interface = int1,alias1 –bridge-interface = 1,所以允许使用多个桥接接口选项添加多个别名。 INT1,别名2

-s,–domain = <域> [,<地址范围> [,本地]]
指定DHCP服务器的DNS域。可以无条件地(无IP范围)或有限的IP范围给予域名。这有两个影响; 首先它使DHCP服务器将域返回给请求它的任何主机,其次它设置DHCP合法主机要求声明的合法域。其目的是限制主机名,以便局域网上的不可信主机不能通过dhcp通告其名称,例如“microsoft.com”,并捕获不适合它的流量。如果未指定域名后缀,则任何具有域名部分(即有句点)的DHCP主机名将被禁止并记录。如果指定了后缀,则允许使用域部分的主机名,前提是域部分与后缀匹配。此外,当设置了后缀时,没有域部分的主机名将作为可选域部分添加后缀。例如在我的网络上,我可以设置 –domain = thekelleys.org.uk 并拥有一台DHCP主机名为“laptop”的机器。该机器的IP地址可以从 dnsmasq 以“laptop”和“laptop.thekelleys.org.uk”获得。如果域以“#”形式给出,那么该域将从/etc/resolv.conf(或等同的)中的第一个“搜索”指令读取。

地址范围可以是<IP地址>,<IP地址>或<IP地址> / <网络掩码>或只是一个<IP地址>的格式。请参阅 –dhcp-fqdn ,它可以用域来改变dnsmasq的行为。

如果地址范围以ip-address / network-size给出,则可以提供附加标志“本地”,其具有为正向和反向DNS查询添加本地声明的效果。例如。 –domain = thekelleys.org.uk,192.168.0.0 / 24,本地 等同于 –domain = thekelleys.org.uk,192.168.0.0 / 24 –local = / thekelleys.org.uk / –local = /0.168.192.in-addr.arpa/网络大小必须是8,16或24,因为这是合法的。

–dhcp-FQDN
在默认模式下,dnsmasq将DHCP客户端的非限定名称插入到DNS中。因此,名称必须是唯一的,即使两个具有相同名称的客户端位于不同的域中。如果出现与已有客户端名称相同的第二个DHCP客户端,则名称将被传输到新客户端。如果 设置了–dhcp-fqdn,则此行为会发生变化:不合格名称不再放入DNS中,而只放入限定名称。使用相同的名称既可以保留一个名为DHCP客户端,前提是该域部分是不同的(即完全合格的名称不同)。为了确保所有的名字有一个域的一部分,必须有至少 –domain 没有地址在 设置–dhcp-fqdn时指定 
–dhcp客户端更新
通常情况下,在给出DHCP租约时,dnsmasq会在FQDN选项中设置标志,以通知客户端不要尝试使用其名称和IP地址进行DDNS更新。这是因为name-IP对会自动添加到dnsmasq的DNS视图中。此标志可以抑制该行为,例如,这对于允许Windows客户端更新Active Directory服务器很有用。详情请参阅RFC 4702。
–enable-RA
启用dnsmasq的IPv6路由器广告功能。与DHCPv4相同,DHCPv6不处理完整的网络配置。路由器发现和自动地址创建的(可能的)前缀发现由不同的协议处理。当使用DHCP时,只需要其中的一部分,而且dnsmasq可以使用现有的DHCP配置来提供大部分数据。启用RA后,dnsmasq将为每个dhcp范围公布一个前缀,默认路由器将作为运行dnsmasq的计算机上的相关链路本地地址。默认情况下,“管理地址”位置1,“使用SLAAC”位复位。对于使用–dhcp-range中描述的模式关键字的单个子网可以更改 此项。 RFC6106 DNS参数包含在广告中。默认情况下,运行dnsmasq的机器的相关链接本地地址作为递归DNS服务器发送。如果提供,DHCPv6选项dns-server和域搜索用于DNS服务器(RDNSS)和域搜索列表(DNSSL)。
–ra-param = <interface>,[mtu:<integer> | <interface> | off,] [high,| low,] <ra-interval> [,<router lifetime>]
为通过接口发送的路由器通告设置非默认值。路由器的优先级字段可能会从默认介质中更改,例如 –rararam = eth0,high。 路由器公告之间的时间间隔可以用–ra-param = eth0,60来设置(以秒为单位)  路由的生命周期可能会改变或设置为零,这允许路由器通过前缀进行通告,但不通过自己通过路由。 –ra-parm = eth0,0,0 (间隔为零的值表示默认值。)所有四个参数可以一次设置。 –ra-PARAM = eth0的,MTU:1280,低,60,1200

界面字段可以包括通配符。

mtu:参数可以是任意的接口名称,在这种情况下使用该接口的MTU值。这对于(例如)在路由器的其他接口上广告WAN接口的MTU很有用。

–dhcp应答延迟= [标记:<标签>,<整数>
延迟发送DHCPOFFER和proxydhcp至少应答指定的秒数。这可以用作PXE启动固件中的错误的解决方法,它在接收即时应答时无法正常工作。该选项考虑已经花费在等待中的时间(例如,执行ping检查)(如果有的话)。
–enable-TFTP [= <接口> [,<接口>]]
启用TFTP服务器功能。这是故意限于网络引导客户端所需的。只允许阅读; 支持tsize和blksize扩展(仅在八位字节模式下支持tsize)。没有参数,TFTP服务就提供给与DHCP服务相同的一组接口。如果提供接口列表,它定义哪些接口接收TFTP服务。
–tftp根= <目录> [,<接口>]
查找要使用相对于给定目录的TFTP进行传输的文件。设置此项时,包含“..”的TFTP路径将被拒绝,以阻止客户端超出指定的根目录。绝对路径(以/开头)是允许的,但它们必须位于tftp-root中。如果给出可选的接口参数,则该目录仅用于通过该接口的TFTP请求。
–tftp-没有失败
如果指定的tftp根目录不可访问,则不要中止启动。
–tftp唯一根[= IP | MAC]
将TFTP客户端的IP地址或硬件地址添加为TFTP根的末尾的路径组件。只有在设置了tftp-root并且该目录存在的情况下才有效。默认为添加IP地址(采用标准的点划格式)。例如,如果tftp-root是“/ tftp”,并且客户端1.2.3.4请求文件“myfile”,那么如果/tftp/1.2.3.4存在,或者/ tftp / tftp文件存在,则有效路径将为“/tftp/1.2.3.4/myfile” myfile,否则。当指定“= mac”时,它将附加MAC地址,使用用破折号分隔的小写零填充数字,例如:01-02-03-04-aa-bb请注意,解析MAC地址仅在客户端处于本地网络或从我们获得的DHCP租约。
–tftp安全
启用TFTP安全模式:如果没有此项,则可以通过TFTP使用正常unix访问控制规则下的dnsmasq进程可读的任何文件。如果给出–tftp-secure标志,则只有运行dnsmasq进程的用户拥有的文件才可访问。如果dnsmasq以root身份运行,则适用不同的规则:–tftp-secure不起作用,但只有具有世界可读位集的文件才可访问。不建议在启用了TFTP的情况下以根用户身份运行dnsmasq,并且当然不是没有指定–tftp-root。这样做可以将服务器上的任何世界可读文件公开给网络上的任何主机。
–tftp小写
将TFTP请求中的文件名转换为全部小写。这对于来自Windows机器的请求非常有用,它们具有不区分大小写的文件系统,并且倾向于在文件名中快速播放。请注意,dnsmasq的tftp服务器始终将文件名中的“\”转换为“/”。
–tftp-MAX = <连接>
设置允许的最大并发TFTP连接数。默认值为50.当服务大量的TFTP连接时,可能会遇到每进程文件描述符限制。Dnsmasq每个并发TFTP连接需要一个文件描述符,每个唯一文件需要一个文件描述符(以及其他一些文件描述符)。因此,向n个客户端同时提供相同的文件将使用对n + 10个文件描述符的要求,同时向n个客户端提供不同的文件需要大约(2 * n)+10个描述符。如果 给出–tftp-port-range ,可能会影响并发连接的数量。
–tftp-mtu = <mtu size>
在协商TFTP块大小时,使用大小作为介入网络支持的MTU的上限,覆盖本地接口的MTU设置(如果较大)。
–tftp-NO-块大小
停止TFTP服务器与客户端协商“块大小”选项。一些有问题的客户请求这个选项,但是当它被授予时会表现得很差。
–tftp端口范围= <启动>,<END>
TFTP服务器侦听已知端口(69)上的连接启动,但它也为每个连接使用动态分配的端口。通常这些由操作系统分配,但是此选项指定TFTP传输使用的一系列端口。当TFTP必须穿越防火墙时,这可能很有用。除非dnsmasq以root身份运行,否则范围的开始不能低于1025。并发TFTP连接的数量受端口范围大小的限制。
-C,–conf-file = <file>
指定一个不同的配置文件。配置文件中也允许配置文件选项,以包含多个配置文件。文件名“ – ”会导致dnsmasq从标准输入读取配置。
-7,–conf-dir = <目录> [,<file-extension> ……],
读取给定目录中的所有文件作为配置文件。如果给出扩展名,则跳过以这些扩展名结尾的任何文件。任何名字以〜结尾的文件。或者以#开头和结尾总是被跳过。如果扩展名以*开头,则仅加载具有该扩展名的文件。因此,– conf-dir = / path / to / dir,*。conf 将加载后缀为.conf的所有文件放在/ path / to / dir中。该标志可以在命令行或配置文件中给出。如果在命令行上给它,一定要转义*字符。
–servers文件= <文件>
–conf文件的 特殊情况 在两个方面有所不同。首先,在配置文件中只允许使用–server和–rev-server。其次,当dnsmasq收到SIGHUP时,文件被重新读取并且其中的配置被更新。

 

配置文件

在启动时, 如果它存在,dnsmasq会读取 /etc/dnsmasq.conf(在FreeBSD上,该文件是 /usr/local/etc/dnsmasq.conf )(但请参阅 -C 和 -7 选项。)此文件的格式由每行一个选项组成,与在选项部分,但没有领先的“ – ”。以#开头的行是注释并被忽略。对于只能指定一次的选项,配置文件将覆盖命令行。在配置文件中允许引用:在引号之间,:,。和#的特殊含义被删除,并允许使用以下转义符:\\ \“\ t \ e \ b \ r和\ n。后者对应于tab,escape,backspace,return和newline。  

笔记

当它收到SIGHUP时, dnsmasq 清除它的缓存,然后重新加载 / etc / hosts 和 / etc / ethers 以及由–dhcp-hostsfile,–dhcp-hostsdir,–dhcp-optsfile,–dhcp -optsdir,–addn-hosts或–hostsdir。为所有现有DHCP租约调用dhcp租约更改脚本。如果 设置了–no-poll,SIGHUP也会重新读取 /etc/resolv.conf。 SIGHUP不会重新读取配置文件。

当它收到SIGUSR1时, dnsmasq 将统计信息写入系统日志。它写入缓存大小,必须在缓存过期之前从缓存中删除的名称数量,以便为新名称腾出空间以及已插入缓存中的名称总数。还给出了缓存命中和未命中的数量以及回答的权威查询的数量。对于每个上游服务器,它会给出发送的查询数量以及导致错误的数量。在 –no-daemon 模式或启用完整日志记录(-q)时,将创建缓存内容的完整转储。

高速缓存统计信息在DNS中也可用作对域绑定类CHAOS查询和TXT类型查询的答案。域名是cachesize.bind,insertions.bind,evictions.bind,misses.bind,hits.bind,auth.bind和servers.bind。使用dig 实用程序查询这个命令的示例命令 

挖+短混乱txt cachesize.bind

当它收到SIGUSR2并直接登录到文件(请参阅 –log-facility ) dnsmasq 将关闭并重新打开日志文件。请注意,在此操作期间,dnsmasq将不会以root身份运行。当它首次创建日志文件时,dnsmasq会将该文件的所有权更改为非root用户,它将作为。在发送SIGUSR2之前,应将Logrotate配置为创建一个新的日志文件,其所有权与现有日志文件匹配。如果正在进行TCP DNS查询,旧的日志文件将在处理TCP查询的子进程中保持打开状态,并且可能会继续写入。有150秒的限制,在此之后,所有现有的TCP进程都将过期:因此,为刚刚旋转的日志文件配置日志文件压缩并不明智。使用logrotate,所需的选项是 create 和delaycompress。


 

Dnsmasq是一个DNS查询转发器:它不能递归地回应从根服务器开始的任意查询,但将这样的查询转发到通常由ISP提供的完全递归上游DNS服务器。默认情况下,dnsmasq读取 /etc/resolv.conf 来发现它应该使用的上游名称服务器的IP地址,因为信息通常存储在那里。除非使用–no-poll , 否则 dnsmasq将 检查/etc/resolv.conf (或等效如果使用 –resolv-file )的修改时间, 并在其更改时重新读取它。这允许DNS服务器由PPP或DHCP动态设置,因为这两个协议都提供了这些信息。缺少 /etc/resolv.conf 不是一个错误,因为它可能没有在PPP连接存在之前创建。Dnsmasq只需在 /etc/resolv.conf文件 中随时创建。Dnsmasq可以被告知解析多个resolv.conf文件。这对于可以使用PPP和DHCP的笔记本电脑很有用:dnsmasq可以设置为轮询 /etc/ppp/resolv.conf 和 /etc/dhcpc/resolv.conf ,并使用最后更改的内容,给DNS服务器之间自动切换。

上游服务器也可以在命令行或配置文件中指定。这些服务器规范可以选择一个域名,告诉dnsmasq只使用该服务器在该特定域中查找名称。

为了将dnsmasq配置为运行它的主机的缓存,请在/etc/resolv.conf中加上“nameserver 127.0.0.1” 以强制本地进程向dnsmasq发送查询。然后,使用–server 选项将上游服务器直接指定为dnsmasq, 或者将其地址保存在另一个文件中,例如 /etc/resolv.dnsmasq, 并使用-r /etc/resolv.dnsmasq 选项运行dnsmasq 第二种技术允许通过PPP或DHCP动态更新服务器地址。

/ etc / hosts中的地址会在上游DNS中为相同名称“映射”不同地址,因此/ etc / hosts中的“mycompany.com 1.2.3.4”将确保对“mycompany.com”的查询始终返回1.2.3.4即使上游DNS中的查询会返回不同的地址。有一个例外:如果上游DNS包含一个指向阴影名称的CNAME,则通过dnsmasq查找CNAME将导致与CNAME的目标相关联的未被遮蔽的地址。要解决这个问题,请将CNAME添加到/ etc / hosts,以便CNAME也被映射。

标记系统的工作原理如下:对于每个DHCP请求,dnsmasq从活动配置行中收集一组有效标记,其中包括set <tag>,其中一个来自 用于分配地址的 dhcp-range,一个来自任何匹配的 dhcp-主机 (如果dhcp-host匹配,则为“known”或“known-othernet”)为BOOTP请求设置标签“bootp”,同时设置名称为请求到达的接口名称的标签。

任何包含一个或多个tag:<tag>结构的配置行只有在所有标签在上面派生的集合中匹配时才有效。通常这是dhcp选项。 具有标签的dhcp-option将优先于未标记的 dhcp选项使用, 前提是_all_标签匹配上述收集的集合中的某处。前缀’!’ 在标签上意味着’不’这样–dhcp-option = tag:!purple,3,1.2.3.4当标签purple不在有效标签集合中时发送选项。(如果在命令行而不是配置文件中使用它,请确保escape!,这是一个shell元字符)

在选择dhcp-options时,dhcp-range中的标记是相对于其他标记的第二个类,以便轻松覆盖各个主机的选项,因此 dhcp-range = set:interface1,…… dhcp-host = set:myhost,….. dhcp-option = tag:interface1,选项:nis-domain,domain1 dhcp-option = tag:myhost,选项:nis-domain,domain2 将NIS域设置为域1该范围,但将其覆盖到特定主机的domain2。

请注意,对于 dhcp范围 ,标记:<tag>和set:<tag>都是允许的,以便根据(例如)dhcp-host选择正在使用的范围,并根据所选范围来影响发送的选项。

这个系统是从一个较早的,更有限的系统发展而来的,并且为了向后兼容,可以使用“net:”代替“tag:”,并且“set:”可以省略。(除了在 dhcp-host中, 可以使用“net:”而不是“set:”。)出于同样的原因,可以使用’#’而不是’!’ 表示NOT。

dnsmasq中的DHCP服务器也将充当BOOTP服务器,前提是为客户端指定了MAC地址和IP地址(使用 dhcp-host 配置或在 / etc / ethers中) ,并且存在 dhcp范围 配置选项以激活特定网络上的DHCP服务器。(设置–bootp-dynamic不需要静态地址映射。)BOOTP请求中的filename参数与标签“bootp”一样用作标记,允许对返回到不同类主机的选项进行一些控制。

 

授权配置

配置dnsmasq充当授权DNS服务器很复杂,因为它涉及配置外部DNS服务器以提供委派。我们将通过增加复杂性的三种情况。所有这些场景的先决条件都是全球可访问的IP地址,指向该地址的A或AAAA记录,以及能够对相关区域进行委派的外部DNS服务器。对于本解释的第一部分,我们将调用全局可访问地址server.example.com的A(或AAAA)记录以及dnsmasq为其授权的区域our.zone.com。

最简单的配置由两行dnsmasq配置组成; 就像是

auth-server = server.example.com,eth0  auth-zone = our.zone.com,1.2.3.0 / 24 

和外部DNS中的两条记录

server.example.com A 192.0.43.10 our.zone.com NS server.example.com 

eth0是dnsmasq正在侦听的外部网络接口,并具有(全局可访问)地址192.0.43.10。

请注意,外部IP地址可能是动态的(即通过DHCP或PPP从ISP分配)如果是这样,则A记录必须通过常用的动态DNS系统之一链接到该动态分配。

一个更复杂但实用的配置具有全局可访问IP地址的地址记录,该IP地址位于dnsmasq服务的权威域中,通常位于根域。现在我们有了

auth-server = our.zone.com,eth0  auth-zone = our.zone.com,1.2.3.0 / 24 
our.zone.com A 1.2.3.4 our.zone.com NS our.zone.com 

我们的.zone.com的A记录现在已经成为胶水记录,它解决了当A记录位于该区域时查找our.zone.com域名服务器IP地址的鸡与鸡问题。请注意,这是该记录的唯一作用:由于dnsmasq现在是来自我们的.zone.com的权威,它也必须提供此记录。如果外部地址是静态的,则可以使用 / etc / hosts 条目或 –host-record来完成。

auth-server = our.zone.com,eth0  host-record = our.zone.com,1.2.3.4  auth-zone = our.zone.com,1.2.3.0 / 24 

如果外部地址是动态的,则与our.zone.com关联的地址必须来自相关接口的地址。这是通过使用接口名称来完成的 

auth-server = our.zone.com,eth0  interface-name = our.zone.com,eth0  auth-zone = our.zone.com,1.2.3.0 / 24,eth0 

(auth-zone中的“eth0”参数将包含eth0动态地址的子网添加到区域,以便接口名称返回外部查询中的地址。)

我们的最终配置建立在上述的基础上,但也添加了辅助DNS服务器。这是另一个DNS服务器,它通过进行区域传输来了解该区域的DNS数据,并在主服务器变得不可访问时充当备份。辅助程序的配置超出了此手册页的范围,但dnsmasq的额外配置很简单:

AUTH-仲丁基服务器= secondary.myisp.com 

our.zone.com NS secondary.myisp.com 

添加auth-sec-servers可以在dnsmasq中传输区域,以允许辅助服务器收集DNS数据。如果你想限制这些数据到特定的主机那么

auth-peer = <secondary的IP地址> 

将这样做。

Dnsmasq充当授权服务器,用于与auth-zone声明中给出的子网关联的in-addr.arpa和ip6.arpa域,因此可以简单地使用合适的NS记录配置反向(地址到名称)查找,例如在此例如,我们允许1.2.3.0/24地址。

 3.2.1.in-addr.arpa NS our.zone.com 

请注意,目前,反向(in-addr.arpa和ip6.arpa)区域在区域传输中不可用,因此没有必要安排辅助服务器进行反向查找。

当将dnsmasq配置为充当授权服务器时,将使用以下数据填充授权区域。

–mx-host,–srv-host,–dns-rr, – txt-record,–naptr-record ,只要记录名称位于授权域中即可。

–cname 只要记录名称在授权域中。如果CNAME的目标不合格,则使用权威区域名称进行限定。以这种方式使用的CNAME(仅)可能是通配符,如

CNAME = *。example.com,default.example.com 

如果地址属于–auth-zone中指定的一个子网, 则从/ etc / hosts(和–addn-hosts )和 –host-record 和 –interface-name中获取 IPv4和IPv6地址 

DHCP租约的地址,前提是该地址属于–auth-zone中指定的一个子网  (如果使用构造的DHCP范围,取决于动态分配给接口 的地址,则应使用通过接口的动态地址定义子网–auth-zone形式 来确保满足此条件。)

在缺省模式下,如果DHCP租用具有非限定名称,并且可能使用–domain构建了限定 名称,则授权区域中的名称将从非限定名称和区域的域构建。这可能会或可能不等于–domain指定的值  如果 设置了–dhcp-fqdn,则将使用与DHCP租约关联的全限定名称,并且必须与区域的域匹配。 
 

 

退出代码

0 – Dnsmasq成功分叉到背景中,或者如果未启用背景,则正常终止。

1 – 检测到配置问题。

2 – 发生网络访问问题(正在使用地址,未经许可尝试使用特权端口)。

3 – 文件系统操作发生问题(缺少文件/目录,权限)。

4 – 内存分配失败。

5 – 其他杂项问题。

11或更高 – 从租赁脚本进程“init”调用收到非零返回码。dnsmasq的退出代码是添加了10的脚本退出代码。

 

极限

dnsmasq中资源限制的默认值通常较为保守,适用于处理器速度较慢且内存有限的嵌入式路由器类型设备。在功能更强大的硬件上,可以增加限制并处理更多的客户端。以下内容适用于dnsmasq-2.37:早期版本也没有扩展。 

 

Dnsmasq能够为至少一千个客户处理DNS和DHCP。DHCP租用时间不应该很短(不到一小时)。 可以增加–dns-forward-max的值 :从等于客户端的数量开始,如果DNS看起来很慢,则增加。请注意,DNS性能也取决于上游名称服务器的性能。DNS缓存的大小可能会增加:硬限制为10000个名称,默认值(150)非常低。将SIGUSR1发送到dnsmasq使其记录有助于调整高速缓存大小的信息。详情请参阅 NOTES 部分。

内置的TFTP服务器可以同时进行多个文件传输:绝对限制与进程允许的文件句柄数量以及select()系统调用处理大量文件句柄的能力有关。如果使用–tftp-max 将限制设置得过高 ,它将被缩小并在启动时记录实际限制。请注意,发送相同文件时可能发生的传输次数比每次传输发送不同文件时的传输次数都多。

可以使用dnsmasq通过在/ etc / hosts 或其他主机文件中使用所有解析为127.0.0.1或0.0.0.0的已知横幅广告服务器列表来阻止Web广告 该列表可能很长,dnsmasq已经成功通过一百万个名称的测试。这个尺寸的文件需要1GHz的处理器和大约60Mb的RAM。

 

国际化

Dnsmasq可以被编译来支持国际化。为此,应使用make all targets和all-i18n来代替标准目标all和install。编译国际化时,dnsmasq将以本地语言生成日志消息并支持国际化域名(IDN)。包含非ASCII字符的/ etc / hosts,/ etc / ethers和/etc/dnsmasq.conf中的域名将被转换为DNS内部punycode表示。请注意,dnsmasq既可以确定消息的语言,也可以确定来自LANG环境变量的配置文件的假定字符集。这应该由负责启动dnsmasq的脚本设置为系统默认值。编辑配置文件时, 

   

FILES

/etc/dnsmasq.conf

/usr/local/etc/dnsmasq.conf

/etc/resolv.conf /var/run/dnsmasq/resolv.conf /etc/ppp/resolv.conf /etc/dhcpc/resolv.conf

/ etc / hosts文件

在/ etc /醚

/var/lib/misc/dnsmasq.leases

/var/db/dnsmasq.leases

/var/run/dnsmasq.pid  

也可以看看

dnsmasq.conf.example

#dnsmasq的配置文件。
#格式是每行一个选项,合法选项是相同的
#作为命令行中合法的长选项。看到
#“/ usr / sbin / dnsmasq –help”或“man 8 dnsmasq”以获取详细信息。
#监听此特定端口而不是标准DNS端口
#(53)。将此设置为零将完全禁用DNS功能,
#只留下DHCP和/或TFTP。
#端口= 5353
#以下两个选项让你成为更好的网友,因为他们
#告诉dnsmasq过滤掉公有DNS不能查询的内容
#答案,并加载服务器(特别是根服务器)
#不必要的。如果你有一个按需拨号链接,他们也会停下来
#这些请求不必要地提出链接。
#不要转发普通名称(没有点或域部分)
#域的需要
#切勿在非路由地址空间中转发地址。
#假,私法
#取消注释以启用DNSSEC验证和缓存:
#(需要使用DNSSEC选项构建dnsmasq。)
#的conf文件= %% PREFIX %% /股/的dnsmasq /信任anchors.conf
#dnssec
#未经DNSSEC签名的回复可能是合法的,因为该域名
#是无符号的,或者可能是伪造的。设置这个选项会告诉dnsmasq
#通过查找DS的安全证明,检查未签名的答复是否正确
#记录根和域之间不存在的地方。
#设置这个的成本是即使在无符号域中的查询也需要
#一个或多个额外的DNS查询来验证。
#DNSSEC – 检查 – 无符号
#取消注释,以过滤无用的Windows发起的DNS请求
#可以不必要地触发按需拨号链接。
#请注意(除其他外)这会阻止所有SRV请求,
#所以如果你使用Kerberos,SIP,XMMP或Google Talk,请不要使用它。
#此选项仅影响转发,源自于的SRV记录
#dnsmasq(通过srv-host =行)不会被压缩。
#filterwin2k
#如果你想让dns从其上游服务器获取,请更改此行
#/etc/resolv.conf中的其他地方
#RESOLV文件=
#默认情况下,dnsmasq会向任何上游发送查询
#知道的服务器,并试图使服务器知道
#要起来。取消注释会强制dnsmasq尝试每个查询
#每台服务器严格按照它们出现的顺序排列
#/etc/resolv.conf
#严格的顺序
#如果您不想让dnsmasq读取/etc/resolv.conf或其他任何文件
#文件,然后从该文件中获取其服务器(请参见下文)
#取消注释。
#无RESOLV
#如果你不想让dnsmasq轮询/etc/resolv.conf或其他resolv
#文件进行更改并重新读取它们,然后取消注释。
#无调查
#在这里添加其他域名服务器,如果它们适用于域名规范
#非公共领域。
#服务器= / localnet的/ 192.168.0.1
#将PTR查询路由到名称服务器的示例:这将发送全部
#地址 – >名称查询192.168.3 / 24到名称服务器10.1.2.3
#服务器= / 3.168.192.in-addr.arpa / 10.1.2.3
#在此添加仅限本地域,这些域中的查询将得到解答
#仅限于/ etc / hosts或DHCP。
#本地= / localnet的/
#在此处添加您要强制的域名到IP地址。
#以下示例将double-click.net中的任何主机发送到本地
# 网络服务器。
#地址= / double-click.net / 127.0.0.1
# – 地址(和–server)也可以使用IPv6地址。
#地址= / www.thekelleys.org.uk / FE80 :: 20D:60ff:fe36:F83
#将所有查询的IP添加到yahoo.com,google.com和他们的
#子域名到vpn并搜索ipsets:
#IPSET = / yahoo.com / google.com / VPN,搜索
#你可以控制dnsmasq与服务器的对话方式:这个强制
#查询到10.1.2.3,通过eth1路由
#server=10.1.2.3@eth1
#并且这设置用于交谈的源(即本地)地址
#10.1.2.3到192.168.1.1端口55(必须有一个接口
#显然,机器上的IP)。
#server=10.1.2.3@192.168.1.1#55
#如果你想让dnsmasq把uid和gid改成别的东西
#默认情况下,编辑以下行。
#=用户
#组=
#如果你想让dnsmasq只侦听DHCP和DNS请求
#指定的接口(和回送)给出的名称
#接口(例如eth0)。
#为多个接口重复该行。
#接口=
#或者你可以指定哪个接口_not_监听
#除了接口=
#或者按地址收听(记住包括127.0.0.1 if
#你用这个。)
#听地址=
#如果你想让dnsmasq只在接口上提供DNS服务,
#如上图所示配置它,然后使用以下行来进行配置
#禁用DHCP和TFTP。
#无DHCP-接口=
#在支持它的系统上,dnsmasq绑定通配符地址,
#即使它只在某些接口上侦听。然后丢弃
#请求它不应答复。这具有优点
#即使在接口来去变换地址时也可以工作。如果你
#想让dnsmasq真正绑定它正在监听的接口,
#取消注释该选项。关于你可能需要的唯一时间是什么时候
#在同一台机器上运行另一个名称服务器。
#绑定接口
#如果您不想让dnsmasq读取/ etc / hosts,请取消注释
#以下行。
#无主机
#或者如果你想要它读取另一个文件,以及/ etc / hosts,请使用
# 这个。
#ADDN-主机=的/ etc / banner_add_hosts
#设置这个(和域:见下文),如果你想有一个域
#自动添加到主机文件中的简单名称。
#扩展的主机
#为dnsmasq设置域。这是可选的,但如果它被设置,它
#会做以下事情。
#1)只允许DHCP主机拥有完全限定的域名
#作为域名部分匹配此设置。
#2)设置“域”DHCP选项,从而可能设置
#由DHCP配置的所有系统的域
#3)为“expand-hosts”提供域部分
#域= thekelleys.org.uk
#为特定子网设置不同的域
#域= wireless.thekelleys.org.uk,192.168.2.0 / 24
#同样的想法,但范围,而不是子网
#域= reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200
#取消注释以启用您需要的集成DHCP服务器
#来提供可用于租赁和可选地址的范围
#租约时间。如果你有多个网络,你需要
#为每个要提供DHCP的网络重复此操作
#服务。
#DHCP-范围= 192.168.0.50,192.168.0.150,12h
#这是给出网络掩码的DHCP范围的一个例子。这个
#是我们通过中继到达dnsmasq DHCP服务器的网络所必需的
#代理。如果你不知道DHCP中继代理是什么,你可能会
#不需要担心这一点。
#DHCP-范围= 192.168.0.50,192.168.0.150,255.255.255.0,12h
#这是一个设置标签的DHCP范围的例子
#一些DHCP选项可能只为这个网络设置。
#DHCP-范围=设定:红,192.168.0.50,192.168.0.150
#只有当标签设置为“绿色”时才使用此DHCP范围。
#DHCP的范围=标签:绿色,192.168.0.50,192.168.0.150,12h
#指定一个不能用于动态地址分配的子网,
#可用于具有匹配–dhcp-host行的主机。注意
除非存在dhcp范围,否则#dhcp-host声明将被忽略
有问题的子网的某种类型的#。
#在这种情况下,网络掩码是隐含的(它来自网络
在运行dnsmasq的机器上#配置)可以给
#代替显式网络掩码。
#DHCP-范围= 192.168.0.0,静态
#启用DHCPv6。请注意,前缀长度不需要指定
#,如果缺失/缺省为64,
#dhcp-range = 1234 :: 2,1234 :: 500,64,12h
#做路由器通告,但不是这个子网的DHCP。
#dhcp-range = 1234 ::,ra-only
#做路由器广告,但不是这个子网的DHCP,也尝试和
#为DNS添加名称,以获取SLAAC配置的双栈的IPv6地址
#主机。使用DHCPv4租约来派生名称,网段和
#MAC地址并假定主机也会有一个
#使用SLAAC算法计算的IPv6地址。
#dhcp-range = 1234 ::,ra-names
#做路由器通告,但不是这个子网的DHCP。
#将寿命设置为46小时。(注意:最低使用期限为2小时。)
#dhcp-range = 1234 ::,ra-only,48h
#为此子网执行DHCP和路由器通告。设置RA中的A位
#以便客户端可以使用SLAAC地址以及DHCP地址。
#dhcp-range = 1234 :: 2,1234 :: 500,slaac
#为此子网执行路由器通告和无状态DHCP。客户会
#不从DHCP获取地址,但他们将获得其他配置信息。
#他们将使用SLAAC作为地址。
#dhcp-range = 1234 ::,ra-stateless
#进行无状态DHCP,SLAAC,并为SLAAC地址生成DNS名称
#来自DHCPv4租约。
#dhcp-range = 1234 ::,ra-stateless,ra-names
#为我们正在做DHCPv6的所有子网执行路由器广告
#除非ra-stateless,ra-names等等被路由器覆盖
#广告将设置M和O位,以便客户端
#从DHCPv6获取地址和配置,并且A位重置,所以
#客户端不使用SLAAC地址。
#使-RA
#为使用DHCP的指定主机提供参数。有很多
有效的备选方案数量,所以我们将举例说明每个方案。注意
#IP地址不必在上面给出的范围内,他们只是
#需要在同一个网络上。这些参数的顺序
#无关紧要,允许在任何地方提供姓名,地址和MAC地址
#订单。
#始终使用以太网地址11:22:33:44:55:66分配主机
#IP地址192.168.0.60
#DHCP主机= 11:22:33:44:55:66,192.168.0.60
#总是用硬件地址设置主机的名称
#11:22:33:44:55:66是“fred”
#DHCP主机= 11:22:33:44:55:66,弗雷
#始终让主机使用以太网地址11:22:33:44:55:66
#名称fred和IP地址192.168.0.60,租用时间45分钟
#DHCP主机= 11:22:33:44:55:66,弗雷,192.168.0.60,45m
#给以太网地址11:22:33:44:55:66或者主机
#12:34:56:78:90:12 IP地址192.168.0.60。Dnsmasq将假设
#这两个以太网接口永远不会同时使用
#时间,并给第二个IP地址,即使它已经是
#由第一个使用。用于有线和无线笔记本电脑
#地址。
#DHCP主机= 11:22:33:44:55:66,12:34:56:78:90:12,192.168.0.60
#给出名称为“bert”IP地址的机器
#192.168.0.70和无限的租约
#DHCP主机= BERT,192.168.0.70,无限
#总是给客户端标识符01:02:02:04
#IP地址192.168.0.60
#DHCP主机= ID:01:02:02:04,192.168.0.60
#始终为InfiniBand接口提供硬件地址
#80:00:00:48:fe:80:00:00:00:00:00:00:f4:52:14:03:00:28:05:81
#ip地址192.168.0.61。客户端ID是从前缀派生的
#ff:00:00:00:00:00:02:00:00:02:c9:00和最后8对
#硬件地址的十六进制数字。
#DHCP主机= ID:FF:00:00:00:00:00:02:00:00:02:C9:00:F4:52:14:03:00:28:05:81,192.168.0.61
#总是给客户端标识符“marjorie”
#IP地址192.168.0.60
#DHCP主机= ID:马乔,192.168.0.60
#启用/ etc / hosts中给出的“judge”的地址
#将被赋予给出现“判断”名称的机器时
#它要求DHCP租约。
#DHCP主机=法官
#切勿向其以太网机器提供DHCP服务
#地址是11:22:33:44:55:66
#DHCP主机= 11:22:33:44:55:66,则忽略
#忽略以太网机器提供的任何客户端ID
#地址11:22:33:44:55:66 这对防止机器很有用
#在不同的操作系统或Windows下运行时会有不同的对待
#PXE启动和OS启动之间。
#DHCP主机= 11:22:33:44:55:66,ID:*
#发送额外的标签为“红色”的选项
#以太网地址为11:22:33:44:55:66的机器
#DHCP主机= 11:22:33:44:55:66,设置:红色
#发送额外的标签为“红色”的选项
#以太网地址从11:22:33开始的任何机器:
#DHCP主机= 11:22:33:*:*:*,设置:红色
#给客户端一个固定的IPv6地址和名称
#DUID 00:01:00:01:16:d2:83:fc:92:d4:19:e2:d8:b2
#请注意MAC地址不能用于识别DHCPv6客户端。
#还要注意,他们[]围绕IPv6地址是强制性的。
#dhcp-host = id:00:01:00:01:16:d2:83:fc:92:d4:19:e2:d8:b2,fred,[1234 :: 5]
#忽略没有在dhcp-host行中指定的客户端
#或/ etc / ethers。相当于ISC“否认未知客户”。
#这依赖于当时设置的特殊“已知”标签
#主机是匹配的。
#DHCP-忽略=标签:知
#发送额外的选项标记为“红色”的任何机器的
#DHCP vendorclass字符串包含子字符串“Linux”
#DHCP-vendorclass =设定:红,Linux的
#发送标记为“红色”的附加选项给任何一台机器
其DHCP用户类字符串中包含子字符串“accounts”的#
#DHCP-UserClass的=设置:红色,账户
#发送额外的选项标记为“红色”的任何机器的
#MAC地址匹配模式。
#DHCP-MAC =设定:红,00:60:8C:*:*:*
#如果这行没有注释,dnsmasq会读取/ etc / ethers并执行操作
#在那里找到的以太网地址/ IP对,就好像它们一样
#作为–dhcp-host选项给出。有用的,如果你保持
#MAC地址/主机映射出于其他目的。
#读醚
#向请求DHCP租约的主机发送选项。
#有关可用选项的详细信息,请参阅RFC 2132。
#通用选项可以通过名称给予dnsmasq:
#运行“dnsmasq –help dhcp”来获取列表。
#请注意,所有常用设置,例如网络掩码和
给出#广播地址,DNS服务器和默认路由
#理性默认由dnsmasq。你很可能不需要
#任何dhcp选项。如果您使用Windows客户端和Samba,那么
#是一些建议的选项,它们在详细说明中
#本节结束。
#覆盖由dnsmasq提供的默认路由,该路由假定为
#路由器与运行dnsmasq的机器相同。
#DHCP选项= 3,1.2.3.4
#做同样的事情,但使用选项名称
#DHCP选项=选项:路由器,1.2.3.4
#覆盖由dnsmasq提供的默认路由并且不发送默认值
#路线。请注意,这只适用于发送的选项
#默认(1,3,6,12,28)同一行将发送一个零长度选项
#用于所有其他选项编号。
#DHCP选项= 3
#将NTP时间服务器地址设置为192.168.0.4和10.10.0.5
#DHCP选项=选项:NTP服务器,192.168.0.4,10.10.0.5
#发送DHCPv6选项。注意[] IPv6地址。
#DHCP选项=选项6:DNS服务器,[1234 :: 77],[1234 :: 88]
#当机器运行时,为namservers发送DHCPv6选项
#dnsmasq和另一个。
#DHCP选项=选项6:DNS服务器,[:],[1234 :: 88]
#请客户每六小时轮询一次选项更改。(RFC4242)
#DHCP选项=选项6:信息刷新时间,6小时
#设置选项58客户端更新时间(T1)。默认为一半
#如果没有指定租用时间。(RFC2132)
#DHCP选项=选项:T1:1M
#设置选项59重新绑定时间(T2)。默认为7/8
#如果没有指定租用时间。(RFC2132)
#DHCP选项=选项:T2:2米
#将NTP时间服务器地址设置为与之相同的机器
#正在运行dnsmasq
#DHCP选项= 42,0.0.0.0
#将NIS域名设置为“welly”
#DHCP选项= 40,WELLY
#将默认生存时间设置为50
#DHCP选项= 23,50
#设置“所有子网都是本地”标志
#DHCP选项= 27,1
#发送etherboot魔术标志,然后etherboot选项(一个字符串)。
#DHCP选项= 128,E4:45:74:68:00:00
#DHCP选项= 129,NIC =的eepro100
#指定一个只会发送到“红色”网络的选项
#(请参阅dhcp-range声明“红色”网络)
#请注意,标签:部分必须位于选项:部分之前。
#dhcp-option = tag:红色,选项:ntp-server,192.168.1.1
#以下DHCP选项按照指定的方式设置dnsmasq
#为ISC dhcpcd中
#http://www.samba.org/samba/ftp/docs/textdocs/DHCP-Server-Configuration.txt
#适用于运行主机的典型dnsmasq安装
#dnsmasq也是运行samba的主机。
#如果您使用的话,您可能需要取消部分或全部注释
#Windows客户端和Samba。
#dhcp-option = 19,0#选项ip-forwarding off
#dhcp-option = 44,0.0.0.0#set netbios-over-TCP / IP nameserver(s)aka WINS server(s)
#dhcp-option = 45,0.0.0.0#netbios数据报分发服务器
#dhcp-option = 46,8#netbios节点类型
#发送一个空的WPAD选项。这可能需要获得Windows 7的行为。
#DHCP选项= 252, “\ n” 个
#发送RFC-3397 DNS域搜索DHCP选项。警告:您的DHCP客户端
#可能不支持这个……
#DHCP选项=选项:域名搜索,eng.apple.com,marketing.apple.com
#发送RFC-3442无类别静态路由(注意网络掩码编码)
#DHCP选项= 121,192.168.1.0 / 24,1.2.3.4,10.0.0.0 / 8,5.6.7.8
#发送封装在DHCP选项43中的厂商级特定选项。
#选项的含义由供应商类定义
#选项仅在客户端提供供应商分类时发送
#匹配这里给出的类。(子字符串匹配是OK,所以“MSFT”
#匹配“MSFT”和“MSFT 5.0”)。这个例子设置了
对于PXEClients,#mtftp地址为0.0.0.0。
#DHCP选项=厂商:PXEClient,1,0.0.0.0
#发送特定于Microsoft的选项以告诉Windows释放DHCP租约
#关闭时。注意“我”标志,告诉dnsmasq发送
#值是一个四字节的整数 – 这就是微软想要的。看到
#http://technet2.microsoft.com/WindowsServer/en/library/a70f1bb7-d2d4-49f0-96d6-4b7414ecfaae1033.mspx?mfr=true
#DHCP选项=供应商:MSFT,2,1i
#发送一些配置所需的Encapsulated-vendor-class ID
#Etherboot允许识别DHCP服务器。
#DHCP选项=厂商:Etherboot的,60, “Etherboot的”
#将选项发送给PXELinux。请注意,我们需要甚至发送选项
#尽管它们没有出现在参数请求列表中,所以我们需要
#在这里使用dhcp-option-force。
#详情请参阅http://syslinux.zytor.com/pxe.php#special。
#魔术数字 – 在别的东西被识别之前需要
#DHCP选项力= 208,F1:00:74:7E
#配置文件名称
#DHCP选项力= 209,CONFIGS /公共
#路径前缀
#DHCP选项力= 210 / tftpboot的/ PXELINUX /文件/
#重新启动时间。(注意’我’发送32位值)
#DHCP选项力= 211,30i
#设置netboot / PXE的启动文件名。你只会需要
#这是你想通过网络启动机器,你将需要
#TFTP服务器; 要么是内置在TFTP服务器上的dnsmasq,要么是一个
#外部一个。(请参阅下面了解如何启用TFTP服务器。)
#DHCP启动= pxelinux.0的
#与上面相同,但使用自定义tftp-server而不是机器运行dnsmasq
#DHCP启动= PXELINUX,server.name,192.168.1.100
#启动Etherboot gPXE。这个想法是发送两个不同的
#文件名,第一个加载gPXE,第二个告诉gPXE要做什么
#加载。dhcp-match为来自gPXE的请求设置gpxe标记。
#dhcp-match = set:gpxe,175#gPXE发送一个175选项。
#DHCP启动=标签:包括gPXE,undionly.kpxe
#DHCP启动= mybootimage
#Etherboot gPXE的封装选项。所有选项都是
#封装在选项175中
#dhcp-option = encap:175,1,5b#优先级代码
#dhcp-option = encap:175,176,1b#no-proxydhcp
#dhcp-option = encap:175,177,string#bus-id
#dhcp-option = encap:175,189,1b#BIOS驱动器代码
#dhcp-option = encap:175,190,用户#iSCSI用户名
#dhcp-option = encap:175,191,传递#iSCSI密码
#测试网络客户端的体系结构。PXE客户端
#应该将它们的体系结构作为选项93发送(参见RFC 4578)
#dhcp-match = peecees,选项:client-arch,0#x86-32
#dhcp-match = itanics,选项:client-arch,2#IA64
#dhcp-match = hammers,选项:client-arch,6#x86-64
#dhcp-match = mactels,选项:client-arch,7 #EFI x86-64
#做真正的PXE,而不仅仅是引导单个文件,这是一个
#替代dhcp-boot。
#pxe-prompt =“我应该启动哪个系统?”
#或者在第一个可用操作执行之前超时:
#pxe-prompt =“按F8查看菜单”,60
#可用的引导服务。为PXE。
#pxe-service = x86PC,“从本地磁盘启动”
#从dnsmasq TFTP服务器加载<tftp-root> /pxelinux.0。
#pxe-service = x86PC,“安装Linux”,pxelinux
#从1.2.3.4的TFTP服务器加载<tftp-root> /pxelinux.0。
#注意在旧的PXE ROM上失败。
#pxe-service = x86PC,“安装Linux”,pxelinux,1.2.3.4
#在网络上使用引导服务器,找到我的多播或广播。
#pxe-service = x86PC,“从RIS服务器安装Windows”,1
#使用已知IP地址的引导服务器。
#pxe-service = x86PC,“从RIS服务器安装Windows”,1,1.2.3.4
#如果您有多播-FTP可用,
#的信息可以使用选项1以类似的方式传递
#至5.参见第19页
#http://download.intel.com/design/archives/wfm/downloads/pxespec.pdf
#启用dnsmasq的内置TFTP服务器
#启用,TFTP
#设置可通过FTP访问的文件的根目录。
#TFTP根=在/ var / ftpd的
#如果tftp-root不可用,请勿中止
#TFTP-没有失败
#使TFTP服务器更安全:使用此设置,只有文件归属于
#用户dnsmasq正在运行,将通过网络发送。
#TFTP安全
#该选项可以停止dnsmasq为TFTP协商较大的块大小
#转移。它会减慢速度,但可能会挽救一些破碎的TFTP
#客户。
#TFTP-NO-块大小
#只有当设置了“red”标签时,才能设置引导文件名称。
#DHCP启动=标签:红,pxelinux.red网
#使用外部TFTP服务器的dhcp-boot示例:名称和IP
服务器的#地址在文件名后面给出。
#可能会由于旧的PXE ROMS而失败。被–pxe-service覆盖。
#DHCP启动=在/ var / ftpd的/ pxelinux.0的,boothost,192.168.0.3
#如果有多个具有相同名称的外部tftp服务器
#(使用/ etc / hosts),那么该名称可以被指定为
#tftp_servername(dhcp-boot的第三个选项)以及其中的内容
#case dnsmasq解析此名称并返回结果IP
#地址以循环方式。这个设施可以用来
#在一组服务器中负载平衡tftp负载。
#DHCP启动=在/ var / ftpd的/ pxelinux.0的,boothost,tftp_server_name
#设置DHCP租约的限制,缺省值为150
#DHCP租赁-MAX = 150
#DHCP服务器需要磁盘上的某个位置来保留其租约数据库。
#这个默认是一个理智的位置,但如果你想改变它,使用
#下面一行。
#DHCP-leasefile =的/ var / lib中/杂项/ dnsmasq.leases
#将DHCP服务器设置为授权模式。在这种模式下,它会插入
#并接管在网络上广播的任何客户的租约,
#它是否有租约记录。这避免了超时
#当一台机器在新网络上醒来时。如果有的话不要启用
#你有可能最终意外地配置DHCP
#你的校园/公司意外的服务器。ISC服务器使用
#同样的选项,这个网址提供了更多信息:
#http://www.isc.org/files/auth.html
#DHCP权威
#创建或销毁DHCP租约时运行可执行文件。
#发送给脚本的参数是“add”或“del”,
#然后是MAC地址,IP地址,最后是主机名
#如果有的话。
#DHCP-脚本= /斌/回波
#在这里设置cachesize。
#缓存大小= 150
#如果您想禁用否定缓存,请取消注释。
#无negcache
#通常来自/ etc / hosts和DHCP租约的响应
#文件的生存时间设置为零,这通常意味着
#不要进一步缓存。如果你很乐意交易更低的负荷
#服务器的可能陈旧的日期,你可以设置一个生存时间(在
#秒)在这里。
#本地-TTL =
#如果您想让dnsmasq检测Verisign发送查询的企图
#未注册.com和.net主机到其站点搜索服务和
#有dnsmasq,而不是返回正确的NXDOMAIN响应,取消注释
#这一行。您可以添加相似的线条来为其他人做同样的事情
已实施通配符A记录的#个注册表。
#假-NXDOMAIN = 64.94.110.11
#如果您想修复上游服务器的DNS结果,请使用
#别名选项。这仅适用于IPv4。
#这个别名使得1.2.3.4的结果显示为5.6.7.8
#别名= 1.2.3.4,5.6.7.8
#和这个映射1.2.3.x到5.6.7.x
#别名= 1.2.3.0,5.6.7.0,255.255.255.0
#并且这映射192.168.0.10-> 192.168.0.40到10.0.0.10-> 10.0.0.40
#别名= 192.168.0.10-192.168.0.40,10.0.0.0,255.255.255.0
#如果您想让dnsmasq提供MX记录,请更改这些行。
#用目标返回名为“maildomain.com”的MX记录
#servermachine.com和首选项50
#MX-主机= maildomain.com,servermachine.com,50
#设置使用localmx选项创建的MX记录的默认目标。
#MX-目标= servermachine.com
#返回指向所有本地mx-target的MX记录
#机器。
#localmx
#为所有本地机器返回指向自身的MX记录。
#selfmx
#如果您想让dnsmasq服务SRV,请更改以下几行
# 记录。如果您想为其提供ldap请求,这些都很有用
#Active Directory和其他Windows发起的DNS请求。
#请参阅RFC 2782。
#你可以添加多个srv-host行。
#这些字段是<name>,<target>,<port>,<priority>,<weight>
#如果域名部分如果从名称中缺少(这样就只有
#服务和协议部分),然后由域=给出的域
使用#config选项。(请注意,扩展主机不需要
#设置这个工作。)
#将example.com域的LDAP发送到的SRV记录
#ldapserver.example.com端口389
#SRV-主机= _ldap._tcp.example.com,ldapserver.example.com,389
#将example.com域的LDAP发送到的SRV记录
#ldapserver.example.com端口389(使用domain =)
#域= example.com
#SRV-主机= _ldap._tcp,ldapserver.example.com,389
#两个LDAP的SRV记录,每个都有不同的优先级
#SRV-主机= _ldap._tcp.example.com,ldapserver.example.com,389,1
#SRV-主机= _ldap._tcp.example.com,ldapserver.example.com,389,2
#SRV记录,指示该域没有LDAP服务器
#example.com
#SRV-主机= _ldap._tcp.example.com
#以下行显示如何使dnsmasq服务于任意PTR
#记录。这对DNS-SD很有用。(注意
为SRV记录_does_not完成#域名扩展
#出现在PTR记录中。)
#ptr-record = _http._tcp.dns-sd-services,“新员工页面.http._tcp.dns-sd-services”
#更改以下行以启用dnsmasq来提供TXT记录。
#这些用于SPF和zeroconf之类的东西。(注意
为SRV记录_does_not完成#域名扩展
#出现在TXT记录中。)
#例子SPF。
#txt-record = example.com,“v = spf1 a -all”
#示例zeroconf
#TXT记录= _http._tcp.example.com,名称=值,纸= A4
#提供“本地”DNS名称的别名。请注意,这个_only_有效
#用于来自DHCP或/ etc / hosts的名称目标。给主人
#“伯特”另一个名字,伯特兰
#CNAME = bertand,伯特
#出于调试目的,记录每个DNS查询通过时的情况
#dnsmasq。
#日志查询
#记录大量有关DHCP事务的额外信息。
#登录DHCP
#包含很多配置选项。
#CONF-文件=的/ etc / dnsmasq.more.conf
#CONF-DIR =的/ etc / dnsmasq.d
#将所有文件包含在一个目录中,除了那些以.bak结尾的文件
#CONF-DIR =的/ etc / dnsmasq.d,.BAK
#将所有文件包含在以.conf结尾的目录中
#CONF-DIR =的/ etc / dnsmasq.d / *。CONF

sftp服务限制用户登录读写家目录

sftp和ftp是两种协议是不同的,sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器启动。

1.查看openssh软件版本,想sftp服务用户只能访问特定的文件目录,版本需要4.8以上

[root@localhost ftp]# rpm -qa | grep openssh
openssh-server-5.3p1-81.el6_3.x86_64
openssh-5.3p1-81.el6_3.x86_64
openssh-clients-5.3p1-81.el6_3.x86_64
2.新增用户,限制用户只能通过sftp访问

[root@localhost ftp]# useradd -m -d /opt/ftp/dave -s /sbin/nologin dave
3.限制用户通过sftp登录进来时只能进入主目录,修改/etc/ssh/sshd_config文件

[root@localhost ftp]# vim /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User dave
ChrootDirectory /opt/ftp/dave
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
重启ssh
systemctl restart sshd.service

4.测试访问

root@10.1.1.200:test# sftp -o Port=22 dave@10.1.6.175 Connecting to 10.1.6.175…
dave@10.1.6.175’s password:
Read from remote host 10.1.6.175: Connection reset by peer
Couldn’t read packet: Connection reset by peer
发现连接不上,查看日志

[root@localhost ftp]# tail /var/log/messages
Jan 6 11:41:41 localhost sshd[4907]: fatal: bad ownership or modes for chroot directory “/opt/ftp/dave” Jan 6 11:41:41 localhost sshd[4905]: pam_unix(sshd:session): session closed for user dave
解决方法:

目录权限设置上要遵循2点:

ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,权限最大设置只能是755。

如果不能遵循以上2点,即使是该目录仅属于某个用户,也可能会影响到所有的SFTP用户。

[root@localhost ftp]# ll
total 4 drwxr-xr-x 3 dave dave 4096 Jan 5 13:06 dave
[root@localhost ftp]# chown root:root dave
[root@localhost ftp]# chmod 755 dave
[root@localhost ftp]# ll total 4 drwxr-xr-x 3 root root 4096 Jan 5 13:06 dave
然后在测试通过

root@10.1.1.200:test# sftp -oPort=22 dave@10.1.6.175 Connecting to 10.1.6.175…
dave@10.1.6.175’s password:
sftp> ls
test
sftp> cd ..
sftp> ls
test
sftp> cd test
sftp> ls 1.txt
sftp> get 1.txt
Fetching /test/1.txt to 1.txt
/test/1.txt

可以看到已经限制用户在家目录,同时该用户也不能登录该机器。