提前感谢大家!
情况如下:
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。