OpenVPN за межсетевым экраном iptables/nftables
У меня есть маршрутизатор Linux с интерфейсом WAN (eth0) и интерфейсом LAN (eth1) в подсети 192.168.0.0/24.
У меня есть следующие nftables
(который, судя по всему, должен быть легко понятен пользователям iptables
).
#!/usr/sbin/nft -f
# Flush the rule set
flush ruleset
table inet filter {
chain input {
# By default, drop all traffic unless it meets a filter
# criteria specified by the rules that follow below.
type filter hook input priority 0; policy drop;
# allow established/related connections
ct state {established, related} accept
# early drop of invalid connections
ct state invalid drop
# allow from loopback
iifname lo accept
# Allow from internal network
iifname eth1 accept
# allow icmp
ip protocol icmp accept
# allow ssh
tcp dport 22 accept
# Uncomment to enable logging of denied inbound traffic
#log prefix "[nftables] Inbound Denied: " flags all counter drop
}
# packets not meant for local server, pass through FORWARD chain
chain forward {
type filter hook forward priority 0; policy drop;
# Allow outgoing via eth0 (WAN)
iifname eth1 oifname eth0 accept
# Allow incoming on wan0 for related & established connections
iifname eth0 oifname eth1 ct state related, established accept
# new connections to the internal SSH at 192.168.0.2 to be accepted. they will
# then use the rule above
iifname eth0 oifname eth1 tcp dport 22 ct state new log prefix "[nftables] New SSH Connection to 192.168.0.2:22 " accept
iifname eth0 oifname eth1 udp dport 1194 ct state new log prefix "[nftables] New OpenVPN Connection to 192.168.0.2 " accept
log prefix "[nftables] Forward Denied: " flags all counter drop
log prefix "[nftables] Forward Accept: " flags all counter accept
}
# allow all packets sent by the firewall machine itself
chain output {
type filter hook output priority 0; policy accept;
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority 0; policy accept;
# Forward traffic from eth0 (WAN) to a LAN server
iifname eth0 tcp dport 8080 dnat 192.168.0.2:22
iifname eth0 udp dport 1194 dnat 192.168.0.2
log prefix "[nftables] Preroute Accept: " flags all counter accept
}
# for all packets to WAN, after routing, replace source address with primary IP of WAN interface
chain postrouting {
type nat hook postrouting priority 0; policy accept;
# Masquerade outgoing traffic
oifname eth0 masquerade
}
}
На внутреннем клиенте 192.168.0.2
, Я использую сервер OpenVPN. Имеет конфигурацию
port 1194
proto udp
dev tun
server 10.5.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"
Соединения от клиента OpenVPN работают, но затем возникает проблема с пакетами возврата от DNS. На экране отображается маршрут / ВПЕРЕД.nftables
неправильно пересылает пакеты обратно на 192.168.0.2 для обработки. Это то, что я вижу вnftables
журналы
New OpenVPN Connection to 192.168.0.2 IN=eth0 OUT=eth1 MAC=fa:16:3e:f6:48:af:6a:9b:a0:b7:8f:6f:08:00 SRC=158.140.193.117 DST=192.168.0.2 LEN=42 TOS=0x00 PREC=0x00 TTL=107 ID=42974 PROTO=UDP SPT=55296 DPT=1194 LEN=22
Preroute Accept: IN=eth1 OUT= MACSRC=fa:16:3e:9b:88:99 MACDST=fa:16:3e:e2:10:02 MACPROTO=0800 SRC=10.5.0.6 DST=84.200.69.80 LEN=62 TOS=0x00 PREC=0x00 TTL=127 ID=54989 PROTO=UDP SPT=55800 DPT=53 LEN=42
Forward Denied: IN=eth0 OUT=eth0 MACSRC=6a:9b:a0:b7:8f:6f MACDST=fa:16:3e:f6:48:af MACPROTO=0800 SRC=84.200.69.80 DST=10.5.0.6 LEN=107 TOS=0x00 PREC=0x00 TTL=49 ID=52240 PROTO=UDP SPT=53 DPT=55800 LEN=87
Вы можете увидеть, что DNS направляется в WAN в журнале Preroute, но затем, когда он возвращается, это отклоняется. Вы можете видеть, что, поскольку адрес DST - 10.5.0.6 (диапазон VPN),nftables
не знает маршрута и пытается переслать его обратно через eth0
(WAN).
Как мне это настроить?