Iptable прямая конфигурация
У меня OpenVPN и PPTP установлены на VPS. У меня есть несколько вопросов, на которые я не могу получить твердый ответ.
Я хочу установить OpenVPN на 1.1.1.1 (eth0, публичный IP-адрес) и PPTP на 1.1.1.2 (eth0:1, публичный IP-адрес). Я смог добиться этого с SNAT. Тем не менее, из всех уроков, которые я читал, рекомендуется пересылать ppp+ в eth0 и наоборот, и та же ситуация для интерфейса tun.
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
Моя установка - CentOS, выделенный сервер.
По некоторым причинам я предполагаю, что iptables направит весь трафик с eth0 на tun0 и остановится на этом.
Мой вопрос
1) Будут ли эти форвардные правила конфликтовать друг с другом? 2) Нужно ли вместо этого пересылать ppp+ в eth0: 1, чтобы избежать конфликта? Это вообще возможно? Я еще не нашел пути. 3) Является ли iptables достаточно умным для маршрутизации трафика, специфичного для tun и ppp, по этим правилам?
1 ответ
Сначала давайте попробуем немного прояснить ситуацию, поскольку вы, кажется, путаете некоторые вещи о том, как фильтрация пакетов и маршрутизация работают вместе.
iptables
(на самом деле Netfilter - это название стека в ядре;iptables
это просто имя двоичного файла пользовательского пространства для работы с наборами правил Netfilter) ничего не маршрутизирует; маршрутизация осуществляется с помощью стека маршрутизации (управляется с помощьюip
двоичное пространство пользователя), а Netfilter может влиять на маршрутизацию только по правилам, установленным вPREROUTING
цепочка (где можно сделать DNAT).Цепочка "FORWARD" (из таблицы "filter") пересекается всеми пакетами, проходящими через хост, то есть не исходящими от него (те, которые проходят через цепочку "OUTPUT") и не предназначенными для него (те, проходят через цепочку "INPUT").
Следовательно, да, если на хосте включена пересылка пакетов (и, следовательно, хост работает как маршрутизатор), политика цепочки "FORWARD" и любые правила в ней влияют на поток определенных пакетов, но не на решения о маршрутизации.
Каждая из главных трех цепочек -
INPUT
,OUTPUT
а такжеFORWARD
имеет так называемую "политику по умолчанию", которая может бытьALLOW
(по умолчанию) илиDROP
, Последний просто отбрасывает любой пакет, входящий в цепочку. Политика по умолчанию применяется к пакету, если пакет не был обработан правилами, установленными в цепочке.Обычно для типичного "пограничного шлюза" (хоста, связывающего локальную сеть с Интернетом) предусмотрена такая настройка, чтобы все блокировалось по умолчанию - включая пересылку пакетов через Netfilter, даже если он включен для самого стека IP, - и затем вставляются конкретные правила для явного включения определенных видов трафика. То есть эти учебники обычно советуют устанавливать политики по умолчанию для
INPUT
а такжеFORWARD
вDROP
а затем явно включить определенные виды трафика с использованием правил.Какой сетевой интерфейс использовать для отправки пакетов, определяется стеком маршрутизации (опять же, Netfilter не имеет права голоса в этом процессе), основываясь на таблице (таблицах) маршрутизации и метриках интерфейса, если конкретный хост / сеть доступен через более одного маршрут.
Если вы бежите
ip route
на хосте роутера вы увидите набор правил, который выглядит следующим образом10.8.10.0/24 via 10.8.0.2 dev tun0
где адрес "via" обозначает следующий маршрутизатор, а "dev" перечисляет интерфейс для отправки пакета на этот маршрутизатор.
Теперь вернемся к вашей ситуации.
Вам нужно только разместить определенные правила в
FORWARD
цепь, если ее политикаDROP
иначе это будет "просто работать".если ты
DROP
пакеты в вашемFORWARD
цепочка по умолчанию, то вам нужно явно разрешить передачу пакетов между интерфейсами VPN и интерфейсом, выходящим в Интернет, то есть междуppp+
и обратно и междуtun+
и назад. Если вам нужно, чтобы клиенты разных сетей VPN могли общаться друг с другом, вам также необходимо включить пересылку пакетов между соответствующими интерфейсами (в обоих направлениях).Обратите внимание, что вам не нужно ссылаться на интерфейсы при написании правил для
FORWARD
цепочка (или любая другая, на самом деле), - вы можете просто использовать сетевые адреса (для-s
а также-d
параметры командной строкиiptables
).Следовательно, если ваши VPN предоставляют две частные сети, A и B, вы можете вставить пару правил, таких как
iptables -A FORWARD -s A -d B -j ACCEPT iptables -A FORWARD -s B -d A -j ACCEPT
Кроме того, поскольку VPN обычно предоставляют частные сети, как и локальные сети, я склонен просто вставлять что-то вроде
iptables -A FORWARD -s 192.168/24 -d 10/8 -j ACCEPT iptables -A FORWARD -s 10/8 -d 192.168/24 -j ACCEPT
выразить идею "каждый может общаться со всеми в моих частных сетях" (если вы хотите также охватить менее используемых
172.16/12
частный диапазон, там будет3x3=9
правила нужны, очевидно).
Обновление: обратите внимание, что необязательно включать пересылку пакетов между интерфейсами VPN и интерфейсом, подключенным к Интернету: первые являются виртуальными и переносят пакеты только в частных сетях внутри туннелей, предоставляемых VPN; пакеты, которые обеспечивают эти туннели, передаются в / из процессов VPN, запущенных на хосте, и не пересекают FORWARD
цепь. Поэтому, если вам нужны только VPN-клиенты для связи с вашей локальной сетью или между собой, вам нужно только включить пересылку пакетов между интерфейсами VPN (и локальной сетью, если есть).