У меня есть установка Linux в качестве моста между клиентом и сервером;
brctl addbr0
brctl addif br0 eth1
brctl addif br0 eth2
ifconfig eth1 0.0.0.0
ifconfig eth2 0.0.0.0
ip link set br0 up
У меня также есть приложение, прослушивающее порт 8080 этой машины. Можно ли передать моему приложению трафик, предназначенный для порта 80? Я провел небольшое исследование, и похоже, что это можно сделать с помощью ebtables
и iptables
.
Вот остальная часть моей настройки:
//set the ebtables to pass this traffic up to ip for processing; DROP on the broute table should do this
ebtables -t broute -A BROUTING -p ipv4 --ip-proto tcp --ip-dport 80 -j redirect --redirect-target DROP
//set iptables to forward this traffic to my app listening on port 8080
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --on-port 8080 --tproxy-mark 1/1
iptables -t mangle -A PREROUTING -p tcp -j MARK --set-mark 1/1
//once the flows are marked, have them delivered locally via loopback interface
ip rule add fwmark 1/1 table 1
ip route add local 0.0.0.0/0 dev lo table 1
//enable ip packet forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
Однако в мое приложение ничего не поступает. Я что-нибудь упускаю? Насколько я понимаю, целевой DROP в цепочке broute BROUTING подтолкнет его к обработке iptables.
Во-вторых, есть ли другие альтернативы, которые мне следует изучить?
Изменить: IPtables получает его в nat PREROUTING, но похоже, что после этого он падает; цепочка INPUT (либо в mangle, либо в фильтре) не видит пакет.
Я решил сохранить переходное поведение. Я буду использовать ebtables для блокировки трафика, который хочу перехватить, и заставлю мое приложение использовать сырые сокеты для перехвата этих пакетов. Похоже на небольшую путаницу, но, похоже, работает.