目标

目标

VM = 虚拟机。WS
= 工作站 VM。GW
= 网关 VM。
虚拟化软件:Oracle VirtualBox。
主机/客户机操作系统:所有 Debian 12。
防火墙软件:nftables

目标

类似 Whonix 的设置。WS 位于内部适配器后面,GW 位于相同的内部适配器和 NAT 后面。WS 通过 GW 访问互联网。

为什么不只是 NAT?

NAT 允许连接到主机的环回接口,这是不可取的。

问题

设置防火墙规则。我希望 WS 只能通过 GW 转发其流量,但不能与其直接连接。

原因是我不明白为什么应该这样。GW 可能恰好为同一内部网络中的其他 VM 托管一些服务,而 WS 应该无法访问它们。

我所理解的

它与数据包的目的地有关。如果 WS 尝试直接连接到 GW,则数据包的最终目的地将是 GW 的 IP 地址,否则 daddr 将指向其他地方。

我还知道有诸如 nexthop 这样的东西,它大概是告诉数据包下一步应该发送到哪里的指针。

我不明白的是

如何设置遵守 nftables 规则。另外,我对整个网络工作原理的了解也很有限,是通过手册页和反复试验获得的。

答案1

enp0s3 = 内部适配器。enp0s8
= NAT 适配器。192.168.1.100
= GW 的 IP 地址。192.168.1.1
= WS 的 IP 地址。
以下设置属于 GW。WS 设置很简单。

/etc/network/interfaces:  

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto enp0s3
iface enp0s3 inet static
    address 192.168.1.100/24

auto enp0s8
iface enp0s8 inet dhcp
/etc/nftables.conf:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    set rfc1918 {
        type ipv4_addr; flags interval
        elements = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }
    }
    chain nat {
        type nat hook postrouting priority srcnat;
        oif "enp0s8" counter masquerade
    }
    chain input {
        type filter hook input priority filter; policy drop
        ct state established,related counter accept
        counter
    }
    chain forward {
        type filter hook forward priority filter; policy drop
        iif  "enp0s3" ip saddr 192.168.1.1 oif "enp0s8" \
          ip daddr != @rfc1918 counter accept
        iif "enp0s8" oif "enp0s3" ip daddr 192.168.1.1 counter accept
    }
    chain output {
        type filter hook output priority filter;
    }
}
/etc/sysctl.conf:

net.ipv4.ip_forward=1

以上所有方法似乎都有效。在我看来,现在问这个问题是可以避免的,但我认为如果将其存档在这里以供将来参考也无妨。

如果您发现防火墙设置或其他方面存在问题,请写下来以便完善。

相关内容