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

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

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). Или я не прав?

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

2 ответа

вам нужно включить пересылку пакетов в редактировании ядра /etc/sysctl.conf и активировать строку 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

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

1
ответ дан 17 July 2018 в 16:55
вам нужно включить пересылку пакетов в редактировании ядра /etc/sysctl.conf и активировать строку 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

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

1
ответ дан 23 July 2018 в 17:46
  • 1
    Здравствуйте, Guntbert, переадресация уже включена. Мне нужно правило SNAT, чтобы маршрутизатор знал, к какому серверу будет перенаправлен ICMP-пакет. Кажется, что это работает хорошо, так как я вижу, что пакет ICMP-reply переходит на правильный сервер: – Radje 2 May 2018 в 09:56
  • 2
    см. выше вопросы обновления и дополнительные выводы – Radje 2 May 2018 в 10:06
  • 3
    @Radje благодарю вас за прояснительную картину. Думаю, я могу видеть, где вы допустили ошибку, которая привела вас к использованию NAT и соответствующим образом изменила мой ответ. – guntbert 8 May 2018 в 21:48

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

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