IPTABLES nat 使用 CSF 维护源 IP 地址

IPTABLES nat 使用 CSF 维护源 IP 地址

我们已经在虚拟化(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.10022

  • /sbin/iptablesiptables需要完整的可执行文件。
  • --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/iptablesiptables需要完整的可执行文件。
  • --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/iptablesiptables需要完整的可执行文件。
  • --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 分别代表源和目标网络转换,因此一旦数据包通过网络地址转换规则,源/目标地址就会被永久“更改”。您无法在目的地检索它们。

相关内容