
Я пытаюсь заставить apache trafficserver работать в режиме прозрачного прокси, т.е. в режиме встроенного моста Linux. У них естьдокументацияо том, как это сделать. Я настроил свою систему Linux в соответствии с их документацией, и вот моя конфигурация:
brctl addbr br0
brctl stp br0 off
brctl addif br0 enp2s0
brctl addif br0 eno1
ifconfig enp2s0 0 0.0.0.0
ifconfig eno1 0 0.0.0.0
ifconfig br0 0.0.0.0
ifconfig br0 192.168.10.100 netmask 255.255.255.0 up
ebtables -t broute -F
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-dport 80 -j redirect --redirect-target DROP
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-sport 80 -j redirect --redirect-target DROP
iptables -t mangle -A PREROUTING -i eno1 -p tcp -m tcp --dport 80 -j TPROXY --on-ip 0.0.0.0 --on-port 8080 --tproxy-mark 1/1
iptables -t mangle -A PREROUTING -i enp2s0 -p tcp -m tcp --sport 80 -j MARK --set-mark 1/1
ip rule add fwmark 1/1 table 1
ip route add local 0.0.0.0/0 dev lo table 1
Однако эта конфигурация, похоже, не работает. Согласно конфигурации, правила ebtables и iptables перехватывают трафик, предназначенный для порта 80, и перенаправляют его на порт 8080. Судя по выводу tcpdump, первоначальный запрос, похоже, приходит на мою систему Linux.
tshark -i eno1 port 80
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eno1'
1 0.000000000 192.168.20.200 -> 192.168.20.50 TCP 74 58986 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=345213688 TSecr=0 WS=128
2 1.002013264 192.168.20.200 -> 192.168.20.50 TCP 74 [TCP Retransmission] 58986 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=345214690 TSecr=0 WS=128
3 3.008098848 192.168.20.200 -> 192.168.20.50 TCP 74 [TCP Retransmission] 58986 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=345216696 TSecr=0 WS=128
3 packets captured
Однако, похоже, что iptables/ebtables не пересылают вверх по стеку. Я добавил трассировку в правила iptables, и вот что я вижу в логах.
[ 5425.095575] TRACE: raw:PREROUTING:policy:2 IN=eno1 OUT= MAC=0c:c4:7a:78:97:c6:0c:c4:7a:b5:be:e9:08:00 SRC=192.168.20.200 DST=192.168.20.50 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=41608 DF PROTO=TCP SPT=58922 DPT=80 SEQ=2153102820 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A1478234C0000000001030307)
[ 5425.095620] TRACE: mangle:PREROUTING:rule:1 IN=eno1 OUT= MAC=0c:c4:7a:78:97:c6:0c:c4:7a:b5:be:e9:08:00 SRC=192.168.20.200 DST=192.168.20.50 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=41608 DF PROTO=TCP SPT=58922 DPT=80 SEQ=2153102820 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A1478234C0000000001030307)
Трассировка iptables подтверждает то, что я вижу в выводе tcpdump. Похоже, что запрос приходит в iptables, а затем теряется где-то в стеке Linux IP. Не уверен, где и как это отладить.
Читая эту тему в интернете, кто-то предложил мне отключитьrp_filter. Однако отключение rp_filter не помогло. Кто-то еще предложил мне включить IP-пересылку, это тоже не помогло. Любая помощь в устранении проблемы или хотя бы какие-то указания, что или где отлаживать дальше, были бы весьма признательны.