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

Маршрутизатор имеет три интерфейса - WAN, который является частной подсетью Mobile Broadband 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 MASQUERADE на обратном пути.

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

Что меня беспокоит, так это то, что когда кто-то из частной подсети выбирает 10.0.0.1 качестве шлюза по умолчанию или создает маршрут к 172.18.15.0/24 через 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 ответ1

0

Использование обратного прокси-сервера (который должен вставлять заголовок 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 и переадресацию.
  • как только пакеты достигают цепочки filter/FORWARD, невозможно определить, были ли они изначально предназначены для 10.0.0.1 а затем DNATed или были отправлены непосредственно в 172.18.15.2 (что должно быть запрещено).

Решение

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

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

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