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

536
TemperedGlass

У меня есть хост, который выступает в качестве шлюза для маршрутизации домашней сети в Интернет. 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 
0
NB, я отключил маскировку (кажется, плохое решение) и включил SNAT следующим образом, однако я потерял все подключения к Интернету и SSH к маршрутизатору в течение пяти минут после этого. Я предполагаю, что если я смогу просто взломать это, то у нас есть ответ, пригодный для моей (и многих других ситуаций?) -A РАЗМЕЩЕНИЕ -o eth0 -j SNAT - к 192.168.1.1 TemperedGlass 8 лет назад 0
Если `SNAT` не работает, вы, вероятно, используете неправильный адрес источника. Daniel B 8 лет назад 0
Кроме того, что вы даже пытаетесь достичь? Пожалуйста, предоставьте вывод `iptables-save` с желаемыми правилами, а также их устное описание. Daniel B 8 лет назад 0
Я теперь SNATING с 192.168.1.1 - Интернет работает, но я не могу отфильтровать трафик (таблицы nat говорят мне не делать этого там, и если я применяю подсети / интерфейсы и т. Д. В таблице FORWARD, то трафик для протокола терпит неудачу Я хочу заблокировать доступ определенных интернет-узлов к Интернету. Таким образом, пример неудачного правила (файл сохранения, указанный выше, является единственной рабочей конфигурацией) будет -A FORWARD -p tcp -s 192.168.2.123 -j DROP -m comment --comment «block tcp from 192.168.2.123», эффект выше = вся пересылка tcp завершается неудачно после iptables-restore из config с этим правилом. TemperedGlass 8 лет назад 0
Спасибо за ответы, кстати. Надеюсь, теперь стало понятнее? TemperedGlass 8 лет назад 0
Какой ваш сетевой адаптер WAN (eth0 / eth1?), А какой сетевой адаптер LAN (eth1 / eth0)? MariusMatutiae 8 лет назад 0
Это довольно ясно из исходного поста, конечно? ... TemperedGlass 8 лет назад 0
На самом деле, чтобы прояснить ситуацию, я перефразировал домашний маршрутизатор на маршрутизатор / широкополосный маршрутизатор ADSL. TemperedGlass 8 лет назад 0

1 ответ на вопрос

1
Radhil

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.... 

Похожие вопросы