Eu encontrei o problema, o quadro ethernet era ruim (no sentido de que o endereço MAC de destino não era vEth0 mac address). Eu não percebi que o tcpdump cheira pacotes antes mesmo do processamento da camada 2.
Eu vejo certos pacotes no tcpdump e não consigo rastrear o que está acontecendo com eles.
Eu defini rp_filter to 0
e log_martians to 1
em todas as interfaces.
Eu habilitei traços no iptables também.
root@sindhu# iptables --list-rules -t raw
-P PREROUTING ACCEPT
-P OUTPUT ACCEPT
-A PREROUTING -p tcp -j TRACE
-A OUTPUT -p tcp -j TRACE
Ainda não vejo nenhum traço pertencente ao pacote que vejo no tcpdump. Eu criei uma regra específica para esses pacotes no iptables, mas a contagem nessa regra não está sendo incrementada. Existe algo que eu estou sentindo falta? Eu tenho depurado isso por 2 dias. Qualquer ajuda seria muito apreciada.
Editar: Adicionando mais detalhes conforme solicitado.
Tcpdump:
03:01:07.625357 IP (tos 0x0, ttl 63, id 6637, offset 0, flags [DF], proto TCP (6), length 60)
192.168.103.1.33950 > 192.168.100.100.81: Flags [S], cksum 0x29b9 (correct), seq 2582058365, win 29200, options [mss 1460,sackOK,TS val 4467432 ecr 0,nop,wscale 7], length 0
03:01:07.625362 IP (tos 0x0, ttl 63, id 41508, offset 0, flags [DF], proto TCP (6), length 60)
192.168.103.1.33951 > 192.168.100.100.81: Flags [S], cksum 0x7ddb (correct), seq 2897653386, win 29200, options [mss 1460,sackOK,TS val 4467432 ecr 0,nop,wscale 7], length 0
Iptables:
# iptables --list -vxn
Chain INPUT (policy ACCEPT 1278 packets, 102705 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
Chain FORWARD (policy ACCEPT 42 packets, 2520 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 779 packets, 104083 bytes)
pkts bytes target prot opt in out source destination
# iptables --list -vxn -t nat
Chain PREROUTING (policy ACCEPT 7 packets, 420 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
Chain INPUT (policy ACCEPT 1 packets, 60 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
Chain OUTPUT (policy ACCEPT 37 packets, 2306 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 17 packets, 1146 bytes)
pkts bytes target prot opt in out source destination
48 3072 MASQUERADE all -- * vEth0 0.0.0.0/0 0.0.0.0/0
# iptables --list -vxn -t raw
Chain PREROUTING (policy ACCEPT 1491 packets, 119478 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
2088 169549 TRACE tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 891 packets, 117135 bytes)
pkts bytes target prot opt in out source destination
1236 169357 TRACE tcp -- * * 0.0.0.0/0 0.0.0.0/0
Como pode ser visto, todas as regras de input / prerouting específicas para o dport 81 possuem 0 contagens de pacotes.
Outras configurações:
# sysctl -a | grep \.rp_filter
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.vEth0.rp_filter = 0
# sysctl -a| grep martians
net.ipv4.conf.all.log_martians = 1
O pacote é destinado a um servidor local em execução na porta 81.
# netstat -at | grep 81
tcp 0 0 *:81 *:* LISTEN
O endereço de destino do pacote, 192.168.100.100 é o endereço da vEth0 na máquina.
root@cfae:/opt/pep/filesystem# ifconfig vEth0
vEth0 Link encap:Ethernet HWaddr 0e:c9:59:d9:75:ce
inet addr:192.168.100.100 Bcast:192.168.100.255 Mask:255.255.255.0
# ip route get 192.168.100.100 from 192.168.103.1 iif vEth0
local 192.168.100.100 from 192.168.103.1 dev lo src 192.168.100.100
cache <local> iif vEth0
Eu encontrei o problema, o quadro ethernet era ruim (no sentido de que o endereço MAC de destino não era vEth0 mac address). Eu não percebi que o tcpdump cheira pacotes antes mesmo do processamento da camada 2.