В настоящее время я работаю на маршрутизаторе 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/24
via 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