Цель состоит в том, чтобы программа перехватывала набор IP-пакетов и считывала их необработанное содержимое, а затем повторно вставляла его в сеть после обработки.
Мой подход основан на настройке интерфейса Tuntap (точнее, Tun), а затем iptables и подобные перенаправляют нужные пакеты на этот туннельный интерфейс.
В целях тестирования я написал этот короткий сценарий оболочки, который настраивает интерфейс Tun и добавляет необходимые правила. На данный момент я намерен проверить это на любом пакете, отправленном с моей локальной машины с пунктом назначения 123.123.123.123
. Вот скрипт запуска:
# Set up the tunnel
ip tuntap add dev maintun mode tun
ifconfig maintun inet 10.10.10.1 netmask 255.255.255.0 up
# Mark packets for forwarding to tun
iptables -t mangle -A PREROUTING -d 123.123.123.123 -j MARK --set-mark 2
# Apply ClientRouter table to mark 2 as it's defined in /etc/iproute2/rt_tables
# 201 ClientRouter
ip rule add fwmark 2 table ClientRouter
# Apply gw if to ClienRouter
ip route add default via 10.10.10.1 dev maintun table ClientRouter
Я начал писать perl-скрипт для чтения с устройства Tun, но застрял сразу в нескольких точках:
- Мне кажется, что способ сделать это состоит в том, чтобы сценарий сам создавал интерфейс, вызывая
ioctl()
в дескрипторе файла для/dev/net/tun
, но я не уверен в других аргументах, которые хочетioctl()
. Что приводит меня к следующим двум пунктам: - Я вижу ссылки на второй аргумент
TUNSETIFF
. Все, что я знаю, это то, что он должен быть числовым. Что он просит? - Судя по тому, что я собрал, третьим аргументом должны быть какие-то флаги, но мне не удалось найти информацию о них. Предположительно, один флаг будет для выбора, должен ли это быть туннель Tun или Tap. Любая информация об этом?
Поскольку я застрял с флагом ioctl(), я хотел бы сделать шаг назад и спросить: как программно читать с устройства Tun, предпочтительно предварительно настроенного, настроенного заранее?
Кроме того, если кто-то увидит что-то не так со сценарием запуска, не стесняйтесь кричать.
Хотя в идеале решение должно быть на Perl, это не обязательно, просто это язык, на котором мне проще всего читать. Java тоже подойдет. К сожалению, моя грамотность на C даже близко не так хороша, как должна быть для этого.
Изменить:
Если подход, отличный от Tun/Tap, позволит мне сделать то, что описано в первом абзаце, любые предложения, конечно, будут приветствоваться.
Примечание.
Я столкнулся с этот вопрос и, хотя похоже, это не предоставить ответ на аргументы ioctl(). Однако именно это указывало на необходимость ioctl()
звонка.