Во-первых, я знаю, что IP не такой. Но, как обычно, мне нужно, чтобы это работало.
Я работаю в охранной компании. Есть как минимум 2 сетевых интерфейса. Оба интерфейса должны иметь шлюз по умолчанию. Один интерфейс - это интерфейс Ethernet по умолчанию, второй - интерфейс 3G. Оба подключены к Интернету. Возможны разные конфигурации, так как один интерфейс является основным, а другой - резервным. Или интерфейс Ethernet - это локальная сеть (с разными подсетями, шлюзом), а 3G-модем - это подключение к Интернету.
Мой главный вопрос: как заставить стек TCP / IP Linux отвечать на том же интерфейсе, откуда пришел запрос.
Второй вопрос: как я могу начать соединение через выбранный мной интерфейс, не играя с разными подсетями на разных интерфейсах.
Вы можете установить маршруты в Linux на основе исходного IP-адреса. Хотя в Linux можно выполнить привязку к определенному интерфейсу, это очень редко. Маршрутизация на основе IP-адреса источника позволит вам создать шлюз по умолчанию для каждого исходящего интерфейса. Поскольку сокет для сервера, отправляющего запросы, может быть привязан к IP-адресу, это гарантирует, что ответы будут отправляться с того же интерфейса, на который они пришли. (Если сервер прослушивает групповой адрес (0.0.0.0
) и не привязаны к конкретному интерфейсу, вы не сможете использовать этот метод. Это все еще должно быть возможно с использованием модуля conntrack и меток iptables, но я не буду здесь вдаваться в подробности).
Вы можете добиться этого, создав еще один таблица маршрутизации используя ip
команда. Цифра 10 здесь произвольная.
# 10.0.0.1 = gateway for the secondary interface
# 10.0.0.10 = ip address for the secondary interface eth1
ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.10 table 10
Если вы привязываетесь к нескольким адресам или используете DHCP, вы можете создать базу правил в подсети.
ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.0/8 table 10
Если вы уверены, что сервер привязан к устройству, подойдет другой шлюз по умолчанию с более высокой метрикой.
ip route add default via 10.0.0.1 dev eth1 metric 2
Я не уверен, возможно ли это в том смысле, в каком вы хотите. Вы, безусловно, можете контролировать, какой сетевой интерфейс использует программа, запущенная на вашем компьютере, привязав ее к определенному адресу.
Однако в целом я не думаю, что есть способ соединить входящие сетевые пакеты с исходящими. Лучшее, что вы можете сделать, это предоставить системе инструкции типа «если вы пытаетесь подключиться к этой сети, всегда используйте этот интерфейс». Это можно сделать различными способами через системную таблицу маршрутизации (iproute
) или с iptables
правила брандмауэра.
Если это сделано в целях безопасности, задумывались ли вы об использовании виртуальных машин, работающих на вашем физическом сервере? Вы можете настроить одну виртуальную машину так, чтобы она имела доступ только к одному интерфейсу, а другую виртуальную машину - только к другому. Поскольку виртуальная машина вообще не видит другой интерфейс, она никак не сможет ответить на пакеты из неправильной сети.
Вам, вероятно, также стоит взглянуть на этот вопрос serverfault в котором рассказывается, как контролировать, какие запросы arp интерфейса будут отправляться. Вы также должны посмотреть на sysctl rp_filter, который можно настроить так, чтобы игнорировать пакеты, появляющиеся на неправильном интерфейсе.