Traefik转发到主机并覆盖IP

时间:2018-03-25 13:33:48

标签: traefik

前言:我感谢这不理想,我正在迁移远离旧的基于Apache的服务器,现在需要在那里留下一些网站。

我想让Traefik将某些请求转发给其他服务器,请考虑以下配置:

[file]

[frontends.attie]
backend = "attie"

[frontends.attie.routes._]
rule = "HostRegexp: {host:^(www\\.)?attie.co.uk}"

[backends.attie.servers._]
url = "http://attie.co.uk:80"

在外部,DNS指向此服务器上的attie.co.uk。然后,Traefik必须使用Host: attie.co.uk标题将请求转发到旧服务器。

不幸的是,DNS将attie.co.uk指向服务器,我们最终会循环(当然)。

我已将条目添加到容器的/etc/hosts,但这不起作用 - 我们最终仍然处于循环中(see the log in this gist),大概是因为Traefik正在进行名称解析并忽略hosts文件。

我尝试使用customRequestHeaders无效 - 它出现在日志中的配置blob中,但不起作用。

[frontends.attie.headers.customRequestHeaders]
Host = "attie.co.uk"

[backends.attie.servers._]
url = "http://10.42.0.4:80"

请注意this页面上的警告:

  

如果自定义标题名称与请求或响应的一个标题名称相同,则将替换它。

我有什么方法可以做其中一个吗?

  • 配置名称解析以考虑/etc/hosts
  • 通过在url
  • 旁边提供IP,强制后端连接到主机
  • 提供与网址
  • 中的IP配对的Host:标头

我对documentation进行了相当广泛的审视,但可能错过了一些内容。

PS:我原本希望这个问题更适合ServerFault或SuperUser,但它们没有标签,文档特别提到了StackOverflow。

2 个答案:

答案 0 :(得分:1)

如果您使用的是官方traefik图像,则此图像是从头开始构建的。最值得注意的是,没有/etc/nsswitch.conf文件存在。在这种情况下,golang implemented the same fallback mechanism as glibc(将忽略/etc/hosts)-正是您正在观察的问题。

配置中的重要一行是,它告诉解析器首先查看本地/etc/hosts文件,然后回退到DNS查询:

 hosts: files dns

通过在容器中运行此文件而创建的最小nsswitch.conf文件可以做到:

echo "hosts: files dns" > /etc/nsswitch.conf

但是,考虑到任何普通主机系统上都存在正确的nsswitch.conf文件,也许最简单的解决方案是在docker run中添加额外的装载。这是traefik docker hub repo的改编示例:

docker run -d -p 8080:8080 -p 80:80 \
-v $PWD/traefik.toml:/etc/traefik/traefik.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/nsswitch.conf:/etc/nsswitch.conf:ro \
traefik

如果使用docker compose或其他工具,我敢肯定您可以对此进行调整。完成后,内部的/etc/hosts文件应该可以正常工作。 (您可能已通过--add-host docker run标志进行了修改)

答案 1 :(得分:0)

永久解决此问题的另一种方法是创建自己的Dockerfile

FROM traefik:v2.1
## Fix nssswitch not looking at hosts file (See https://github.com/containous/traefik/pull/6012)
RUN echo "hosts: files dns" > /etc/nsswitch.conf

我尝试在git上submit the change,但是官方图像似乎隐藏在某个地方。