У меня есть хост, который выступает в качестве шлюза для маршрутизации домашней сети в Интернет. IP Masquerading был включен в течение нескольких месяцев, и система работала нормально.

Как я могу настроить его для работы также в качестве брандмауэра? Любые условия, которые я ставлю на трафик в цепочке FORWARD просто не работают.

Например

-A FORWARD -i eth1 -p tcp -j ACCEPT

Просто отбрасывает весь TCP-трафик из маршрутизации, вместо того, чтобы просто ограничить его трафиком из eth1. Также...

 -A FORWARD -s 192.168.2.0/24 -p tcp -j ACCEPT

... не только разрешает трафик TCP из подсети 192.168.2.0, в тот момент, когда я применяю правило, весь трафик TCP прекращает маршрутизацию.

Мне не удалось найти какой-либо четкой документации по разбивке пакетов с помощью маскарада или о том, как отказаться от маскарада и использовать вместо этого SNAT.

  • eth0 - внешний интерфейс в той же подсети, что и DSL-маршрутизатор
  • eth1 - внутренний интерфейс, все мои хосты работают нормально по DHCP

Как настроить iptables для маскировки IP-адресов и межсетевого экрана?

# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*nat
:PREROUTING ACCEPT [10859:2328892]
:INPUT ACCEPT [1002:126271]
:OUTPUT ACCEPT [1256:91484]
:POSTROUTING ACCEPT [638:43890]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Oct 29 12:48:19 2015
# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*filter
:INPUT ACCEPT [5:803]
:FORWARD ACCEPT [127:18532]
:OUTPUT ACCEPT [5:431]
-A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "HTTP Serve eth1"
-A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "SSH Serve eth1"
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT -m comment --comment "ssh on eth1"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j DROP -m comment --comment "drop dns from eth0"
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth0 -j DROP
-A INPUT -i eth1 -j REJECT
-P INPUT DROP
-A FORWARD -p tcp -j ACCEPT -m comment --comment "all tcp from internal"
-A FORWARD -p udp -j ACCEPT -m comment --comment "all udp from internal"
-A FORWARD -p icmp -j ACCEPT
-P FORWARD DROP
-A OUTPUT -o eth1 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-P OUTPUT DROP
COMMIT
# Completed on Thu Oct 29 12:48:19 2015

1 ответ1

1

iptables и сетевое взаимодействие в целом сложнее, чем вы думаете.

Допустим, вы делаете это только в надежде включить весь исходящий трафик из внутреннего eth1, как в первой строке:

-A FORWARD -i eth1 -p tcp -j ACCEPT
-P FORWARD DROP

Это нарушает то, что все соединения и трафик являются двусторонними. FORWARD обрабатывает весь трафик, который не предназначен для маршрутизатора (INPUT) или получен из маршрутизатора (OUTPUT). Таким образом, FORWARD получает как ваше исходящее соединение, инициирующее tcp-трафик (что позволяет ваше правило), так и все ответы, пытающиеся подтвердить это соединение и передать трафик обратно (который, поскольку вы отбрасываете все остальное, что не соответствует, потребует нового правила для разрешать).

Здесь iptables становится очень сложным, очень быстрым, потому что настраивать правило для каждого потенциального пакета в обоих направлениях - это безумие. Это начинает становиться проще, если первое правило всегда разрешает трафик через установленные соединения с использованием -m state --state ESTABLISHED, как вы начали использовать over в своем другом вопросе, решающем проблему NAT. Это позволит вам просто написать правила для соединений, которые вы хотите разрешить запускать. Также может быть полезно отсортировать входящие и исходящие соединения в их собственные правила (если вы не беспокоитесь только об исходящих), как показано ниже:

#setup
-N outbound
-N inbound
#design
-A FORWARD -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j inbound
-A FORWARD -i eth1 -o eth0 -j outbound
-P FORWARD DROP
#allow outgoing web access
-A outbound -p tcp -m tcp --dport 80,443 -j ACCEPT
#and nothing else
-A outbound DROP
#etc....

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .