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 (и локальной сетью, если есть).

Другие вопросы по тегам