Є кілька можливостей, залежно від того, як ви хочете вирішити, які пакети куди йти. Більшість із них потребуватиме певного розуміння того, як мережа TCP / IP працює в Linux. Основними інструментами, які потрібно знати, щоб робити складні речі, є iptables
(Ubuntu: iptables ) та iproute2 ( ip
команда) (Ubuntu: iproute , iproute-doc ).
Якщо ви можете повністю розрізнити цільову IP-адресу, це просто: маршрутизуйте IP-адреси відповідно до своїх побажань. Наприклад, наступні команди викликають всі пакети для 1.2.3. x і 1.2.4.2 для переходу через ppp0
інші пакети та інші пакети eth0
.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Для більш складних вимог потрібно почати використовувати iptables
і ip route
. Наприклад, наступні команди встановлюють спеціальні таблиці маршрутизації, щоб усі пакети, позначені 1, виходили через, eth0
а всі пакети, позначені 2, виходили через ppp0
(за винятком пакетів, призначених для localhost
приєднання до інтерфейсу петлі).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Тепер ви можете використовувати, iptables
щоб "погладити" вихідні пакети, додавши позначку, яка визначатиме, яким маршрутом вони рухаються. Наприклад, ось як надіслати весь вихідний SMTP-трафік (порт 25) через eth0
і весь трафік, породжений програмою, що працює як користувач proxy
через ppp0
.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Дивіться також 2 мережеві інтерфейси, підключені до Інтернету. Виберіть той, який потрібно використовувати відповідно до доменного імені, і прив’яжіть програмне забезпечення до різних мережевих інтерфейсів .
Вам потрібно буде домовитись виконання цих команд, коли підключені обидва інтерфейси. Я рекомендую написати сценарій під назвою, /etc/network/if-up.d/0justin-routes
який виконує потрібні команди. Цей сценарій буде виконуватися щоразу, коли буде піднято мережевий інтерфейс; оскільки його ім'я починається з а, 0
він запуститься на початку цього процесу, перед тим як встановити специфічну програму, яка може очікувати, що маршрути будуть встановлені. Є симетричний /etc/network/if-down.d/
випадок, якщо ви також хочете робити щось, коли один з інтерфейсів виходить з ладу. (Усі асоційовані маршрути будуть автоматично стертись, що може залишити деякі пакети прокрученими, коли ви хочете, щоб вони повернулися до іншого інтерфейсу.)
Сценарії ifup задокументовані в interfaces(5) man page
. Головне, що потрібно знати, - це те, що назва інтерфейсу, що виховується або знижується, знаходиться в змінній оточення IFACE
. Ви можете дізнатися, чи не працює інший інтерфейс if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.