Iptables 根据目的地的 DNS 名称进行预路由?

Iptables 根据目的地的 DNS 名称进行预路由?

我有一个关于 iptable 预路由的问题。我对网络/路由/iptables 不太熟悉,所以我希望这不是一个愚蠢的问题。因此我请求你们的理解和宽容。

我的做法是:我使用 LXC 将应用程序分离到容器中。为了访问容器中的服务(可能是 apache2),我必须像这样进行预路由:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 20080 -j DNAT --to <container-ip>:80

到目前为止一切顺利,运行正常。

假设主机系统还运行 apache2(端口 80)。它分配了 1 个 NIC 和 2 个 DNS 名称:DNS1(HostRecord)和DNS2(别名为DNS1)我想要做的是不使用 dport 而是使用 DNS-Name 来 PREROUTE,这样:

http://DNS1:80 #ends up at the host apache2
http://DNS2:80 #ends up at lxc-container's apache2 (at the the same host)

可以吗?如果可以,如何配置 iptables?

答案1

TCP/IP 数据包被路由到 IP 地址和网络端口,而不是主机名。

因此,iptables 数据包过滤器也适用于 ip 地址、网络端口和协议,但不适用于 DNS/主机名。


您的选择是:

  1. 配置桥接,以便您的容器获得公共 IP 地址而不是仅限于主机的私有范围,并相应地设置 DNS。
  2. 使用 apache 反向代理功能(或类似功能),它在 DNS 主机名级别工作并在应用程序级别路由您的 HTTP 请求:

例如:

 NameVirtualHost *:80
 <VirtualHost *:80>
   # The DNS1 site is hosted locally
   ServerName DNS1
   DocumentRoot /var/www./...
 </VirtualHost>

 <VirtualHost *:80>
   ServerName DNS2
   # Forward all requests to container:
   Proxypass / http://<container-ip>
   ProxypassReverse / http://<container-ip>
 </VirtualHost>

相关内容