Я использую Linux-машину с двумя разными подключениями к Интернету в качестве шлюза по умолчанию для локальной сети. Каждое подключение к Интернету имеет свой собственный публичный IP-адрес. Я использовал исходную маршрутизацию с командой «ip rule», чтобы сбалансировать исходящий трафик между этими двумя интернет-соединениями.
eth0 - это локальная сеть. eth1 и ppp0 подключены к Интернету. сама машина linux использует eth1 для подключения к Интернету.
Все работает нормально, за исключением того, что я не могу получить доступ к общедоступному IP-адресу ppp0 из локальной сети:
ping PPP0-PUBLIC-IP #works fine from the linux machine
ping PPP0-PUBLIC-IP #works fine from outside network
ping PPP0-PUBLIC-IP #**fails** from other machines on local network
Также:
$ip rule ls
0: from all lookup local
32763: from x.x.x.x lookup Home
32765: from 192.168.0.208/28 lookup Home
32766: from all lookup main
32767: from all lookup default
$ip route show table local
...
local x.x.x.x dev ppp0 proto kernel scope host src x.x.x.x
...
Где x.x.x.x - публичный IP-адрес ppp0. Что я здесь делаю не так? Почему я не могу пинговать IP-адрес ppp0 pulic из локальной сети, но могу пинговать его из внешней сети?
Обновить: Я использую две команды iptables для настройки NAT. Я не уверен, что это правильный способ, но у меня он работает:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Обновление 2: Когда я пингую общедоступный IP-адрес ppp0 с машины в локальной сети, вывод tcpdump на шлюзе указывает, что пакеты поступают правильно из локальной сети, но кажется, что ядро не доставляет их на уровень приложения.
Вам нужно использовать шпилька NAT в этом сценарии. Обратите внимание, что PCI-DSS запрещает этот тип правила NAT.