月度归档:2018年05月

nginx 对文件(动态页面) 进行缓存 ( nginx content caching)

refer to: http://nginx.com/resources/admin-guide/caching/ 首先看一个完整的例子:

  proxy_cache_path /tmp/nginx_cache keys_zone=cache_one:100m
                       loader_threshold=300 loader_files=200 max_size=200m;
  server {
          listen 80;
          server_name  www.tidev.in tidev.in;
          client_max_body_size 500m;
          charset utf-8;
          location / {
              proxy_hide_header "cache-control";
              proxy_hide_header Expires;

              proxy_ignore_headers Set-Cookie;
              proxy_ignore_headers Cache-Control;
              proxy_ignore_headers Expires;
              proxy_ignore_headers X-Accel-Expires;

              proxy_cache cache_one;
              proxy_cache_valid any 60s; # 任何内容,都缓存60秒钟 proxy_pass          http://tidev_servers; proxy_redirect default;
              proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header    X-Real-IP $remote_addr;
              proxy_set_header    Host $http_host;
              proxy_next_upstream http_502 http_504 error timeout invalid_header;

              proxy_cache_key $host$uri$is_args$args;
          }
          location ~ ^/assets/ {
              root /opt/app/tidev.in/public;
              expires 1y;
              add_header Cache-Control public;
              add_header ETag ""; break;
          }
  }

  upstream tidev_servers{
         server localhost:3600;
         server localhost:3601;
         server localhost:3602;
         server localhost:3603;
  }

注意:  

1. nginx 建议使用 1.7.9 以上版本, 亲测 1.7.9, 1.8.0 可用. 1.4.x 不可用. 所以,不要使用ubuntu 默认的 apt-get install 方式的nginx. 它是1.4的.

2. proxy_cache_path 务必出现在 proxy_cache 关键字之前, (也就是说,如果你用了include sites-enabled/*; , 那么,这句话要放在 proxy_cache_path之后!) 否则会报错: nginx: [emerg] the size 10485760 of shared memory zone “cache_one” conflicts with already declared size 0  

3. proxy_cache_key 是关键. 

          location / { proxy_hide_header "cache-control"; proxy_hide_header Expires; proxy_ignore_headers Set-Cookie; proxy_ignore_headers Cache-Control; proxy_ignore_headers Expires; proxy_ignore_headers X-Accel-Expires; proxy_cache cache_one; proxy_cache_valid any 60s; # 任何内容,都缓存60秒钟 proxy_pass http://tidev_servers; proxy_redirect default; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache_key $host$uri$is_args$args;
          }

nginx可以对某个请求进行缓存,

例子:

http {
    ...
    proxy_cache_path /data/nginx/cache keys_zone=one:10m; server {
        proxy_cache one;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

设置好了允许缓存后,进一步可以设置它的过期时间: (iteration 如何解释。。需要动手弄一下)

参与cache 过程 的,有两个角色, cache manager 和 cache loader:

1. cache manager 会循环的检查 cache的状态。当它发现 缓存的文件超过了 max_size 这个数目后,就会删掉最少访问的cache page. 

2. cache loader: 仅仅在nginx启动后 随之启动一次。它把之前的cache 信息加载到 shared memory中去。这在nginx启动的前几分钟会拖累nginx的速度。

以上的iteration, 比 loader_threshold(默认是200ms) 要少。 每次加载的文件数目小于 loader_files(默认是100),每个iteration 间隔 loader_sleeps (默认50ms)。 

下面是个例子: 

proxy_cache_path /data/nginx/cache keys_zone=one:10m
                 loader_threshold=300 loader_files=200; 

指定某个URL 要缓存

如果某个response来自 proxy_server, 并且request是 GET/HEAD 方法,则nginx 默认会把它做缓存. 

而且默认使用的key就是 url ,你也可以指定这个key, 例如:

proxy_cache_key “$host$request_uri$cookie_user”;

如果我们希望某个 url 至少被请求5次之后才被缓存,就这样:

proxy_cache_min_uses 5;

如果希望对POST和 DELETE进行缓存:

proxy_cache_methods GET HEAD POST;

下面的例子:对于 200 , 302的response, 缓存 10分钟, 

proxy_cache_valid 200 302 10m;  # 对于 200, 302,缓存10分钟
proxy_cache_valid 404 1m;       # 缓存1分钟 
proxy_cache_valid any 10m;      # 对于所有的响应,都缓存10分钟。

也可以根据条件来判断是否使用cache: ( cookie 中的变量:nocache, parameter中的变量:nocache 或者 comment, 只要有一个 不是空,也不是 0, 那么这个request就不会使用cache) 

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

对于下面的例子:压根就不使用cache:

proxy_no_cache $http_pragma $http_authorization;

下面是一个更大的例子:

http {
    ... # 定义了一个 proxy_cache_path, : proxy_cache_path /data/nginx/cache keys_zone=one:10m
                     loader_threshold=300 loader_files=200 max_size=200m; # 这个server中有两个backend, 对应两种不同的cache策略 server {
        listen 8080; # cache的名字叫做 one (注意上面的 keys_zone=one:10m) proxy_cache one; # 对所有的 / 请求,都尽可能长久的缓存,不存在过期 location / {
            proxy_pass http://backend1; }

        
        location /some/path {
            proxy_cache_valid any 1m; # 任何内容,都缓存1分钟 proxy_cache_min_uses 3; # 访问3次后,触发缓存 proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment; # 设置好不使用缓存的规则 proxy_pass http://backend2; }
    }
}

注意: 如何调试呢?

1. 要设置log format, 把日志打印出来. 例如,配置文件为: (注意其中的 $upstream_cache_status, 这个变量最重要, 从它我们可以知道, 是HIT 还是MISS )

    log_format my_format '$remote_addr - $remote_user [$time_local]  ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" $upstream_cache_status'; access_log logs/my_access.log my_format;

2. 要有对应的 ignore headers, 如果后端返回的结果中,增加了 cache-control (也有一说是 set-cookie) 或者 啥的,就不行了. 

server{
            proxy_ignore_headers "cache-control";
            proxy_hide_header "cache-control";
} 

下面是一个完整的 nginx.conf例子;

http{ # 其他内容  proxy_cache_path /tmp/nginx_cache keys_zone=cache_one:10m
                     loader_threshold=300 loader_files=200 max_size=200m; log_format my_format '$remote_addr - $remote_user [$time_local]  ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" $upstream_cache_status';

    access_log logs/my_access.log my_format;

    server {
        listen 80; 

        location / { 
            proxy_ignore_headers "cache-control";
            proxy_hide_header "cache-control";
            proxy_cache cache_one;
            proxy_cache_valid any 10s; # 任何内容,都缓存10秒钟 proxy_pass http://rails_api;
        }

    }
    upstream rails_api{
        server localhost:3000;
    }

缓存用的哪些文件?

我们可以在 proxy_cache_path中设置, 例如:

    proxy_cache_path /tmp/nginx_cache keys_zone=cache_one:10m loader_threshold=300 loader_files=200 max_size=200m;

然后, 找到 /tmp/nginx_cache 目录, 如果某个 cache被命中过, 就会看到出现一个以md5 结果命名的文件:

:/tmp/nginx_cache$ ll
total 20 drwxrwxrwx 2 nobody sg552 4096 Sep 10 11:39 ./
drwxrwxrwt 10 root   root 12288 Sep 10 11:38 ../
-rw------- 1 nobody nogroup 594 Sep 10 11:39 f8924891f34a941a8342ccd19c4cf290 

上面中, 这个文件 “f89…” 就是缓存文件. 它的内容如下.

���U���������Ud����0""b4945c5f2d4b62faae53f44f44a5e946"
KEY: http://rails_api/prices/say_hi
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
ETag: "b4945c5f2d4b62faae53f44f44a5e946" Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 90fbc91b-e5a4-4279-8832-5d484cba7ba8
X-Runtime: 0.007120 Connection: close Server: thin 1.6.2 codename Doc Brown time is: 2015-09-10 11:39:58 +0800 

可以看出, 该静态文件, 以文本的形式缓存了 所有的response信息.


来源;http://siwei.me/blog/posts/nginx-nginx-content-caching

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 /)。如果没有此步操作,则文件系统处于只读状态,导致不能修改配置文件并保存

HTTPS 安全最佳实践(三)之服务器nginx,OpenSSL

我们在最佳实践文章中建议大家如何去配置协议和密码套件,但是如果服务器软件(nginx、apache等)所使用的ssl协议库存在SSL漏洞,或者不支持那些现代化的密码套件和特性,那么无论你如何去修改配置都无法改善现在的安全问题。

所以我们在配置前,或者发现按照推荐配置进行了调整《SSL/TLS安全评估报告》还是无法满足要求,那么可以检查下所使用的OpenSSL等加密库是否版本过低。

如何检查OpenSSL版本

nginx

nginx -V

nginx version: nginx/1.10.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled 

或者通过openssl命令查看(适用于非自己通过openssl源码编译的)

openssl version

推荐的OpenSSL版本

  1. OpenSSL 1.0.2用户需更新到1.0.2h 以上。
  2. OpenSSL 1.0.1用户需更新到1.0.1t 以上。
  3. OpenSSL官方已停止对 0.9.8和 1.0.0 两个版本的升级维护,请使用这两个版本的用户将其升级至1.0.2h版本以上。

OpenSSL 1.0.1以下不支持tls1.2

升级前请做好测试

漏洞事件

https://www.trustasia.com/openssl-heartbleed

OpenSSL 1.0.1g 已修复该漏洞

OpenSSL 1.0.0 分支版本不受此漏洞影响

OpenSSL 0.9.8 分支版本不受此漏洞影响

OpenSSL 1.0.2 Beta2 不受此漏洞影响

Heartbleed检测工具>>

https://www.trustasia.com/OpenSSL-DROWN-attack

OpenSSL 1.0.1h+

OpenSSL 1.0.0m+

OpenSSL 0.9.8za+

https://www.trustasia.com/OpenSSL-CVE-2016-2107-Padding-Oracle

1、OpenSSL 1.0.2用户需更新到1.0.2h 。

2、OpenSSL 1.0.1用户需更新到1.0.1t 。

3、使用包管理系统的用户可以直接更新到2016年5月3日 之后的版本。

CBC padding oracle检测 检测工具>>

OpenSSL CCS漏洞

此漏洞是 OpenSSL ChangeCipherSpec 设计缺陷造成,被称为 CCS 注入漏洞。

https://www.trustasia.com/openssl-ccs

OpenSSL 1.1.0 应升级到 1.1.0a 或更高版本。

OpenSSL 1.0.2 应升级到 1.0.2i 或更高版本。

OpenSSL 1.0.1 应升级到 1.0.1u 或更高版本。

OpenSSL CCS 检测工具>>

注意:

OpenSSL官方已停止对 0.9.8和 1.0.0 两个版本的升级维护,请使用这两个版本的用户将其升级至更高版本。

HTTPS 安全最佳实践(二)之安全加固

当你的网站上了 HTTPS 以后,可否觉得网站已经安全了?这里 提供了一个 HTTPS 是否安全的检测工具,你可以试试。

本篇正文讲述的是 HTTP 安全的最佳实践,着重在于 HTTPS 网站的 Header 的相关配置。

1 连接安全性和加密

1.1 SSL/TLS

传输层安全(TLS)及其前身安全套接字层(SSL),通过在浏览器和 web 服务器之间提供端到端加密来促进机密通信。没有 TLS,就谈不上什么安全。TLS 是 HTTP 安全性的基础。

想要部署 TLS 是非常容易的,但其难点在于如何使用安全的配置来保障站点的安全。

尤其是 Protocol 版本和 Cipher 需要小心选择和配置。你可以通过本站 工具 体检你的网站,发现并解决这些细节的问题。

建议

所有本地和链接的资源需要正确的配置,且要使用 TLS。

1.2 HTTP Strict Transport Security (HSTS)

指示浏览器只使用 HTTPS 连接到目标服务器。这可以防止一些潜在的中间人攻击,包括 SSL 剥离,会话 cookie 窃取(如果没有被 适当保护)。如果遇到任何与证书相关的错误,它还可以阻止浏览器连接到网站。当浏览器访问一个设置相应 HTTP header 的 HTTPS 网站时,HSTS 将被激活。

HSTS 有一个固定期限,由 max-age 字段值控制。这个值可以是静态的,也可以是相对于将来某个特定日期的,你可以设置成 SSL 证书的过期时间。

在浏览器中,HSTS 首选项可以通过提交到 Chromium’s HSTS preload list 来硬编码,这是所有实现 HSTS 使用的浏览器。

注意,HSTS 确实有陷阱。它提供了 include subdomains 选项,这在实践中可能是太宽泛了。此外,客户端错误可能会造成严重的后果——客户端错误的时钟导致它认为服务器的 SSL 证书无效或过期,或者缺少根 CA 证书——将不再导致浏览器中的证书错误。浏览器将完全拒绝访问页面,并且可能会显示让安全专家之外的完全无法理解的错误。

建议

设置 HSTS header 长的生命周期,最好是半年及以上。

Strict-Transport-Security: max-age=31536000 

1.3 Public Key Pins

HTTP PKP(HPKP)指示浏览器只与提供的 SSL/TLS 的 HASH 相符或存在于同一证书链的服务器相连接。换句话说,如果 SSL/TLS 证书以一种意想不到的方式发生了变化,浏览器就无法连接到主机。这主要是针对受信任证书颁发机构(CA)或流氓 CA 证书颁发的伪造证书,用户可能会被骗安装。

例如,浏览器连接到 https://example.com,它存在这个头。header 告诉浏览器,如果证书 key 匹配,或者在发出证书链中有一个 key 匹配,那么在将来才会再次连接。其他的指令组合是可能的。它们都极大地减少了攻击者在客户端和合法主机之间模拟主机或拦截通信的可能性。

像 HSTS 一样,HPKP 在实现之前需要仔细的思考和计划。错误可以将用户锁定在您的站点之外,并且不容易修复。

像 HSTS 一样,HPKP 在实现之前需要仔细的思考和计划。错误可以将用户锁定在您的站点之外,并且不容易修复。

建议

确定是否需要为您的站点使用 PKP。如果是这样的话,那么从一个较小的实践开始,如果在一段时间之后没有遇到问题,就增加它。如果 SSL/TLS 密钥需要更新,建立备份计划。优先创建备份密钥和离线存储。

示例HTTP头:

Public-Key-Pins: max-age=5184000; pin-sha256="+oZq/vo3Kcv0CQPjpdwyInqVXmLiobmUJ3FaDpD/U6c="; pin-sha256="47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=" 

1.4 Mixed HTTPS and HTTP Content

主站点通过 HTTPS 安全地服务,但是在 HTTP 上加载一些文件(images、js、css)。这是一个巨大的安全漏洞,破坏了 HTTPS 提供的安全性。受影响的站点可能会泄漏会话 cookie 或用户行为信息。它们也可能容易受到注入和其他 MITM 攻击的攻击,而 HTTPS 通常会阻止这种攻击。

建议

如果 HTTPS 部署在主站上,请将任何地方的所有内容都 HTTPS 化(全站 HTTPS)。

2 Content security

2.1 Content Security Policy

为浏览器提供关于网站内容类型和行为的明确说明。良好的内容安全策略(CSP)可以帮助抵御跨站点脚本(XSS)和其他注入攻击等攻击。CSP 支持所有主要的浏览器,尽管只是部分地之前在 IE 11。

一个好的 CSP 是基于白名单的方法,不允许任何东西,除了明确允许的内容。它还限制了 javascript 的来源和允许操作。

CSP 很难启用遗留代码库。为了简化实现,CSP 提供了一个 report-only 模式,在浏览器中,CSP 的违规被发送到一个网站端点,但是该策略没有被强制执行。

新项目应该从一开始就使用 CSP。

建议

从限制性政策开始,在必要时放松。禁止所有的例子:

Content-Security-Policy: default-src 'none'; 

现在让我们允许自托管 scripts、images、CSS、fonts 和 AJAX,以及 jQuery CDN 托管脚本和 Google Analytics:

Content-Security-Policy: default-src 'none'; script-src 'self' https://code.jquery.com https://www.google-analytics.com; img-src 'self' https://www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self'; 

要注意的是,不要让所有的东西都破坏你的网站,例如,如果你使用 child-src 指令,而浏览器不支持它。一个不那么严格的政策可能从以下开始:

Content-Security-Policy: default-src 'self'; 

甚至更少的限制性政策甚至可以使用 default-src '*',然后添加限制。我建议你不要这么做,除非你完全明白其中的含义。否则,你可能会依赖 CSP,它只会给你一种错误的安全感。

2.2 Frame Options

控制站点是否可以放置在 <iframe><frame> 或 <object> 标签。不允许使用框架可以防止 clickjacking 攻击。例如,从 2015 年 2 月起,Internet Explorer’s universal cross-site-scripting bug 就被这个消息头减轻了。

X-Frame-Options 是一个非标准的 header,在内容安全策略级别 2 中被 frame ancestor指令所取代。然而,frame ancestor 还没有得到普遍的支持,而 X-Frame-Options 得到了广泛的支持。

建议

确定你的网站是否需要被允许呈现在一个 frame 中。完全不允许使用 sameorigin 拒绝或允许同源框架的选项。避免由于受限或 bug 浏览器支持而允许的选项。示例 HTTP 头:

X-Frame-Options: deny 

2.3 XSS Protection

跨站点脚本(XSS 或 CSS)的保护被构建到大多数流行的浏览器中,除了 Firefox 之外。这种保护是用户可配置的,可以关闭。因此,明确要求浏览器在你的网站上使用它的 XSS 过滤器是个好主意。

相反,网站可以要求 XSS 保护在页面的基础上被禁用。这绝对不是一个好主意。

建议

使用入校 HTTP header:

X-Xss-Protection: 1; block 

2.4 Cache Control

表示缓存页面输出的首选项。适当的值随网站数据的性质而变化,但强烈推荐使用偏好。否则,它取决于浏览器和代理来选择是否缓存内容。不恰当的选择可能会导致性能问题、安全问题,或者两者都有。

建议

开发缓存策略,然后将缓存首选项包括为 HTTP 头。

Cache-Control: public* 

其中的一个 public,private,no-cache 或 no-store。如果允许缓存,则应该将 max-age 值包含在 Cache-Control 以及 Etag 头文件中,以允许客户端缓存验证。

2.5 Content Type Options

当浏览器以不同的方式处理来自服务器的文件时,MIME 嗅探就是服务器指令。当一个网站承载不受信任的内容(如用户提供的)时,这是很危险的。假设服务器允许用户上传 image。如果用户上传 HTML 文档,浏览器可能会将其呈现为 web 执行 scriptpage,即使服务器明确表示正在发送 image。非标准的标头 X-Content-Type-Options选项指示浏览器不做任何模仿指定类型的 MIME。

建议

总是设置 header:

X-Content-Type-Options: nosniff 

2.6 Subresource Integrity

浏览器通常从外部域加载大量资源、javascript 和样式表。内容交付网络经常被使用。如果外部资源被破坏,依赖站点的安全性也可以。子资源完整性允许浏览器验证 javascript 或样式表未被意外修改。

建议

设置外部 javascript 和样式表的完整性属性。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" integrity="sha384-6ePHh72Rl3hKio4HiJ841psfsRJveeS+aLoaEf3BWfS+gTF0XdAqku2ka8VddikM"></script> 

注意

您应该始终提供外部脚本的本地副本,并实现一种方法,以便在外部负载失败的情况下重新加载它们。否则你的网站可能会崩溃。例子:

<script>window.jQuery || document.write('<script src="/jquery.min.js"><\/script>')</script> 

2.7 Iframe Sandbox

iframe 在 WWW 上随处可见。网站平均有 5.1 iframe,主要用于装载第三方内容。这些 iframe 有很多方法来伤害托管网站,包括运行脚本和插件和重新引导访问者。sandbox属性允许对 iframe 中可以进行的操作进行限制。

建议

设置 iframe 的 sandbox 属性,然后添加所需的权限。

<iframe src="https://example.com" sandbox="allow-same-origin allow-scripts"></script> 

2.8 Server Clock

服务器包括所有响应的时间戳。不准确的时钟不会给客户机浏览器带来问题。然而,当与其他系统或服务交互时,问题就会出现。

建议

使用网络时间协议(NTP)来保持服务器时钟的准确性。

3 Information disclosure

3.1 Server Banner

大多数 web 服务器设置报头来识别自己和他们的版本号。这只服务于信息目的和实际用途是非常有限的。去掉整个头,而完全可以接受,通常是不必要的。但是,建议从头中删除版本号。在特定 web 服务器版本中存在 bug 的情况下,包括版本号可以作为对脚本 kiddy 的邀请来尝试对服务器的攻击。

建议

包含服务器名称但去掉版本号;

Server: nginx 

3.2 Web Framework Information

许多 web 框架设置 HTTP 头,识别框架或版本号。除了满足用户的好奇心,而且主要作为技术堆栈的广告,这几乎没有什么作用。这些头是不标准的,对浏览器渲染站点的方式没有影响。

虽然它们没有什么实际用途,但对于搜索运行过时版本的软件的机器人或蜘蛛来说,这些标头是无价的,因为这些软件可能包含安全漏洞。如果没有定期更新,这些头文件可以使网站的目标变得容易。

建议

从服务器响应中删除这些标头: X-Powered-ByX-RuntimeX-Version 和 X-AspNet-Version

4 Cookies

4.1 Cookie Security

包含敏感信息的 cookie,特别是会话 id,需要标记为安全的,假设网站是通过 HTTPS 传输的。这会阻止 cookie 通过 HTTP 发送明文文本。另一种方法是通过 HSTS 来阻止非安全 cookie 在 HTTP 上传输。建议使用安全 cookie 和 HSTS。

会话 cookie 应该与 HttpOnly 值进行标记,以防止它们被 javascript 访问。这可以防止攻击者利用 XSS 窃取会话 cookie。其他 cookie 可能不需要这样标记。但是,除非有明确的需要从 javascript 中访问他们的值,否则最好还是呆在安全的一边,把所有cookie标记为 HttpOnly

建议

标记所有 cookie 安全和 HttpOnly

Set-Cookie: Key=Value; path=/; secure; HttpOnly, Key2=Value2; secure; HttpOnly

https://blog.myssl.com/https-security-best-practices/

HTTPS 安全最佳实践(一)之SSL/TLS部署

SSL/TLS 是一种简单易懂的技术,它很容易部署及运行。但想要部署的安全通常是不容易的。这也使系统管理员和开发者不得不去了解 SSL 和 TLS 相关的技术,掌握如何配置一个安全的 web 服务器或应用。无疑会耗费很大的精力去看相关的技术文档,乏味且宽泛。

本篇文档的目的在于如何让系统管理员或开发者用尽可能少的时间部署一个安全的 web 站点或应用,即 SSL 和 TLS 部署最佳实践。

1 证书和私钥

在TLS中,所有的安全性都从服务器的密码标识开始;需要一个强大的私钥来防止攻击者进行模拟攻击。同样重要的是要有一个有效的和强大的证书,这将授予私有密匙作为一个特定主机名的权利。没有这两个基本的构建块,就没有其他东西可以安全了。

1.1 使用 2048 位私钥

对于大多数的 web 站点,提供一个 2048 的 RSA key 是足够安全的。RSA 的公钥算法是被普遍支持的,这使得这个类型的 key 作为默认是足够安全的。对于 2048 位,这些 key 提供了大约 112 位的安全性。如果您想要比这更多的安全性,请注意 RSA key 的伸缩性不太好。想要获得 128 位的安全性,你需要 3072 位 RSA key,这会很大的影响性能。ECDSA key 提供了一种提供更好安全性和更好性能的替代方法。对于 256 位,ECDSA key 提供 128 位安全性。少数古董客户端不支持 ECDSA,但现代客户端是支持的。如果您不介意管理这样一个设置的开销,那么您可以同时部署 RSA 和 ECDSA 密钥。

1.2 保护你的私钥

把你的私钥视为一项重要的资产,尽可能最大的使用你的私钥,限制最小的员工的访问。建议的政策包括以下内容:

  • 在可信计算机上用足够的熵生成私有密钥。一些 CA 为您提供生成私钥的功能,请尽量不要这样做。
  • 密码保护 key 最初就不要存储在备份系统中。私钥密码在生产环境中起不了什么作用,因为有知识的攻击者总是能够从进程内存中检索密钥。有硬件设备(被称为硬件安全模块,或 HSMs),即使在服务器折衷的情况下,也可以保护私有密匙,但是它们是昂贵的,因此仅适用于具有严格安全性需求的组织。
  • 妥协后,撤销旧证书并生成新密钥。
  • 每年更新证书,如果您可以自动化过程,则更频繁。大多数网站都应该假定不可靠的妥协证书被撤销; 因此,具有较短使用寿命的证书在实践中更加安全。
  • 除非保持相同的密钥对于公钥密钥很重要,否则每当获得新证书时,还应该生成新的私钥。

1.3 覆盖您的域名

确保您的证书涵盖您希望与网站一起使用的所有名称。您的目标是避免无效的证书警告,这会混淆用户,削弱他们的信心。

即使您期望只使用一个域名,请记住,您无法控制用户到达该网站的方式或其他人如何链接到该网站。在大多数情况下,您应该确保该证书与 www 前缀有关(例如,它适用于 example.com 和

www.example.com )。经验法则是,安全的 Web 服务器应该具有对配置为指向它的每个 DNS 名称有效的证书。

通配符证书能满足更广泛的需求,但如果准备将密钥暴露给更多的人员,特别是跨团队或部门,则避免使用它们。换句话说,访问私钥的人越少越好。还要注意,证书共享会创建一个可以被滥用的将漏洞从一个网站或服务器传输到使用相同证书的所有其他站点和服务器(即使底层私钥不同,只要证书域名匹配)的绑定。

1.5 从可信 CA 获取证书

选择对其证书业务和安全性可靠和认真的认证中心(CA)。选择 CA 时,请考虑以下条件:

安全状态 所有CA都经过定期审核,但有些则比其他 CA 更为严重。弄清哪些在这方面做的更好并不容易,但一个选择是检查他们的安全历史,更重要的是,他们如何反应妥协,如果他们从错误中学到了经验,这将更有利。

业务重点 CA 的活动构成其业务的重要组成部分,如果事情发生严重错误,其所有事情都将丢失,并且在其他地方追逐潜在的更有利可图的机会可能不会忽视其证书部门。

提供的服务 至少,您选择的 CA 应提供对证书吊销列表(CRL)和在线证书状态协议(OCSP)撤销方法的支持,具有稳定的网络可用性和性能。许多网站对域验证的证书感到满意,但您也应该考虑是否需要扩展验证(EV)证书。在任一种情况下,您都应该选择公钥算法。大多数网站今天使用 RSA,但由于其性能优势,ECDSA 在未来可能会变得重要。

证书管理 选项如果您需要大量证书并在复杂环境中运行,请选择一个 CA,为您提供良好的管理工具。

支持选择一个 CA,如果需要的话可以给您很好的支持。

注意

为了获得最佳效果,请提前获得证书,并在部署到生产之前至少一周。这种做法(1)有助于避免在计算机上没有正确时间的一些用户的证书警告;(2)有助于避免与 CA 需要额外时间的 CA 失败的撤销检查,以向 OCSP 响应者传播有效的新证书。随着时间的推移,尝试将这个“热身”期延长至 1-3 个月。同样,不要等到你的证书即将到期以替换它们。留下额外的几个月也会帮助时钟不正确的人在另一个方向。

1.6 使用强签名算法

证书安全性取决于(1)用于签署证书的私钥的强度,(2)签名中使用的散列函数的强度。直到最近,大多数证书都依赖于 SHA1 散列函数,现在被认为是不安全的。因此,我们正在向 SHA256 转型。截至 2016

年 1 月,您无法从公共 CA 获取 SHA1 证书。现有的 SHA1 证书将继续工作(在某些浏览器中有警告),但只能到 2016 年底。

2 配置

使用正确的 TLS 服务器配置,您可以确保将凭据正确呈现给站点的访问者,仅使用安全的加密原语,并减轻所有已知的缺陷。

2.1 使用完整的证书链

在大多数部署中,仅服务器证书不够的; 需要两个或多个证书来建立完整的信任链。当部署具有有效证书但没有所有必要的中间证书的服务器时,会发生常见的配置问题。为避免这种情况,只需使用 CA 提供给您的所有证书。

无效的证书链有效地使服务器证书无效并导致浏览器警告。实际上,这个问题有时难以诊断,因为一些浏览器可以重构不完整的链,有些浏览器不能重建。所有浏览器都倾向于缓存和重用中间证书。

2.2 使用安全的协议

SSL/TLS 系列中有五种协议:SSL v2,SSL v3,TLS v1.0,TLS v1.1和TLS v1.2:

  • SSL v2 是不安全的,不能使用。此协议版本非常糟糕,即使它们位于完全不同的服务器(DROWN 攻击)上也可以用来攻击具有相同名称的RSA 密钥和站点。
  • 当与 HTTP(POODLE 攻击)一起使用时,SSL v3 是不安全的,当与其他协议一起使用时,SSL v3 是弱的。它也是过时的,不应该被使用。
  • TLS v1.0 也是不应该使用的传统协议,但在实践中通常仍然是必需的。其主要弱点(BEAST)在现代浏览器中得到缓解,但其他问题仍然存在。
  • TLS v1.1 和 v1.2 都没有已知的安全问题,只有 v1.2 提供了现代的加密算法。

TLS v1.2 应该是您的主要协议,因为它是唯一提供现代认证加密(也称为 AEAD)的版本。如果您今天不支持 TLS v1.2,则缺乏安全性。

为了支持较旧的客户端,您可能需要继续支持 TLS v1.0 和TLS v1.1。但是,您应该计划在不久的将来退出 TLS v1.0。例如,PCI DSS 标准将要求所有接受信用卡付款的网站在 2018 年 6 月之前移除对 TLS v1.0 的支持。

目前正在开展设计 TLS v1.3 的工作,其目的是消除所有过时和不安全的功能,并进行改进,以保持我们的通信在未来几十年内的安全。

2.3 使用安全的套件

为了安全通信,您必须首先确定您正在与所需方(而不是通过将窃听的其他人)直接沟通并安全地交换数据。在 SSL 和 TLS 中,密码套件定义了如何进行安全通信。它们由不同的建筑组成,通过多样性实现安全。如果发现其中一个构建块软弱或不安全,那么您应该可以切换到另一个。

您应该主要依靠提供强身份验证和密钥交换,前向保密和至少 128 位加密的 AEAD 套件。还有一些其他较弱的套房可能仍然得到支持,只要它们只能与不支持任何更好的老客户进行协商。

有几个过时的加密原语必须避免:

  • 匿名 Diffie-Hellman(ADH)套件不提供身份验证。
  • NULL 密码套件不提供加密。
  • 导出密码套件在连接中协商时不安全,但也可以针对更喜欢更强大的套件(FREAK攻击)的服务器使用。
  • 弱密码(通常为 40 和 56 位)的套件使用可以轻松破坏的加密。
  • RC4 是不安全的。
  • 3DES 缓慢而虚弱。

使用以RSA和ECDSA键为基础的以下套件配置,作为起点:

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 

警告

我们建议您始终首先在分段环境中测试TLS配置,仅在确定所有内容按预期工作时将更改应用到生产环境。请注意,以上是一个通用列表,并不是所有系统(特别是较旧的)支持所有套件。这就是为什么测试很重要,推荐您使用《SSL/TLS安全评估》进行检查。

上述示例配置使用标准 TLS 套件名称。一些平台使用非标准名称; 有关详细信息,请参阅您的平台的文档。例如,以下套件名称将与OpenSSL 一起使用:

ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-SHA
ECDHE-ECDSA-AES256-SHA
ECDHE-ECDSA-AES128-SHA256
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES128-SHA
DHE-RSA-AES256-SHA
DHE-RSA-AES128-SHA256
DHE-RSA-AES256-SHA256 

2.4 选择合适的协议

在SSL v3及更高版本的协议版本中,客户端提交他们支持的密码套件列表,服务器从列表中选择一个用于连接的套件。然而,并不是所有的服务器都做得很好,有些将从客户端列表中选择第一个支持的套件。使服务器主动选择最佳可用加密套件对于实现最佳安全性至关重要。

2.5 使用 FS

前向保密(有时也称为完全前向保密)是一种协议功能,可实现不依赖服务器私钥的安全对话。对于不提前向保密的密码套件,可以恢复服务器的私钥的人就可以解密所有较早记录的加密对话(也就是可以先大量记录密文,再解密,比如您的证书到期后没有正确销毁,它的私钥就能用来解密非PFS的密文)。您需要支持并喜欢 ECDHE 套件,以便通过现代网络浏览器实现前向保密。为了支持更广泛的客户,您还应该使用 DHE 套件作为 ECDHE 后备。避免 RSA 密钥交换,除非绝对必要。我在2.3节中提出的默认配置只包含提供前向保密的套件。

2.6 使用强的密钥交换算法

对于密钥交换,公共站点通常可以选择经典的短暂的 Diffie-Hellman密钥交换(DHE)和其椭圆曲线变体 ECDHE。还有其他的密钥交换算法,但是它们通常是以某种方式不安全的。RSA 密钥交换仍然很受欢迎,但不提供前向保密。

2015 年,一批研究人员发表了对 DHE 的新攻击; 他们的工作被称为Logjam 攻击。[2] 研究人员发现,较低强度的 DH 密钥交换(例如768 位)容易被破坏,一些知名的 1024 位 DH 组可被国家机构破坏。为了安全起见,如果部署 DHE,请至少配置 2048 位的安全性。一些较老的客户端(例如Java 6)可能不支持这种强度。出于性能原因,大多数服务器应该更喜欢 ECDHE,这是更强大和更快。在这种情况下,secp256r1命名曲线(也称为 P-256)是一个很好的选择。

3 减轻已知问题

近几年来已经发生了几次严重的 SSL 和 TLS 攻击,但是如果您正在运行最新的软件并遵循本指南的建议,那么它们通常不会关心您。(如果没有,我建议您使用 MYSSL 测试您的系统,并从中进行测试)。但是,没有什么是完全安全的,所以为了保持对安全性的了解,这是一个很好的做法。如果供应商补丁可用,请及时提供; 否则,依靠解决方案进行缓解。

4 性能

安全是我们在本指南中的主要重点,但我们也要注意表现; 一个不符合性能标准的安全服务无疑将被丢弃。通过正确配置,TLS 可以相当快。使用现代协议(例如 HTTP/2),甚至可能比明文通信更快。

4.1 避免过度安全

用于建立安全连接的密码握手是一种操作,其费用受私钥大小的高度影响。使用太短的密钥是不安全的,但使用太长的密钥将导致“太多”的安全性和缓慢的操作。对于大多数网站,使用超过 2048 位的 RSA 密钥和强大于 256 位的 ECDSA 密钥会浪费 CPU 功耗,并可能会损害用户体验。类似地,增加短暂密钥交换的强度对于 DHE 为 2048 位以及 ECDHE 为 256 位几乎没有什么好处。使用高于 128 位的加密没有明显的好处。

4.2 使用 session 恢复

会话恢复是一种性能优化技术,可以节省昂贵的密码操作的结果,并重复使用一段时间。残疾或非功能性会话恢复机制可能会引起显着的性能损失。

4.3 使用 WAN 优化和 HTTP/2

这些天,TLS 开销不是来自 CPU 饥饿的加密操作,而是来自网络延迟。只有在 TCP 握手完成后才能启动TLS握手,需要进一步交换数据包,并且离开服务器的距离更远。最小化延迟的最佳方法是避免创建新的连接 – 换句话说,保持现有的连接长时间(keep-alives)。提供良好结果的其他技术包括支持现代协议(如HTTP / 2)和使用WAN优化(通常通过内容传送网络)。

4.4 隐藏公共内容

通过TLS进行通信时,浏览器可能会认为所有流量都是敏感的。它们通常会使用内存来缓存某些资源,但一旦关闭浏览器,所有内容可能会丢失。为了获得性能提升,并能够长期缓存一些资源,将公共资源(例如图像)标记为公开。

4.5 使用 OCSP Stapling

OCSP 装订是 OCSP 协议的扩展,可以直接从服务器提供撤销信息作为 TLS 握手的一部分。因此,客户端不需要联系 OCSP 服务器进行带外验证,并且总体 TLS 连接时间显着减少。OCSP 装订是一种重要的优化技术,但您应该注意,并不是所有的网络服务器都提供了可靠的 OCSP 装订实现。结合具有缓慢或不可靠的 OCSP 响应者的 CA,这样的 Web 服务器可能会产生性能问题。为了获得最佳效果,请模拟故障条件,看看它们是否会影响您的可用性。

4.6 使用快速加密

除了提供最佳的安全性,我推荐的密码套件配置也提供了最好的性能。尽可能使用支持硬件加速 AES 的 CPU。之后,如果您真的想要进一步的性能优势(大多数网站可能不需要),请考虑使用 ECDSA 密钥。

5 HTTP 和 应用安全

HTTP 协议和 Web 应用交付的周边平台在 SSL 诞生后继续快速发展。作为这一进化的结果,该平台现在包含可用于打败加密的功能。在本节中,我们列出了这些功能,以及安全使用它们的方法。

5.1 加密无处不在

加密是可选的事实可能是今天最大的安全问题之一。我们看到以下问题:

  • 没有 TLS 需要它的网站
  • 具有 TLS 但不执行 TLS 的站点
  • 混合 TLS 和非 TLS 内容的网站,有时甚至在同一网页内
  • 编程错误的网站会颠覆 TLS

尽管如果您确切了解您正在做的事情,许多这些问题可以被缓解,可靠地保护网站通信的唯一方法是无一例外地执行加密。

5.2 消除混合内容

混合内容页面是通过 TLS 传输但是包含不通过 TLS 传输的资源(例如,JavaScript 文件,images,CSS 文件)的页面。这样的页面不安全。一个活跃的中间人(MITM)攻击者可以搭载一个单独的未受保护的 JavaScript 资源,例如劫持整个用户会话。即使您遵循上一节的建议并对整个网站加密,您仍然可能会最终从第三方网站中检索未加密的一些资源。

5.3 使用可信第三方

网站通常使用通过从另一个服务器下载的 JavaScript 代码激活的第三方服务。这种服务的一个很好的例子是 Google Analytics(分析),用于 Web 的大部分。这种包含第三方代码创建一个隐含的信任连接,有效地使对方完全控制您的网站。第三方可能不是恶意的,但是这些服务的大型提供商越来越被视为目标。推理很简单:如果大型提供程序受到威胁,攻击者将被自动访问所有依赖该服务的站点。

如果您遵循第4.2节的建议,至少您的第三方链接将被加密,从而避免 MITM 攻击。但是,您应该进一步了解:了解您使用的服务和删除服务,将其替换为更安全的替代方案,或接受其继续使用的风险。一种称为子资源完整性(SRI)的新技术可用于通过第三方资源来减少潜在的风险。[3]

5.4 安全 cookie

要正确安全,网站需要 TLS,而且所有的 Cookie 在创建时都被明确标记为安全的。未能保护 cookies 可以让活跃的 MITM 攻击者通过聪明的技巧来挑逗一些信息,即使在 100% 加密的网站上也是如此。为了获得最佳效果,请考虑为您的 Cookie 添加加密完整性验证或甚至加密。

5.5 安全 HTTP 压缩

2012 年 CRIME 攻击显示 TLS 压缩无法安全实施。唯一的解决方案是完全禁用 TLS 压缩。次年,随后再发生两次攻击。TIME 和 BREACH 专注于使用 HTTP 压缩压缩的 HTTP 响应实体中的秘密。与 TLS 压缩不同,HTTP 压缩是必需的,不能关闭。因此,为了解决这些攻击,需要对应用程序代码进行更改。[4]

TIME 和 BREACH 攻击并不容易实现,但是如果某人有足够的动力使用它们,则这种影响大致相当于成功的跨站点请求伪造(CSRF)攻击。

5.5 部署 HSTS

HTTP 严格传输安全(HSTS)是 TLS 的安全网。它旨在确保即使在配置问题和实施错误的情况下,安全性仍然保持不变。要激活 HSTS 保护,您可以向您的网站添加一个新的响应头。之后,支持 HSTS(此时所有现代浏览器)的浏览器执行它。

HSTS 的目标很简单:激活后,它不允许与使用它的网站进行任何不安全的通信。通过自动将所有明文链接转换为安全的链接,实现了这一目标。作为奖励,它还会禁用点击式证书警告。(证书警告是活动的 MITM 攻击的指标,研究表明大多数用户点击这些警告,所以绝对不要让他们感兴趣)。

添加对 HSTS 的支持是您可以为您的网站的 TLS 安全性做出的最重要的改进。新站点始终应设计为 HSTS,旧站点转换为尽可能快地支持。为了获得最佳安全性,请考虑使用 HSTS 预加载[5],将HSTS配置嵌入到现代浏览器中,从而使您的网站的第一个连接安全。

以下配置示例将在主主机名及其所有子域上激活一段时间为一年的 HSTS,同时还允许预加载:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload 

5.6 部署 CSP

内容安全策略(CSP)是网站可以用来限制浏览器操作的安全机制。尽管最初旨在解决跨站点脚本(XSS),CSP 不断发展,并支持对增强TLS安全性有用的功能。特别地,它可以用于限制混合内容,当涉及到第三方网站,HSTS没有帮助。

要部署CSP以防止第三方混合内容,请使用以下配置:

Content-Security-Policy: default-src https: 'unsafe-inline' 'unsafe-eval';
                         connect-src https: wss: 

注意

这不是部署 CSP 的最佳方法。为了提供不破坏混合内容以外的任何内容的示例,我不得不禁用某些默认安全功能。随着时间的推移,当您了解 CSP 的更多信息时,您应该更改您的策略以使其恢复。

5.7 不要缓存敏感内容

所有敏感内容必须仅传达给预定方,并由所有设备进行相应处理。虽然代理没有看到加密的流量,并且不能在用户之间共享内容,但是使用基于云的应用交付平台正在增加,这就是为什么在指定什么是公共的时候需要非常小心的是什么。

5.8 考虑其它威胁

TLS 旨在仅解决安全机密和您与用户之间通信的完整性的一个方面,但还有许多其他威胁需要处理。在大多数情况下,这意味着确保您的网站没有其他弱点。

6 验证

有许多配置参数可用于调整,预先知道某些变化会产生什么影响。此外,有时会意外地进行更改; 软件升级可以静默地引入更改。因此,我们建议您最初使用全面的 SSL/TLS 评估工具来验证您的配置,以确保您开始安全,然后定期确保您保持安全。对于公共网站,我们建议您免费使用SSL实验室服务器测试。[6]

6.1 高级主题

以下高级主题目前不在我们的指南范围之内。他们需要更深入地了解 SSL/TLS 和公钥基础设施(PKI),而且他们仍然被专家辩论。

6.2 使用 HPKP

公共密钥固定旨在使网站运营商有权限制哪些 CA 可以为其网站颁发证书。Google 已经部署了这个功能了一段时间(硬编码到他们的浏览器,Chrome),并且已被证明是非常有用的,以防止攻击并使公众了解它们。在 2014 年,Firefox 还增加了对硬编码固定的支持。现在可以使用一种称为 HTTP [7]的公钥固定扩展标准。公钥绑定解决了 PKI 最大的弱点(事实上,任何 CA 都可以为任何网站发布证书),但是这是一个成本; 部署需要大量精力和专业知识,并造成失去对您站点控制的风险(如果最终导致无效的固定配置)。你应该考虑固定很大程度上只有当你

6.2 使用 DNSSEC 和 DANE

域名系统安全扩展(DNSSEC)是一种增加域名系统完整性的技术。今天,一个活跃的网络攻击者可以轻松地劫持任何 DNS 请求并伪造任意的响应。使用 DNSSEC,所有响应都可以加密地跟踪到 DNS 根目录。命名实体的基于 DNS 的身份验证(DANE)是建立在 DNSSEC 之上的单独标准,用于提供 DNS 和 TLS 之间的绑定。DANE 可用于增强现有基于 CA 的 PKI 生态系统的安全性,或者完全绕过它。

即使不是每个人都同意,DNSSEC 是互联网的一个很好的方向,但对其的支持仍在继续改善。浏览器还不支持 DNSSEC 或 DANE(更喜欢 HSTS 和 HPKP 提供的类似功能),但有一些迹象表明它们正在开始用于提高电子邮件传递的安全性。

Nginx配置支持HTTP2

从 2015 年 5 月 14 日 HTTP/2 协议正式版的发布到现在已经快有一年了,越来越多的网站部署了 HTTP2,HTTP2 的广泛应用带来了更好的浏览体验,只要是 Modern 浏览器都支持,所以部署 HTTP2 并不会带来太多困扰。

虽然 h2 有 h2c (HTTP/2 Cleartext) 可以通过非加密通道传输,但是支持的浏览器初期还是比较少的,所以目前部署 h2 还是需要走加密的,不过由于 Let’s Encrypt 大力推行免费证书和证书的廉价化,部署 h2 的成本并不高。

介绍

HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。

HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 将在「2016 年初结束对 SPDY 的支持」;Nginx、Apache 也已经全面支持 HTTP/2 ,并也不再支持 SPDY)。

一般的大家把 HTTP2 简称为 h2,尽管有些朋友可能不怎么愿意,但是这个简称已经默认化了,特别是体现在浏览器对 HTTP2 都是这个简写的。

配置

普通的 HTTPS 网站浏览会比 HTTP 网站稍微慢一些,因为需要处理加密任务,而配置了 h2 的 HTTPS,在低延时的情况下速度会比 HTTP 更快更稳定!

现在电信劫持事件频发,网站部署了 HTTPS 加密后可以杜绝大部分劫持,但不是完全。像电子商务行业对 HTTPS 加密可是标配啊,因此部署 h2 更是势在必行。

证书

这里是 免费和便宜 SSL 证书介绍 ,大家可以从这里购买或者申请免费的 SSL 证书,免得 Chrome 弹出红色的页面令人不悦,从而拒绝了大多数访客。

Web 服务器

说明

默认编译的 Nginx 并不包含 h2 模块,我们需要加入参数来编译,截止发文,Nginx 1.9 开发版及以上版本源码需要自己加入编译参数,从软件源仓库下载的则默认编译。 Tengine 可以同时部署 h2 和 SPDY 保证兼容性,Nginx 则是一刀切不再支持 SPDY。

安装/编译

如果你编译的 Nginx 不支持,那么在 ./configure 中加入:--with-http_v2_module ,如果没有 SSL 支持,还需要加入 --with-http_ssl_module

然后 make && make install 即可。

配置

主要是配置 Nginx 的 server 块, 。
修改相关虚拟机的 .conf 文件,一般在 /usr/local/nginx/conf/vhost/ 或者 /etc/nginx/conf/,具体参考你的环境指导,不懂请回复。

server { listen 443 ssl http2 default_server; server_name www.mf8.biz; ssl_certificate /path/to/public.crt; ssl_certificate_key /path/to/private.key; 

注:将 server_name www.mf8.biz; 中的 www.mf8.biz 替换为你的域名。

然后通过 /usr/local/nginx/sbin/nginx -t 或者 nginx -t 来检测是否配置正确,然后重启 Nginx ,即可。

检验

在 Chrome 浏览器上可以通过,HTTP/2 and SPDY indicator 来检验,如果地址栏出现蓝色的闪电就是 h2

也可以在 chrome://net-internals/#http2 中检查。注意版本要新,姿势要帅!

配置进阶

大家都知道去年的心血漏洞将 SSL 推到了风口浪尖,所以单单支持了 h2 ,我们任然需要对 SSL 做一些安全的优化!

配置赫尔曼密钥

openssl dhparam -out dhparam.pem 2048 // 在 ssh 运行, openssl 生成 2048 位的密钥而不是当作参数写入 nginx.conf 文件。 ssl_dhparam /path/to/dhparam.pem; //在 .conf 中配置 

禁止不安全的 SSL 协议,使用安全协议

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

禁止已经不安全的加密算法

ssl_ciphers
'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';

也可以参考:ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;

缓解 BEAST 攻击

ssl_prefer_server_ciphers on;``` **启用 HSTS**

此举直接跳过 301 跳转,还降低了中间人攻击的风险!配置在 .conf 中即可 `add_header Strict-Transport-Security max-age=15768000;` **301 跳转** 80 端口跳转到 443 端口

server {
listen 80;
add_header Strict-Transport-Security max-age=15768000;
return 301 https://www.yourwebsite.com$request_uri;
}

 **缓存连接凭据** 

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;

 **OCSP 缝合** 

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/cert/trustchain.crt;
resolver 119.29.29.29 233.6.6.6 valid=300s;

nginx支持http2,openssl 升级openssl-1.1.0h https A+

首先升级openssl 到 openssl-1.1.0h

wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz

tar -zxvf openssl-1.1.0h.tar.gz
cd openssl-1.1.0h

./config –prefix=/usr

make

make install

openssl version -a

nginx配置参考:

listen 443 ssl http2;
add_header Strict-Transport-Security max-age=15768001;
ssl_certificate /usr/local/nginx/conf/vhost/Nginx/1_www.dnsdizhi.com_bundle.crt;
ssl_certificate_key /usr/local/nginx/conf/vhost/Nginx/2_www.dnsdizhi.com.key;
ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  10m;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers   on;

完毕后可以用:https://www.ssllabs.com/ssltest/  或者 https://myssl.com/ 检查就是能达到A+,当然其实达到A就不错了。如facebook、v.qq.com、www.google.com都是A。区别在哪里?就是没有配置add_header Strict-Transport-Security max-age=15768001;,说真的就是不用配置的,没必要。

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