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 ruleset
VPN + 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 mark
chain input
table inet mullvad
ct 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 route
type filter
(詳細に関心がない場合は、この段落を無視してもかまいません。それでも情報が完全に正確でない可能性があります。)
編集するchain prerouting
:実際には、すべてのトラフィックに必要なトラフィックをtable inet mullvad
設定することは、DNSがVM上で動作することを可能にするために、上記で提供されたチェーンが必要ないことを意味することに気づきました。試してみて役に立つかどうかを確認できますが、今はもともと疑っていたように、何らかの理由でアップストリームサーバーとして使用されないことが問題かもしれません...ct mark
iif != "wg-mullvad"
dnsmasq
10.64.0.1