Mulvad VPNの「ローカルネットワーク共有」ブロックからlibvirtが使用するdnsmasqを除外する方法

Mulvad VPNの「ローカルネットワーク共有」ブロックからlibvirtが使用するdnsmasqを除外する方法

libvirtのdnsmasqを除いて、ローカルネットワーキングを使用しません。ローカルネットワークがブロックされているため、仮想マシンにDNSはありません。したがって、次のガイドを使用して分割トンネリングを使用するローカルネットワーク共有ブロックからdnsmasqを除外したいと思いますhttps://mullvad.net/en/help/split-tunneling-with-linux-advanced

私が知る限り、私の場合、dnsmasqは私のホストのDNSをチェックせず、特定のNIC(VM 1)のDNSのみをチェックします。 libvirt dnsmasqに関する情報https://www.whonix.org/wiki/KVM#DHCP

セキュリティを最大化するためにローカルネットワーク共有を無効にしたいが、dnsmasqがローカルネットワーク上の他のコンピュータ/ルータへのポートを開かなくてもMulvadガイドのnetfilterルールを使用できるようにします。

機能する必要がある唯一のローカル接続はdnsmasqです。

Proto Recv-Q Send-Q Local Address           Foreign Address         State       Program name    
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      dnsmasq 

たぶん私も仕事をするためにこのような接続が必要かもしれません。

Netid  State    Recv-Q   Send-Q      Local Address:Port      Peer Address:Port  Process                                                                         
udp    UNCONN   0        0           192.168.122.1:53             0.0.0.0:*      users:(("dnsmasq",pid=1695,fd=5))                                              
udp    UNCONN   0        0          0.0.0.0%virbr0:67             0.0.0.0:*      users:(("dnsmasq",pid=1695,fd=3)) 

nft list rulesetVPN + Killswitch +ローカルテザリング(オフ)を使用します。

$ sudo /usr/sbin/nft list ruleset
table inet filter {
    chain input {
        type filter hook input priority filter; policy accept;
    }

    chain forward {
        type filter hook forward priority filter; policy accept;
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}
# Warning: table ip filter is managed by iptables-nft, do not touch!
table ip filter {
    chain LIBVIRT_INP {
        iifname "virbr0" udp dport 53 counter packets 0 bytes 0 accept
        iifname "virbr0" tcp dport 53 counter packets 0 bytes 0 accept
        iifname "virbr0" udp dport 67 counter packets 0 bytes 0 accept
        iifname "virbr0" tcp dport 67 counter packets 0 bytes 0 accept
    }

    chain INPUT {
        type filter hook input priority filter; policy accept;
        counter packets 60942 bytes 62002672 jump LIBVIRT_INP
    }

    chain LIBVIRT_OUT {
        oifname "virbr0" udp dport 53 counter packets 0 bytes 0 accept
        oifname "virbr0" tcp dport 53 counter packets 0 bytes 0 accept
        oifname "virbr0" udp dport 68 counter packets 0 bytes 0 accept
        oifname "virbr0" tcp dport 68 counter packets 0 bytes 0 accept
    }

    chain OUTPUT {
        type filter hook output priority filter; policy accept;
        counter packets 50614 bytes 29575202 jump LIBVIRT_OUT
    }

    chain LIBVIRT_FWO {
        iifname "virbr0" ip saddr 192.168.122.0/24 counter packets 0 bytes 0 accept
        iifname "virbr0" counter packets 0 bytes 0 reject
    }

    chain FORWARD {
        type filter hook forward priority filter; policy accept;
        counter packets 0 bytes 0 jump LIBVIRT_FWX
        counter packets 0 bytes 0 jump LIBVIRT_FWI
        counter packets 0 bytes 0 jump LIBVIRT_FWO
    }

    chain LIBVIRT_FWI {
        oifname "virbr0" ip daddr 192.168.122.0/24 ct state related,established counter packets 0 bytes 0 accept
        oifname "virbr0" counter packets 0 bytes 0 reject
    }

    chain LIBVIRT_FWX {
        iifname "virbr0" oifname "virbr0" counter packets 0 bytes 0 accept
    }
}
# Warning: table ip nat is managed by iptables-nft, do not touch!
table ip nat {
    chain LIBVIRT_PRT {
        ip saddr 192.168.122.0/24 ip daddr 224.0.0.0/24 counter packets 1 bytes 40 return
        ip saddr 192.168.122.0/24 ip daddr 255.255.255.255 counter packets 0 bytes 0 return
        meta l4proto tcp ip saddr 192.168.122.0/24 ip daddr != 192.168.122.0/24 counter packets 0 bytes 0 masquerade to :1024-65535
        meta l4proto udp ip saddr 192.168.122.0/24 ip daddr != 192.168.122.0/24 counter packets 1 bytes 635 masquerade to :1024-65535
        ip saddr 192.168.122.0/24 ip daddr != 192.168.122.0/24 counter packets 0 bytes 0 masquerade
    }

    chain POSTROUTING {
        type nat hook postrouting priority srcnat; policy accept;
        counter packets 396 bytes 23131 jump LIBVIRT_PRT
    }
}
# Warning: table ip mangle is managed by iptables-nft, do not touch!
table ip mangle {
    chain LIBVIRT_PRT {
        oifname "virbr0" udp dport 68 counter packets 0 bytes 0 xt target CHECKSUM
    }

    chain POSTROUTING {
        type filter hook postrouting priority mangle; policy accept;
        counter packets 50620 bytes 29575670 jump LIBVIRT_PRT
    }
}
table ip6 filter {
    chain LIBVIRT_INP {
    }

    chain INPUT {
        type filter hook input priority filter; policy accept;
        counter packets 4 bytes 256 jump LIBVIRT_INP
    }

    chain LIBVIRT_OUT {
    }

    chain OUTPUT {
        type filter hook output priority filter; policy accept;
        counter packets 18 bytes 1064 jump LIBVIRT_OUT
    }

    chain LIBVIRT_FWO {
    }

    chain FORWARD {
        type filter hook forward priority filter; policy accept;
        counter packets 0 bytes 0 jump LIBVIRT_FWX
        counter packets 0 bytes 0 jump LIBVIRT_FWI
        counter packets 0 bytes 0 jump LIBVIRT_FWO
    }

    chain LIBVIRT_FWI {
    }

    chain LIBVIRT_FWX {
    }
}
table ip6 nat {
    chain LIBVIRT_PRT {
    }

    chain POSTROUTING {
        type nat hook postrouting priority srcnat; policy accept;
        counter packets 2 bytes 136 jump LIBVIRT_PRT
    }
}
table ip6 mangle {
    chain LIBVIRT_PRT {
    }

    chain POSTROUTING {
        type filter hook postrouting priority mangle; policy accept;
        counter packets 18 bytes 1064 jump LIBVIRT_PRT
    }
}
table inet mullvad {
    chain prerouting {
        type filter hook prerouting priority -199; policy accept;
        iif != "wg-mullvad" ct mark 0x00000f41 meta mark set 0x6d6f6c65
        ip saddr 138.199.15.146 udp sport 57632 meta mark set 0x6d6f6c65
    }

    chain output {
        type filter hook output priority filter; policy drop;
        oif "lo" accept
        ct mark 0x00000f41 accept
        udp sport 68 ip daddr 255.255.255.255 udp dport 67 accept
        ip6 saddr fe80::/10 udp sport 546 ip6 daddr ff02::1:2 udp dport 547 accept
        ip6 saddr fe80::/10 udp sport 546 ip6 daddr ff05::1:3 udp dport 547 accept
        ip6 daddr ff02::2 icmpv6 type nd-router-solicit icmpv6 code no-route accept
        ip6 daddr ff02::1:ff00:0/104 icmpv6 type nd-neighbor-solicit icmpv6 code no-route accept
        ip6 daddr fe80::/10 icmpv6 type nd-neighbor-solicit icmpv6 code no-route accept
        ip6 daddr fe80::/10 icmpv6 type nd-neighbor-advert icmpv6 code no-route accept
        ip daddr 138.199.15.146 udp dport 57632 meta mark 0x6d6f6c65 accept
        oif "wg-mullvad" udp dport 53 ip daddr 10.64.0.1 accept
        oif "wg-mullvad" tcp dport 53 ip daddr 10.64.0.1 accept
        udp dport 53 reject
        tcp dport 53 reject with tcp reset
        oif "wg-mullvad" accept
        reject
    }

    chain input {
        type filter hook input priority filter; policy drop;
        iif "lo" accept
        ct mark 0x00000f41 accept
        udp sport 67 udp dport 68 accept
        ip6 saddr fe80::/10 udp sport 547 ip6 daddr fe80::/10 udp dport 546 accept
        ip6 saddr fe80::/10 icmpv6 type nd-router-advert icmpv6 code no-route accept
        ip6 saddr fe80::/10 icmpv6 type nd-redirect icmpv6 code no-route accept
        ip6 saddr fe80::/10 icmpv6 type nd-neighbor-solicit icmpv6 code no-route accept
        icmpv6 type nd-neighbor-advert icmpv6 code no-route accept
        ip saddr 138.199.15.146 udp sport 57632 ct state established accept
        iif "wg-mullvad" accept
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
        udp sport 68 ip daddr 255.255.255.255 udp dport 67 accept
        udp sport 67 udp dport 68 accept
        ip6 saddr fe80::/10 udp sport 546 ip6 daddr ff02::1:2 udp dport 547 accept
        ip6 saddr fe80::/10 udp sport 546 ip6 daddr ff05::1:3 udp dport 547 accept
        ip6 saddr fe80::/10 udp sport 547 ip6 daddr fe80::/10 udp dport 546 accept
        ip6 daddr ff02::2 icmpv6 type nd-router-solicit icmpv6 code no-route accept
        ip6 saddr fe80::/10 icmpv6 type nd-router-advert icmpv6 code no-route accept
        ip6 saddr fe80::/10 icmpv6 type nd-redirect icmpv6 code no-route accept
        ip6 daddr ff02::1:ff00:0/104 icmpv6 type nd-neighbor-solicit icmpv6 code no-route accept
        ip6 daddr fe80::/10 icmpv6 type nd-neighbor-solicit icmpv6 code no-route accept
        ip6 saddr fe80::/10 icmpv6 type nd-neighbor-solicit icmpv6 code no-route accept
        ip6 daddr fe80::/10 icmpv6 type nd-neighbor-advert icmpv6 code no-route accept
        icmpv6 type nd-neighbor-advert icmpv6 code no-route accept
        oif "wg-mullvad" udp dport 53 ip daddr 10.64.0.1 accept
        oif "wg-mullvad" tcp dport 53 ip daddr 10.64.0.1 accept
        udp dport 53 reject
        tcp dport 53 reject with tcp reset
        oif "wg-mullvad" accept
        iif "wg-mullvad" ct state established accept
        reject
    }

    chain mangle {
        type route hook output priority mangle; policy accept;
        oif "wg-mullvad" udp dport 53 ip daddr 10.64.0.1 accept
        oif "wg-mullvad" tcp dport 53 ip daddr 10.64.0.1 accept
        meta cgroup 5087041 ct mark set 0x00000f41 meta mark set 0x6d6f6c65
    }

    chain nat {
        type nat hook postrouting priority srcnat; policy accept;
        oif "wg-mullvad" ct mark 0x00000f41 drop
        oif != "lo" ct mark 0x00000f41 masquerade
    }
}

私のdnsmasq confはlibvirtdによって管理されています。以下のconfを参照してください

##WARNING:  THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
##OVERWRITTEN AND LOST.  Changes to this configuration should be made using:
##    virsh net-edit default
## or other application using the libvirt API.
##
## dnsmasq conf file created by libvirt
strict-order
pid-file=/run/libvirt/network/default.pid
except-interface=lo
bind-dynamic
interface=virbr0
dhcp-range=192.168.122.2,192.168.122.254,255.255.255.0
dhcp-no-override
dhcp-authoritative
dhcp-lease-max=253
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts

答え1

下記のチェーンは別のテーブルに含める必要があります。例:

table inet allowedLocal {
    ...
}

許可する特定のトラフィックによって異なります。仮想マシンのDNS要求(およびホストからの応答)のみを許可するには、次のリンクを使用する必要があります。

chain input {
    type filter hook input priority mangle; policy accept;
    ip saddr 192.168.122.0/24 meta l4proto { tcp, udp } th dport 53 ct mark set 0x00000f41
}

(conntrack mark)を設定すると、ホストの応答チェーンはct mark必要ありませんhook output。応答チェーンはその要求の同じ「接続」に属するため、ct mark自動的に同じ接続が得られます。トラフィックが(場所)に入る前に設定されていることをpriority mangle確認してください。ct markchain inputtable inet mullvadct mark 0x00000f41 accept

私が知っている/記憶するのとは異なり、少なくともホスト自体から「ローカル」ネットワークにではなく、必要に応じて応答をルーティングするために正しいmeta mark()を設定する必要はないようです。fwmark(驚くべきことに、実際の動作はアプリケーションごとに異なります。systemd-resolvedスタブ追加リスナーでテストするときにプレフィックスを含むがこれに限定されないすべてのルーティングを削除しても、応答は要求が発生したインターフェイスから来ます。応答は常にmainすべてのIPルール/代替テーブルを無視し、ルーティングテーブルに従ってルーティングされます。


すべての「接続」を許可したい場合VMによって起動それは(L3-) ターゲットがホストである、以下を削除できますmeta l4proto { tcp, udp } th dport 53

chain input {
    type filter hook input priority mangle; policy accept;
    ip saddr 192.168.122.0/24 ct mark set 0x00000f41
}

上記のチェーンは「接続」を設定しません。ホストによって開始それは(L3-) VM に送信許可する。これらの「接続」を許可するには、次のものが必要です。

chain output {
    type route hook output priority filter; policy accept;
    ip daddr 192.168.122.0/24 ct mark set 0xf41 meta mark set 0x6d6f6c65
}

ちなみに、ct markこのチェーンの設定は主に仮想マシンの応答を許可することです。実際にホストからのトラフィックを許可することはのoif "wg-mullvad" accept規則chain outputですtable inet mullvad。トラフィックは後の段階でチェーンを通過するように見えるtype routeため、新しいルーティング決定が行われる前にも元のルートを許可する必要があります(なぜならmeta mark)。つまり、私の考えではあるチェーンによって「変更された」トラフィックを(追加で)フィルタリングするには(1つの代わりに)type route別のチェーンを使用する必要があります。type routetype filter(詳細に関心がない場合は、この段落を無視してもかまいません。それでも情報が完全に正確でない可能性があります。)


編集するchain prerouting:実際には、すべてのトラフィックに必要なトラフィックをtable inet mullvad設定することは、DNSがVM上で動作することを可能にするために、上記で提供されたチェーンが必要ないことを意味することに気づきました。試してみて役に立つかどうかを確認できますが、今はもともと疑っていたように、何らかの理由でアップストリームサーバーとして使用されないことが問題かもしれません...ct markiif != "wg-mullvad"dnsmasq10.64.0.1

関連情報