LINUX.ORG.RU
решено ФорумAdmin

Как подружить свои правила iptables (для запрета трафика мимо VPN) с правилами от libvirt?

 , , , ,


1

1

Имеются взятые из Интернета и переделанные немного под себя правила iptables, обеспечивающие запрет трафика при отключении VPN. Всё работает, как нужно.
Понадобилось перевести виртуальную машину с VirtualBox на QEMU/KVM, решил использовать libvirt и virt-manager. Но появилась проблема - с моими правилами iptables гостевая ОС не получает доступа к Интернету. Насколько я понял, libvirt создаёт свои правила, но, видимо, мои запреты (кажется, по части FORWARD) всё-равно мешают. Я по-разному пытался сделать, в итоге добился появления Интернета на госте через удаление правила :FORWARD DROP [0:0]. Но в этом случае, при отключении VPN на хосте, на хосте соединение пропадает, но гость продолжает иметь доступ к Интернету напрямую, что меня не устраивает. Хотелось-бы, чтобы гость не мог этого сделать, но имел доступ лишь при включенном на хосте VPN. Ниже приведу правила iptables.

Мои запрещающие правила:

*filter
:INPUT DROP [145:11482]
:FORWARD DROP [0:0]
:OUTPUT DROP [18518:3426455]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A OUTPUT -d X.X.X.X/32 -p tcp -j ACCEPT
-A OUTPUT -d X.X.X.X/32 -p udp -j ACCEPT

-A OUTPUT -d 192.168.100.0/24 -p all -j ACCEPT
-A INPUT -d 192.168.100.0/24 -p all -j ACCEPT

-A OUTPUT -o lo -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A OUTPUT -o tun0 -j ACCEPT
COMMIT
X.X.X.X здесь - адрес VPN-сервера.

Вот вывод iptables -S со всеми правилами в сумме - моими, и теми, которые добавляются libvirt:
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -d 192.168.100.0/24 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A OUTPUT -d X.X.X.X/32 -p tcp -j ACCEPT
-A OUTPUT -d X.X.X.X/32 -p udp -j ACCEPT
-A OUTPUT -d 192.168.100.0/24 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT
С ними Интернета на госте нет совсем.
Помогите, пожалуйста, сделать так, чтобы гость всё-таки имел доступ в Интернет, но только пока на хосте включен VPN.

-A FORWARD -i virbr0 -j ACCEPT
-A FORWARD -o virbr0 -m state --state ESTABLISHED,RELATED -j ACCEPT

ну и nat скореее всего понадобиться.
А насчет этого:

но только пока на хосте включен VPN.

добавляйте правила при влючении vpn и удаляйте при выключении. Вполне возможно вы говорите о том что при включенном впн трафик идет через него, тогда можно сделать проще, но в посте об это не сказано.

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 2)
Ответ на: комментарий от anc

Спасибо Вам большое, с указанными правилами Интернет у гостя появился! Осталось решить задачу его запрета при обрыве VPN...

при включенном впн трафик идет через него

Кажется именно так.

можно сделать проще

Если Вам не трудно, не могли бы Вы помочь с этим?

fludardes ★★
() автор топика
Ответ на: комментарий от fludardes

Кажется именно так.

Та кажется или оно так?

Если Вам не трудно, не могли бы Вы помочь с этим?

Надо больше золота информации. Есть п.1 действительно «так», то у первого правила (мой предыдущий пост) добавьте еще -o VPN-Интерфейс

anc ★★★★★
()
Ответ на: комментарий от anc

Видимо, я был не прав. На хосте сеть без VPN не работает, но на госте даже с параметром -o tun0 (-A FORWARD -i virbr0 -o tun0 -j ACCEPT) в конфигурации iptables при отключении VPN Интернет продолжает работать напрямую.

fludardes ★★
() автор топика
Ответ на: комментарий от anc

Запущены iptables, виртуальная машина и установлено подключение к VPN.
ip a:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether a2:97:a2:55:53:be brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.3/24 brd 192.168.100.255 scope global dynamic enp2s0
       valid_lft 253303sec preferred_lft 253303sec
    inet6 fe80::a097:a2ff:fe55:53be/64 scope link 
       valid_lft forever preferred_lft forever
3: wlp3s0b1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether a2:97:a2:55:53:be brd ff:ff:ff:ff:ff:ff
16: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100
    link/none 
    inet 188.126.91.242/27 brd 188.126.91.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 2a00:1a28:1557:f::1010/64 scope global 
       valid_lft forever preferred_lft forever
17: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:ce:b1:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
18: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue master virbr0 state DOWN group default qlen 500
    link/ether 52:54:00:ce:b1:08 brd ff:ff:ff:ff:ff:ff
19: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr0 state UNKNOWN group default qlen 500
    link/ether fe:54:00:4c:0e:4e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe4c:e4e/64 scope link 
       valid_lft forever preferred_lft forever

ip r:
default via 188.126.91.225 dev tun0  proto static  metric 50 
default via 192.168.100.1 dev enp2s0  proto static  metric 100 
178.73.195.105 via 192.168.100.1 dev enp2s0  proto static  metric 100 
188.126.91.224/27 dev tun0  proto kernel  scope link  src 188.126.91.242  metric 50 
192.168.100.0/24 dev enp2s0  proto kernel  scope link  src 192.168.100.3  metric 100 
192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1

fludardes ★★
() автор топика
Ответ на: комментарий от fludardes

Уточню в таблице FORWARD у вас:

-P FORWARD DROP
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o tun0 -j ACCEPT
-A FORWARD -o virbr0 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
?

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от fludardes

Бред. И что при таких правилах и опущенном vpn, трафик от virbr0 через enp2s0 благополучно ходит?

anc ★★★★★
()
Ответ на: комментарий от anc

Так, кажется я Вас запутал, и сам запутался. На каком-то этапе я добавил в конфиг iptables строчки

-A OUTPUT -d 192.168.122.0/24 -p all -j ACCEPT
-A INPUT -d 192.168.122.0/24 -p all -j ACCEPT
Вот... Сейчас я их убрал, всё перезапутил (Ваши правила на месте) - Интернета в госте нет совсем. Извините, возможно я сотворил какую-то глупость и веду Вас по ложному следу, если можно так выразиться.

fludardes ★★
() автор топика
Ответ на: комментарий от fludardes

Гость - Windows. В её ipconfig /all:

Адаптер Ethernet Ethernet 5:

   DNS-суффикс подключения . . . . . :
   Описание. . . . . . . . . . . . . : Red Hat VirtIO Ethernet Adapter
   Физический адрес. . . . . . . . . : 52-54-00-4C-0E-4E
   DHCP включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да
   Локальный IPv6-адрес канала . . . : fe80::a12f:9455:49d5:919b%15(Основной)
   IPv4-адрес. . . . . . . . . . . . : 192.168.122.115(Основной)
   Маска подсети . . . . . . . . . . : 255.255.255.0
   Аренда получена. . . . . . . . . . : 18 февраля 2016 г. 17:29:21
   Срок аренды истекает. . . . . . . . . . : 18 февраля 2016 г. 18:29:21
   Основной шлюз. . . . . . . . . : 192.168.122.1
   DHCP-сервер. . . . . . . . . . . : 192.168.122.1
   IAID DHCPv6 . . . . . . . . . . . : 458380288
   DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-1E-11-3F-52-08-3E-8E-AD-63-39
   DNS-серверы. . . . . . . . . . . : 192.168.122.1
   NetBios через TCP/IP. . . . . . . . : Включен

fludardes ★★
() автор топика
Ответ на: комментарий от fludardes

Да, вы всего запретили доступ к хосту, а я предположил что днс в гостя отдается хостовый, поэтому и написал ip для пинга.

anc ★★★★★
()

Нагородил-то... Создавай руками нужные бриджи и включай виртуалки в них. Из полезных правил, которые libvirt создаёт, я подсмотрел изоляцию бриджей. В целом, все файрволлы у меня построены на базе модели от FrozenTux.

Да, естественно, для виртуалок выделена своя внутренняя сеть и виртуальный же гейт.

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от anc

Отключаю VPN на хосте. В госте 8.8.8.8 продолжает успешно пинговаться :(

fludardes ★★
() автор топика

используй визуализацию. Разрисуй. Очень, реально ОЧЕНЬ, помогает. Выдели узловые сущности и распиши связи.

targitaj ★★★★★
()

И так, для предотвращения течения трафика из виртуалки мимо VPN нашлось такое костыльное решение:

iptables -R FORWARD 2 -s 192.168.122.0/24 -i virbr0 -o tun+ -j ACCEPT
Оно, как я понял, заменяет одно из добавляемых автоматически libvirt правил на более строгое. Теперь вопрос - как сделать, чтобы оно применялось автоматически, или сделать чтобы как-то автоматически перебить, отменить оригинальное добавляемое правило и добавить это?

fludardes ★★
() автор топика

Господа, я идиот

Проблема решается тремя кнопками из GUI virt-manager. Нужно просто создать новую виртуальную сеть, и прямо из GUI направить её на tun. Тогда всё прекрасно поднимается и падает вместе с VPN.

fludardes ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.