Я использую 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)
, в то время как следующий вывод утверждает политику "ACCEPT" во всех цепочках.
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, у которого, похоже, есть связанная проблема (именно там я нашел идею попробовать две предыдущие команды).
Что бы я ни пробовал до сих пор, я все еще могу пинговать, например, 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?
Как ни странно, я не смог найти ответ в далекой интернет-сети. Но это должно быть просто, поэтому я снова погрузился в manpage ufw. Если у вас есть идеи, дайте мне знать!
Это ожидаемое поведение. Попробуйте использовать для проверки что-нибудь другое, кроме ping
. Например, если у вас есть веб-сервер, работающий на порту 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
, через интерфейс wg0
на 10.0. 0,6
. UFW также автоматически устанавливает правило брандмауэра, которое разрешает обратное для уже установленных соединений (т.е. пересылать пакеты обратно из 10.0.0.6
к исходному источнику установленного соединения).
UFW также всегда разрешает пересылку определенных типов пакетов ICMP (таких как тип 8, «эхо-запрос», используемый запросами ping
) через все интерфейсы хоста. Таким образом, независимо от установленных вами правил UFW, ваш входной узел будет пересылать пакеты с ping
на любые другие хосты, к которым он может подключиться.
Чтобы запретить UFW пересылать (IPv4) пакеты ping
по умолчанию, отредактируйте файл /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 перезапустите 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 ПРИНЯТЬ правило
.