一段时间以来,我们一直在虚拟化 (OpenVZ) 环境中成功使用 CSF,结合 venet 和桥接接口,因此我们可以使用公共 IP + 本地寻址虚拟系统。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.100 0.0.0.0 255.255.255.255 UH 0 0 0 venet0
xxx.xxx.xxx.24 0.0.0.0 255.255.255.255 UH 0 0 0 venet0
xxx.xxx.xxx.0 0.0.0.0 255.255.255.0 U 0 0 0 vmbr0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vmbr10
0.0.0.0 xxx.xxx.xxx.254 0.0.0.0 UG 0 0 0 vmbr0
我们通过 iptables 规则路由“本地”ips 的流量:
iptables -t nat -A POSTROUTING -s "10.0.0.0/24" -o vmbr0 -j MASQUERADE
/proc/sys/net/ipv4/ip_forward 值显然设置为 1
主机和 venet 联网机器运行它们自己的 CSF 安装,该安装为此设置创建所有防火墙规则,其中包括创建“重定向”到内部 IP 的可能性。
有了这个,我们可以打开主机 IP 上的特定端口,这些端口由本地网络上的本地内部虚拟机提供服务。CSF 创建的一长串防火墙规则包括:
Chain PREROUTING (policy ACCEPT 53M packets, 15G bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DNAT tcp -- !lo * 0.0.0.0/0 XXX.XXX.XXX.184 tcp dpt:5100 to:10.0.0.100:5000
Chain POSTROUTING (policy ACCEPT 9700K packets, 615M bytes)
num pkts bytes target prot opt in out source destination
3 0 0 SNAT tcp -- * !lo 0.0.0.0/0 10.0.0.100 to:XXX.XXX.XXX.184
8 10 600 MASQUERADE all -- * vmbr0 10.0.0.0/24 0.0.0.0/0
CSF 防火墙上的重定向功能有效,但报告的 IP 是主机 IP,而不是原始 IP,因此我们不能用目标虚拟系统上的另一个 CSF 实例(或简单的防火墙规则)来限制它。我们知道,在 PREROUTING 上,它们也不能限制在主机 CSF 上。
CSF 自述文件实际上指出“所有到另一个 IP 地址的重定向将始终出现在带有该服务器源的目标服务器上,而不是原始 IP 地址。” 所以这是一个标准功能。
CSF 支持一个 postrules.sh 文件,我们可以在其中手动包含 NAT 规则,但我们不确定是否可以使用 IPTABLES SNAT 和/或 DNAT 将“真实”源 IP 传递到 NAT IP 的目的地。
您提到的在目的地看到“真实”源 IP 的唯一方法是避免 Natting 或 Masquerading 它。请记住,SNAT 和 DNAT 分别代表源和目标网络转换,因此一旦数据包通过 Natting 规则,源/目标地址就会永久“更改”。您无法在目的地取回它们。
问题:
回答:
是的,这是可能的,如果您使用的是 CSF,这里是如何做到的。不要依赖 CSF 的重定向功能,即有类似于以下内容的行
/etc/csf/csf.redirect
:相反,将以下
iptables
命令放入/etc/csf/csfpost.sh
:测试:
解释:
此行将来自 port 上外部接口的 TCP 流量重定向到 port上
2222
的内部地址。10.0.0.100
22
/sbin/iptables
需要完整的iptables
可执行文件。--table nat
在 nat(网络地址转换)表上工作。--append PREROUTING
PREROUTING
在链中所有现有规则之后附加此规则。--in-interface vmbr0
捕获vmbr0
接口上的所有流量。--protocol tcp
只捕获 TCP 流量。--match tcp
使用 TCP 模块。--dport 2222
只捕获指向端口的流量2222
。--jump DNAT
执行目标网络地址转换。--to-destination 10.0.0.100:22
将目标地址更改为10.0.0.100
,将目标端口更改为22
。这一行允许不跳过所有 CSF 的过滤只是因为我们正在重定向。
/sbin/iptables
需要完整的iptables
可执行文件。--insert FORWARD
FORWARD
在链中现有规则之前插入此规则。这是重定向数据包的去向,而不是例如INPUT
链。--in-interface vmbr0
匹配进入vmbr0
接口的流量。--out-interface vmbr10
匹配从vmbr0
接口流出的流量作为重定向的结果。--destination 10.0.0.0/24
仅匹配发往(重定向到)内部网络的流量。--jump LOCALINPUT
通过LOCALINPUT
链。这是 CSF 执行其众所周知的所有良好过滤的地方,防止被禁止和列入黑名单的 IP 到达系统。有了这个规则,我们将 CSF 的过滤扩展到内部网络上的所有主机(而不是仅将流量发往运行 CSF 的主机)。此行将所有剩余的转发流量传递给内部主机。
/sbin/iptables
需要完整的iptables
可执行文件。--insert FORWARD
FORWARD
在链中现有规则之前插入此规则。在链中执行所有归档后,将评估此规则LOCALINPUT
。--in-interface vmbr0
匹配进入vmbr0
接口的流量。--out-interface vmbr10
匹配从vmbr0
接口流出的流量作为重定向的结果。--destination 10.0.0.0/24
仅匹配发往(重定向到)内部网络的流量。--jump ACCEPT
在 CSF 执行了所有过滤(在LOCALINPUT
链中)之后,我们希望对剩余的数据包进行ACCEPT
编辑。