更新,一个真实的例子

更新,一个真实的例子

我有一个想法,在我的服务器上托管一个没有内置身份验证的 Web 应用程序。并仅通过 nftables、WireGuard 和反向路径转发来保护它。Web 服务器将监听服务器的 WireGuard 接口地址,本例中为 10.0.0.1。

原理:

  • WireGuard 使用公钥加密来验证用户身份,类似于 SSH 公钥认证的行为
  • fib daddr . iif type != local、反向路径转发和 wg0 接口地址 10.0.0.1/24 可以限制只有 wg0 的对等体可以访问 10.0.0.1
  • Web 服务器将仅监听 10.0.0.1

这安全吗?是否存在任何潜在漏洞?欢迎提出任何意见。

系统控制

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

服务器的 WireGuard 接口

#wg0
[Interface]
Address = 10.0.0.1/24

# My trusted device
[Peer]
PublicKey = $server_publickey
AllowedIPs = 10.0.0.2/32

nftables.conf

table ip filter {
    chain PREROUTING {
        type filter hook prerouting priority filter; policy accept;
        fib daddr . iif type != local drop
    }
    
}

更新,一个真实的例子

不使用密码保护服务器上的 Syncthing GUI

  • Syncthing GUI 正在监听 127.0.0.1:8384
  • 用户设备将通过 Apache 反向代理访问 GUI
  • 由于该服务器正在托管其他服务,因此 Apache 反向代理向 Internet 开放。
  • http 请求通过 WireGuard 到达 VPS 路由器。
<VirtualHost *:443>
    ServerName syncthing.$DOMAIN
    SSLEngine on
    ProxyPass / http://localhost:8384/
    ProxyPassReverse / http://localhost:8384/

    <Location "/">
        Require ip 10.1.0
    </Location>
</VirtualHost>
chain STRONG {
    type filter hook input priority raw; policy accept;
    ip saddr 10.1.0.0/24 iifname != { "lo", "wg0" } drop
}
[Interface]
Address = $home_server_wg_ip_address/30
PrivateKey = $home_server_privatekey
Table = $VPS_INTERFACE_TABLE
PreUp = ip rule add from $home_server_wg_ip_address/32 lookup $VPS_INTERFACE_TABLE priority $VPS_INTERFACE_TABLE_PRIORITY
PostDown = ip rule del from $home_server_wg_ip_address/32 lookup $VPS_INTERFACE_TABLE priority $VPS_INTERFACE_TABLE_PRIORITY

[Peer]
PublicKey = $vps_publickey
Endpoint = $vps_ip_address:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

答案1

是的,这将保护 Web 应用程序的安全,以便只能通过 WireGuard 隧道进行远程访问(即10.0.0.2,在您的示例中,只能从您的“受信任的设备”访问)。

但通常最好设置 nftables 规则以默认阻止对服务器上运行的所有网络服务的访问,并且明确允许仅授权的例外:例如:

table inet filter {
    chain input {
        # drop packets by default
        type filter hook input priority 0; policy drop;

        # accept loopback packets
        iif "lo" accept
        # accept icmp/icmpv6 packets
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept
        # accept already-established connections
        ct state established,related accept

        # accept new WireGuard connections
        udp dport 51820 accept
        # accept new connections to web app from WireGuard network
        tcp dport 80 iifname "wg0" accept
        # accept new SSH connections from LAN
        tcp dport 22 ip saddr 192.168.1.0/24 accept
        # ...
    }
}

如果您这样做了,您就不需要限制您的 Web 应用程序监听10.0.0.1,或者使用该fibnftables 规则,或者打开反向路径过滤 - 相反,您的所有访问控制措施都将集中在一个地方,以便于将来的审查或更新。


是的,您更新的示例将保护 Syncthing GUI,以便只能从 WireGuard 网络上的设备访问它。不过,在这种情况下,您主要依靠 Apache 来确保安全性,而不是 nftables——因此您需要小心任何可能覆盖 Apache 的客户端 IP 跟踪的东西(主要是mod_remoteip)。

相关内容