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).

Как мне это настроить?

0 ответов

Другие вопросы по тегам