Используйте iptables в качестве маршрутизатора

У меня есть следующая установка:

schematic overview of setup

client: 
192.168.103.55                

"router"  
192.168.103.30 (eth3), 192.168.102.30 (eth2) 

server-1                   server-2
192.168.102.21 (eth2)      192.168.102.22 (eth2)

Маршрутизатор является на самом деле маленькой машиной Linux, работая iptables.

Цель состоит в том, чтобы настроить iptables таким способом, которым я могу проверить с помощью ping-запросов с серверов (192.168.102.21 и.22) клиенту (192.168.103.55) через маршрутизатор (192.168.102.30 в серверной стороне и 192.168.103.30 в клиентском)

Серверам настроили маршрут как:

192.168.103.55 via 192.168.102.30 dev eth2 

На маршрутизаторе я настроил следующие правила в таблицах IP:

*filter
:INPUT ACCEPT [1610193:248234329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1945999:238163662]
-A FORWARD -i eth3 -j ACCEPT
-A FORWARD -o eth3 -j ACCEPT
-A FORWARD -i eth2 -j ACCEPT
-A FORWARD -o eth2 -j ACCEPT
COMMIT
# Completed on Wed May  2 08:26:55 2018
# Generated by iptables-save v1.4.21 on Wed May  2 08:26:55 2018
*nat
:PREROUTING ACCEPT [5610:715368]
:INPUT ACCEPT [2029:121740]
:OUTPUT ACCEPT [326029:19788110]
:POSTROUTING ACCEPT [326029:19788110]
-A POSTROUTING -d 192.168.103.55/32 -o eth3 -j SNAT --to-source 192.168.103.30
COMMIT

Ping от 192.168.102.21 достигает клиента (192.168.103.55), и клиент отправляет ответ к 192.168.103.30. Но ответ не передается к клиенту (.55). Это застревает в маршрутизаторе

Что я пропускаю здесь?

Заранее спасибо в течение Вашего времени!

=================== ОБНОВЛЕНИЕ ===================

Предложение Guntbert на передаче было уже сделано.

SNAT-правило требуется для маршрутизатора знать к который сервер направить назад Ответ ICMP. В моем первом объяснении я не учел второй сервер. Я обновил вопрос теперь, чтобы дать Вам полный обзор.

SNAT, кажется, работает так или иначе, так как я вижу, что ответный пакет ICMP идет в корректный сервер:

[router ~]# tcpdump -ni eth2 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes

08:38:26.110245 IP 192.168.102.21 > 192.168.103.55: ICMP echo request, id 4471, seq 1, length 64
08:38:26.112722 IP 192.168.103.55 > 192.168.102.21: ICMP echo reply, id 4471, seq 1, length 64

08:39:53.238281 IP 192.168.102.22 > 192.168.103.55: ICMP echo request, id 8285, seq 1, length 64
08:39:53.239110 IP 192.168.103.55 > 192.168.102.22: ICMP echo reply, id 8285, seq 1, length 64

То, что на самом деле должно произойти затем, я думаю, то, что исходный IP (192.168.103.55) в ответе должен быть заменен IP маршрутизатора (192.168.102.30). Или я неправильно?

3
задан 8 May 2018 в 21:25

1 ответ

  1. необходимо включить пакетную передачу в ядре

    • править /etc/sysctl.conf и активируйте строку

      net.ipv4.ip_forward=1
      

      путем удаления # вначале.

    • перезагрузка или сразу включает установку с

      echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
      
  2. Не используйте SNAT (на самом деле не используют вида NAT вообще). У Вас есть две сети, маршрутизатор присоединен к обоим (он имеет участок в обоих). Поэтому удалите 3-ю строку Вашего iptables- правила.

    • удалите правило NAT из маршрутизатора
    • настройте все системы для достижения "другой" сети через маршрутизатор
      • на серверах заменяют Ваш маршрут
        192.168.103.0/24 via 192.168.102.30 dev eth2
        (это говорит им, как достигнуть целой сети, не всего одного клиента),
      • на клиенте добавляют следующий маршрут
        192.168.102.0/24 via 192.168.103.30 dev eth0

Теперь Вы будете видеть, что каждый пакет с обоих серверов достигнет клиента с адресом первоисточника. Клиент знает, как достигнуть того исходного адреса и может отправить ответ на точно сервер, который проверил с помощью ping-запросов его.

3
ответ дан 1 December 2019 в 16:18

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

Похожие вопросы: