LINUX.ORG.RU
ФорумAdmin

Изоляция/фильтрация трафика всей сети. С одинаковым Default GW для всех клиентов.

 , , ,


1

2

Существует проблема изоляции клиентов друг от друга:
1. Необходимо иметь возможность с КОНКРЕТНОГО VLAN для КОНКРЕТНОГО IP разрешать (по умолчанию всё запрещено) роутинг в КОНКРЕТНЫЙ VLAN на КОНКРЕТНЫЙ IP на КОНКРЕТНЫЙ порт (использоваться, в основном только TCP будет).
2. При этом все клиенты (машины в сети) должны иметь ОДИНАКОВЫЙ IP дефолт гетевея прописанным. (!!!!!!!!!!!!!!!)

Извиняюсь за капс, но на лоре весьма много людей с позицией «бред писал, топик не читал».

A - клиенты, P - их сервера, S - сервер-шлюз (фильтрующий трафик).

Технически это должно выглядеть так:
Например, нужно иметь возможность с A1 (192.168.1.1) получить доступ к P6 (192.168.1.6) на TCP 22. Тогда:
1. А1 отсылает arp-запрос IP-адреса 192.168.1.1 в VLAN1, который приходит на виртуальный интерфейс vlan0.1 у S8.
2. S8 отвечает на запрос любого IP, ставя свой MAC (или, таки удалённого компа!?).
3. S8 проверяет правило в стиле: от 192.168.1.1 с vlan0.1 к 192.168.1.6 на vlan0.6 протокол TCP порт 22.
4. Правило верно, тогда пакет уходит с vlan0.6 на P6, а в ipbtales делается запись established для данной сессии, чтобы пакеты обратно пропускались.

Проблема именно в том, что из-за необходимости иметь одинаковый IP на всех компах (т.е. для клиентов взаимодействие с другими клиентами должно быть настолько же (кроме широковещалки) прозрачно, как и в обычной сети, но с чёткими ограничениями через фильтрующий сервер S8). Из-за этого условия нельзя воспользоваться тупой нарезкой сети по 4 IP (два отнимаются, т.к. нижний - номером сети будет, верхний - броадкасn-адресом, согласно спецификации IP). В случае с нарезкой на такие сегменты всё просто: поскольку это тупо куча разных сетей (по одной на клиента, фактически), то можно использовать тупой роутинг + iptables форвардинг с проверкой условий. Но по моим условиям (у всех должен быть один IP gefault gw) так сделать нельзя.

Я пришел к выводу, что мою задачу можно реализовать двумя путями:
1. Для того, чтобы сервер выдавал свой MAC при ARM-запросе IP от клиента присваиваем ему все IP всех клиентов.
Далее в iptables пишем, что netfilter заменяет (в стадии PREROUTING) адрес клиента 192.168.1.X на 192.168.2.X (чтобы сервер сам не стал обрабатывать пакеты, т.к. ему все адреса присвоены).
После чего уже делаем проверку прав и определение исходящего интерфейса в FORWARD.
Далее в POSTROUTING уже обратно заменяем 192.168.2.X на 192.168.1.X

Проблемы:
Всё на костылях.
Один IP можно назначить только одному интерфейсу. А тут нужно назначить на каждый VLAN кучу IP, за исключением IP клиента. Хотя это делается, однако никакой реакции от всех интерфейсов, кроме одного на конкретный IP не будет. Даже если мы разрешим (есть такая опция) принимать данные с любых IP, то исходящие пакеты будут только с одного (причём не ясно какого) интерфейса.


2. Использовать ARP PROXY, чтобы отвечать своим MAC на любой ARP-запрос.
Но это лишь преодолевает костыль с подменой IP на 192.168.2.X, но никак не проблема дубликатов IP на интерфейсов.
Ведь (!!! Поправьте, если я не прав) iptables и route не будет работать (и нет настроек ядра, чтобы это изменить), если IP шлюза, указанный в пакете, не будет совпадать с тем, который реально есть у интерфейса, даже если ethernet-кадр пришел.


3. Использовать ebtables. ebtable позволяет работать с L2, там есть поддержка протокола. Но для нормальной (насколько я знаю) работы с tcp (особенно в плане established для разрешения ответов с принимающего конца).
Но разве iptables может работать, когда на интерфейсах нет ip (вопрос скорее риторический)? Или ebtables научился нормально с tcp работать (особенно меня запоминание открытых соединений для разрешения ответов с другой стороны интересует)?

На ум приходят только такие настройки для ebtables (подразумевается, что все vlan'ы объединены в бридж, который рубит весь неразрешенный трафик (последняя строка)):
-p IPv4 -i vlan0.1 -o vlan0.6 --ip-src 192.168.1.1 --ip-dst 192.168.1.6 --ip-proto tcp --ip-dport 22 -j ACCEPT
-p IPv4 -i vlan0.6 -o vlan0.1 --ip-src 192.168.1.6 --ip-dst 192.168.1.1 --ip-proto tcp --ip-sport 22 -j ACCEPT
-p IPv4 -j DROP
#Всё, что дошло до сюда уже переходит в следующую часть, где должна происходить L2-маршрутизация. Хотя, думаю, что она произойдёт автоматически, т.к. VLAN'ы объединены в свитч виртуальный должны быть.

В этом случае для того, чтобы пускать машины в инетик, нужно в --ip-dst использовать адрес GW (192.168.1.7) или уже внешние адреса, например:
-p IPv4 -i vlan0.1 -o vlan0.7 --ip-dst 192.168.1.7 -j ACCEPT
или
-p IPv4 -i vlan0.7 -o vlan0.1 ! --ip-dst 192.168.1.0/24 -j ACCEPT
?

Я не совсем понял, как именно клиент работает с default gw. Он тупо на его MAC высылает готовые IP-пакеты, что ли? Т.е. в самих пакетах к шлюзу его IP вообще не фиругирует?

Огромное спасибо всем, кто будет помогать мне в решении такой задачки ^____^ .

Схема следующая:
.............Свитч
.......... -------------
A1 ------|VLAN1....|
..........|...........|
A2 ------|VLAN2....|
..........|...........|
A3 ------|VLAN3....|
A4 ------|VLAN4....|
A5 ------|VLAN5....|
..........|....VLAN8|--------- S8 (сервер-фильтр)
P6 ------|VLAN6....|
P7 ------|VLAN7....|
--------------
Порошу простить за точки, считайте, что это пробелы. Движок все пробелы больше одного делает одним пробелом. Вероятно, ширина тема действительно куда важнее, чем такая мелочь. Скажем спасибо maxcom и прочим любителям микроэкранов.

Используйте схему netfilter и ebtables для понимания их работы: http://4.bp.blogspot.com/_N3xuQCvc1v4/TQlz5a1YXSI/AAAAAAAAASc/f0aNn5Z1q3I/s16...

Ответ на: комментарий от no-dashi

Любой «прямой стык» имеет свойство распрямлячиваться рано или поздно. Проверено :-/

Тут столько обсуждений, рассуждений. Я же имел ввиду стык между маршрутизаторами, например между двумя border gw, или другие подобные случаи, где предполагает только p2p соединение, где и можно использовать /31 сеть. И только! Больше я за /31 нигде не ратовал, это вы сами, типа про 2 /31 хоста в одном сегменте и подобное.

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

что будет в dst ip, для пакета который сформировал RIPv1 и отправил в Ethernet интерфейс с единственным ip, и маской /31

Когда я написал про то, что RIPv1 работает по multicast, это я ошибся. По multicast работает RIPv2. RIPv1 работает по broadcast.

И сейчас ты подводишь к тому, что т.к. /31 сеть не имеет broadcast адреса и RIPv1 работать не сможет?

Но если я не ошибаюсь, RIPv1 шлет broadcast с dest ip = 255.255.255.255, так что и тут все _по-идее_ должно сработать.

И конечно же все это не отменяет заблаговременного обдумывания использования чего-либо.

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

Сейчас собрал в виртуалке, все работает. Вместо tap0 на реальной машине будет eth0 или 1.

Сервер, в данном случае моя машина
ip a s dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet 10.10.10.1/0 scope global lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
10.10.10.2      0.0.0.0         255.255.255.255 UH    0      0        0 tap0.2
10.10.10.3      0.0.0.0         255.255.255.255 UH    0      0        0 tap0.3
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Свич (gns3)
1 = dot1q 1 nio_tap:tap0 # сервер, мой tap0, без ip
2 = access 2 R1 f0/0 # клиент1, я использовал виртуальные роутеры, но может быть qemu,
# это не принципиально
3 = access 3 R2 f0/0 # клиент 2

ip-шник на клиенте
interface FastEthernet0/0
 ip address 10.10.10.2 255.255.255.0
 duplex half
второй такой же, но 10.10.10.3
сервер видит обоих клиентов, клиент видит только себя и сервер.

Включаем proxy_arp и форвардинг, клиенты начинают видеть друг друга, но при этом

sh arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  10.10.10.2              -   ca00.0a12.0000  ARPA   FastEthernet0/0
Internet  10.10.10.3              0   ee62.f235.b60b  ARPA   FastEthernet0/0
Internet  10.10.10.1              0   ee62.f235.b60b  ARPA   FastEthernet0/0
то есть они ходят через сервер.

Скрипт для запуска

#! /bin/bash
tunctl -t tap0 -u 1000 # 
ip l set tap0 up 
        
ip a a dev lo 10.10.10.1/0 
                                                                                                        
for i in 2 3; # последний байт адреса клиента 
do                                                                                                      
    vconfig add tap0 $i 
    ip l set dev tap0.$i up 
    ip r a 10.10.10.$i dev tap0.$i src 10.10.10.1 
done

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

P.S. Это стандартная Цисковая схема, я просто заменил маршрутизатор на линукс

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

Но если я не ошибаюсь, RIPv1 шлет broadcast с dest ip = 255.255.255.255, так что и тут все _по-идее_ должно сработать.

а вот и нет.

к примеру Linux и quagga

tcpdump -i eth1.93  -vvv -n
tcpdump: listening on eth1.93, link-type EN10MB (Ethernet), capture size 65535 bytes
13:14:25.022145 IP (tos 0xc0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 52)
    10.11.16.97.520 > 10.11.16.103.520: [udp sum ok] 

ip add sh dev eth1.93
12: eth1.93@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 00:1b:fc:af:90:37 brd ff:ff:ff:ff:ff:ff
    inet 10.11.16.97/29 brd 10.11.16.103 scope global eth1.93
    inet6 fe80::21b:fcff:feaf:9037/64 scope link 
       valid_lft forever preferred_lft forever

ip addr add 10.11.16.97/29 brd 10.11.16.102 dev eth1.93

ip add sh dev eth1.93
12: eth1.93@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 00:1b:fc:af:90:37 brd ff:ff:ff:ff:ff:ff
    inet 10.11.16.97/29 brd 10.11.16.102 scope global eth1.93
    inet6 fe80::21b:fcff:feaf:9037/64 scope link 
       valid_lft forever preferred_lft forever

tcpdump -i eth1.93  -vvv -n
tcpdump: listening on eth1.93, link-type EN10MB (Ethernet), capture size 65535 bytes
13:15:41.070404 IP (tos 0xc0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 52)
    10.11.16.97.520 > 10.11.16.102.520: [udp sum ok]

разве зря было сказано, смотреть детальные настройки интерфейса ?

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

Во первых, RIPv1 можно заставить отправлять анонсы на определенный ip адрес, и так даже делают, если среда с множественным доступом. По крайней мере так можно сделать на циске.

а вот и нет.

А вот и да.

Проверь, сделай сетку /31, а не /29

Использую RIPv1

r1#debug ip rip
r1#sh logging
May  4 15:31:40.323: RIP: sending v1 update to 255.255.255.255 via FastEthernet0/1 (10.1.2.0)
*May  4 15:31:40.327: RIP: build update entries
*May  4 15:31:40.331:   subnet 10.1.1.1 metric 1
*May  4 15:31:40.335:   subnet 10.1.2.2 metric 1
*May  4 15:31:40.339:   network 192.168.0.0 metric 1


r2#debug ip rip
r2#sh logging
*May  4 15:32:52.735: RIP: received v1 update from 10.1.2.0 on FastEthernet0/0
*May  4 15:32:52.739:      10.1.1.1 in 1 hops
*May  4 15:32:52.739:      10.1.2.2 in 1 hops
*May  4 15:32:52.743:      192.168.0.0 in 1 hops 

r2#sh ip route 192.168.0.0
Routing entry for 192.168.0.0/24
  Known via «rip», distance 120, metric 1
  Redistributing via rip
  Last update from 10.1.2.0 on FastEthernet0/0, 00:00:01 ago
  Routing Descriptor Blocks:
    10.3.2.1, from 10.3.2.1, 00:00:13 ago, via FastEthernet0/0.2
      Route metric is 1, traffic share count is 1
  * 10.1.2.0, from 10.1.2.0, 00:00:01 ago, via FastEthernet0/0
      Route metric is 1, traffic share count is 1

Дампы трафика лень приводить, там тоже самое будет.

разве зря было сказано, смотреть детальные настройки интерфейса ?

не знаю, что тут особенного:

r1#sh int Fa0/1
FastEthernet0/1 is up, line protocol is up
  Hardware is i82543 (Livengood), address is ca03.1204.0006 (bia ca03.1204.0006)
  Description: --to-r2
  Internet address is 10.1.2.0/31
  MTU 1500 bytes, BW 100000 Kbit/sec, DLY 100 usec,
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation 802.1Q Virtual LAN, Vlan ID  1., loopback not set
  Keepalive set (10 sec)
  Full-duplex, 100Mb/s, 100BaseTX/FX
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input 00:00:00, output 00:00:01, output hang never
  Last clearing of «show interface» counters never
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     2355 packets input, 322132 bytes
     Received 418 broadcasts (0 IP multicasts)
     0 runts, 0 giants, 0 throttles
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     0 watchdog
     0 input packets with dribble condition detected
     4032 packets output, 267819 bytes, 0 underruns
     0 output errors, 0 collisions, 3 interface resets
     0 unknown protocol drops
     0 babbles, 0 late collision, 0 deferred
     0 lost carrier, 0 no carrier
     0 output buffer failures, 0 output buffers swapped out


r1#sh ip int Fa0/1
FastEthernet0/1 is up, line protocol is up
  Internet address is 10.1.2.0/31
  Broadcast address is 255.255.255.255
  Address determined by non-volatile memory
  MTU is 1500 bytes
  Helper address is not set
  Directed broadcast forwarding is disabled
  Multicast reserved groups joined: 224.0.0.5 224.0.0.9
  Outgoing access list is not set
  Inbound  access list is not set
  Proxy ARP is enabled
  Local Proxy ARP is disabled
  Security level is default
  Split horizon is enabled
  ICMP redirects are always sent
  ICMP unreachables are always sent
  ICMP mask replies are never sent
  IP fast switching is enabled
  IP fast switching on the same interface is disabled
  IP Flow switching is disabled
  IP CEF switching is enabled
  IP CEF switching turbo vector
  IP CEF turbo switching turbo vector
  IP multicast fast switching is enabled
  IP multicast distributed fast switching is disabled
  IP route-cache flags are Fast, CEF
  Router Discovery is disabled
  IP output packet accounting is disabled
  IP access violation accounting is disabled
  TCP/IP header compression is disabled
  RTP/IP header compression is disabled
  Policy routing is disabled
  Network address translation is disabled
  BGP Policy Mapping is disabled
  Input features: MCI Check
  WCCP Redirect outbound is disabled
  WCCP Redirect inbound is disabled
  WCCP Redirect exclude is disabled

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

Broadcast address is 255.255.255.255

Посмотреть анологичные параметры для Linux (добавление через ip & ifconfig), junos, и т.д.

Осознать,что RIPv1 может быть реализован по разному. Затем осознать,что тут не спорят,что «оно не работает»,а пытаются донести до неокрепших умов, что подобные финты ушами могут аукнуться, и RIPv1 один из примеров.

В общем кто хотел,тот подчерпнул.

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

Осознать,что RIPv1 может быть реализован по разному

Осознать что он уже не нужен, ну правда :)

На линуксе, кстати, спокойно повесилась /31 на интерфейс и хотя бы пингуется удаленный хост. Думается ни с чем остальным проблем не будет.

RIPv1 один из примеров

Что даже с ним, все работает. А при желании, можно отконфигурировать его, чтобы слал пакеты на необходимый ip адрес.

В общем проблемы нет.

И последнее - мне уже надоело спорить, кидать всякие выводы, дампы и подобное. Каждый понял, что он хотел понять.

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