Переадресация брандмауэра Iptables

Переадресация брандмауэра Iptables

В настоящее время я работаю на маршрутизаторе Linux и не могу настроить его так, как мне хотелось бы.

Маршрутизатор имеет три интерфейса - WAN, который является частной подсетью мобильного широкополосного доступа 172.18.15.0/24, которая безопасна и имеет 172.18.15.2частную подсеть устройства 10.0.0.0/24, которой я не доверяю. WAN предназначен для доступа к нему через OpenVPN и является шлюзом маршрутизатора по умолчанию.

IP-адреса маршрутизатора — 172.18.15.1и 10.0.0.1. В iptables у меня есть правило DNAT для пересылки 80трафика порта с 10.0.0.1на 172.18.15.2с МАСКАРАДОМ на обратном пути.

Эта часть работает отлично.

Меня беспокоит то, что когда кто-либо из частной подсети выбирает 10.0.0.1в качестве своего шлюза по умолчанию или создает маршрут к 172.18.15.0/24via 10.0.0.1, то он тоже раскрывается 172.18.15.2. Это поведение я хотел бы прекратить, чтобы единственный способ доступа к 172.18.15.2вебу был через адрес 10.0.0.1.

Если я отменю пересылку, я отменю и DNAT, что является проблемой.

Один из способов, который приходит мне в голову, это установить Apache и создать обратный прокси. Однако я не уверен, является ли это правильным и корректным способом.

Спасибо за предложения!

РЕДАКТИРОВАТЬ:

172.18.15.2простое устройство. Оно может иметь только свой собственный адрес и адрес шлюза, в данном случае 172.18.15.1. Оно отвечает, потому что я установил/etc/sysctl.conf net.ipv4.ip_forwarf=1

Вот дамп iptables-save -c
enp1s0 — это интерфейс для 10.0.0.0/24
enp2s0 — это интерфейс для 172.18.15.0/24
wwx582c80139263 — это интерфейс для мобильного широкополосного шлюза

# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to- 
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018

решение1

Использование обратного прокси (который должен вставлять X-Forwarded-Forзаголовок для целей регистрации) и удаление сетевой переадресации было бы чистым решением. Решение ниже следует четко понимать, чтобы избежать неожиданных эффектов при дальнейших изменениях правил iptables.

Тем не менее...

Проблема

  • Узлы LAN 10.0.0.0/24не должны использовать Router как маршрутизатор, по крайней мере, чтобы достичь 172.18.15.0/24. Некоторые так и делают.
  • Маршрутизатор предоставляет услуги, расположенные по адресу 172.18.15.0/24( 172.18.15.2:80) для 10.0.0.0/24узлов, используя DNAT и пересылку.
  • Как только пакеты достигают цепочки фильтров/FORWARD, нет возможности отличить, были ли они изначально предназначены для 10.0.0.1, а затем подвергнуты ДНК-кодированию или были отправлены напрямую 172.18.15.2(что должно быть запрещено).

Решение

Таким образом, классификация должна быть выполнена до того, как произойдет NAT: в таблице mangle, как можно увидеть в этомПоток пакетов в Netfilter и общих сетяхСхема. Этого уникального правила достаточно, чтобы справиться с этим:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP

Но обычно для лучшего управления должно быть разделение ролей: mangle для изменения (не удаления) или здесь пометки, и таблица фильтров (по умолчанию) для фильтрации и удаления. Это возможно с помощью отметки на шаге mangle и сопоставления этой отметки для удаления на шаге фильтра. Так что это эквивалентно:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP

(и чтобы быть совсем полным: iptables -A INPUT -m mark --mark 1 -j DROPчтобы предотвратить доступ к 172.18.15.1)

Оба метода эквивалентны. Конечно, если действительно нужно защитить только устройство 172.18.15.2, просто замените -d 172.18.15.0/24на -d 172.18.15.2.

ОБНОВЛЕНИЕ: можно использовать более простой метод, основанный на conntrack (который уже используется из-за NAT): запросconntrackчтобы узнать, был ли пакет на самом деле DNAT-ом, и отбросить его, если нет. Так что это упрощает вещи, потому что это только одно правило, и просто в цепочке filter/FORWARD. Так что в качестве третьего метода, вместо правил выше:

iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP

Также следующая строка бесполезна и может быть удалена. PREROUTING изменил назначение с DNAT, поэтому поток никогда не достигает INPUT, а вместо этого проходит через цепочку FORWARD:

[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

Связанный контент