Доброго времени суток всем!Схема такая:
LAN=============eth1-server1-eth0 ========= eth1-server2-eth0 ======[hardware gateway]====INET
server1 - только роутинг
server2 - роутинг и NAT
[hardware gateway] - только роутинг
на всех сетевках обоих серверов висят серые IP
Такая схема из-за того, что внутри LAN в некоторых VLAN сидят абоненты с реальными IP.
Для eth0 server1 на server2 делаеться SNAT в реальный IP.
Сниферим пакеты на eth0 server2.
При пингах с server1 в инет, на снифере видим что SNAT работает.
При запуске трассы с инета во внутреннюю сеть, на один из реальных IP, при получении сервер1 пакетов с ttl=1, он отвечает
соответствующим ICMP пакетом об ошибке. И вот у этого пакета (смотрим также на снифере второго сервера) SNAT не применяется.
Т.е. ICMP пакет по выходу с сервера2 имеет в поле IP источника серый IP, а не натированный в реальный.Получается что не отрабатывает NAT на 2сервере. Т.е. для каких-то пакетов от сервера1 он работает, а для каких-то нет.
Куда копать ?
Система везде Centos4.5 full
>Доброго времени суток всем!
>
>Схема такая:
>LAN=============eth1-server1-eth0 ========= eth1-server2-eth0 ======[hardware gateway]====INET
>server1 - только роутинг
>server2 - роутинг и NAT
>[hardware gateway] - только роутинг
>на всех сетевках обоих серверов висят серые IP
>Такая схема из-за того, что внутри LAN в некоторых VLAN сидят абоненты
>с реальными IP.
>Для eth0 server1 на server2 делаеться SNAT в реальный IP.
>Сниферим пакеты на eth0 server2.
>При пингах с server1 в инет, на снифере видим что SNAT работает.
>
>При запуске трассы с инета во внутреннюю сеть, на один из реальных
>IP, при получении сервер1 пакетов с ttl=1, он отвечает
>соответствующим ICMP пакетом об ошибке. И вот у этого пакета (смотрим также
>на снифере второго сервера) SNAT не применяется.
>Т.е. ICMP пакет по выходу с сервера2 имеет в поле IP источника
>серый IP, а не натированный в реальный.
>
>Получается что не отрабатывает NAT на 2сервере. Т.е. для каких-то пакетов от
>сервера1 он работает, а для каких-то нет.
>
>Куда копать ?
>Система везде Centos4.5 fulliptables -L -v -t nat в студию, адреса можно изменить
>iptables -L -v -t nat в студию, адреса можно изменитьВывод с сервера2:
Chain PREROUTING (policy ACCEPT 9243K packets, 567M bytes)
pkts bytes target prot opt in out source destination
734 45495 DNAT icmp -- eth0 * 0.0.0.0/0 xx.xx.xxx.53 to:172.xx.1.9 #обратный проброс для сервера1 (на его eth0)
31 1956 DNAT icmp -- eth0 * 0.0.0.0/0 xx.xx.xxx.49 to:172.xx.1.5 #обратный nat для сервера2 (на его eth0)
***************
дальше идут клиентские пробросы
*************Chain POSTROUTING (policy ACCEPT 376K packets, 26M bytes)
pkts bytes target prot opt in out source destination
1965 251K SNAT all -- * eth0 172.хх.1.5 0.0.0.0/0 to:хх.хх.ххх.49
29309 2127K SNAT all -- * eth0 172.хх.1.9 0.0.0.0/0 to:хх.хх.ххх.53
******************
дальше идет клиентское натирование.
*******************
Chain OUTPUT (policy ACCEPT 122K packets, 14M bytes)
pkts bytes target prot opt in out source destination
Т.е. интерфейсы eth0 сервера1 и eth1 сервера2 это подсеть 172.хх.1.8/29
Т.е. интерфейсы eth0 сервера2 и [hardware gateway] это подсеть 172.хх.1.4/30
Теперь при снифе на eth0 сервера2:
Запускаем с сервера1 пинги в инет:
# /usr/sbin/tcpdump -i eth0 -f 'src host хх.хх.ххх.53 or dst host хх.хх.ххх.53'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
23:06:31.516921 IP хх.хх.ххх.53 > 77.234.201.242: icmp 64: echo request seq 0
23:06:31.543021 IP 77.234.201.242 > хх.хх.ххх.53: icmp 64: echo reply seq 0
23:06:32.517843 IP хх.хх.ххх.53 > 77.234.201.242: icmp 64: echo request seq 1
23:06:32.545051 IP 77.234.201.242 > хх.хх.ххх.53: icmp 64: echo reply seq 1
23:06:33.522144 IP хх.хх.ххх.53 > 77.234.201.242: icmp 64: echo request seq 2
23:06:33.548065 IP 77.234.201.242 > хх.хх.ххх.53: icmp 64: echo reply seq 2
23:06:34.523050 IP хх.хх.ххх.53 > 77.234.201.242: icmp 64: echo request seq 3
23:06:34.550374 IP 77.234.201.242 > хх.хх.ххх.53: icmp 64: echo reply seq 3
Т.е. видим, что IP 172.хх.1.9 сервера1 было на сервере2 проNATино в хх.хх.ххх.5382.137.183.89 - IP, с которого я проверял пинги и трассу в свою локалку с инета.
Пример2 - пинг на сервер1 с инета:
#/usr/sbin/tcpdump -i eth0 -f 'src host хх.хх.ххх.53 or dst host хх.хх.ххх.53'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
23:09:13.603550 IP 82.137.183.89 > хх.хх.ххх.53: icmp 40: echo request seq 4609
23:09:13.605275 IP хх.хх.ххх.53 > 82.137.183.89: icmp 40: echo reply seq 4609
23:09:14.430659 IP 82.137.183.89 > хх.хх.ххх.53: icmp 40: echo request seq 4865
23:09:14.431198 IP хх.хх.ххх.53 > 82.137.183.89: icmp 40: echo reply seq 4865
23:09:15.431548 IP 82.137.183.89 > хх.хх.ххх.53: icmp 40: echo request seq 5121
23:09:15.432220 IP хх.хх.ххх.53 > 82.137.183.89: icmp 40: echo reply seq 5121
23:09:16.415883 IP 82.137.183.89 > хх.хх.ххх.53: icmp 40: echo request seq 5377
23:09:16.417392 IP хх.хх.ххх.53 > 82.137.183.89: icmp 40: echo reply seq 5377Во всех примерах НАТ работает.
Ну и теперь главное - трасса с инета на реальный ИП (хх.хх.ххх.65) в локалке за сервером1:
# /usr/sbin/tcpdump -i eth0 -f 'src host 82.137.183.89 or dst host 82.137.183.89'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
23:48:46.558837 IP 82.137.183.89 > хх.хх.ххх.65: icmp 72: echo request seq 22529
23:48:46.559450 IP 172.хх.1.9 > 82.137.183.89: icmp 100: time exceeded in-transit
23:48:51.058281 IP 82.137.183.89 > хх.хх.ххх.65: icmp 72: echo request seq 22785
23:48:51.058771 IP 172.хх.1.9 > 82.137.183.89: icmp 100: time exceeded in-transit
23:48:55.543205 IP 82.137.183.89 > хх.хх.ххх.65: icmp 72: echo request seq 23041
23:48:55.544751 IP 172.хх.1.9 > 82.137.183.89: icmp 100: time exceeded in-transitТ.е. тут уже при ответе сервера1 нат не отрабатывает и идет серый ИП.