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