# URL ip-address:port/fqdn ident method # http://g.idnes.cz/js/ad/vylohy.js 127.0.0.1:42423/localhost - GET do { $_=$error; next; } if !(my($url,$client_hostip,$client_port,$method)=m#^\s*(.+?)\s+([\d.]+)(?::(\d+))\S*\s+\S+\s+(\S+)\s*$#s); do { $_=$error; next; } if !(my($client_arp,$client_vid)=My::HotelKeeper->client_arp_vid($client_hostip,$client_port,$C->{"proxy_hostip"},$C->{"proxy_port"})); sub client_arp_vid($$$$$) { my($self,$client_hostip,$client_port,$server_hostip,$server_port)=@_; # tcp 6 428476 ESTABLISHED src=192.168.192.1 dst=192.168.192.50 sport=36440 dport=22 packets=1718 bytes=98100 src=192.168.192.50 dst=192.168.192.1 sport=22 dport=36440 packets=1522 bytes=132767 [ASSURED] use=1 mark=0 local *CONNTRACK; open CONNTRACK,$CONNTRACK_PATHNAME or confess "open \"$CONNTRACK_PATHNAME\": $!"; my $conntrack=do { local $/=undef(); ; }; close CONNTRACK or confess "close \"$CONNTRACK_PATHNAME\": $!"; my $mark=($conntrack=~/^tcp\b.* \Qsrc=$client_hostip dst=$server_hostip sport=$client_port dport=$server_port\E .* mark=(\d+)/m)[0]; # return if !$mark; $mark=qr/\d+/ if !defined $mark; # for non-FORWARDed (local) connections # IP address HW type Flags HW address Mask Device # 192.168.2.254 0x1 0x2 00:08:74:3F:FB:1B * eth1.2 local *ARP; open ARP,$ARP_PATHNAME or confess "open \"$ARP_PATHNAME\": $!"; my $arp_file=do { local $/=undef(); ; }; close ARP or confess "close \"$ARP_PATHNAME\": $!"; my($arp,$vid)=($arp_file=~/^\Q$client_hostip\E\s+\S+\s+\S+\s+((?:[[:xdigit:]]{2}:){5}[[:xdigit:]]{2})\s+\S+\s+eth\d+[.]($mark)$/m); return if !$arp || !defined $vid; return($arp,$vid); }