IPTables DNAT WAN 接口到托管虚拟机失败,但 DNAT 到 WAN IP 成功

IPTables DNAT WAN 接口到托管虚拟机失败,但 DNAT 到 WAN IP 成功

提前感谢大家!

情况如下:

1. domain0 有两个 NIC(LAN=enp1s0f0,WAN=enp1s0f1)
2. domain0 的 vm0 有 IP=10.4.4.10
3. ip_forward=1 并且所有接口转发=1
4. PREROUTING WAN(来自 ISP 的 dhcp)-->interface<-- DNAT 到 10.4.4.10
5. PREROUTING WAN(来自 ISP 的 dhcp)-->IP<-- DNAT 到 10.4.4.10

问题是 !LAN! 到 domain.com 的 HTTP 流量因上述 (4) 而失败。
而 !LAN! 到 domain.com 的 HTTP 流量因上述 (5) 而成功。

最好:

$ {IPTABLES} -t nat -A PREROUTING $ {STATE_NEW_TCP} -p tcp -i $ {if_WAN} --dport 80 -j DNAT --to-destination $ {ip_VM0}:80

$ {IPTABLES} -t nat -A PREROUTING $ {STATE_NEW_UDP} -p udp -i $ {if_WAN} --dport 80 -j DNAT --to-destination $ {ip_VM0}:80



但这仅有效:

我的 IP=22.22.222.22/24
$ {IPTABLES} -t nat -A PREROUTING $ {STATE_NEW_TCP} -p tcp -d $ {MY_IP} --dport 80 -j DNAT --to-destination $ {ip_VM0}:80 $ {IPTABLES} -t nat -A PREROUTING $ {STATE_NEW_UDP} -p udp -d $ {MY_IP} --dport 80 -j DNAT --to-destination $ {ip_VM0}:80


问:将 !LAN 流量!传输到 domain.com(托管在 VM0 上的网站)的正确方法是什么?
目前,iptables 正在从(ISP 分配的 dhcp)WAN 接口到虚拟机进行 PREROUTING DNAT 转发。
任何帮助表示感谢。:)

注意:使用 CentOS 7 (1611)

((结果已过滤)) = 仅提供与问题相关的信息。

链输入(策略丢弃 2 个数据包,120 字节)((结果已过滤))
 pkts 字节数 目标 协议 选择加入 退出 源 目标
    0 0 接受 tcp -- enp1s0f1 * 0.0.0.0/0 0.0.0.0/0 状态 新 tcp dpt:80
    0 0 接受 udp -- enp1s0f1 * 0.0.0.0/0 0.0.0.0/0 状态 新 udp dpt:80
    0 0 接受 tcp -- * * 0.0.0.0/0 10.4.4.10 状态新 tcp dpt:80
    0 0 接受 udp -- * * 0.0.0.0/0 10.4.4.10 状态新 udp dpt:80

链转发 (策略丢弃 0 个数据包,0 个字节) ((结果已过滤))
 pkts 字节数 目标 协议 选择加入 退出 源 目标
    0 0 接受 tcp -- enp1s0f1 * 0.0.0.0/0 0.0.0.0/0 状态 新 tcp dpt:80
    0 0 接受 udp -- enp1s0f1 * 0.0.0.0/0 0.0.0.0/0 状态 新 udp dpt:80
    0 0 接受 tcp -- * * 0.0.0.0/0 10.4.4.10 状态新 tcp dpt:80
    0 0 接受 udp -- * * 0.0.0.0/0 10.4.4.10 状态新 udp dpt:80

链 PREROUTING(策略接受 7 个数据包,689 字节)((结果已过滤))
 pkts 字节数 目标 协议 选择加入 退出 源 目标
    0 0 DNAT tcp -- enp1s0f1 * 0.0.0.0/0 0.0.0.0/0 状态 NEW tcp dpt:80 至:10.4.4.10:80
    0 0 DNAT udp -- enp1s0f1 * 0.0.0.0/0 0.0.0.0/0 状态 NEW udp dpt:80 至:10.4.4.10:80
    1 60 DNAT tcp -- * * 0.0.0.0/0 22.22.222.22 状态 NEW tcp dpt:80 至:10.4.4.10:80
    0 0 DNAT udp -- * * 0.0.0.0/0 22.22.222.22 状态 NEW udp dpt:80 至:10.4.4.10:80

链 POSTROUTING(策略接受 22181 个数据包,1435K 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标
 338K 73M MASQUERADE 全部 -- * enp1s0f1 10.2.2.0/24 0.0.0.0/0
16549 1086K MASQUERADE 全部 -- * enp1s0f1 10.4.4.0/24 0.0.0.0/0

domain0$ ip a ((结果已过滤))
2:enp1s0f0:mtu 1500 qdisc mq 状态UP qlen 1000
    链接/以太 XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 10.2.2.1/24 brd 10.2.2.255 范围全局 enp1s0f0
       valid_lft 永远 preferred_lft 永远
3:enp1s0f1:mtu 1500 qdisc mq 状态UP qlen 1000
    链接/以太 XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 22.22.222.22/24 brd 255.255.255.255 范围全局动态 enp1s0f1
       valid_lft 87813秒 preferred_lft 87813秒
4:xenbr0:mtu 1500 qdisc 无队列状态 UP qlen 1000
    链路/以太 fe:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff:ff
    inet 10.4.4.1/24 brd 10.4.4.255 范围全局 xenbr0
       valid_lft 永远 preferred_lft 永远
9:vm0-emu:mtu 1500 qdisc pfifo_fast master xenbr0 状态未知 qlen 1000
    链路/以太 fe:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff:ff
10:vm0:mtu 1500 qdisc mq master xenbr0 状态 UP qlen 32
    链路/以太 fe:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff:ff

domain0$ brctl 显示
桥名称 桥 ID STP 启用接口
xenbr0 8000.feffffffffff 没有 vm0
                                                        vm0-emu

domain0$ cat /proc/sys/net/ipv4/ip_forward
1

domain0$ cat /proc/sys/net/ipv4/conf/*/forwarding ((结果已过滤))
1
1
1
1
1
1
1

domain0$ ls /proc/sys/net/ipv4/conf/-l ((结果已过滤))
dr-xr-xr-x. 1 root root 0 5月 2 15:31 全部
dr-xr-xr-x. 1 root root 0 5月 2 15:31 default
dr-xr-xr-x. 1 root root 0 5月 2 18:08 vm0
dr-xr-xr-x. 1 root root 0 5月 2 18:08 vm0-emu
dr-xr-xr-x. 1 root root 0 5月 2 15:31 enp1s0f0
dr-xr-xr-x. 1 root root 0 5月 2 15:31 enp1s0f1
dr-xr-xr-x. 1 root root 0 5月 2 15:31 xenbr0

domain0$ uname -a ((结果已过滤))
Linux 主机名 4.9.13-22.el7.x86_64 #1 SMP 2017 年 2 月 26 日星期日 22:15:59 UTC x86_64 x86_64 x86_64 GNU/Linux

vm0$ip a
2:eth0:mtu 1500 qdisc pfifo_fast 状态UP qlen 1000
    链接/以太 xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.4.4.10/24 brd 10.4.4.255 范围全局 eth0

答案1

这是预期的行为。

“-i ${if_WAN}” 仅匹配从“WAN”接口进入的数据包。来自 LAN 主机的数据包不会从该接口进入,因此它们永远不会匹配规则。

不幸的是,我认为 iptables 无法匹配“发往 ${if_WAN} 的 ip 地址的数据包”,因此您只能在 iptables 规则中对您的 WAN IP 进行硬编码。

答案2

我在配置中没有看到任何 MASQUERADE 条目iptables。根据您提供的信息,我假设您已enp1s0f1为 LAN 启用了 MASQUERADE,但尚未为 LAN 网络启用它enp1s0f0,这就是为什么您的 NAT 不适用于 WAN 也不适用于 LAN。

相关内容