В настоящее время я пытаюсь понять, как я могу перенаправить трафик со вторичного общедоступного IP-адреса моего выделенного сервера на внутренний IP-адрес моей сети с помощью iptables, чтобы, например, веб-серверы и тому подобное, видимые снаружи.
Моя установка - это выделенный сервер, содержащий три виртуальные машины, которые образуют «частную локальную сеть». Между ними устанавливается соединение, и виртуальные машины могут подключаться к Интернету через мост между изолированной локальной сетью и физическим сервером. Разрешение исходящий трафик устанавливается с использованием следующего правила (LAN: 192.168.x.x, пример публичного адреса: 8.8.8.8):
iptables -t nat -A POSTROUTING -s 192.168.1.101 -j SNAT --to-source 8.8.8.8
Это отлично работает - если я открою интернет-браузер и перейду на whatismyip.com, он больше не будет отображать основной IP-адрес сервера, а вместо этого будет показывать вторичный IP-адрес в том виде, в каком он должен.
Однако теперь я бы хотел сделать наоборот и установить, например, веб-сервер на одной из виртуальных машин и сделать его общедоступным через мой вторичный IP-адрес. Я искал ответ и обнаружил, что должен добавить правило PREROUTING для этого, поэтому я попробовал следующее:
iptables -t nat -A PREROUTING -d 8.8.8.8 -j DNAT --to-destination 192.168.1.101
Однако подключение к порту 80 общедоступного IP-адреса истечет. Кажется, что я все еще что-то упускаю или в том, как я выполняю правила, есть ошибка.
Пожалуйста, обратите внимание: Вместо того, чтобы открывать только конкретный порт, я бы хотел перенаправить весь входящий трафик с этого конкретного IP-адреса на виртуальную машину и обрабатывать там безопасность.
Любой совет будет оценен - возможно, я просто упускаю что-то незначительное.
Вам понадобится комбинация DNAT и SNAT, а также активный ip_forwarding.
Сначала проверьте ip_forwarding:
cat /proc/sys/net/ipv4/ip_forward
Если он равен 1 (включен), продолжайте. Если нет, вам нужно будет поставить net.ipv4.ip_forward=1
на /etc/sysctl.conf
и беги sysctl -p
.
Первое правило - DNAT (допустим, 8.8.8.8
как внешний IP и 192.168.0.10
как внутренний):
iptables -t nat -A PREROUTING -d 8.8.8.8 -j DNAT --to-destination 192.168.0.10
Когда внешняя система (например, 200.100.50.25
) отправляет пакет, достигающий 8.8.8.8, будет иметь DESTINATION
изменился на 192.168.0.10
, и отослал. Но источник будет 200.100.50.25
, пакет будет обработан и ответный пакет сможет:
Быть сброшенным 192.168.0.10, который может не знать, как его маршрутизировать. Не желательно.
Отправлять через 192.168.0.10 на шлюз по умолчанию и в Интернет. Как только он достигнет 200.100.50.25
, эта система никогда не слышала 192.168.0.10
и сбросит пакет. Не хорошо.
Быть сброшенным с первого прыжка, как 192.168.0.10
является частным адресом и не маршрутизируется в Интернете.
Чтобы решить эту проблему, вам нужно второе правило, SNAT:
iptables -t nat -A POSTROUTING -s 192.168.0.10 -j SNAT --to-source 8.8.8.8
Согласно этому правилу каждый пакет, который приходит от 192.168.0.10
будет ли источник изменен на 8.8.8.8
и отослал.
Побочный эффект заключается в том, что каждый вход в систему 192.168.0.10
покажет 8.8.8.8
как клиент, а не как настоящий клиент. Отследить нарушителей будет немного сложнее.