Я искал, искал и пробовал несколько разных вещей и не смог найти решение.
Вот моя ситуация:
узел1 имеет 2 интерфейса: eth0 (Публичный IP: 56.X.X.X), и eth1 (Частный IP: 10.X.X.X)
узел2 имеет 2 интерфейса: eth0 (Публичный IP: 56.X.X.X), и eth1 (Частный IP: 10.X.X.X)
На каждом узле работает Ubuntu 10.04 LTS.
Из этой настройки узел1 и узел2 у каждого есть доступ к Интернету, но они также могут подключаться друг к другу через локальную сеть.
Я хочу добиться узел1 быть брандмауэр и прокси-сервер для узел2 и многие другие узлы, которые я разверну позже. узел1 будет иметь единственный доступ в Интернет, так как я отключу eth0 на узел2 так что узел2 имеет доступ только ко всему в своей частной сети.
Проще говоря, как я могу переслать www запрос, который входит узел1 и дальше eth0 и переслать его узел2 с помощью eth1 пока узел2 будет действовать как веб-сервер для этого запроса?
Следуя приведенному ниже примеру, вот мой iptables -L:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere 10.182.43.193 state NEW tcp dpt:www
ACCEPT tcp -- anywhere 10.182.43.193 state NEW tcp dpt:https
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Вот мой iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT all -- anywhere firewall to:10.182.43.193
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Я назначу несколько произвольных IP-адресов, чтобы прояснить это. Подставьте свои настоящие адреса.
узел1 eth0: 56.0.0.1 узел1 eth1: 10.0.0.1 узел2 eth0: 56.0.0.2 узел2 eth1: 10.0.0.2
Если node1 должен быть вашим шлюзом / брандмауэром, вам нужно запустить iptables для обработки NAT / пересылки.
# iptables config on node1
# set up a destination nat from 56.0.0.2 to 10.0.0.2
iptables -t nat -A PREROUTING -d 56.0.0.2 -j DNAT --to-destination 10.0.0.2
# open port 80/443
iptables -A INPUT -d 10.0.0.2 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -d 10.0.0.2 -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
# related/established traffic
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Вам не нужно настраивать eth0 на node2. Скорее, вам нужно настроить IP-адрес 56.0.0.2 на node1, чтобы использовать его однозначно для сопоставления с node2.
Если предполагается, что node2 имеет собственный IP-адрес, тогда вам не нужна переадресация портов, вам понадобится прокси-ARP и маршрутизация.
На node2 отключите eth0 и добавьте публичный IP-адрес к любому другому интерфейсу, например:
ip addr add 56.0.0.2/32 dev eth1
На node1 настройте маршрут к node2 через eth1:
ip route add 56.0.0.2 dev eth1
и включите ARP-ответы прокси на eth0 (чтобы node1 отвечал на ARP-запросы для node2):
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
Это заставит весь трафик к node2 проходить через node1. Затем вы можете настроить правила iptables, чтобы ограничить его, как и любой другой перенаправляемый трафик. Это не делает прокси на уровне приложения, но вы все равно можете добиться этого с помощью правил iptables.
Их постоянная установка обычно зависит от дистрибутива, я недостаточно хорошо знаю Ubuntu, но параметр proxy_arp, вероятно, можно установить в /etc/sysctl.conf:
net.ipv4.conf.eth0.proxy_arp = 1
IP-адрес на узле eth1 должен быть добавлен в конфигурацию интерфейса (но без какой-либо сетевой маски! Или с длиной префикса '/ 32'), также должно быть место для размещения статических маршрутов (/ etc / sysconfig / static-routes на моем система).