Вопрос был о UFW, но этот ответ использует iptables напрямую и может быть не таким, как хотелось бы.
Вы можете заблокировать исходящие и входящие сетевые пакеты, кроме ваших SSH, с помощью этого скрипта iptables:
#!/бин/ш
ФВВЕР=0,01
#
# ask1393247 Smythies 2022.02.16 Версия: 0.01
# Глянь сюда:
# https://askubuntu.com/questions/1393247/does-ufw-allow-all-incoming-traffic-in-response-to-outbound-requests?noredirect=1#comment2409932_1393247
# запустить как sudo на s19.
# Начали снизу:
#
# ask1368071 Smythies 2021.10.08 Версия: 0.01
# Глянь сюда:
# https://askubuntu.com/questions/1368071/iptables-that-only-allow-incoming-traffic-to-openssh-and-block-all-other-traffic
# запустить как sudo на s19.
# записи журнала только для каждого НОВОГО пакета ssh. Кажется неразумным регистрировать каждый пакет ssh, но это можно сделать.
#
echo "Загружается версия набора правил ask1393247 $FWVER..\n"
# Расположение программы iptables
#
IPTABLES=/sbin/iptables
#Установка ВНЕШНИХ и ВНУТРЕННИХ интерфейсов и адресов для сети
#
# Набор для компьютера Smythies s19 (для тестирования). Изменить для компьютера ask1393247.
EXTIF="br0"
EXTIP="192.168.111.136"
СЕТЬ = "192.168.111.0/24"
ВСЕЛЕННАЯ="0.0.0.0/0"
# Очистка любой предыдущей конфигурации
# Будьте осторожны. Я могу сделать это на s19, но не знаю
# о других пользователях компьютера.
#
echo "Очистка существующих правил и установка политик по умолчанию.."
$IPTABLES -P ВХОД DROP
$IPTABLES -F ВВОД
$IPTABLES -P УДАЛЕНИЕ ВЫВОДА
$IPTABLES -F ВЫВОД
$IPTABLES -P ПЕРЕДАТЬ ПРИНЯТЬ
$IPTABLES -F ВПЕРЕД
$IPTABLES -t физ -F
# Удалить пользовательские цепочки
$IPTABLE -X
# Сбросить все счетчики IPTABLES
$IPTABLES -Z
# Smythies: Хотя в моих ссылках этого нет, я думаю, что это необходимо.
$IPTABLES -t физ -Z
# петлевые интерфейсы допустимы.
#
$IPTABLES -A INPUT -i lo -s $UNIVERSE -d $UNIVERSE -j ПРИНЯТЬ
# Разрешить любой связанный трафик, возвращающийся на сервер.
# По неизвестным причинам, ask1393247 не хочет использовать универсальную версию. Так что закомментировано.)
#$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m состояние --state УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ
# ask1393247, похоже, хочет этого:
эхо "флаг 1"
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m состояние --state УСТАНОВЛЕНО,СВЯЗАННО -p tcp --dport 22 -j ПРИНЯТЬ
эхо "флаг 2"
# Разрешить и регистрировать новые подключения SSH. Не требуется, если вы не хотите регистрировать сеансы, но тогда вам нужно добавить NEW выше.
# Примечание: я использую порт 22, потому что никто другой не может сюда попасть. Переключитесь на свой порт.
#
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j LOG --log-prefix "ssh traffic:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j ACCEPT
# Теперь также выпускаем только ssh:
$IPTABLES -A ВЫВОД -o $EXTIF -p tcp --sport 22 -m состояние --state УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ
# Примечание: если ваш компьютер использует DCHP, вам нужно будет разрешить его как для входа, так и для выхода.
# Выполнено.
#
echo ask1393247 версия набора правил $FWVER выполнена.
И это результат:
doug@s19:~/iptables/misc$ sudo iptables -xvnL
Цепочка INPUT (политика DROP 133 пакета, 11819 байт)
pkts bytes target prot opt in out source target
0 0 ПРИНЯТЬ все -- lo * 0.0.0.0/0 0.0.0.0/0
202 13689 ПРИНЯТЬ TCP -- br0 * 0.0.0.0/0 192.168.111.136 состояние СВЯЗАННО,УСТАНОВЛЕНО TCP dpt:22
4 280 LOG tcp -- br0 * 0.0.0.0/0 192.168.111.136 состояние NEW tcp dpt:22 LOG flags 0 уровень 6 префикс "ssh traffic:"
4 280 ACCEPT TCP -- br0 * 0.0.0.0/0 192.168.111.136 состояние NEW TCP dpt:22
Цепочка FORWARD (политика ACCEPT 0 пакетов, 0 байт)
pkts bytes target prot opt in out source target
Цепочка OUTPUT (политика DROP 14 пакетов, 3240 байт)
pkts bytes target prot opt in out source target
164 25505 ПРИНЯТЬ tcp -- * br0 0.0.0.0/0 0.0.0.0/0 tcp spt:22 состояние СВЯЗАННО, УСТАНОВЛЕНО