我使用 WireGuard VPM 通过外部入口节点反向连接到我的家庭服务器。在该入口节点上,我尝试使用 ufw 添加防火墙规则。其目的是仅允许路由到一个且只有一个特定 IP(10.0.0.6)。
因此基本设置是:
10.0.0.1 entry node (publicly available, responsible for routing packets inside the VPN)
10.0.0.6 home server (should be reachable for any machine in the VPN)
10.0.0.13 any other peer (should not be reachable for other peers, therefor the ufw rule)
通过入口节点路由数据包工作正常,但防火墙规则不会拒绝其他目标 IP。
我的设置如下:
user@host:~$ sudo ufw route allow in on wg0 out on wg0 to 10.0.0.6/32
Rule added
->
user@host:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
...
[firewall rules]
...
10.0.0.6 on wg0 ALLOW FWD Anywhere on wg0
(注意:我删除了其他规则。它们与路由无关,只有 ALLOW IN / LIMIT IN 规则)
上面的输出清楚地显示了Default: .. deny (routed)
,而下面的输出声称所有链中的“接受”策略。
user@host:~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
令人惊讶的是,以下命令显示不同:
user@host:~$ sudo iptables -L
Chain INPUT (policy DROP)
...
Chain FORWARD (policy DROP)
target prot opt source destination
ufw-before-logging-forward all -- anywhere anywhere
ufw-before-forward all -- anywhere anywhere
ufw-after-forward all -- anywhere anywhere
ufw-after-logging-forward all -- anywhere anywhere
ufw-reject-forward all -- anywhere anywhere
ufw-track-forward all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
...
askubuntu 上这个尚未回答的问题包含来自 saiarcot895 的评论,他似乎有一个相关的问题(这是我找到尝试前两个命令的想法的地方)。
无论我到目前为止尝试了什么,我仍然可以从家庭服务器 ping 10.0.0.13。
user@home-server:~$ ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=63 time=58.0 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=63 time=51.7 ms
然而,我预计这个 ping 包不会被路由,因此返回超时或类似信息。
我的问题是这是预期的行为吗?如果是,我该如何使用 ufw 创建相应的规则?
奇怪的是,我在遥远的互联网中找不到答案。但这应该很容易,所以我再次深入研究了 ufw 手册页。如果你有任何想法,请告诉我!
答案1
这是预期行为。请尝试使用除 之外的其他方法ping
进行测试。例如,如果您有一个在 端口上运行的 Web 服务器80
,10.0.0.13
请尝试curl 10.0.0.13
在您的主服务器 ( 10.0.0.6
) 上运行。
您的 UFW 命令ufw route allow in on wg0 out on wg0 to 10.0.0.6/32
是正确的。它将允许发送到主机wg0
接口的所有传入数据包从接口10.0.0.6
转发到。UFW 还会自动设置防火墙规则,允许已建立连接的反向操作(即将数据包从 转发回已建立连接的原始源)。wg0
10.0.0.6
10.0.0.6
UFW 还始终允许某些 ICMP 数据包类型(例如ping
请求使用的类型 8,“回显请求”)通过主机的所有接口转发。因此,无论您设置了什么 UFW 规则,您的入口节点都会将数据包转发ping
到它可以连接的任何其他主机。
ping
要默认停止 UFW 转发(IPv4)数据包,请编辑该/etc/ufw/before.rules
文件并注释掉(即#
在开头添加)此行:
#-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
对于ping
IPv6,请编辑该/etc/ufw/before6.rules
文件并注释掉以下行:
#-A ufw6-before-forward -p icmpv6 --icmpv6-type echo-request -j ACCEPT
#-A ufw6-before-forward -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
然后重新启动UFW(例如sudo systemctl restart ufw
)。
用于sudo iptables-save | grep -i forward
检查iptables
现在适用于您的链的 (IPv4) 规则FORWARD
。在注释掉上述行之前,输出将如下所示:
:FORWARD DROP [0:0]
:ufw-after-forward - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-reject-forward - [0:0]
:ufw-skip-to-policy-forward - [0:0]
:ufw-track-forward - [0:0]
:ufw-user-forward - [0:0]
:ufw-user-logging-forward - [0:0]
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -j ufw-track-forward
-A ufw-after-logging-forward -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw-before-forward -j ufw-user-forward
-A ufw-skip-to-policy-forward -j DROP
-A ufw-user-forward -d 10.0.0.6/32 -i wg0 -o wg0 -j ACCEPT
注释掉该行并重新启动 UFW 后,输出应该不再列出该-A ufw-before-forward -p icmp -m icmp --icmp-type 8 -j ACCEPT
规则。