У меня есть настройка коробки как DHCP-сервер с включенной пересылкой NAT ipv4. В настоящее время в коробке используется eth0 для подключения к локальной сети и имеет доступ к Интернету, у него есть еще 3 интерфейса, eth1, eth2 и eth3 которые подключаются к другим ящикам. Все 3 других бокса могут общаться друг с другом и с основным боксом.
Я бы хотел, чтобы остальные 3 устройства имели доступ к Интернету через основной ящик поверх него. eth0 интерфейс, поэтому я считаю, что мне нужно настроить правила iptable. Нет никаких особых правил порта или чего-то особенного, я просто хочу трафик из eth1, eth2 и eth3 пройти через eth0 при доступе к общедоступному Интернету.
для основательности вот мой /etc/network/interface
файл
auto lo
iface lo inet loopback
iface eth0 inet dhcp
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
iface eth2 inet static
address 192.168.2.1
netmask 255.255.255.0
iface eth3 inet static
address 192.168.3.1
netmask 255.255.255.0
Из информации здесь, в SO и в Интернете, вот как сейчас выглядит мой iptables-save
*nat
:PREROUTING ACCEPT [1799:327587]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [23:2190]
-A POSTROUTING -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [3474:500657]
:FORWARD ACCEPT [24:1613]
:OUTPUT ACCEPT [857:128814]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.1.101 -i eth1 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 192.168.2.102 -i eth2 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 192.168.3.103 -i eth3 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
COMMIT
Правила сохраняются при перезагрузке через pre-up
Поскольку я плохо разбираюсь в правилах iptable, на текущие вопросы по serverfault сложно следить / понимать, что я на самом деле делаю.
Прежде чем сразу перейти к правилам брандмауэра, следует также выполнить простую проверку пересылки. Скорее, как когда проверяют, подключен ли шнур питания, прежде чем разбирать оборудование.
Бегать:
cat /proc/sys/net/ipv4/ip_forward
Если вы получите ноль, IPv4 не будет пересылать. Вам нужно будет включить это.
Чтобы включить его немедленно и временно для проверки поведения:
echo 1 > /proc/sys/net/ipv4/ip_forward
Вышеупомянутое включает его для машины, но просто изменяет настройку ядра на лету и не будет "сохранен".
Отредактируйте файл sysctl.conf, чтобы внести правильные постоянные изменения и обеспечить следующие настройки:
net.ipv4.ip_forward = 1
В дополнение к ответу Магеллана не используйте -j MASQUERADE
, если вы действительно не знаете, что он делает, и должны его использовать. Вместо этого используйте -j SNAT --to <source address>
. Во-вторых, ваше правило POSTROUTING должно включать -o eth0
, в противном случае это маскирование соединений, возвращающихся в также, что ваши внутренние коробки, вероятно, не знают, как обращаться.
Есть некоторые проблемы с тем, как вы писали свои правила.
-A POSTROUTING -j MASQUERADE
Это правило применяется слишком широко. Такое правило нужно только для подключений из LAN, выходящих из вашей сети. Один из способов сделать это - указать, к какому исходящему интерфейсу он применяется:
-A POSTROUTING -o eth0 -j MASQUERADE
Кроме того, ваша таблица фильтров не имеет большого смысла:
*filter
:INPUT ACCEPT [3474:500657]
:FORWARD ACCEPT [24:1613]
:OUTPUT ACCEPT [857:128814]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.1.101 -i eth1 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 192.168.2.102 -i eth2 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -s 192.168.3.103 -i eth3 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
COMMIT
Каждое из ваших правил ПРИНИМАЕТ пакеты согласно определенным критериям. Однако все это избыточно, поскольку в конце вы собираетесь ПРИНЯТЬ их с политикой по умолчанию для цепочки. В результате вы ПРИНИМАЕТЕ все, что также будет иметь место, если вы удалите все правила.