我们已经在虚拟化(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 地址,而不是原始 IP 地址。”所以这是一个标准功能。
CSF 支持 postrules.sh 文件,我们可以在其中包含手动 NAT 规则,但我们不确定是否可以使用 IPTABLES SNAT 和/或 DNAT 将“真实”源 IP 传递到 NAT IP 的目的地。
答案1
问题:
我们不确定是否可以使用 IPTABLES SNAT 和/或 DNAT 将“真实”源 IP 传递到目的地。
回答:
是的,这是可能的,如果您使用 CSF,请按照以下方法操作。不要依赖 CSF 的重定向功能,即在 中有类似于以下内容的行/etc/csf/csf.redirect
:
XXX.XXX.XXX.184|2222|10.0.0.100|22|tcp
相反,输入以下iptables
命令/etc/csf/csfpost.sh
:
/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j ACCEPT
/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j LOCALINPUT
/sbin/iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.100:22
测试:
$ ssh xxx.xxx.xxx.184 -p 2222 'netstat -tn'
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 72 10.0.0.100:22 xxx.xxx.xxx.199:55812 ESTABLISHED
解释:
/sbin/iptables --table nat --append PREROUTING --in-interface vmbr0 --protocol tcp --match tcp --dport 2222 --jump DNAT --to-destination 10.0.0.100:22
此行将端口 上外部接口传入的 TCP 流量重定向到端口 上的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
。
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump LOCALINPUT
这一行允许我们不跳过所有 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 --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump ACCEPT
该线路将所有剩余转发的流量传递到内部主机。
/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
。
答案2
您在目的地看到“真实”源 IP 的唯一方法是避免对其进行网络地址转换或伪装。请记住,SNAT 和 DNAT 分别代表源和目标网络转换,因此一旦数据包通过网络地址转换规则,源/目标地址就会被永久“更改”。您无法在目的地检索它们。