Я пытаюсь создать простой доступный шаблон для фильтра пакетов на FreeBSD 11.1-RELEASE. у меня есть vtnet0
(общедоступный), vtnet1
(частный, адрес 10.10) и tun0
(openvpn, полностью рабочий / протестирован от клиента до узлов в моей сети).
Мой rc.conf выглядит следующим образом:
hostname="bastion"
sshd_enable="YES"
static_routes="linklocal"
ifconfig_vtnet0="DHCP"
ifconfig_vtnet0_ipv6="inet6 accept_rtadv"
ipv6_activate_all_interfaces="YES"
rtsold_enable="YES"
rtsold_flags="-aF"
ifconfig_vtnet1="inet 10.10.6.20 netmask 255.255.255.0"
gateway_enable="YES"
openvpn_enable="YES"
pf_enable="YES"
Мой облачный провайдер предоставляет мне общедоступные адреса ipv4 / ipv6 через DHCP.
Я просмотрел документы FreeBSD и другие доступные playbook и придумал этот базовый pf.conf:
block all
set skip on lo0
set skip on tun0
pass out all keep state
tcp_services = "{ ssh }"
udp_services = "{ openvpn }"
pass in proto tcp to any port $tcp_services keep state
pass in proto udp to any port $udp_services keep state
Однако с этой конфигурацией я блокирую весь доступ по ssh и openvpn, и мне нужно войти в свой ящик через веб-консоль виртуальной машины.
Моя цель состоит в том, чтобы этот ящик разрешал только openvpn (udp) и ssh из общедоступного интерфейса, разрешал весь трафик через vpn (tun0) и весь трафик из внутреннего.
Настройка pf
может быть немного хлопотно. Вы должны понять это pf
обрабатывает все интерфейсы абсолютно одинаково, и нет понятия о том, что пакеты исходят из самого блока, как в iptables
- OUTPUT
цепь. Я бы начал с чего-то в этом роде и на этом развил:
# allow all from host itself
pass out inet all keep state
pass out inet6 all keep state
# allow all from private
pass in quick on vtnet1 inet from any to any keep state
# openvpn
pass in quick proto udp to vtnet0 port openvpn keep state
pass in quick on tun0 inet from any to any keep state
# ssh
pass in quick proto tcp to vtnet0 port ssh flags S/SA keep state
Предупреждение: не используйте стандартные порты openvpn и ssh.