У меня есть следующая установка:
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). Или я неправильно?
необходимо включить пакетную передачу в ядре
править /etc/sysctl.conf
и активируйте строку
net.ipv4.ip_forward=1
путем удаления #
вначале.
перезагрузка или сразу включает установку с
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Не используйте SNAT (на самом деле не используют вида NAT вообще). У Вас есть две сети, маршрутизатор присоединен к обоим (он имеет участок в обоих). Поэтому удалите 3-ю строку Вашего iptables
- правила.
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-запросов его.