Linux 端口转发记录源 IP 地址

Linux 端口转发记录源 IP 地址

我正在设置一些 ICS 蜜罐用于研究,因此我需要能够记录我收到的流量的原始 IP 地址。

我自己在本地运行服务器,但使用 4G 连接,位于 CGNAT/Double NAT 后面。我已通过 Wiregurad VPN 隧道设置端口转发到 Linux VPS,以提供外部 IP 地址,以便我可以打开端口。

这种方法很有效,但是由于端口转发,蜜罐收到的所有流量都具有 VPS 的原始 IP 地址。据我所知,无法使用原始 IP 地址转发,因为返回流量路由会出现问题。

我的问题是,有什么好方法可以记录原始 IP,以便将其与蜜罐上收到的流量相匹配?我计划捕获蜜罐上的所有流量,是否可以在 VPS 上也捕获并以某种方式关联两者?

谢谢,戴夫

使用下面的答案,下面是我为实现此目标所采取的步骤:

1:删除上面的MASQUERADE行,以阻止源IP地址被修改。

2:在Honeypot端添加基于策略的路由:

ip -4 route add default dev wg0 table 4242
ip -4 rule add pref 500 from x.x.x.2 lookup 4242

3:更改 Honeypot 端 Wireguard 配置上的 AllowedIPs,以使所有外部 IP 地址的流量通过隧道返回。我使用这个网站来计算正确的配置https://www.procustodibus.com/blog/2021/03/wireguard-allowedips-calculator/

要注意的一个陷阱是确保排除 VPS 的 IP 地址,否则 wireguard 将尝试通过尚不存在的隧道引导隧道设置流量,这与你想象的一样好!

编辑:我添加了一个图表来帮助说明情况。VPS 和 Honeypot 主机都是通过隧道直接连接的 Ubuntu 机器。一旦到达 Honeypot,我将如何使用基于策略的路由来保留源 IP 地址 zzzz。假设 VPS 上的 yyyy:44444 被转发到 xxx2:33333。

网络图

当前用于转发的 IPTables 规则(在 VPS 上):

iptables -I FORWARD -d x.x.x.2 -p tcp --dport 33333 -j ACCEPT    
iptables -I FORWARD -s x.x.x.2 -p tcp --sport 33333 -j ACCEPT    
iptables -t nat -I PREROUTING -p tcp --dport 44444 -j DNAT --to-destination x.x.x.2:33333   
iptables -t nat -I POSTROUTINGq -d x.x.x.2 -o wg0 -j MASQUERADE

答案1

最好不是首先执行地址转换——通常 SNAT 是解决“回复路由”问题最简单的方法,但不一定是仅有的解决方案。即使比在服务器上设置 SNAT 规则花费更多时间,但正确配置路由仍然是可行的,而且效果更好。

但如果翻译不可避免,那么最好在地址翻译发生的地方记录原始地址:

使用基于 Linux 的网关,所有 NAT 状态(入站和出站)——事实上,所有每个连接的状态,即使 NAT不是正在使用 – 在“conntrack”子系统中可用,例如,您可以使用实时监控新连接conntrack -E,或运行ulogd2如果您希望将所有内容记录在磁盘(或数据库)上。

inpflow_NFCT具体来说,您需要使用“通过 nf_conntrack_netlink 进行基于状态流的 [日志记录]”插件来设置 ulogd2 (不是通过 NFLOG 记录每个数据包的日志)。例如,如果您想要一个纯文本可 grep 日志文件:

plugin="/usr/lib/x86_64-linux-gnu/ulogd/ulogd_inpflow_NFCT.so"
(other plugins...)
plugin="/usr/lib/x86_64-linux-gnu/ulogd/ulogd_output_LOGEMU.so"
stack=ct1:NFCT,ip2str1:IP2STR,print1:PRINTFLOW,emu2:LOGEMU

[emu2]
file="/var/log/ulog/ct.log"

使用 conntrack 您不需要关联任何东西,因为相同的状态条目将同时具有原始和转换后的(“回复”)地址/端口,这对于有状态 NAT 的工作来说是必要的。

net.netfilter.nf_conntrack_acct(如果您想要记录传输的数据量,可能还需要在 sysctl 中启用该功能。)

据我所知,无法使用原始 IP 地址转发它,因为返回流量路由会出现问题。

这在一定程度上是正确的——多宿主总是存在问题,但这些问题取决于您的内部网关(或者内部服务器本身)上运行的操作系统。

如果您的本地网关(本地 WireGuard 端点)也是基于 Linux 的,则通常使用“策略路由”来实现将返回流量正确路由到不同的上游。例如,在最简单的情况下(隧道端点也是目标主机),策略路由可以根据本地 IP 地址选择路由。例如:

  1. Table=在内部主机上,创建一个新的路由表,将所有内容通过 wg0 进行路由(如果您使用 wg-quick,则可以使用此方法实现):

    ip -4 route add default dev wg0 table 4242
    ip -6 route add default dev wg0 table 4242
    
  2. 为所有即将从 wg0 IP 地址发送的回复创建一个选择此表的策略规则:

    ip -4 rule add pref 500 from x.x.x.2 lookup 4242
    ip -6 rule add pref 500 from fdXX:XX::2 lookup 4242
    

当您拥有多个主机并且其中一个单独的网关充当 WireGuard 端点时,网关可以使用数据包标记(再次依靠 conntrack 来关联传入和传出的数据包)来选择多个路由表之一——通过 WireGuard 到达的数据包会导致流在 conntrack 中被标记,然后根据标记,从 LAN 到达的数据包会通过 WireGuard 路由回来。

(使用 pf 的基于 BSD 的网关具有类似的功能;据我所知,与 Linux 相比,使用 pf 实现这种路由甚至更容易。)

相关内容