Wireguard 限制对本地网络中的服务和机器的访问

Wireguard 限制对本地网络中的服务和机器的访问

我在本地网络中运行 Wireguard “服务器”,我可以通过静态公共 IP 远程访问该服务器。我希望能够将对 Wireguard 远程对等点的访问限制在我局域网中的服务/机器上,我在该局域网中托管其他服务器。

示例:安装了 Wireguard 的服务器 1(192.168.1.23 | 10.0.0.1)+ 同一台机器上的 Nextcloud + Jellyfin 安装了 Photoprism 的服务器 2(192.168.1.62)

远程对等体 1 (10.0.0.2 | 动态 ip) 远程对等体 2 (10.0.0.3 | 动态 ip)

我想要:

1-允许 peer1(10.0.0.2)访问服务器 1 Nextcloud + Jellyfin 并允许服务器 2 访问 Photoprism。

2- 允许 Peer2 (10.0.0.3) 仅访问服务器 1 Nextcloud,但不允许 Jellyfin 访问,并阻止访问服务器 2

现在我可以从所有对等点访问我的局域网中的所有机器。

Iptables 规则:

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp0s7 -j MASQUERADE; iptables -t nat -A POSTROUTING -o wg0
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp0s7 -j MASQUERADE; iptables -t nat -D POSTROUTING -o wg0

我关注了教程, 从贾斯汀·路德维希因为站点到点拓扑与我的非常相似。所以我尝试使用以下规则复制 Iptables 规则:

# masquerading
PreUp = iptables -t mangle -A PREROUTING -i wg0 -j MARK --set-mark 0x200
PreUp = iptables -t nat -A POSTROUTING ! -o wg0 -m mark --mark 0x200 -j MASQUERADE
PostDown = iptables -t mangle -D PREROUTING -i wg0 -j MARK --set-mark 0x200
PostDown = iptables -t nat -D POSTROUTING ! -o wg0 -m mark --mark 0x200 -j MASQUERADE

# wireguard ingress
PreUp = iptables -I INPUT -p udp --dport 2332 -j ACCEPT
PostDown = iptables -D INPUT -p udp --dport 2332 -j ACCEPT

# site firewall
PreUp = iptables -N wg0-filter
PreUp = iptables -N to-photoprism
PreUp = iptables -N to-jellyfin
PreUp = iptables -N to-nextcloud

PreUp = iptables -I INPUT   -i wg0 -j wg0-filter
PreUp = iptables -I FORWARD -i wg0 -j wg0-filter
PreUp = iptables -I FORWARD -o wg0 -j wg0-filter
PreUp = iptables -I OUTPUT  -o wg0 -j wg0-filter

PreUp = iptables -A wg0-filter -m state --state ESTABLISHED,RELATED -j ACCEPT
PreUp = iptables -A wg0-filter -d 192.168.1.63  -p tcp --dport   2342 -j to-photoprism
PreUp = iptables -A wg0-filter -d 192.168.1.23  -p tcp --dport   8096 -j to-jellyfin
PreUp = iptables -A wg0-filter -d 192.168.1.23  -p tcp --dport     80 -j to-nextcloud
PreUp = iptables -A wg0-filter -j REJECT

PreUp = iptables -A to-photoprism     -s 10.0.0.2    -j ACCEPT

PreUp = iptables -A to-jellyfin       -s 10.0.0.2    -j ACCEPT
PreUp = iptables -A to-jellyfin       -s 10.0.0.3    -j ACCEPT

PreUp = iptables -A to-nextcloud      -s 10.0.0.2    -j ACCEPT
PreUp = iptables -A to-nextcloud      -s 10.0.0.3    -j ACCEPT

PostDown = iptables -D INPUT   -i wg0 -j wg0-filter
PostDown = iptables -D FORWARD -i wg0 -j wg0-filter
PostDown = iptables -D FORWARD -o wg0 -j wg0-filter
PostDown = iptables -D OUTPUT  -o wg0 -j wg0-filter

PostDown = iptables -F to-photoprism
PostDown = iptables -F to-jellyfin
PostDown = iptables -F to-nextcloud

PostDown = iptables -X to-photoprism
PostDown = iptables -X to-jellyfin
PostDown = iptables -X to-nextcloud

这不起作用,对等点 1 和对等点 2 都可以访问服务器 1,但不能访问服务器 2。

我不太清楚要实现这个目标我需要做哪些改变,如果有人能参与进来我会很高兴。

提前致谢

答案1

总体而言,您的 iptables 规则对我来说看起来不错;尽管:

  1. 在问题描述中,您提到服务器 2 的 IP 地址为192.168.1.62;但在 iptables 规则中,您似乎正在使用192.168.1.63它:

     iptables -A wg0-filter -d 192.168.1.63  -p tcp --dport   2342 -j to-photoprism
    

    这是哪里的打字错误?

  2. 在描述中,您提到 Peer 2 ( 10.0.0.3) 不应有权访问 Jellyfin;但在 iptables 规则中,您使用以下行授予其访问权限:

     iptables -A to-jellyfin       -s 10.0.0.3    -j ACCEPT
    

    也许您的意思是删除这条规则?

  3. 我没有看到任何PostDown拆除wg0-filter链条的命令,就像您对其他自定义链条一样;请确保将它们包括在内:

     PostDown = iptables -F wg0-filter
     PostDown = iptables -X wg0-filter
    

    如果没有这些拆卸命令,如果您进行更改并重新启动,wg0-chain最终可能会使用以前尝试的旧规则,而不是较新的更新。(请确保您遵循进行配置更改文章中的建议是,在进行配置更改并重新启动之前关闭 WireGuard 界面——sudo iptables-save在界面关闭时运行以仔细检查是否有任何尚未清理的旧规则或链。)

相关内容