我有一个带有两个接口 lo 和 eth0 的 Linux 系统,我有一些 iptables 规则会阻止一些 tcp 端口。
是否可以通过实施探测服务来扫描我自己的端口来测试我自己的防火墙规则?这个想法是对我的外部接口 eth0 进行端口扫描,但在内部进行。
我已经用原始套接字在 C++ 中做了一些基本的实现,但最终数据包总是流向 lo 接口,我在 eth0 上看不到任何东西。
似乎内核正在执行快捷方式,因为目标等于源地址,对这个问题有什么想法吗?
答案1
您可以使用网络 名称空间,并使用一对将其链接到您的系统韦斯接口。这样,您将真正拥有两个网络堆栈:主机的和附加网络命名空间的。这将非常便宜(比虚拟机要多得多,只有网络是分离的)创建一个要扫描的主机。管理这个的最简单的命令是ip netns
(其设计目的是通过安装对网络名称空间的引用来保持网络名称空间的运行,即使没有进程正在使用它们):
ip netns add scanner
ip link add name veth0 type veth peer netns scanner name veth0
ip address add 192.0.2.2/24 dev veth0
ip -n scanner address add 192.0.2.3/24 dev veth0
ip link set veth0 up
ip -n scanner link set lo up #not really needed, but can avoid a few surprising results
ip -n scanner link set veth0 up
ip netns exec scanner /path/to/my/probing_service ...
现在可以从192.0.2.3扫描192.0.2.2,这不会使用罗。当然,这一切都取决于您的防火墙规则(您必须调整 IP、接口名称、两者或一些其他内容)。