我有一个已经映射到的设备domain.tld
.我现在想为所有子域创建一个通配符,*.domain.tld
以便它们也映射到ip domain.tld
.我该怎么做dnsmasq
?
基本上我的问题是我正在运行一个用于开发网站的虚拟机.
主机的dns指向正在运行dnsmasq的Vm,它解析了各种开发站点的地址,即test.mysite.vm等.
问题是当我从我的工作网络转到我的家庭网络时,它会因为虚拟机的IP发生变化而中断.是否可以根据请求来自哪个接口提供不同的IP地址?或者我应该尝试以完全不同的方式解决这个问题?
谢谢你的帮助!
事实证明,毕竟有一个更简单的方法......
我现在在VM上设置了2个接口,不需要使用dnsmasq.
第一个是桥接/共享接口,它允许VM在每次我移动办公室时重新启动网络时使用主机可用的互联网连接.
第二个是与我的VM主机的私有连接,它具有静态IP地址.这是我用来连接和绑定任何服务的接口,如nginx,mysql等.
症状是:主机具有适当的网络访问权限,但在容器内运行的程序无法解析DNS名称(在调查更多内容之前可能看起来"无法访问网络").
$ sudo docker run -ti mmoy/ubuntu-netutils /bin/bash
root@082bd4ead733:/# ping www.example.com
... nothing happens (timeout) ... ^C
root@082bd4ead733:/# host www.example.com
... nothing happens (timeout) ... ^C
Run Code Online (Sandbox Code Playgroud)
(docker图像mmoy/ubuntu-netutils是一个基于Ubuntu的简单图像ping
,host
包含在内,方便,因为网络坏了,我们不能使用apt install
这些工具)
问题来自于docker自动将Google的公共DNS配置为容器内的DNS服务器:
root@082bd4ead733:/# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8
nameserver 8.8.4.4
Run Code Online (Sandbox Code Playgroud)
这只适用于许多配置,但显然不适用于主机在网络上运行,其中Google的公共DNS被某些防火墙规则过滤.
发生这种情况的原因是:
/etc/resolve.conf
是nameserver 127.0.1.1 …
我的计算机位于具有私有DNS服务器的专用网络上,以及用于DNS解析的专用区域.我可以从主机解析此区域上的主机,但我无法从主机上运行的容器中解析它们.
主持人:
root@host:~# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
root@host:~# ping privatedomain.io
PING privatedomain.io (192.168.0.101) 56(84) bytes of data.
Run Code Online (Sandbox Code Playgroud)
容器:
root@container:~# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8
nameserver 8.8.4.4
root@container:~# ping privatedomain.io
ping: unknown …
Run Code Online (Sandbox Code Playgroud) 设置我的本地开发环境类似于这篇文章,一切都工作正常但最近我无法访问我的本地开发域我离线时.当我连接到互联网时,它工作正常.我想知道在优胜美地中如何使用解析器改变了一些东西.如果我离线,似乎会忽略解析器规则.
dnsmasq.conf:
address=/.dev/127.0.0.1
listen-address=127.0.0.1
Run Code Online (Sandbox Code Playgroud)
的/ etc /分解器的/ dev
nameserver 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
在线时:
ping -c 1 mydomain.dev
PING mydomain.dev (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.038 ms
--- mydomain.dev ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.038/0.038/0.038/0.000 ms
scutil --dns
resolver #1
search domain[0] : nomadix.com
nameserver[0] : 203.124.230.12
nameserver[1] : 202.54.157.36
if_index : 4 (en0)
flags : Request A records
reach : Reachable
resolver #2
domain : …
Run Code Online (Sandbox Code Playgroud) 我试图创建一个将请求转发给Nginx上的代理/<service>
来http://<service>
.我首先尝试了以下内容:
location ~ ^/(.+)$ {
set $backend "http://$1:80";
proxy_pass $backend;
}
Run Code Online (Sandbox Code Playgroud)
但它没有说出(当打电话时/myservice
):
[error] 7741#0: *1 no resolver defined to resolve http://myservice
Run Code Online (Sandbox Code Playgroud)
由于myservice
无法从外部访问,我尝试将go-dnsmasq作为边车安装在同一个pod中,我尝试将其用于DNS解析(就像我在本例中看到的那样)并将我的nginx配置更改为如下所示:
location ~ ^/(.+)$ {
resolver 127.0.0.1:53;
set $backend "http://$1:80";
proxy_pass $backend;
}
Run Code Online (Sandbox Code Playgroud)
但现在nginx失败了:
[error] 9#9: *734 myservice could not be resolved (2: Server failure), client: 127.0.0.1, server: nginx-proxy, request: "GET /myservice HTTP/1.1", host: "localhost:8080"
127.0.0.1 - xxx [30/May/2016:10:34:23 +0000] "GET /myservice HTTP/1.1" 502 173 "-" "curl/7.38.0" …
Run Code Online (Sandbox Code Playgroud) 当我执行一个PHP脚本,该脚本运行一个URL到.test域的cURL请求时,该域在Mac上使用Laravel Valet / dnsmasq进行了设置,我得到此错误消息:
无法解析:mydomain.test(找不到域名)
当我在浏览器中测试域时,就可以了。
当我curl -Ik https://mydomain.test
在终端中运行时,我获得了HTTP / 2 200代码,因此可以。
当我curl -k https://mydomain.test
在终端中运行时,我得到了页面的源代码,因此可以。
为什么它不能与PHP中的cURL一起使用?我很绝望...
更新
由于受欢迎的需求;-)这是我的cURL代码。您不能做得更简单:
try {
$ch = curl_init( "http://mydomain.test" );
curl_exec( $ch );
dump(curl_error($ch));
curl_close( $ch );
} catch (Exception $e) {
var_dump($e);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个docker dnsmasq容器,以便我可以让所有的docker容器查找域名,而不是使用硬编码的IP(如果它们位于同一主机上).这解决了一个问题,即无法改变docker容器中的/ etc/hosts文件,这使我可以通过更改dnsmasq容器引用的单个文件,轻松地一次性更新所有容器.
看起来有人已经为我完成了艰苦的工作并创建了一个dnsmasq容器.不幸的是,它对我来说并不"有效".我写了一个bash脚本来启动容器,如下所示:
name="dnsmasq_"
timenow=$(date +%s)
name="$name$timenow"
sudo docker run \
-v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \
--name=$name \
-p='127.0.0.1:53:5353/udp' \
-d sroegner/dnsmasq
Run Code Online (Sandbox Code Playgroud)
在运行之前,我创建了dnsmasq.hosts目录并在其中插入了一个名为hosts.txt的文件,其中包含以下内容:
192.168.1.3 database.mydomain.com
Run Code Online (Sandbox Code Playgroud)
不幸的是,每当我尝试从内部ping该域时:
我总是收到ping: unknown host
错误消息.
我尝试启动没有守护进程模式的dnsmasq容器,所以我可以调试它的输出,如下所示:
dnsmasq: started, version 2.59 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n DHCP TFTP conntrack IDN
dnsmasq: reading /etc/resolv.dnsmasq.conf
dnsmasq: using nameserver 8.8.8.8#53
dnsmasq: read /etc/hosts - 7 addresses
dnsmasq: read /dnsmasq.hosts//hosts.txt - 1 addresses
Run Code Online (Sandbox Code Playgroud)
我猜我-p
在启动容器时没有正确指定参数.有人可以告诉我其他docker容器应该查找DNS,或者我试图做的事实际上是不可能的吗?
今天,我的cURL开始向我显示此错误,Could not resolve: {local-domain.test} (domain name not found)
如果我尝试从外部链接获取某些信息,则一切正常,但是本地站点无法正常工作。
所以,这是我的代码
public function send($type, $url, $data)
{
$type = strtolower($type);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($type == 'post') {
$urlWithData = http_build_query($data);
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlWithData);
}
$result = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$out = new \stdClass();
$out->status = $status;
$out->body = json_decode($result, true);
return $out;
}
Run Code Online (Sandbox Code Playgroud)
如果我将该主机添加到我的/ etc / hosts /文件中,那么所有主机都将开始工作,但是我拥有大量的域,并且在更新PHP之前,我都可以正常工作。我正在使用dnsmasq作为动态主机解析工具。
作为一个整体解决方案,我想使用dnsmasq拆分dns在不同服务器之间进行解析.
即默认为dns服务器A,除非显式设置为每个主机(mac)的dns服务器B.
我想将我的网络分成dnsmasq标记的子网,这个例子说:
192.168.1.80-150 =绿色
192.168.1.40-50 =红色
我希望dhcp租约由-default-标记为绿色,除了一些特定的MAC,我想分发红色标签.我有这个部分成功运作(我相信),我明确地通过MAC设置它 - 但我想要的是一切 - 除非另有说明 - 默认为绿色.
然后我想说"对于所有绿色标签,给他们dns服务器A作为他们的解析器","对于所有红色标签,给他们dns服务器B作为他们的解析器".
这可能吗?
我有以下配置似乎不起作用:
--8<--
dhcp-range=set:green,192.168.1.80,192.168.1.150,infinite
dhcp-range=tag:red,192.168.1.40,192.168.1.50,infinite
dhcp-option=net:green,option:dns-server,8.8.8.8,8.8.4.4
dhcp-option=net:red,option:dns-server,192.168.1.11
dhcp-host=AA:BB:CC:DD:CC:BB,redhost1,192.168.1.41,infinite,net:red
dhcp-host=BB:CC:DD:AA:BB:00,greenhost1,192.168.1.81,infinite,net:green
dhcp-option=option:router,192.168.1.1
--8<--
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,但我根据我是否匹配了他们的MAC,为不同的主机分配了不同的IP地址,然后好像dns服务器没有正确分发.
我相信dns服务器没有发布,因为其中一个主机上的"cat /etc/resolv.conf"显示为127.0.0.1.
总结一下我的疑问:
非常感谢
dnsmasq ×10
dns ×6
docker ×3
curl ×2
php ×2
kubernetes ×1
laravel ×1
localhost ×1
networking ×1
nginx ×1
osx-yosemite ×1
resolver ×1
subdomain ×1
wildcard ×1