我有一个关于 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/主机名。
您的选择是:
- 配置桥接,以便您的容器获得公共 IP 地址而不是仅限于主机的私有范围,并相应地设置 DNS。
- 使用 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>