我有一个想法,在我的服务器上托管一个没有内置身份验证的 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
,或者使用该fib
nftables 规则,或者打开反向路径过滤 - 相反,您的所有访问控制措施都将集中在一个地方,以便于将来的审查或更新。
是的,您更新的示例将保护 Syncthing GUI,以便只能从 WireGuard 网络上的设备访问它。不过,在这种情况下,您主要依靠 Apache 来确保安全性,而不是 nftables——因此您需要小心任何可能覆盖 Apache 的客户端 IP 跟踪的东西(主要是mod_remoteip)。