my %local_src = ();
### regex to match IP addresses
-my $ip_re = qr|(?:[0-2]?\d{1,2}\.){3}[0-2]?\d{1,2}|; ### IPv4
-my $ipv6_re = qr|(?:[a-f0-9]{4}:){7}(?:[a-f0-9]{4})|i; ### IPv6
+my $ipv4_re = qr|(?:[0-2]?\d{1,2}\.){3}[0-2]?\d{1,2}|; ### IPv4
+
+### IPv6 - full version in ip6tables logs
+my $ipv6_re = qr|(?:[a-f0-9]{4}:){7}(?:[a-f0-9]{4})|i;
### ttl values are decremented depending on the number of hops
### the packet has taken before it hits the firewall. We will
### DST=192.168.20.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=47300 DF
### PROTO=TCP SPT=34111 DPT=6345 WINDOW=5840 RES=0x00 SYN URGP=0
- if ($pkt_str =~ /SRC=($ip_re)\s+DST=($ip_re)\s+LEN=(\d+)\s+TOS=(\S+)
+ if ($pkt_str =~ /SRC=($ipv4_re)\s+DST=($ipv4_re)\s+LEN=(\d+)\s+TOS=(\S+)
\s*.*\s+TTL=(\d+)\s+ID=(\d+)\s*.*\s+PROTO=TCP\s+
SPT=(\d+)\s+DPT=(\d+)\s.*\s*WINDOW=(\d+)\s+
(.*)\s+URGP=/x) {
### SRC=192.168.20.25 DST=192.168.20.1 LEN=28 TOS=0x00 PREC=0x00
### TTL=40 ID=47523 PROTO=UDP SPT=57339 DPT=305 LEN=8
- if ($pkt_str =~ /SRC=($ip_re)\s+DST=($ip_re)\s+LEN=(\d+)\s+TOS=(\S+)
+ if ($pkt_str =~ /SRC=($ipv4_re)\s+DST=($ipv4_re)\s+LEN=(\d+)\s+TOS=(\S+)
\s.*TTL=(\d+)\s+ID=(\d+)\s*.*\s+PROTO=UDP\s+
SPT=(\d+)\s+DPT=(\d+)\s+LEN=(\d+)/x) {
### 20:78:10:70:e7:08:00 SRC=192.168.10.20 DST=192.168.10.1 LEN=84 TOS=0x00
### PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=61055 SEQ=256
- if ($pkt_str =~ /SRC=($ip_re)\s+DST=($ip_re)\s+LEN=(\d+).*
+ if ($pkt_str =~ /SRC=($ipv4_re)\s+DST=($ipv4_re)\s+LEN=(\d+).*
TTL=(\d+)\s+ID=(\d+).*PROTO=ICMP\s+TYPE=(\d+)\s+
CODE=(\d+)/x) {
"Could not open $config{'DSHIELD_EMAIL_FILE'}: $!";
if ($config{'DSHIELD_DL_THRESHOLD'} > 0) {
for my $line (@dshield_data) {
- if ($line =~ /^.*?($ip_re)/) {
+ if ($line =~ /^.*?($ipv4_re)/) {
my $src = $1;
if (defined $scan_dl{$src}
and ($scan_dl{$src}
"Subject: $subject\n";
if ($config{'DSHIELD_DL_THRESHOLD'} > 0) {
for my $line (@dshield_data) {
- if ($line =~ /^.*?($ip_re)/) {
+ if ($line =~ /^.*?($ipv4_re)/) {
my $src = $1;
if (defined $scan_dl{$src}
and ($scan_dl{$src}
}
if ($fw_block_ip) {
- unless ($fw_block_ip =~ m|^\s*$ip_re\s*$|
- or $fw_block_ip =~ m|^\s*$ip_re/\d+\s*$|
- or $fw_block_ip =~ m|^\s*$ip_re/$ip_re\s*$|) {
+ unless ($fw_block_ip =~ m|^\s*$ipv4_re\s*$|
+ or $fw_block_ip =~ m|^\s*$ipv4_re/\d+\s*$|
+ or $fw_block_ip =~ m|^\s*$ipv4_re/$ipv4_re\s*$|) {
die '[*] The --fw-block-ip argument accepts ' .
'an IP address or network.';
}
}
if ($fw_rm_block_ip) {
- unless ($fw_rm_block_ip =~ m|^\s*$ip_re\s*$|
- or $fw_rm_block_ip =~ m|^\s*$ip_re/\d+\s*$|
- or $fw_rm_block_ip =~ m|^\s*$ip_re/$ip_re\s*$|) {
+ unless ($fw_rm_block_ip =~ m|^\s*$ipv4_re\s*$|
+ or $fw_rm_block_ip =~ m|^\s*$ipv4_re/\d+\s*$|
+ or $fw_rm_block_ip =~ m|^\s*$ipv4_re/$ipv4_re\s*$|) {
die '[*] The --fw-rm-block-ip argument accepts ' .
'an IP address or network.';
}
}
next if $intf_name eq 'lo';
next if $intf_name =~ /dummy/i;
- if ($line =~ /^\s+inet.*?($ip_re)\/(\d+)/i) {
+ if ($line =~ /^\s+inet.*?($ipv4_re)\/(\d+)/i) {
push @connected_subnets, new NetAddr::IP($1, $2);
} elsif ($line =~ /inet6\s(\S+)/) {
push @connected_subnets, new6 NetAddr::IP($1);
}
next if $intf_name eq 'lo';
next if $intf_name =~ /dummy/i;
- if ($line =~ /^\s+inet.*?:($ip_re).*:($ip_re)/i) {
+ if ($line =~ /^\s+inet.*?:($ipv4_re).*:($ipv4_re)/i) {
push @connected_subnets, new NetAddr::IP($1, $2);
} elsif ($line =~ /^\s+inet6\saddr:\s+(\S+)/) {
push @connected_subnets, new6 NetAddr::IP($1);
my $found_one_net = 0;
for my $net (@home_nets) {
my $home_net = '';
- if ($net =~ m|($ip_re/$ip_re)|) {
+ if ($net =~ m|($ipv4_re/$ipv4_re)|) {
$home_net = new NetAddr::IP $1;
- } elsif ($net =~ m|($ip_re/\d+)|) {
+ } elsif ($net =~ m|($ipv4_re/\d+)|) {
$home_net = new NetAddr::IP $1;
- } elsif ($net =~ m|($ip_re)|) {
+ } elsif ($net =~ m|($ipv4_re)|) {
$home_net = new NetAddr::IP $1;
} else {
next;
if ($ip_str =~ m|,|) {
my @ips = split /\s*,\s*/, $ip_str;
for my $ip (@ips) {
- if ($ip =~ m|($ip_re/$ip_re)|
- or $ip =~ m|($ip_re/\d+)|
- or $ip =~ m|($ip_re)|) {
+ if ($ip =~ m|($ipv4_re/$ipv4_re)|
+ or $ip =~ m|($ipv4_re/\d+)|
+ or $ip =~ m|($ipv4_re)|) {
push @arr, $1;
$sig_ip_objs{$1} = new NetAddr::IP($1);
} elsif ($ip =~ m|\:|) {
}
}
- } elsif ($ip_str =~ m|($ip_re/$ip_re)|
- or $ip_str =~ m|($ip_re/\d+)|
- or $ip_str =~ m|($ip_re)|) {
+ } elsif ($ip_str =~ m|($ipv4_re/$ipv4_re)|
+ or $ip_str =~ m|($ipv4_re/\d+)|
+ or $ip_str =~ m|($ipv4_re)|) {
push @arr, $1;
$sig_ip_objs{$1} = new NetAddr::IP($1)
or die "[*] NetAddr::IP error for $1";
%auto_dl = (); ### undef so we don't leave old ips in %auto_dl
- open A, "< $config{'AUTO_DL_FILE'}" or die '[*] Could not open ',
- "$config{'AUTO_DL_FILE'}: $!";
- my @lines = <A>;
- close A;
my $i = 0;
- LINE: for my $line (@lines) {
+ open F, "< $config{'AUTO_DL_FILE'}" or die '[*] Could not open ',
+ "$config{'AUTO_DL_FILE'}: $!";
+ while (<F>) {
$i++;
- next LINE unless $line =~ /\S/;
- next LINE if $line =~ /^\s*#/;
+ next unless /\S/;
+ next if /^\s*#/;
my $ip = '';
my $mask = '';
my $dl = '';
my $opt_criteria = '';
- if ($line =~ m|^\s*($ip_re)\s*/\s*($ip_re)\s+([0-5])\s*(.*);|) {
+ if (m|^\s*($ipv4_re)\s*/\s*($ipv4_re)\s+([0-5])\s*(.*);|) {
$ip = $1;
$mask = $2;
$dl = $3;
$opt_criteria = $4;
- } elsif ($line =~ m|^\s*($ip_re)\s*/\s*(\d+)\s+([0-5])\s*(.*);|) {
+ } elsif (m|^\s*($ipv4_re)\s*/\s*(\d+)\s+([0-5])\s*(.*);|) {
$ip = $1;
$mask = $2;
$dl = $3;
$opt_criteria = $4;
- } elsif ($line =~ m|^\s*($ip_re)\s+([0-5])\s*(.*);|) {
+ } elsif (m|^\s*($ipv4_re)\s+([0-5])\s*(.*);|) {
$ip = $1;
$mask = '32'; ### single IP
$dl = $2;
$opt_criteria = $3;
- } elsif ($line =~ m|^\s*(\S+)\s+([0-5])\s*(.*);|) {
- ### check to see if it is a hostname
- my $hostname = $1;
- $dl = $2;
+ } elsif (m|^\s*(\S+)\s+([0-5])\s*(.*);|) {
+ my $str = $1;
+ $dl = $2;
$opt_criteria = $3;
- my $iaddr = 0;
- $iaddr = inet_aton($hostname);
- unless ($iaddr) {
- &sys_log(qq|could not resolve auto_dl "$hostname" | .
- "to an IP at line $i");
- next LINE;
- }
- $ip = inet_ntoa($iaddr) or
- &sys_log(qq|could not resolve auto_dl "$hostname" | .
- "to an IP at line $i");
- $mask = '32'; ### single IP
+ if ($str =~ /\:/) {
+ ### check to see if this is an IPv6 address
+ if ($str =~ m|(\S+)/(\S+)|) {
+ $ip = $1;
+ $mask = $2;
+ } else {
+ $ip = $str;
+ $mask = '128';
+ }
+ } else {
+ ### check to see if it is a hostname
+ my $hostname = $str;
+ my $iaddr = 0;
+ $iaddr = inet_aton($hostname);
+ unless ($iaddr) {
+ &sys_log(qq|could not resolve auto_dl "$hostname" | .
+ "to an IP at line $i");
+ next;
+ }
+ $ip = inet_ntoa($iaddr) or
+ &sys_log(qq|could not resolve auto_dl "$hostname" | .
+ "to an IP at line $i");
+ $mask = '32'; ### single IP
+ }
} else {
&sys_log("improperly formatted auto_dl line $i");
- next LINE;
+ next;
}
$auto_dl_ip_objs{$ip} = new NetAddr::IP($ip, $mask);
unless (defined $auto_dl_ip_objs{$ip} and $auto_dl_ip_objs{$ip}) {
&sys_log("auto_dl could not acquire NetAddr::IP object at line $i");
- next LINE;
+ next;
}
$auto_dl{$ip}{'mask'} = $mask;
$auto_dl{$ip}{'dl'} = $dl;
- if ($line =~ m|icmp|i) {
+ if (m|icmp|i) {
$auto_dl{$ip}{'proto'}{'icmp'}{'all'} = '';
}
### check for optional port/protocol criteria
- if ($line =~ /tcp/i or $line =~ /udp/i) {
+ if (/tcp/i or /udp/i) {
&parse_port_range(\%{$auto_dl{$ip}{'proto'}}, $opt_criteria);
}
- if ($line =~ m|tcp|i and not defined $auto_dl{$ip}{'proto'}{'tcp'}) {
+ if (m|tcp|i and not defined $auto_dl{$ip}{'proto'}{'tcp'}) {
$auto_dl{$ip}{'proto'}{'tcp'}{'all'} = '';
}
- if ($line =~ m|udplite|i and
+ if (m|udplite|i and
not defined $auto_dl{$ip}{'proto'}{'udplite'}) {
$auto_dl{$ip}{'proto'}{'udplite'}{'all'} = '';
}
- if ($line =~ m|udp|i and not defined $auto_dl{$ip}{'proto'}{'udp'}) {
+ if (m|udp|i and not defined $auto_dl{$ip}{'proto'}{'udp'}) {
$auto_dl{$ip}{'proto'}{'udp'}{'all'} = '';
}
}
}
}
+ close F;
+
if (%auto_dl) {
- my $ip_ctr = 0;
- my $net_ctr = 0;
- for my $ip (keys %auto_dl) {
- my $mask = $auto_dl{$ip}{'mask'};
- if ($mask eq '32') {
- $ip_ctr++;
- } else {
- $net_ctr++;
- }
- }
+
### don't write syslog message if we are running in --fw-block-ip
### mode
unless ($fw_block_ip) {
- &sys_log("imported auto_dl, got $ip_ctr " .
- "IP addresses and $net_ctr networks");
+ my $msg = "imported auto_dl file, got " . (keys %auto_dl) .
+ " IP addrs/networks";
+ print STDERR $msg, "\n" if $debug;
+ &sys_log($msg);
}
}
return;
close B;
for my $line (@lines) {
- if ($line =~ /^\s*($ip_re)\s+(\d+)/) {
+ if ($line =~ /^\s*($ipv4_re)\s+(\d+)/) {
my $ip = $1;
my $orig_block_time = $2;
my @lines = <B>;
close B;
for my $line (@lines) {
- if ($line =~ /^\s*($ip_re)\s+(\d+)/) {
+ if ($line =~ /^\s*($ipv4_re)\s+(\d+)/) {
my $ip = $1;
my $orig_block_time = $2;
my @lines = <B>;
close B;
for my $line (@lines) {
- if ($line =~ /($ip_re)/) {
+ if ($line =~ /($ipv4_re)/) {
my $ip = $1;
### remove block rules for $ip if it has been blocked
&tcpwr_rm_block($ip) if &tcpwr_test_block($ip);
sub ipt_block() {
my ($ip, $renewed_status) = @_;
- return unless $ip and $ip =~ /^$ip_re$/;
+ return unless $ip and $ip =~ /^$ipv4_re$/;
### see if the IP is already blocked
if (defined $auto_blocked_ips{$ip}) {
$del_chains = 1 if $line =~ /delchains/i;
&flush_auto_blocked_ips($del_chains);
} else {
- if ($line =~ m|add\s+($ip_re)\s*$|i
- or $line =~ m|add\s+($ip_re/\d+)\s*$|i
- or $line =~ m|add\s+($ip_re/$ip_re)\s*$|i) {
+ if ($line =~ m|add\s+($ipv4_re)\s*$|i
+ or $line =~ m|add\s+($ipv4_re/\d+)\s*$|i
+ or $line =~ m|add\s+($ipv4_re/$ipv4_re)\s*$|i) {
### instantiate the blocking rule
&ipt_block($1, '');
- } elsif ($line =~ m|del\s+($ip_re)\s*$|i
- or $line =~ m|del\s+($ip_re/\d+)\s*$|i
- or $line =~ m|del\s+($ip_re/$ip_re)\s*$|i) {
+ } elsif ($line =~ m|del\s+($ipv4_re)\s*$|i
+ or $line =~ m|del\s+($ipv4_re/\d+)\s*$|i
+ or $line =~ m|del\s+($ipv4_re/$ipv4_re)\s*$|i) {
### remove the blocking rule
&ipt_rm_block($1);
}
sub sockwrite_add_ipt_block_ip() {
die "[*] --fw-block-ip takes either an IP or subnet as an argument."
- unless $fw_block_ip =~ /$ip_re/;
+ unless $fw_block_ip =~ /$ipv4_re/;
my $block_ip = '';
my $block_mask = '';
my $block_net = '';
- if ($fw_block_ip =~ m|^\s*($ip_re)\s*$|) {
+ if ($fw_block_ip =~ m|^\s*($ipv4_re)\s*$|) {
$block_ip = $1;
$block_mask = '32';
$block_net = new NetAddr::IP($1);
- } elsif ($fw_block_ip =~ m|^\s*($ip_re)/($ip_re)\s*$|) {
+ } elsif ($fw_block_ip =~ m|^\s*($ipv4_re)/($ipv4_re)\s*$|) {
$block_ip = $1;
$block_mask = $2;
$block_net = new NetAddr::IP($1, $2);
- } elsif ($fw_block_ip =~ m|^\s*($ip_re)/(\d+)\s*$|) {
+ } elsif ($fw_block_ip =~ m|^\s*($ipv4_re)/(\d+)\s*$|) {
$block_ip = $1;
$block_mask = $2;
$block_net = new NetAddr::IP($1, $2);
sub sockwrite_rm_ipt_block_ip() {
die "[*] --fw-rm-block-ip takes an IP/subnet as an argument."
- unless $fw_rm_block_ip =~ /$ip_re/;
+ unless $fw_rm_block_ip =~ /$ipv4_re/;
my $rm_block_ip = '';
my $rm_block_mask = '';
my $rm_block_net = '';
- if ($fw_rm_block_ip =~ m|^\s*($ip_re)\s*$|) {
+ if ($fw_rm_block_ip =~ m|^\s*($ipv4_re)\s*$|) {
$rm_block_ip = $1;
$rm_block_mask = '32';
$rm_block_net = new NetAddr::IP($1);
- } elsif ($fw_rm_block_ip =~ m|^\s*($ip_re)/($ip_re)\s*$|) {
+ } elsif ($fw_rm_block_ip =~ m|^\s*($ipv4_re)/($ipv4_re)\s*$|) {
$rm_block_ip = $1;
$rm_block_mask = $2;
$rm_block_net = new NetAddr::IP($1, $2);
- } elsif ($fw_rm_block_ip =~ m|^\s*($ip_re)/(\d+)\s*$|) {
+ } elsif ($fw_rm_block_ip =~ m|^\s*($ipv4_re)/(\d+)\s*$|) {
$rm_block_ip = $1;
$rm_block_mask = $2;
$rm_block_net = new NetAddr::IP($1, $2);
### file (or update the time if $renewed_status)
for my $line (@tmplines) {
chomp $line;
- if ($line =~ /^\s*($ip_re)\s*$/) { ### old format; update to include time
+ if ($line =~ /^\s*($ipv4_re)\s*$/) { ### old format; update to include time
my $tmpsrc = $1;
push @lines, "$tmpsrc " . $auto_blocked_ips{$tmpsrc};
$skip_src = 1 if $tmpsrc eq $src;
die "[*] Could not open ${file}.tmp: $!";
for my $line (@lines) {
chomp $line;
- if ($line =~ /^\s*($ip_re)/) {
+ if ($line =~ /^\s*($ipv4_re)/) {
print W $line, "\n" unless $src eq $1;
}
}
my @ips = @{&run_command($cmds{'ip'}, 'addr')};
return unless @ips;
for my $line (@ips) {
- if ($line =~ /inet\s+($ip_re)\/\d+\s/) {
+ if ($line =~ /inet\s+($ipv4_re)\/\d+\s/) {
print STDERR "[+] : Adding $1 to local_ips\n" if $debug;
$local_ips{$1} = '';
} elsif ($line =~ /inet6\s(\S+)/) {
my @ips = @{&run_command($cmds{'ifconfig'}, '-a')};
return unless @ips;
for my $line (@ips) {
- if ($line =~ /inet\s+.*?:($ip_re)\s/) {
+ if ($line =~ /inet\s+.*?:($ipv4_re)\s/) {
print STDERR "[+] : Adding $1 to local_ips\n" if $debug;
$local_ips{$1} = '';
} elsif ($line =~ /inet6\s+addr:\s+(\S+)/) {
return [], '' unless $pkt_hr->{$tok} =~ m|$match_hr->{'re'}|;
}
} elsif (defined $match_hr->{'net'} or defined $match_hr->{'ip'}) {
- if ($pkt_hr->{$tok} =~ m|$ip_re|
+ if ($pkt_hr->{$tok} =~ m|$ipv4_re|
or $pkt_hr->{$tok} =~ m|$ipv6_re|) {
my $ip_match_obj = '';
if ($tok eq 'src') {
$search_hsh{'re'} = qr|$1|;
} elsif ($search =~ m|^'(.*?)'$|) {
$search_hsh{'str'} = $1;
- } elsif ($search =~ m|^$ip_re/$ip_re$|) {
+ } elsif ($search =~ m|^$ipv4_re/$ipv4_re$|) {
$search_hsh{'net'} = $search;
- } elsif ($search =~ m|^$ip_re/\d+$|) {
+ } elsif ($search =~ m|^$ipv4_re/\d+$|) {
$search_hsh{'net'} = $search;
- } elsif ($search =~ m|^$ip_re$|) {
+ } elsif ($search =~ m|^$ipv4_re$|) {
$search_hsh{'ip'} = $search;
} else {
die "[*] Unrecognized value for $token";
chomp $line;
if ($line =~ /^\s*(\S+)/) {
my $ip = $1; ### this may be a subnet
- next unless $ip =~ /$ip_re/;
+ next unless $ip =~ /$ipv4_re/;
if ($specific_ip) {
next unless $ip eq $specific_ip;
}
chdir $config{'PSAD_DIR'} or die $!;
SRCIP: for my $src (@files) {
- next SRCIP unless ($src =~ /$ip_re/ and -d $src);
+ next SRCIP unless ($src =~ /$ipv4_re/ and -d $src);
### define as many hash keys as we can (older versions
### of psad don't include several of these files).
my $num_emails = 0;
my %dst_ips;
for my $scan_file (@scan_files) {
next if $scan_file =~ /_whois/; ### may be <src>_whois
- if ($scan_file =~ /($ip_re)/) {
+ if ($scan_file =~ /($ipv4_re)/) {
$dst_ips{$1} = '';
}
}
next unless /\S/;
next if /^\s*#\s*$/;
### Format: <IP> <DL> <total_packets> <uniq_sigs> <sig_matches> <is_local>
- if (/^\s*($ip_re)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d)/) {
+ if (/^\s*($ipv4_re)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d)/) {
my $ip = $1;
my $dl = $2;
my $tot_pkts = $3;
chdir $config{'PSAD_DIR'} or die $!;
SRCIP: for my $src (@files) {
- next SRCIP unless ($src =~ /$ip_re/ and -d $src);
+ next SRCIP unless ($src =~ /$ipv4_re/ and -d $src);
rmtree $src or die
"[*] Could not remove $config{'PSAD_DIR'}/$src: $!";
}
closedir D;
IPDIR: for my $file (@files) {
- if ($file =~ /$ip_re/ and -d $file) {
+ if ($file =~ /$ipv4_re/ and -d $file) {
### check for the danger level associated with this dir
if (-e "$file/danger_level") {
open F, "< $file/danger_level" or next IPDIR;
chdir $config{'PSAD_DIR'} or die $!;
for my $ipdir (@ipdirs) {
- if ($ipdir =~ /$ip_re/ and -d $ipdir) {
+ if ($ipdir =~ /$ipv4_re/ and -d $ipdir) {
opendir IP, $ipdir or die $!;
my @scanfiles = readdir IP;
closedir IP;
my @ifconfig_out = @{&run_command($cmds{'ip'}, 'addr')};
if (@ifconfig_out) {
for (@ifconfig_out) {
- s/$ip_re/x.x.x.x/g;
+ s/$ipv4_re/x.x.x.x/g;
s/inet6\s+\S+/inet6 (removed)/;
print $fh $_;
}
my @ifconfig_out = @{&run_command($cmds{'ifconfig'}, '-a')};
if (@ifconfig_out) {
for (@ifconfig_out) {
- s/$ip_re/x.x.x.x/g;
+ s/$ipv4_re/x.x.x.x/g;
s/inet6\s+addr:\s+\S+/inet6 addr: (removed)/;
print $fh $_;
}
### always include 0.0.0.0/0
$line =~ s|0\.0\.0\.0/0|___PsAd0Net___|g;
$line =~ s|0\.0\.0\.0|___PsAd0IP___|g;
- $line =~ s|($ip_re/\d+)|x.x.x.x/x|g;
- $line =~ s|($ip_re)|x.x.x.x|g;
+ $line =~ s|($ipv4_re/\d+)|x.x.x.x/x|g;
+ $line =~ s|($ipv4_re)|x.x.x.x|g;
$line =~ s|___PsAd0Net___|0.0.0.0/0|g;
$line =~ s|___PsAd0IP___|0.0.0.0|g;
}