Infrastructure Machines: Difference between revisions

From JCWiki
Jump to navigation Jump to search
 
(129 intermediate revisions by 12 users not shown)
Line 3: Line 3:
== jail1 ==
== jail1 ==


* Location: castle, cab 3-
* Location: castle, SHUTDOWN
* OS: FreeBSD x86
* OS: FreeBSD 6.2 i386
* Networking: Priv IP: 10.1.4.101, Pub IP: 69.55.2 1 onboard and 1 PCI
* Networking: Priv IP: 10.1.4.101 (PCI nic), Pub IP: 69.55.230.107 (onboard)
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: two 36 GB (2 x 36GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
* Drives: two 74 GB (4 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
* Remote management: none
* Disk accounting: gvinum


== jail2 ==
== jail2 ==


* Location: castle, cab 3-
* Location: castle, cab 6-16
* OS: FreeBSD x86
* OS: FreeBSD 7.2 amd64
* Networking: Priv IP: 10.1.4., Pub IP: 69.55.2 1 onboard and 1 PCI
* Networking: Priv IP: 10.1.4.102, Pub IP: 69.55.228.53 (2 onboard nics)
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: two  GB (2 x GB) RAID1 arrays running on an LSI-based, Dell-branded (perc) RAID card.
* Drives: one 146 GB (2 x 146GB) RAID1 array, two 300 GB (4 x 300GB) RAID1 arrays running on an LSI-based, Dell-branded (PERC 6/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.232
* Disk accounting: md


== jail3 ==
* Location: I2b  SHUTDOWN
* OS: FreeBSD 8.3 amd64
* Networking: Priv IP: 10.1.2.103, Pub IP: 69.55.229.7 (2 onboard nics)
* Hardware: Supermicro (custom build). 6 SATA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 300 GB (2 x 300GB) RAID1 array running on a 3ware 8006-2LP RAID card.
* Remote management: none
* Disk accounting: md


=== Notes ===
* '''We should not add users to this server since it is at I2B'''
* must be ssh'd to from nat2
* is a super jail for customer col01737


== jail4 ==


* Location: castle, cab 3-
* Location: castle, cab 6-17
* OS: FreeBSD x86
* OS: FreeBSD 9.1 x86_64
* Networking: Priv IP: 10.1.4., Pub IP: 69.55.2 1 onboard and 1 PCI
* Networking: Priv IP: 10.1.4.104, Pub IP: 69.55.228.104 (2 onboard nics)
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Hardware: Dell 2850. 6 x 300GB SCSI drives (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 36 GB (2 x 36GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
* CPU:  2 x Intel(R) Xeon(TM) CPU 2.80GHz (8 virtual CPUs)
* RAM:  16 GB ( 4 x 4GB Reg ECC )
* Drives: one 1.4 TB RAID 5 array (6 x 300GB SCSI) Dell-branded (PERC 4e)LSI megarc RAID card.
* Remote management: None
* Disk accounting: md


= virts =


= mail =
=== Notes ===
== Summary ==
Only FreeBSD 9.1 jail
This machine (mail) is the swiss army knife of the company, playing host to many services and functions.  
Not upgraded to FBSD 9.2 or 9.3 because too many libraries modified (would require customers to rebuild apps).


* Location: castle, cab 3-8
== jail5 ==
* OS: FreeBSD 4.10 x86
* Networking: Priv IP: 10.1.4.5, Pub IPs: 69.55.230.2, 69.55.225.225 (ns1c jail), 69.55.230.9. 1 onboard and 1 PCI
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 36 GB (2 x 36GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.


== Services Provided ==
* Location: castle, cab 3-6
* mail
* OS: FreeBSD 10.1 x86_64
* web
* Networking: Priv IP: 10.1.4.105, Pub IP: 69.55.230.105 (2 onboard nics)
* mysql
* Hardware: Supermicro JC-14004 - Intel S1200BTL motherboard - 6 SATA/SAS drive bays (2 colums of 3), Dual power supply.
* bigbrother server/pager
* CPU:  1 x Intel(R) Xeon(TM) E3-1230 V2 CPU 3.30 GHz (8 virtual CPUs)
* snmp
* RAM:  32 GB ( 4 x 8GB ECC )
* Drives: 1x80 GB SATA SSD on motherboard + one 2.6 TB RAID 5 array 4x1 TB + 3ware 9650 RAID card.
* Remote management: Intel RMM 4 - 10.1.4.235
* Disk accounting: md


== email ==
=== Notes ===
This server hosts mail for johncompanies.com (mail.johncompanies.com). Sendmail 8.13.6/8.13.6 is listening on 69.55.230.2 port 25 for incoming mail. Relaying is allowed per /etc/mail/relay-domains
Only FreeBSD 10.1 jail used for bhyve virtuals.
Other addresses (aliases) are defined per /etc/mail/aliases


The following active users have mail hosted on this server:
Use ~+Ctrl-D to disconnect from console (vm attach colXXXXX).
* dave
* linux
* support
* payments
* sales
* tech1
* info


Traditionally, mail is checked via shell apps (pine). qpopper (pop3s) is running to allow mail downloading. Checking mail in this way causes an opened INBOX in pine to lock read-only. For this reason, we tee incoming mail to support and linux to tech1.
== jail6 ==


Procmail rules are setup to filter spam and send text messages. They are enabled for info, support, linux, tech1, dave and can be found in ~/Procmail/, for example:
* Location: castle, cab 6-16
<pre># more ~support/Procmail/rc.emergency
* OS: FreeBSD 10.3 x86_64
:0c # use c only if you want to forward a copy and file the original later
* Networking: Priv IP: 10.1.4.106, Pub IP: 69.55.230.106 (2 onboard nics)
* ^Subject:.*\<emergency\>
* Hardware: Supermicro JC-14004 - Intel S1200BTL motherboard - 6 SATA/SAS drive bays (2 colums of 3), Dual power supply.
* ! ^Subject:\<re\>
* CPU: 1 x Intel(R) Xeon(TM) E3-1230 V2 CPU 3.30 GHz (8 virtual CPUs)
  {
* RAM: 32 GB ( 4 x 8GB ECC )
  :0h
* Drives: one 2.7 TB ZFS RAID 6 array 5x1 TB
  FROMANDSUBJECT=|formail -XFrom: -XSubject:
* Remote management: Intel RMM 4 - 10.1.4.236
* Disk accounting: zfs


  :0fwh
== jail7 ==
  | /usr/local/bin/formail -I"Subject: " -I"To: pager@johncompanies.com" ; echo $FROMANDSUBJECT ; echo


  :0
* Location: castle, cab 3-5  SCHEUDLED SHUTDOWN 9/30/19
  ! -t
* OS: FreeBSD 6.3 i386
  }
* Networking: Priv IP: 10.1.4.107, Pub IP: 69.55.230.108 (2 onboard nics)
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 146 GB (4 x 146GB) RAID1 arrays, one 74 GB (2 x 74GB) RAID1 array running on an LSI-based, Dell-branded (PERC 6/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.237
* Disk accounting: gvinum


</pre>
=== Notes ===
Do not run a verify while OS/jails running, will crash.


control: <tt>cd /etc/mail; make stop</tt> (stop), <tt>cd /etc/mail; make start</tt> (start)
== jail8 ==


The following aliases are also in place:
* Location: castle, cab 3-6
* OS: FreeBSD 8.0 amd64
* Networking: Priv IP: 10.1.4.108, Pub IP: 69.55.234.2 (2 onboard nics)
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: one 146 GB (2 x 146GB) RAID1 array, one 300 GB (2 x 300GB) RAID1 array, one 400 GB (2 x 400GB) RAID1 array, running on an LSI-based, Dell-branded (PERC 6/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.238
* Disk accounting: md


<pre>debian:        linux
jobs:  info
careers:        info
#reboot:        6128102202@txt.att.net
#reboot:        8582298897@vtext.com
reboot:        pager
#pager: 8582298897@vtext.com
pager:  4158718324@txt.att.net
tech1on:  "| /usr/local/sbin/tech1on.sh"
tech1off:  "| /usr/local/sbin/tech1off.sh"</pre>


To change them, edit <tt>/etc/aliases</tt> and then run <tt>newaliases</tt>
== jail9 ==


Note on tech1: this address was setup as a read-only address to be mirrored on all email coming into support and linux. We set this up so we could easily check support mail via a pop client- popping email locks out the user in pine so checking support/linux directly via pop was not an option. When checking and responding to email that comes into tech1, care should be taken to make sure it is sent as/under an address other than tech1. This is cause tech1 is not monitored by support staff as closely as email to support/linux. Further, the tech on call may not be checking tech1. Lastly, because of the nature of the copying, you will sometimes notice certain automated email/notices are received 2x in support- this is because of/related to the tech1 mirror.
* Location: castle, cab 3-6
* OS: FreeBSD 8.2 amd64
* Networking: Priv IP: 10.1.4.109, Pub IP: 69.55.232.36 (2 onboard nics)
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: one 146 GB (2 x 146GB) RAID1 array, one 400 GB (2 x 300GB) RAID1 array running on an LSI-based, Dell-branded (PERC 5/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.239
* Disk accounting: md


To enable it (on mail, run):


<tt>~support/tech1on.sh</tt>
== jail11 ==


To disable
* Location: castle, cab 3-7
* OS: FreeBSD 4.7 i386
* Networking: Priv IP: 10.1.4.111 (PCI nic), Pub IP: 69.55.236.92 (onboard)
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 74 GB (4 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
* Remote management: none
* Disk accounting: vinum


<tt>~support/tech1off.sh</tt>


Or via email:
== mx1 ==


<tt>tech1on@johncompanies.com
* Location: castle, SHUTDOWN AND SCRAPPED
tech1off@johncompanies.com</tt>
* OS: FreeBSD 4.11 i386
* Networking: Priv IP: 10.1.4.201 (PCI nic), Pub IP: 69.55.237.3 (onboard)
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: one 36 GB (2 x 36GB) RAID1 array, one 74 GB (2 x 74GB) RAID1 array running on an Adaptec-based, Dell-branded (perc) RAID card.
* Remote management: none
* Disk accounting: vinum


== web ==  
=== Notes ===
* is our (old) backup mail/dns vps service host


See [[Management_System_/_Public_Website_/_Signup|Management System / Public Website / Signup]]
== mx2 ==


== mysql ==
* Location: castle, SHUTDOWN AND SCRAPPED
mysql 4.1.22 is running on port 3306
* OS: FreeBSD 7.1 i386
* Networking: Priv IP: 10.1.4.202 (PCI nic), Pub IP: 69.55.237.90 (onboard)
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: two 74 GB (4 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
* Disk accounting: gvinum


* datadir: <tt>/mnt/data1/db/mysql/</tt>
=== Notes ===
* config: <tt>/etc/my.cnf</tt>
* is our latest backup mail/dns vps service host
* database: <tt>jc</tt>
* control: <tt>/usr/local/etc/rc.d/mysql-server.sh stop</tt> (stop), <tt>/usr/local/etc/rc.d/mysql-server.sh start</tt> (start)


== bigbrother ==
== jail17 ==
There is a client running on mail (which monitors the services running on mail and mail itself), installed under <tt>/usr/home/bb/bbc1.9e-btf</tt><br>
* Location: castle, cab 3-7
And the big brother pager/server (which displays information gathered from all bb-monitored machines, including mail) is installed under <tt>/usr/home/bb/bbsrc/bb1.9i-btf</tt>
* OS: FreeBSD 4.10 i386
* Networking: Priv IP: 10.1.4.117 (PCI nic), Pub IP: 69.55.228.2 (onboard nics)
* Hardware: Supermicro (custom build). 6 SCA SCSI drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 74 GB (4 x 74GB) RAID1 arrays, one 146 GB (2 x 146GB) RAID1 array, running on an Adaptec 2120S  RAID card.
* Remote management: none
* Disk accounting: vinum
* Host of devweb.johncompanies.com and www.utopian.com/mail.utopian.com


Both are running under the user <tt>bb</tt>
== jail18 ==
* Location: castle, cab 3-5  SCHEDULED SHUTDOWN 9/30/19
* OS: FreeBSD 4.10 i386
* Networking: Priv IP: 10.1.4.118 (PCI nic), Pub IP: 69.55.228.2 (onboard nics)
* Hardware: Supermicro (custom build). 6 SCA SCSI drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 74 GB (4 x 74GB) RAID1 arrays, one 146 GB (2 x 146GB) RAID1 array, running on an Adaptec 2120S  RAID card.
* Remote management: none
* Disk accounting: vinum
* Host of ns2c.johncompanies.com (now on ns2c.johncompanies.com on ganeti)


Refer to [[BigBrother]] for more about use.
== jail19 ==
* Location: castle, cab 3-5  SCHEDULED SHUTDOWN 9/30/19
* OS: FreeBSD 6.1 i386
* Networking: Priv IP: 10.1.4.119 (PCI nic), Pub IP: 69.55.228.200 (onboard nics)
* Hardware: Supermicro (custom build). 6 SCA SCSI drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: one 74 GB (2 x 74GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an Adaptec 2120S  RAID card.
* Remote management: none
* Disk accounting: gvinum


== DNS (ns1c.johncompanies.com) ==
= virts =
ns1c is a jail running on the mail server, who's IP is 69.55.225.225


It's running from <tt>/mnt/data1/ns1c-dir</tt>
== quar1 ==


See [[DNS]] for more details
* Location: castle, SHUTDOWN AND SCRAPPED
* OS: RedHat 7.3 x86
* Networking: Priv IP: 10.1.4.151 (PCI nic), Pub IP: 69.55.227.2 (onboard nic)
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: one 36 GB (2 x 36GB) RAID1 array, one 74 GB (2 x 74GB) RAID1 array, running on an Adaptec-based, Dell-branded (perc) RAID card.
* Remote management: none
* Virtuozzo version: 2.6.1
* VZ license: hwid=23C0.C0E1.6FDD.08BA.8971.8E1C.EBD5.1EDC serial=0DE6.903E.E239.E23F.470C.4369.4104.A5A4


== Usage and Notes ==
=== Notes ===
* always mounted to backup1 and backup2 via nfs:
* used to be the home of customers who's VE's would just run out of control/badly
<pre>backup2:/mnt/data1 on /backup (nfs)
* has a max of 10 VE's allowed to run
backup2:/mnt/data2 on /backup2 (nfs)
backup2:/mnt/data3 on /backup3 (nfs)
backup2:/mnt/data4 on /backup4 (nfs)
backup1:/data on /backup1 (nfs)
</pre>


== Cronjobs ==
== virt9 ==
* * * * * /usr/local/www/mgmt/mrtg/mrtg.sh > /dev/null 2>&1
Gathers up data for our mrtg/load graphs


*/5 * * * * /usr/local/bin/rsync -a root@nat2:/mnt/data1/mrtg/data/ /usr/local/www/mgmt/mrtg/data/
* Location: castle, cab 3-7
Gathers up data from i2b servers for our mrtg/load graphs
* OS: RedHat 7.3 x86
* Networking: Priv IP: 10.1.4.59 (PCI nic), Pub IP: 69.55.226.161 (onboard nic)
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: two 74 GB (2 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
* Remote management: none
* Virtuozzo version: 2.6.1
* VZ license: hwid=BC15.B4D6.0D25.A5FE.F3BA.D518.E351.AE3F serial=F6AD.B6B4.5650.8869.C97C.73EE.AF65.FA8B


40 0 * * * /usr/local/bin/rsync -a root@nat2:"/mnt/data1/mrtg/*.cfg" /usr/local/www/mgmt/mrtg
Gathers up mrtg configuration (port names) from i2b switches for our mrtg/load graphs


41 0 * * * for f in `grep -l "mnt\/data1" /usr/local/www/mgmt/mrtg/switch-p*.cfg`; do cat $f | sed s#\/mnt\/data1#\/usr\/local\/www\/mgmt# > $f.new; mv $f.new $f; done
== virt11 ==
Gathers up mrtg configuration (port names) from castle switches for our mrtg/load graphs


1 0 1 * * cp /usr/local/www/mgmt/html/top20ip /usr/local/www/mgmt/html/top20ip_last
* Location: castle, cab 3-6
1 0 1 * * cp /usr/local/www/mgmt/html/top20customers /usr/local/www/mgmt/html/top20customers_last
* OS: CentOS 5.4 x86
2 * * * * /usr/local/www/cronjobs/top20ip.pl > /dev/null 2>&1
* Networking: Priv IP: 10.1.4.61, Pub IP: 69.55.238.3, 2 onboard nics
15 * * * * /usr/local/www/cronjobs/top20customer.pl > /dev/null 2>&1
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
1 0 1 * * rm /usr/local/www/mgmt/html/bandtrack
* Drives: one 146 GB (2 x 146GB) RAID1 array, one 400 GB (2 x 400GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an LSI-based, Dell-branded (perc 6/i) RAID card.
Archiving and generation of bandwidth statistics presented in mgmt -> Reference -> Bandwidth
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.211
* Virtuozzo version: 4.0.0
* VZ license: hwid="029D.A187.78E1.480F.49E3.E20A.7389.7F79" serial="163C.F3E2.195F.96B5.2D38.8937.9600.4A05"  key_number="VZ.00172378.0006"
  vzlicload -p A40R00-D8CS00-5D8817-A2RB23-8Y9J78


1 0 * * * /usr/local/etc/rsync.backup
== virt12 ==
Nightly backup script


0 1 * * * /usr/local/www/mgmt/awstats/wwwroot/cgi-bin/awstats.pl -config=jcpub -update
* Location: castle, cab 3-7
Public web traffic stats
* OS: CentOS 5.2 x86
* Networking: Priv IP: 10.1.4.62, Pub IP: 69.55.227.70, 2 onboard nics
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: two 300 GB (2 x 300GB) RAID1 arrays one 400 GB (2 x 400GB) RAID1 array, running on an LSI-based, Dell-branded (perc 6/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.212
* Virtuozzo version: 4.0.0
* VZ license: hwid="0C53.A413.E095.B4F4.51BC.D740.6919.A77B" serial="84E5.9498.3759.E683.E24B.2514.CA72.DC31"


15 0 * * * rm /usr/local/www/mgmt/bwgraphs/*.png
== virt13 ==
16 0 * * * rm /usr/local/www/am/bwgraphs/*
Cleanup for graph-related temp data generated by customers using the bandwidth reports via the AM


  10 0 1 * * /usr/local/www/cronjobs/monthly_bandwidth_report.pl
* Location: castle, cab 6-17
Monthly bandwidth overage report
* Switch port: P13-
* OS: CentOS 6.2 x86_64
* Networking: Priv IP: 10.1.4.63, Pub IP: 69.55.226.2, 2 onboard nics
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* CPU:    2 x Intel(R) Xeon(R) CPU E5420  @ 2.50GHz  (8 virtual cores)
* RAM:    32 GB (8 x 4GB DDR2 FB-DIMM ECC 667MHz)
* Drives: one 146 GB (2 x 146GB) RAID1 array, one 600 GB (2 x 600GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an LSI-based, Dell-branded (perc 6/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.213
* Virtuozzo version: 4.7.0
* VZ license: hwid="7D07.93BE.0B1F.7D2B.B039.4B5B.48B6.453B" serial="60A4.A94C.44BB.DCD6.8D03.1778.605B.10FE"


*/3 * * * * /usr/local/www/cronjobs/bbcheck.pl
=== Notes ===
Updates mgmt with bb monitoring issues
* home to our latest/current signups
* currently the only 64bit vz host


5 0 * * * /usr/local/www/cronjobs/shutdownreminder.pl
== virt14 ==
Emails customers reminding them of upcoming shutdown date


  7 0 * * * /usr/local/www/cronjobs/invoice_email.pl
* Location: castle, cab 6-16
Emails customers who have invoices and are set to auto-email (currently no customer gets these)
* Switch Port: p13-
* OS: CentOS 6.4 x86_64
* Networking: Priv IP: 10.1.4.64 Pub IP: 69.55.225.14 2 onboard nics
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* CPU: 2 x Xeon 5140 Dual Core @ 2.33GHz (4 virtual CPUs)
* RAM: 32 GB (8 x 4GB Reg ECC)
* Drives: one 146 GB (2 x 146 GB SAS) RAID1 array, and one 1TB RAID1 array (2 x 1 TB SATA), running on an LSI-based, Dell-branded (perc 5/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.214
* Virtuozzo version: 4.7.0
* VZ license: hwid="EA32.2CA0.2368.F5FC.DFBE.6724.5AC0.8ED0" serial="DA0D.F464.0BCE.35B8.C0C0.28B6.D921.F3FD" key_number="VZ.02634184.0070"
* Activation Key="A00E00-A0WC02-W1A863-482N41-BQAY84"
=== Notes ===
* our latest virt
* Temp server to offload Virt13 till we can get a Cloud going.
* virt 13 and 14 currently the only 64bit vz hosts


8 */4 * * * /usr/local/www/cronjobs/mysqlrepchk.pl
== virt15 ==
Checking that we are properly replicating (mysql) traffic data from bwdb to backup1


16 0 1 * * /usr/local/www/cronjobs/purge_traffic.pl
* Location: SHUTDOWN
Removed old traffic data from the traffic database (running on backup1)
* OS: RedHat 9 x86
* Networking: Priv IP: 10.1.4.65, Pub IP: 69.55.232.160 (2 onboard nics)
* Hardware: Supermicro (custom build). 6 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: one 74 GB (2 x 74GB) RAID1 array, two 146 GB (2 x 146GB) RAID1 arrays, running on an LSI MegaRAID SCSI 320-1 RAID card.
* Remote management: none
* Virtuozzo version: 2.6.2
* VZ license: hwid=A90F.6F48.E723.D8BA.3025.184A.5B73.D11E serial=E94B.5164.C1E6.A67F.67D1.7D96.0B6C.5524


*/5 * * * * chmod 0700 /usr/local/www/ccard_orders/* && mv /usr/local/www/ccard_orders/* /usr/local/www/ccard_orders/done
== virt16 ==
Secure credit card data: set root-read-only


25 0 * * * /usr/local/www/cronjobs/biller.pl
* Location: castle, cab 3-7
Enters service charges in customer billing ledgers
* OS: Fedora Core 4 x86
* Networking: Priv IP: 10.1.4.66, Pub IP: 69.55.232.2 (2 onboard nics)
* Hardware: Supermicro (custom build). 6 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: one 74 GB (2 x 74GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an LSI MegaRAID SCSI 320-1 RAID card.
* Remote management: none
* Virtuozzo version: 3.0.0
* VZ license: hwid=DEFA.A325.7230.BBC8.9715.8B52.3FD7.27BE serial=66C0.41EA.3FBB.11D3.9CC6.55C7.09AE.14AB


10 13 * * * /usr/local/www/cronjobs/pfp_batch_gather.pl
Looks for customers with balance due and active credit card on file, prepares a payflow batch


10 14 * * * /usr/local/www/cronjobs/pfp_batch_process.pl
== virt17 ==
Tries to collect ccard funds for items in payflow batch - communicates with payflow


15 13 * * * /usr/local/www/cronjobs/pb_batch_gather.pl
* Location: castle, cab 3-6
Looks for customers with balance due and active paypal billing agreement on file, prepares a paypal batch
* OS: CentOS 4.4 x86
 
* Networking: Priv IP: 10.1.4.67, Pub IP: 69.55.232.162, 2 onboard nics
15 14 * * * /usr/local/www/cronjobs/pb_batch_process.pl
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
Tries to collect paypal funds for items in paypal batch - communicates with paypal
* Drives: two 146 GB (2 x 146GB) RAID1 arrays running on an LSI-based, Dell-branded (perc 5/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.217
* Virtuozzo version: 3.0.0
* VZ license: hwid=2E14.AED9.70B8.C26E.D99F.B0D3.BCD2.229C serial=2A11.DAD0.61DB.E889.8DF4.9AF7.CF82.3C37


0 7 * * 1 /usr/local/www/cronjobs/email_pmt_reminder.pl
Emails customers in arrears, reminding them to pay


0 0 1 * * /usr/bin/mail -s 'archive sent mail in pine' support@johncompanies.com < /dev/null
== virt19 ==
Reminds us to archive sent mail


0 3 * * * /usr/local/bin/rsync -a isys.e-monitoring.net:/var/mail /backup2/isys; /usr/local/bin/rsync -a isys.e-monitoring.net:/usr/home /backup2/isys
* Location: castle, cab 3-6
Backup data on isys
* OS: CentOS 5.2 x86
* Networking: Priv IP: 10.1.4.69, Pub IP: 69.55.236.2, 2 onboard nics
* Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: one 146 GB (2 x 146GB) RAID1 array, one 300 GB (2 x 300GB) RAID1 array, running on an LSI-based, Dell-branded (perc 5/i) RAID card.
* Remote management: [[DRAC/RMM|DRAC]] @ 10.1.4.219
* Virtuozzo version: 3.0.0
* VZ license: hwid=3968.13F7.B2AC.8952.8E19.13A9.6EF5.5822 serial=061D.84CD.CCE5.B213.15B5.C061.D6A7.B034


== Regular maintenance ==
= mail =
*[[Routine_Maintenance#Adaptec_Controllers|Check RAID array]]
 
= nat =
== Summary ==
== Summary ==
This is the main machine to which we ssh and runs all our screen sessions. Further, it's ip runs in a special block which is not routed through the firewall and this is somewhat immune to DoS attacks which hobble our firewall. Lastly, it acts as a nat server for certain/random devices on the private network.
This machine (mail) is the swiss army knife of the company, playing host to many services and functions.  


* Location: castle, cab 3-7
* Location: castle, cab 3-7
* OS: FreeBSD 4.10 x86
* OS: FreeBSD 4.10 x86
* Networking: Priv IP: 10.1.4.1, Pub IPs: 69.55.233.195, 69.55.233.196, 69.55.233.197, 69.55.233.198, 69.55.233.199. 1 onboard and 1 PCI
* Networking: Priv IP: 10.1.4.5, Pub IPs: 69.55.230.2, 69.55.225.225 (ns1c jail), 69.55.230.9. 1 onboard and 1 PCI
* Hardware: Custom 1U. single power supply.  
* Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: one 8 GB IDE drive
* Drives: two 36 GB (2 x 36GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.


== Services Provided ==
== Services Provided ==
* nat
* mail
* web
* mysql
* bigbrother server/pager
* snmp
* named in a jail (ns1c)
 
== email ==
This server hosts mail for johncompanies.com (mail.johncompanies.com). Sendmail 8.13.6/8.13.6 is listening on 69.55.230.2 port 25 for incoming mail. Relaying is allowed per /etc/mail/relay-domains
Other addresses (aliases) are defined per /etc/mail/aliases
 
The following active users have mail hosted on this server:
* dave
* linux
* support
* payments
* sales
* tech1
* info


== nat control ==
Traditionally, mail is checked via shell apps (pine). qpopper (pop3s) is running to allow mail downloading. Checking mail in this way causes an opened INBOX in pine to lock read-only. For this reason, we tee incoming mail to support and linux to tech1.
All rules are contained in and look like:


<pre>cat /etc/ipnat.rules
Procmail rules are setup to filter spam and send text messages. They are enabled for info, support, linux, tech1, dave and can be found in ~/Procmail/, for example:
# www (was 69.55.230.12)
<pre># more ~support/Procmail/rc.emergency
# virt19
:0c # use c only if you want to forward a copy and file the original later
#bimap fxp0 10.1.4.209/32 -> 69.55.233.198/32
* ^Subject:.*\<emergency\>
# virt18
* ! ^Subject:\<re\>
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32
  {
# virt13
  :0h
#bimap fxp0 10.1.4.213/32 -> 69.55.233.196/32
  FROMANDSUBJECT=|formail -XFrom: -XSubject:
# virt12
 
#bimap fxp0 10.1.4.212/32 -> 69.55.233.196/32
  :0fwh
# virt17
  | /usr/local/bin/formail -I"Subject: " -I"To: pager@johncompanies.com" ; echo $FROMANDSUBJECT ; echo
bimap fxp0 10.1.4.217/32 -> 69.55.233.196/32
# virt11
#bimap fxp0 10.1.4.211/32 -> 69.55.233.196/32
# ASA
#bimap fxp0 10.1.4.172/32 -> 69.55.233.196/32
# P1A
bimap fxp0 10.1.4.240/32 -> 69.55.233.197/32
#bimap fxp0 10.1.4.238/32 -> 69.55.233.197/32
# developer (was 69.55.230.17)
# jail2
#bimap fxp0 10.1.4.232/32 -> 69.55.233.198/32
# jail8
#bimap fxp0 10.1.4.238/32 -> 69.55.233.198/32
# jail9
#bimap fxp0 10.1.4.239/32 -> 69.55.233.198/32
# POLL
#BIMAP EM0 10.1.6.134/32 -> 69.55.230.20/32
# 1U SUN
#BIMAP EM0 10.1.4.4/32 -> 69.55.227.46/32
# ??
#BIMAP EM0 10.1.6.3/32 -> 69.55.230.100/32
# random machine
#bimap fxp0 10.1.6.13/32 -> 69.55.233.199/32
#bimap fxp0 10.1.4.232/32 -> 69.55.233.199/32
# OFFICE OUTBOUND TRAFFIC
#map fxp0 10.1.6.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
#map fxp0 10.1.6.0/24 -> 0.0.0.0/32</pre>


A simple entry looks like:
  :0
bimap fxp0 10.1.4.240/32 -> 69.55.233.197/32
  ! -t
Which essentially means make private IP 10.1.4.240 reachable on 69.55.233.197 and allow 10.1.4.240 to communicate with the public internet via 69.55.233.197
  }


To reload new rule config:
</pre>
ipnat -C -F -f /etc/ipnat.rules


You may want to setup natting, as above, when you need to reach a DRAC card's web interface, wherin the DRAC card only has a private IP.
control: <tt>cd /etc/mail; make stop</tt> (stop), <tt>cd /etc/mail; make start</tt> (start)


= nat2 =
The following aliases are also in place:
== Summary ==
This is the main machine to which we ssh and runs all our screen sessions at i2b, and runs ns3c (this is kind of the what mail is to castle). Further, it's ip runs in IP space provided by i2b: 66.181.18.1 - 66.181.18.30, which is not routed through the firewall and this is somewhat immune to DoS attacks which hobble our firewall. Lastly, it acts as a nat server for certain/random devices on the private network.


* Location: i2b, cab 6
<pre>debian:         linux
* OS: FreeBSD 6.4 x86
jobs:   info
* Networking: Priv IP: 10.1.2.1, Pub IPs: 69.55.229.2, 69.55.229.3, 66.181.18.4, 66.181.18.5, 66.181.18.6, 66.181.18.7, 66.181.18.8, 66.181.18.9, 66.181.18.10, 66.181.18.11, 66.181.18.12, 66.181.18.13, 66.181.18.14 1 onboard and 1 PCI
careers:       info
* Hardware: Custom 2U. 6 drive bays, non-hot-swappable. single power supply.  
#reboot:         6128102202@txt.att.net
* Drives: one 150 GB (2 x 150GB) RAID1 array running on a 3ware 8006 RAID card.
#reboot:        8582298897@vtext.com
reboot:        pager
#pager: 8582298897@vtext.com
pager:  4158718324@txt.att.net
tech1on: "| /usr/local/sbin/tech1on.sh"
tech1off: "| /usr/local/sbin/tech1off.sh"</pre>


== Services Provided ==
To change them, edit <tt>/etc/aliases</tt> and then run <tt>newaliases</tt>
* nat
* bigbrother
* ns3c (jail)
* ntp


== nat config ==
Note on tech1: this address was setup as a read-only address to be mirrored on all email coming into support and linux. We set this up so we could easily check support mail via a pop client- popping email locks out the user in pine so checking support/linux directly via pop was not an option. When checking and responding to email that comes into tech1, care should be taken to make sure it is sent as/under an address other than tech1. This is cause tech1 is not monitored by support staff as closely as email to support/linux. Further, the tech on call may not be checking tech1. Lastly, because of the nature of the copying, you will sometimes notice certain automated email/notices are received 2x in support- this is because of/related to the tech1 mirror.
Here's what's currently nat'd on nat2:
<pre>cat /etc/ipnat.rules
# sample entry
#ATS-9
bimap em0 10.1.2.79/32 -> 66.181.18.14/32
#ATS-8
bimap em0 10.1.2.78/32 -> 66.181.18.13/32
#ATS-7
bimap em0 10.1.2.77/32 -> 66.181.18.12/32
#ATS-6
bimap em0 10.1.2.76/32 -> 66.181.18.6/32
#ATS-5
bimap em0 10.1.2.75/32 -> 66.181.18.7/32
#ATS-4
bimap em0 10.1.2.74/32 -> 66.181.18.8/32
#ATS-3
bimap em0 10.1.2.73/32 -> 66.181.18.9/32
#ATS-2
bimap em0 10.1.2.72/32 -> 66.181.18.10/32
#ATS-1
bimap em0 10.1.2.71/32 -> 66.181.18.11/32
#bwdb2
bimap em0 10.1.2.4/32 -> 66.181.18.5/32


# spare
To enable it (on mail, run):
 
<tt>~support/tech1on.sh</tt>
 
To disable


map em0 10.1.2.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
<tt>~support/tech1off.sh</tt>


#bimap fxp0 10.1.6.49/32 -> 10.1.1.2/32
Or via email:
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32
</pre>


== build ==
<tt>tech1on@johncompanies.com
tech1off@johncompanies.com</tt>


* partition map:
== IP Blocking ==
<pre>/ 512m
swap 1G
/var 256m
/tmp 256m
/usr 5g
/mnt/data1 ~</pre>


* edit /etc/make.conf
<pre>
<pre>echo "WITHOUT_X11=yes \
01000 deny ip from 188.92.72.5 to any
KERNCONF=nat2 \
01003 deny ip from any to 122.49.31.50
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf</pre>
01004 deny ip from 122.49.31.50 to any
01014 deny ip from 74.208.225.225 to any
01015 deny ip from any to 216.243.118.35
01016 deny ip from 216.243.118.35 to any
01017 deny ip from any to 216.243.118.36
01018 deny ip from 216.243.118.36 to any
01020 deny ip from 112.215.0.0/18 to any  2014-08-13 Blocked PT Excelcomindo Pratama (Indonesia) for fradulent credit card attempts
01020 deny ip from 112.215.64.0/20 to any  2014-08-13 Blocked PT Excelcomindo Pratama (Indonesia) for fradulent credit card attempts
01022 deny ip from 120.168.0.0/24 to any  2014-08-13 Blocked Indosat 3G Broadband (Indonesia) for fradulent credit card attempts
01022 deny ip from 120.175.213.0/24 to any 2014-08-13 Blocked Indosat 3G Broadband (Indonesia) for fradulent credit card attempts


* add settings to /boot/loader.conf and /boot.config
</pre>


<pre>echo "-Dh" >> /boot.config
== web ==


echo 'console="comconsole,vidconsole" \
See [[Management_System_/_Public_Website_/_Signup|Management System / Public Website / Signup]]
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf</pre>


* turn off all ttyv's except 0 and 1 in /etc/ttys
== mysql ==
also turn on ttyd0, change type to vt100:
mysql 4.1.22 is running on port 3306
<pre>vi /etc/ttys


ttyv2  "/usr/libexec/getty Pc"        cons25  off secure
* datadir: <tt>/mnt/data1/db/mysql/</tt>
ttyv3  "/usr/libexec/getty Pc"        cons25  off secure
* config: <tt>/etc/my.cnf</tt>
ttyv4  "/usr/libexec/getty Pc"        cons25  off secure
* database: <tt>jc</tt>
ttyv5  "/usr/libexec/getty Pc"        cons25  off secure
* control: <tt>/usr/local/etc/rc.d/mysql-server.sh stop</tt> (stop), <tt>/usr/local/etc/rc.d/mysql-server.sh start</tt> (start)
ttyv6  "/usr/libexec/getty Pc"        cons25  off secure
ttyv7  "/usr/libexec/getty Pc"        cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0  "/usr/libexec/getty std.9600"  vt100  on  secure


kill -1 1</pre>
== bigbrother ==
There is a client running on mail (which monitors the services running on mail and mail itself), installed under <tt>/usr/home/bb/bbc1.9e-btf</tt><br>
And the big brother pager/server (which displays information gathered from all bb-monitored machines, including mail) is installed under <tt>/usr/home/bb/bbsrc/bb1.9i-btf</tt>


on console server:
Both are running under the user <tt>bb</tt>
vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console


Refer to [[BigBrother]] for more about use.


* populate hosts
== DNS (ns1c.johncompanies.com) ==
<pre>echo "69.55.230.10 backup2" >> /etc/hosts
ns1c is a jail running on the mail server, who's IP is 69.55.225.225
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.4 bwdb2" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts</pre>


* put key in authorized_keys on backup3
It's running from <tt>/mnt/data1/ns1c-dir</tt>
<pre>cd
ssh-keygen -t dsa -b 1024</pre>  
(default location, leave password blank)


<pre>cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys'
See [[DNS]] for more details
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'</pre>


confirm that you can ssh to backup3 and backup 2 without getting a login prompt
== Usage and Notes ==
* always mounted to backup1 and backup2 via nfs:
<pre>backup2:/mnt/data1 on /backup (nfs)
backup2:/mnt/data2 on /backup2 (nfs)
backup2:/mnt/data3 on /backup3 (nfs)
backup2:/mnt/data4 on /backup4 (nfs)
backup1:/data on /backup1 (nfs)
</pre>


  ssh backup3 hostname
== Cronjobs ==
  * * * * * /usr/local/www/mgmt/mrtg/mrtg.sh > /dev/null 2>&1
Gathers up data for our mrtg/load graphs
 
*/5 * * * * /usr/local/bin/rsync -a root@nat2:/mnt/data1/mrtg/data/ /usr/local/www/mgmt/mrtg/data/
Gathers up data from i2b servers for our mrtg/load graphs


  ssh backup2 hostname
  40 0 * * * /usr/local/bin/rsync -a root@nat2:"/mnt/data1/mrtg/*.cfg" /usr/local/www/mgmt/mrtg
Gathers up mrtg configuration (port names) from i2b switches for our mrtg/load graphs


  ssh backup1 hostname
  41 0 * * * for f in `grep -l "mnt\/data1" /usr/local/www/mgmt/mrtg/switch-p*.cfg`; do cat $f | sed s#\/mnt\/data1#\/usr\/local\/www\/mgmt# > $f.new; mv $f.new $f; done
Gathers up mrtg configuration (port names) from castle switches for our mrtg/load graphs


1 0 1 * * cp /usr/local/www/mgmt/html/top20ip /usr/local/www/mgmt/html/top20ip_last
1 0 1 * * cp /usr/local/www/mgmt/html/top20customers /usr/local/www/mgmt/html/top20customers_last
2 * * * * /usr/local/www/cronjobs/top20ip.pl > /dev/null 2>&1
15 * * * * /usr/local/www/cronjobs/top20customer.pl > /dev/null 2>&1
1 0 1 * * rm /usr/local/www/mgmt/html/bandtrack
Archiving and generation of bandwidth statistics presented in mgmt -> Reference -> Bandwidth


* edit root's path and login script:
1 0 * * * /usr/local/etc/rsync.backup
vi /root/.cshrc
Nightly backup script


Change alias entries (add G):
0 1 * * * /usr/local/www/mgmt/awstats/wwwroot/cgi-bin/awstats.pl -config=jcpub -update
<pre>alias la        ls -aG
Public web traffic stats
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm      mb mount
alias mbu      mb umount</pre>


and alter the prompt, set the following:
15 0 * * * rm /usr/local/www/mgmt/bwgraphs/*.png
  set prompt = "`/bin/hostname -s` %/# "
  16 0 * * * rm /usr/local/www/am/bwgraphs/*
Cleanup for graph-related temp data generated by customers using the bandwidth reports via the AM


* install cvsup
10 0 1 * * /usr/local/www/cronjobs/monthly_bandwidth_report.pl
<pre>cd /usr/ports/net/cvsup-without-gui
Monthly bandwidth overage report
make install clean; rehash; mail -s 'cvs installed' dave.boodman@vtext.com < /dev/null</pre>


* get latest sources for this release:
*/3 * * * * /usr/local/www/cronjobs/bbcheck.pl
<pre>cd /usr/src
Updates mgmt with bb monitoring issues
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
src-all" > sup


cvsup sup ; mail -s 'cvs sup done' dave.boodman@vtext.com < /dev/null</pre>
5 0 * * * /usr/local/www/cronjobs/shutdownreminder.pl
Emails customers reminding them of upcoming shutdown date


7 0 * * * /usr/local/www/cronjobs/invoice_email.pl
Emails customers who have invoices and are set to auto-email (currently no customer gets these)


* configure new kernel.  
8 */4 * * * /usr/local/www/cronjobs/mysqlrepchk.pl
Checking that we are properly replicating (mysql) traffic data from bwdb to backup1


  cd /usr/src/sys/i386/conf
  16 0 1 * * /usr/local/www/cronjobs/purge_traffic.pl
scp backup2:/mnt/data4/build/freebsd/nat2-6.4 ./nat2
Removed old traffic data from the traffic database (running on backup1)


* build, install kernel and world
*/5 * * * * chmod 0700 /usr/local/www/ccard_orders/* && mv /usr/local/www/ccard_orders/* /usr/local/www/ccard_orders/done
Secure credit card data: set root-read-only


<pre>cd /boot
25 0 * * * /usr/local/www/cronjobs/biller.pl
Enters service charges in customer billing ledgers


mv kernel kernel.GENERIC
10 13 * * * /usr/local/www/cronjobs/pfp_batch_gather.pl
cd kernel.GENERIC
Looks for customers with balance due and active credit card on file, prepares a payflow batch
cd /usr/src
make buildkernel installkernel


make buildworld ; mail -s 'buildworld done' support@johncompanies.com < /dev/null
10 14 * * * /usr/local/www/cronjobs/pfp_batch_process.pl
make installworld
Tries to collect ccard funds for items in payflow batch - communicates with payflow
mergemaster -i
</pre>


* populate /etc/rc.conf with IPs and NFS settings
15 13 * * * /usr/local/www/cronjobs/pb_batch_gather.pl
<pre>vi /etc/rc.conf
Looks for customers with balance due and active paypal billing agreement on file, prepares a paypal batch


hostname="nat2.johncompanies.com"
15 14 * * * /usr/local/www/cronjobs/pb_batch_process.pl
kern_securelevel_enable="NO"
Tries to collect paypal funds for items in paypal batch - communicates with paypal
portmap_enable="NO"
 
sendmail_enable="NO"
0 7 * * 1 /usr/local/www/cronjobs/email_pmt_reminder.pl
usbd_enable="YES"
Emails customers in arrears, reminding them to pay
 
0 0 1 * * /usr/bin/mail -s 'archive sent mail in pine' support@johncompanies.com < /dev/null
Reminds us to archive sent mail
 
0 3 * * * /usr/local/bin/rsync -a isys.e-monitoring.net:/var/mail /backup2/isys; /usr/local/bin/rsync -a isys.e-monitoring.net:/usr/home /backup2/isys
Backup data on isys
 
== Regular maintenance ==
*[[Routine_Maintenance#Adaptec_Controllers|Check RAID array]]


xntpd_enable="YES"
== Building a new Mail Server ==
xntpd_flags="-A -p /var/run/ntpd.pid"


nfs_client_enable="YES"
=== Installations ===
nfs_reserved_port_only="YES"
ifconfig_em0="inet 10.1.6.50 netmask 255.255.255.0"
#ifconfig_em0="inet 69.55.229.2 netmask 255.255.255.0"
#ifconfig_em0_alias0="inet 69.55.229.229 netmask 255.255.255.255"
ifconfig_fxp0="inet 69.55.229.2 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 69.55.229.3 netmask 255.255.255.255"
ifconfig_fxp1="inet 10.1.2.1 netmask 255.255.255.0"
defaultrouter="10.1.6.1"
#defaultrouter=" 66.181.14.250"
snmpd_enable="YES"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"


inetd_enable="YES"
I used FreeBSD 11.2  
inetd_flags="-wW -a 10.1.2.1"
fsck_y_enable="YES"
background_fsck="NO"
sshd_enable="YES"</pre>


* reboot. Confirm new kernel is loaded
The order is important especially for the Web Server.


uname -a
==== Web Server ====


* update ports:
I used FreeBSD 11.2
<pre>cd /usr/ports
  perl 5.26
echo "*default host=cvsup4.FreeBSD.org\
  OpenSSL 1.0.2o-freebsd
*default base=/usr\
  pcre
*default prefix=/usr\
  apache22
*default release=cvs tag=RELENG_6_4\
  mod_perl2
*default delete use-rel-suffix\
  PayflowPro
*default compress\
  mariadb 55 server and client
ports-all tag=." > sup
 
Installation order is important
 
install perl 5.26.2 from ports
 
<ore>
cd /usr/ports/lang/perl5.26/
make
[X] PERL_64BITINT  Use 64 bit integers (on i386)
[X] USE_PERL      Rewrite links in /usr/bin
(the rest unchecked
make install
</pre>
 
install OpenSSL 1.0.2o-freebsd


cvsup sup; mail -s 'cvs sup ports done' dave.boodman@vtext.com < /dev/null</pre>
<pre>
cd /usr/ports/
make install
</pre>


* Install raid mgmt tool
install pcre


<pre>cd /usr/local/sbin
<pre>
fetch http://3ware.com/download/Escalade9690SA-Series/9.5.3/tw_cli-freebsd-x86-9.5.3.tgz
cd /usr/ports/
tar xzf tw_cli-freebsd-x86-9.5.3.tgz
make install
rm tw_cli-freebsd-x86-9.5.3.tgz
</pre>
chmod 0700 tw_cli</pre>


Test:
./tw_cli info c0


* install rsync from ports
install Apache22
<pre>cd /usr/ports/net/rsync
make install clean</pre>
choose default options


* install perl from ports
<pre>
<pre>cd /usr/ports/lang/perl5.8
cd /usr/ports/distfiles
make install clean</pre>
fetch http://archive.apache.org/dist/httpd/httpd-2.2.32.tar.gz


* install screen from ports
<pre>cd /usr/ports/sysutils/screen
make install clean</pre>


* install bb client
cd /usr/ports/www/apache22/tmp
<pre>adduser
fetch --no-verify-peer http://mirror.nexcess.net/apache//httpd/httpd-2.2.34.tar.gz
Username: bb
tar xvzf httpd-2.2.34.tar.gz
Full name: bb
./configure --prefix=/usr/local/apache --with-ssl=/usr/local/openssl/ --enable-ssl --enable-so --with-mpm=prefork --enable-threads --enable-mods-shared='mime alias setenvif dir' --enable-modules='mime alias setenvif dir' --with-pcre=/usr/local
Uid (Leave empty for default): 1984
make install
Login group [bb]:
apachectl restart
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username  : bb
Password  : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups    : bb
Home      : /home/bb
Shell      : /bin/sh
Locked    : no
OK? (yes/no): yes


cd /usr/home/bb
cd /usr/ports/www/apache22
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
tar xvf bb-freebsd.tar</pre>
make DISABLE_VULNERABILITIES=yes
edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
make install
<pre>echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
</pre>
10.1.2.1 nat2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
vi /home/bb/bbc1.9e-btf/ext/openfiles
MACHINE="nat2,johncompanies,com"      # HAS TO BE IN A,B,C FORM


cd /usr/home/bb/bbc1.9e-btf/etc
./bbchkcfg.sh
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..


vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
install mod_perl2
        $1 $TOPARGS > $BBTMP/TOP.$$
 
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$
<pre>
cd /usr/ports/www/mod_perl2
echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
make DISABLE_VULNERABILITIES=yes
make install
</pre>
 
 
install mariadb
 
<pre>
cd /usr/ports/databases/mariadb-103-server
echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
make DISABLE_VULNERABILITIES=yes
make install


./runbb.sh start
more BBOUT
(look for errors)
exit


echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh
</pre>
</pre>


Punch a hole in the firewall to allow it to communicate with bb monitor (probably already exists):
==== Mail Server ====
 
I used Postfix for email
 
==== DNS Server (ns1c.johncompanies.com) ====


ipfw add 96 allow ip from 66.181.18.0/27 to 69.55.230.2
= ns2c =
== Summary ==


* configure bb on mail:
* Location: castle, on lamphost ganeti cloud
<pre>vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
* OS: FreeBSD 11.2 x86_64
64.163.14.48 nat2.johncompanies.com # ssh
* Networking: Pub IP: 69.55.230.3  Private access: gnt-instance console ns2c.johncompanies.com
* Hardware: on ganeti cloud gn6.jcihosting.net  secondary gn1.jcihosting.net
* CPU:  1
* RAM: 1 GB
* Drives: 10 GB
* Remote management:  gnt-instance console ns2c.johncompanies.com


su bb
= nat =
cd
== Summary ==
bbsrc/bb/runbb.sh restart ; exit</pre>
This is the main machine to which we ssh and runs all our screen sessions. Further, it's ip runs in a special block which is not routed through the firewall and this is somewhat immune to DoS attacks which hobble our firewall. Lastly, it acts as a nat server for certain/random devices on the private network.


* configure ntp
* Location: castle, cab 3-7
<pre>echo "server 69.55.230.2
* OS: FreeBSD 9.1 i386
server 0.pool.ntp.org
* Networking: Priv IP: 10.1.4.1, Pub IPs: 69.55.233.195, 69.55.233.196, 69.55.233.197, 69.55.233.198, 69.55.233.199. 1 onboard and 1 PCI
server 1.pool.ntp.org
* Hardware: Custom 1U. single power supply.  
server 2.pool.ntp.org
* Drives: one 8 GB IDE drive
server 3.pool.ntp.org
server 66.187.233.4
server 217.204.76.170
server 64.112.189.11
server 66.69.112.130
server 80.85.129.25
server 80.237.234.15
server 130.60.7.44
server 134.99.176.3
server 198.144.202.250
server 202.74.170.194
server 204.17.42.199
server 204.87.183.6
server 213.15.3.1
server 213.239.178.33
server 217.114.97.97
server 69.55.230.2" > /etc/ntp.conf</pre>


<pre>/usr/sbin/ntpd -A -p /var/run/ntpd.pid
== Services Provided ==
sleep 2; ntpq -p</pre>
* nat
(confirm it’s able to reach our time server)


echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
== nat control ==
chmod 0700 /usr/local/etc/rc.d/ntp.sh
All rules are contained in and look like:


* fwd and reverse lookups on ns1c
<pre>cat /etc/ipnat.rules
vr johncompanies.com
# www (was 69.55.230.12)
(edit the PTR too)
# virt19
 
#bimap fxp0 10.1.4.209/32 -> 69.55.233.198/32
* setup backups, nfs mount
# virt18
 
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32
<pre>mkdir /backup3
# virt13
echo 'backup3:/data          /backup3        nfs    rw,bg          0      0' >> /etc/fstab
#bimap fxp0 10.1.4.213/32 -> 69.55.233.196/32
 
# virt12
echo '#\!/bin/sh\
#bimap fxp0 10.1.4.212/32 -> 69.55.233.196/32
backupdir=/data/nat2/current\
# virt17
\
bimap fxp0 10.1.4.217/32 -> 69.55.233.196/32
## ENTRY /etc ' > /usr/local/etc/backup.config</pre>
# virt11
#bimap fxp0 10.1.4.211/32 -> 69.55.233.196/32
# ASA
#bimap fxp0 10.1.4.172/32 -> 69.55.233.196/32
# P1A
bimap fxp0 10.1.4.240/32 -> 69.55.233.197/32
#bimap fxp0 10.1.4.238/32 -> 69.55.233.197/32
# developer (was 69.55.230.17)
# jail2
#bimap fxp0 10.1.4.232/32 -> 69.55.233.198/32
# jail8
#bimap fxp0 10.1.4.238/32 -> 69.55.233.198/32
# jail9
#bimap fxp0 10.1.4.239/32 -> 69.55.233.198/32
# POLL
#BIMAP EM0 10.1.6.134/32 -> 69.55.230.20/32
# 1U SUN
#BIMAP EM0 10.1.4.4/32 -> 69.55.227.46/32
# ??
#BIMAP EM0 10.1.6.3/32 -> 69.55.230.100/32
# random machine
#bimap fxp0 10.1.6.13/32 -> 69.55.233.199/32
#bimap fxp0 10.1.4.232/32 -> 69.55.233.199/32
# OFFICE OUTBOUND TRAFFIC
#map fxp0 10.1.6.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
#map fxp0 10.1.6.0/24 -> 0.0.0.0/32</pre>


on backup3:
A simple entry looks like:
setup backup dirs:
  bimap fxp0 10.1.4.240/32 -> 69.55.233.197/32
  ssh backup3 mkdir -p /data/nat2/current
Which essentially means make private IP 10.1.4.240 reachable on 69.55.233.197 and allow 10.1.4.240 to communicate with the public internet via 69.55.233.197


on backup3, add the system to
To reload new rule config:
  vi /usr/local/sbin/snapshot_archive
  ipnat -C -F -f /etc/ipnat.rules


<pre>scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup
You may want to setup natting, as above, when you need to reach a DRAC card's web interface, wherin the DRAC card only has a private IP.
vi /usr/local/etc/rsync.backup
backup1 > backup3</pre>


crontab -e
= nat2 =
1 0 * * * /usr/local/etc/rsync.backup
== Summary ==
This is the main machine to which we ssh and runs all our screen sessions at i2b, and runs ns3c (this is kind of the what mail is to castle). Further, it's ip runs in IP space provided by i2b: 66.181.18.1 - 66.181.18.30, which is not routed through the firewall and this is somewhat immune to DoS attacks which hobble our firewall. Lastly, it acts as a nat server for certain/random devices on the private network.


* edit sshd_config for security
* Location: i2b, cab 6
<pre>vi /etc/ssh/sshd_config
* OS: FreeBSD 6.4 x86
ListenAddress 66.181.18.1
* Networking: Priv IP: 10.1.2.1, Pub IPs: 69.55.229.2, 69.55.229.3, 66.181.18.4, 66.181.18.5, 66.181.18.6, 66.181.18.7, 66.181.18.8, 66.181.18.9, 66.181.18.10, 66.181.18.11, 66.181.18.12, 66.181.18.13, 66.181.18.14 1 onboard and 1 PCI
ListenAddress 69.55.229.2
* Hardware: Custom 2U. 6 drive bays, non-hot-swappable. single power supply.
ListenAddress 10.1.2.1
* Drives: one 150 GB (2 x 150GB) RAID1 array running on a 3ware 8006 RAID card.


kill -1 `cat /var/run/sshd.pid`</pre>
== Services Provided ==
* nat
* bigbrother
* ns3c (jail)
* wiki (jail)
* ntp


* raid chk
== nat config ==
Here's what's currently nat'd on nat2:
<pre>cat /etc/ipnat.rules
# sample entry
#ATS-9
bimap em0 10.1.2.79/32 -> 66.181.18.14/32
#ATS-8
bimap em0 10.1.2.78/32 -> 66.181.18.13/32
#ATS-7
bimap em0 10.1.2.77/32 -> 66.181.18.12/32
#ATS-6
bimap em0 10.1.2.76/32 -> 66.181.18.6/32
#ATS-5
bimap em0 10.1.2.75/32 -> 66.181.18.7/32
#ATS-4
bimap em0 10.1.2.74/32 -> 66.181.18.8/32
#ATS-3
bimap em0 10.1.2.73/32 -> 66.181.18.9/32
#ATS-2
bimap em0 10.1.2.72/32 -> 66.181.18.10/32
#ATS-1
bimap em0 10.1.2.71/32 -> 66.181.18.11/32
#bwdb2
bimap em0 10.1.2.4/32 -> 66.181.18.5/32


<pre>cat > /usr/local/sbin/lsiraidchk
# spare
#!/usr/bin/perl
 
map em0 10.1.2.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp


my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;
#bimap fxp0 10.1.6.49/32 -> 10.1.1.2/32
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32
</pre>


foreach (@out) {
== build ==
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}</pre>


* netflow stuff
* partition map:
add crontab entries
<pre>/ 512m
<pre>crontab -e
swap 1G
30 3 * * * /usr/local/etc/rsync.backup
/var 256m
0 0 1 * * /sbin/ipfw zero
/tmp 256m
0 0 1 * * /sbin/ipfw del 3 4 5
/usr 5g
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
/mnt/data1 ~</pre>
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
*/5 * * * * /usr/local/sbin/lsiraidchk


#10 0 * * * rm /var/spool/clientmqueue/*</pre>
* edit /etc/make.conf
<pre>echo "WITHOUT_X11=yes \
KERNCONF=nat2 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf</pre>


<pre>scp /etc/makefwrules.pl user@64.163.14.48:~
* add settings to /boot/loader.conf and /boot.config
scp /etc/makepiperules.pl user@64.163.14.48:~
mv /home/user/makefwrules.pl /etc
mv /home/user/makepiperules.pl /etc
touch /etc/firewall.sh
mkdir /etc/oldrules/</pre>


other binaries
<pre>echo "-Dh" >> /boot.config
<pre>scp /usr/local/bin/rulemaker user@64.163.14.48:~
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~</pre>


* add nat rules
echo 'console="comconsole,vidconsole" \
<pre>vi /etc/ipnat.rules
boot_multicons="YES" \
# sample entry
boot_serial="YES" \
bimap fxp0 10.1.6.70/32 -> 10.1.6.59/32
comconsole_speed="115200"' >> /boot/loader.conf</pre>
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32


ipnat -C -f /etc/ipnat.rules</pre>
* turn off all ttyv's except 0 and 1 in /etc/ttys
also turn on ttyd0, change type to vt100:
<pre>vi /etc/ttys


* shell for user
ttyv2  "/usr/libexec/getty Pc"        cons25  off secure
<pre>cp /root/.cshrc ~user/
ttyv3  "/usr/libexec/getty Pc"        cons25  off secure
vi ~user/</pre>
ttyv4  "/usr/libexec/getty Pc"        cons25  off secure
change # to $
ttyv5  "/usr/libexec/getty Pc"        cons25  off secure
ttyv6  "/usr/libexec/getty Pc"        cons25  off secure
ttyv7  "/usr/libexec/getty Pc"        cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0  "/usr/libexec/getty std.9600"  vt100  on  secure


* mrtg
kill -1 1</pre>


<pre>cd /usr/ports/net-mgmt/mrtg
on console server:
make install clean</pre>
vi /etc/remote
(no FONTCONFIG, v3)
(rename port to jail8 depending on where and which digi plugged into)
test serial console


this didn't work cause of libtool incompat


so manually moved files:
* populate hosts
<pre>echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.4 bwdb2" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts</pre>


<pre>scp /usr/local/bin/cfgmaker user@nat2:/usr/local/bin/cfgmaker
* put key in authorized_keys on backup3
scp /usr/local/lib/perl5/site_perl/5.6.1/MRTG_lib.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
<pre>cd
scp /usr/local/lib/perl5/site_perl/5.6.1/SNMP_util.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
ssh-keygen -t dsa -b 1024</pre>
scp /usr/local/lib/perl5/site_perl/5.6.1/BER.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
(default location, leave password blank)
scp /usr/local/lib/perl5/site_perl/5.6.1/SNMP_Session.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
scp /usr/local/bin/mrtg root@nat2:/usr/local/bin/mrtg
scp /usr/local/lib/perl5/site_perl/5.6.1/locales_mrtg.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/locales_mrtg.pm
scp /usr/local/bin/rrdtool root@nat2:/usr/local/bin/rrdtool
scp /usr/local/lib/perl5/site_perl/5.6.1/mach/RRDs.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/mach/RRDs.pm
rsync -av /usr/local/lib/perl5/site_perl/5.6.1/mach/auto/RRDs/ root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/mach/auto/RRDs/
scp /usr/lib/libz.so.2 root@nat2:/usr/lib/libz.so.2
scp /usr/lib/libm.so.2 root@nat2:/usr/lib/libm.so.2
rsync -av /usr/local/lib/librrd* root@nat2:/usr/local/lib/
scp /usr/lib/libc.so.4 root@nat2:/usr/lib/libc.so.4


rsync -av /usr/ports/net/rrdtool root@nat2:/usr/ports/net
<pre>cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys'
cd /usr/ports/net/rrdtool
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
make install
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'</pre>


mkdir -p /mnt/data1/mrtg/data
confirm that you can ssh to backup3 and backup 2 without getting a login prompt
scp /usr/local/www/mgmt/mrtg/template.pl root@nat2:/mnt/data1/mrtg/
scp /usr/local/www/mgmt/mrtg/host.pl root@nat2:/mnt/data1/mrtg/


cfgmaker --if-template=template.pl --show-op-down --global "options[_]: growright,bits" --global 'WorkDir: /mnt/data1/mrtg/data' --global 'Interval: 1' --global 'LogFormat: rrdtool' --global 'PathAdd: /usr/local/bin' --global 'LibAdd: /usr/local/lib' --host-template=host.pl jc292401@10.1.2.50 --output=switch-p20.cfg
ssh backup3 hostname


cat > /mnt/data1/mrtg/mrtg.sh
ssh backup2 hostname
#!/bin/sh
/usr/local/bin/mrtg /mnt/data1/mrtg/switch-p20.cfg


chmod 0700 /mnt/data1/mrtg/mrtg.sh
ssh backup1 hostname


crontab -e
* * * * * /mnt/data1/mrtg/mrtg.sh 2>&1 > /dev/null</pre>


* snmp firewall block
* edit root's path and login script:
<pre>cat > /usr/local/etc/rc.d/boot.sh
vi /root/.cshrc
ipfw add 10 allow udp from 69.55.230.2 to any 161
ipfw add 10 allow udp from 10.1.2.1 to any 161
ipfw add 11 deny udp from any to any 161
chmod 0700 /usr/local/etc/rc.d/boot.sh</pre>


= bwdb =
Change alias entries (add G):
== Summary ==
<pre>alias la        ls -aG
This machine tracks and stores network traffic (netflow) at castle. It is our means to monitor customer bandwidth usage.
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm      mb mount
alias mbu      mb umount</pre>


* Location: castle, cab 3-7
and alter the prompt, set the following:
* OS: FreeBSD 4.10 x86
set prompt = "`/bin/hostname -s` %/# "
* Networking: Priv IP: 10.1.4.203 There are 2 onboard nic's, one of which is the "listener"
* Hardware: Custom 1U. Single power supply.
* Drives: one 250 GB (2 x 250GB) RAID1 array running on a Promise IDE RAID card.


== Services Provided ==
* install cvsup
* netflow
<pre>cd /usr/ports/net/cvsup-without-gui
* mysql
make install clean; rehash; mail -s 'cvs installed' dave.boodman@vtext.com < /dev/null</pre>
* bigbrother
* snmp


== netflow ==
* get latest sources for this release:
<pre>cd /usr/src
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
src-all" > sup


The main function of this server is to run netflow on an eth device in promiscuous mode so as to hear everything happening on the port (wherein all network traffic is mirrored to that port via the cisco swith). Every 15min, it creates a flow file under <tt>/usr/home/flows/</tt> (organized by date). The flow file contains all traffic data for a 15min increment of time.
cvsup sup ; mail -s 'cvs sup done' dave.boodman@vtext.com < /dev/null</pre>


A cronjob moves that flow file (or files if there are multiple due to some delay)
1,16,31,46 * * * * /usr/home/flowbin/queue.pl


into a processing queue:
* configure new kernel.
<tt>/usr/home/working</tt>
 
cd /usr/src/sys/i386/conf
scp backup2:/mnt/data4/build/freebsd/nat2-6.4 ./nat2
 
* build, install kernel and world
 
<pre>cd /boot
 
mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel


Then a separate file processes whatever flow files it finds there, inserting the data into the local mysql database:
make buildworld ; mail -s 'buildworld done' support@johncompanies.com < /dev/null
2,17,32,47 * * * * /usr/home/flowbin/processflows.pl
make installworld
mergemaster -i
</pre>


== mysql ==
* populate /etc/rc.conf with IPs and NFS settings
<pre>vi /etc/rc.conf


The database storing all the traffic data is named <tt>traffic</tt>
hostname="nat2.johncompanies.com"
Tables:
kern_securelevel_enable="NO"
<pre>mysql> show tables;
portmap_enable="NO"
+---------------------------+
sendmail_enable="NO"
| Tables_in_traffic        |
usbd_enable="YES"
+---------------------------+
 
| dailyIpTotals_69_55_224  |
xntpd_enable="YES"
| dailyIpTotals_69_55_225  |
xntpd_flags="-A -p /var/run/ntpd.pid"
| dailyIpTotals_69_55_226  |
 
| dailyIpTotals_69_55_227  |
nfs_client_enable="YES"
| dailyIpTotals_69_55_228  |
nfs_reserved_port_only="YES"
| dailyIpTotals_69_55_229  |
ifconfig_em0="inet 10.1.6.50 netmask 255.255.255.0"
| dailyIpTotals_69_55_230  |
#ifconfig_em0="inet 69.55.229.2 netmask 255.255.255.0"
| dailyIpTotals_69_55_231  |
#ifconfig_em0_alias0="inet 69.55.229.229 netmask 255.255.255.255"
| dailyIpTotals_69_55_232  |
ifconfig_fxp0="inet 69.55.229.2 netmask 255.255.255.0"
| dailyIpTotals_69_55_233  |
ifconfig_fxp0_alias0="inet 69.55.229.3 netmask 255.255.255.255"
| dailyIpTotals_69_55_234  |
ifconfig_fxp1="inet 10.1.2.1 netmask 255.255.255.0"
| dailyIpTotals_69_55_235  |
defaultrouter="10.1.6.1"
| dailyIpTotals_69_55_236  |
#defaultrouter=" 66.181.14.250"
| dailyIpTotals_69_55_237  |
snmpd_enable="YES"
| dailyIpTotals_69_55_238  |
ipnat_enable="YES"
| dailyIpTotals_69_55_239  |
ipnat_rules="/etc/ipnat.rules"
| dailyPortTotals_69_55_224 |
gateway_enable="YES"
| dailyPortTotals_69_55_225 |
 
| dailyPortTotals_69_55_226 |
inetd_enable="YES"
| dailyPortTotals_69_55_227 |
inetd_flags="-wW -a 10.1.2.1"
| dailyPortTotals_69_55_228 |
fsck_y_enable="YES"
| dailyPortTotals_69_55_229 |
background_fsck="NO"
| dailyPortTotals_69_55_230 |
sshd_enable="YES"</pre>
| dailyPortTotals_69_55_231 |
 
| dailyPortTotals_69_55_232 |
* reboot. Confirm new kernel is loaded
| dailyPortTotals_69_55_233 |
| dailyPortTotals_69_55_234 |
| dailyPortTotals_69_55_235 |
| dailyPortTotals_69_55_236 |
| dailyPortTotals_69_55_237 |
| dailyPortTotals_69_55_238 |
| dailyPortTotals_69_55_239 |
| ipTotals_69_55_224        |
| ipTotals_69_55_225        |
| ipTotals_69_55_226        |
| ipTotals_69_55_227        |
| ipTotals_69_55_228        |
| ipTotals_69_55_229        |
| ipTotals_69_55_230        |
| ipTotals_69_55_231        |
| ipTotals_69_55_232        |
| ipTotals_69_55_233        |
| ipTotals_69_55_234        |
| ipTotals_69_55_235        |
| ipTotals_69_55_236        |
| ipTotals_69_55_237        |
| ipTotals_69_55_238        |
| ipTotals_69_55_239        |
| portTotals_69_55_224      |
| portTotals_69_55_225      |
| portTotals_69_55_226      |
| portTotals_69_55_227      |
| portTotals_69_55_228      |
| portTotals_69_55_229      |
| portTotals_69_55_230      |
| portTotals_69_55_231      |
| portTotals_69_55_232      |
| portTotals_69_55_233      |
| portTotals_69_55_234      |
| portTotals_69_55_235      |
| portTotals_69_55_236      |
| portTotals_69_55_237      |
| portTotals_69_55_238      |
| portTotals_69_55_239      |
+---------------------------+
</pre>


So as you see we store each class-C block in its own table, for efficiency. Further, we store and organize data in 4 ways: "daily" tables and 15-minute granularity tables, and for each of those we track simple IP traffic and port-specific traffic. The daily tables contains 2 entries (one for each direction) for each IP for each day. For the current day, the row data is incremented as the day goes on.
uname -a


<pre>mysql> describe dailyIpTotals_69_55_224;
* update ports:
+-----------+-------------+------+-----+---------+-------+
<pre>cd /usr/ports
| Field    | Type        | Null | Key | Default | Extra |
echo "*default host=cvsup4.FreeBSD.org\
+-----------+-------------+------+-----+---------+-------+
*default base=/usr\
| id        | varchar(23) |      | PRI |        |      |
*default prefix=/usr\
| date      | date        | YES  |    | NULL    |      |
*default release=cvs tag=RELENG_6_4\
| ip        | varchar(15) | YES  | MUL | NULL    |      |
*default delete use-rel-suffix\
| direction | tinyint(1)  | YES  |    | NULL    |      |
*default compress\
| octets    | bigint(12)  | YES  |    | NULL    |      |
ports-all tag=." > sup
| packets  | int(11)    | YES  |    | NULL    |      |
 
+-----------+-------------+------+-----+---------+-------+
cvsup sup; mail -s 'cvs sup ports done' dave.boodman@vtext.com < /dev/null</pre>


mysql> select * from dailyIpTotals_69_55_224 limit 1\G
* Install raid mgmt tool
*************************** 1. row ***************************
      id: 6955224194-20100917-1
    date: 2010-09-17
      ip: 69.55.224.194
direction: 1
  octets: 8821
  packets: 91
</pre>


The <tt>id</tt> is a unique identifier (key), <tt>direction</tt> indicates incoming or outgoing traffic (outbound = 2, inbound = 1), <tt>octets</tt> are the amount of traffic in kilobytes, and <tt>packets</tt> is the total number of packets.
<pre>cd /usr/local/sbin
fetch http://3ware.com/download/Escalade9690SA-Series/9.5.3/tw_cli-freebsd-x86-9.5.3.tgz
tar xzf tw_cli-freebsd-x86-9.5.3.tgz
rm tw_cli-freebsd-x86-9.5.3.tgz
chmod 0700 tw_cli</pre>


The 15-minute table has similar information, but it's organized in 15 minute increments:
Test:
./tw_cli info c0


<pre>mysql> describe ipTotals_69_55_224;
* install rsync from ports
+-----------+------------+------+-----+---------+-------+
<pre>cd /usr/ports/net/rsync
| Field    | Type      | Null | Key | Default | Extra |
make install clean</pre>
+-----------+------------+------+-----+---------+-------+
choose default options
| date      | datetime  | YES  |    | NULL    |      |
| ip        | char(15)  | YES  | MUL | NULL    |      |
| direction | tinyint(1) | YES  |    | NULL    |      |
| octets    | bigint(20) | YES  |    | NULL    |      |
| packets  | int(11)    | YES  |    | NULL    |      |
+-----------+------------+------+-----+---------+-------+


mysql> select * from ipTotals_69_55_224 limit 2\G
* install perl from ports
*************************** 1. row ***************************
<pre>cd /usr/ports/lang/perl5.8
    date: 2010-01-11 19:30:00
make install clean</pre>
      ip: 69.55.224.13
direction: 1
  octets: 288
  packets: 6
*************************** 2. row ***************************
    date: 2010-01-11 19:30:00
      ip: 69.55.224.12
direction: 1
  octets: 216
  packets: 4</pre>


So for a given IP, there will be 192 rows in a given day: 4 rows per hour, *2 for 2 directions, *24 for 24hours in a day. Obviously this table is large which is why we broke it down into a daily table for quick, easy, daily-summary access.
* install screen from ports
<pre>cd /usr/ports/sysutils/screen
make install clean</pre>


That covers the simple traffic tabulation tables. We also track traffic by port:
* install bb client
 
<pre>adduser
<pre>mysql> describe dailyPortTotals_69_55_224;
Username: bb
+-----------+-------------+------+-----+---------+-------+
Full name: bb
| Field    | Type        | Null | Key | Default | Extra |
Uid (Leave empty for default): 1984
+-----------+-------------+------+-----+---------+-------+
Login group [bb]:
| id        | varchar(28) |      | PRI |        |      |
Login group is bb. Invite bb into other groups? []:
| date      | date        | YES  |    | NULL    |      |
Login class [default]:
| ip        | varchar(15) | YES  | MUL | NULL    |      |
Shell (sh csh tcsh nologin) [sh]:
| direction | tinyint(1) | YES  |    | NULL    |      |
Home directory [/home/bb]:
| protocol  | smallint(3) | YES |    | NULL    |      |
Use password-based authentication? [yes]:
| port     | int(11)     | YES  |    | NULL    |       |
Use an empty password? (yes/no) [no]:
| octets    | bigint(11)  | YES  |    | NULL    |      |
Use a random password? (yes/no) [no]: yes
| packets  | int(11)     | YES  |    | NULL    |      |
Lock out the account after creation? [no]:
+-----------+-------------+------+-----+---------+-------+
Username  : bb
8 rows in set (0.00 sec)
Password  : <random>
Full Name : bb
Uid        : 1984
Class     :
Groups     : bb
Home       : /home/bb
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes


mysql> select * from dailyPortTotals_69_55_224 limit 1\G
cd /usr/home/bb
*************************** 1. row ***************************
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
      id: 695522496-20091218-1-6-23
tar xvf bb-freebsd.tar</pre>
    date: 2009-12-18
edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
      ip: 69.55.224.96
<pre>echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
direction: 1
10.1.2.1 nat2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
protocol: 6
vi /home/bb/bbc1.9e-btf/ext/openfiles
     port: 23
MACHINE="nat2,johncompanies,com"     # HAS TO BE IN A,B,C FORM
  octets: 1796
  packets: 30


mysql> select * from portTotals_69_55_224 limit 1\G
cd /usr/home/bb/bbc1.9e-btf/etc
*************************** 1. row ***************************
./bbchkcfg.sh
    date: 2010-09-07 18:45:00
(y to questions)
      ip: 69.55.224.254
./bbchkhosts.sh
direction: 1
(ignore ssh errors)
protocol: 6
cd ../..
    port: 99999
chown -R bb .
  octets: 144
su bb
  packets: 3
cd
cd bbc1.9e-btf/src
make; make install
cd ..


</pre>
vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
        $1 $TOPARGS > $BBTMP/TOP.$$
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$


This is largely the same with 2 more additions: <tt>protocol</tt> (1=ICMP, 6=TCP, 17=UDP), and <tt>port</tt> which we set to 99999 if the traffic is return traffic and the port is above 1024. Obviously the potential for number of rows grows quickly when you consider the addition of port and protocol tracking per IP.
./runbb.sh start
more BBOUT
(look for errors)
exit


== Regular maintenance ==
echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
*[[Routine_Maintenance#Adaptec_Controllers|Check RAID array]]
chmod +x /usr/local/etc/rc.d/bb.sh
* archive data from database
</pre>
archive_daily.pl 2012 09
This will archive data for the given year and month from the daily summary tables. Generally we want to have a year of history in the database.


archive_15min.pl 2012 09
Punch a hole in the firewall to allow it to communicate with bb monitor (probably already exists):
This will archive data for the given year and month from the 15min-increment tables. Generally, we want to have 6 months of history in the database.


* if space becomes tight, move flow files and exported data to a backup server, both located in <tt>/usr/home/flowbin/archive</tt> and <tt>/usr/home/exported</tt>, respectively
ipfw add 96 allow ip from 66.181.18.0/27 to 69.55.230.2


== Slaving ==
* configure bb on mail:
<pre>vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
64.163.14.48 nat2.johncompanies.com # ssh


If we were going to setup traffic database slaving (we don't do this anymore), perhaps cause the bwdb machine gets busy and it cannot handle traffic requests and netflow, here's how it's done:
su bb
cd
bbsrc/bb/runbb.sh restart ; exit</pre>


On the traffic master:
* configure ntp
<pre>echo "server 69.55.230.2
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
server 3.pool.ntp.org
server 66.187.233.4
server 217.204.76.170
server 64.112.189.11
server 66.69.112.130
server 80.85.129.25
server 80.237.234.15
server 130.60.7.44
server 134.99.176.3
server 198.144.202.250
server 202.74.170.194
server 204.17.42.199
server 204.87.183.6
server 213.15.3.1
server 213.239.178.33
server 217.114.97.97
server 69.55.230.2" > /etc/ntp.conf</pre>


GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.1.4.8' IDENTIFIED BY 'qERUG8wf';
<pre>/usr/sbin/ntpd -A -p /var/run/ntpd.pid
sleep 2; ntpq -p</pre>
(confirm it’s able to reach our time server)


in my.cnf:
echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
<pre>bin-log
chmod 0700 /usr/local/etc/rc.d/ntp.sh
server-id=1
max_binlog_size=500M
expire_logs_days = 3</pre>


on slave:
* fwd and reverse lookups on ns1c
in my.cnf:
vr johncompanies.com
<pre>server-id      = 2
(edit the PTR too)
master-host    =  10.1.4.203
master-user    =  repl
master-password =  qERUG8wf
master-connect-retry=60
replicate-wild-do-table=traffic.daily%
max_relay_log_size=500M
expire_logs_days = 3


replicate-wild-do-table=traffic.%</pre>
* setup backups, nfs mount


on master:
<pre>mkdir /backup3
touch /usr/home/working/.lock
echo 'backup3:/data          /backup3        nfs    rw,bg          0      0' >> /etc/fstab
(make sure processflows not running)


<pre>FLUSH TABLES WITH READ LOCK;
echo '#\!/bin/sh\
cd /usr/home/database/traffic
backupdir=/data/nat2/current\
tar -czf mysql-traffic-snapshot.tgz ./daily*
\
(~1G)
## ENTRY /etc ' > /usr/local/etc/backup.config</pre>
SHOW MASTER STATUS;
+-----------------+-----------+--------------+------------------+
| File            | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+-----------+--------------+------------------+
| bwdb-bin.000039 | 154432615 |              |                  |
+-----------------+-----------+--------------+------------------+


(write down info)
on backup3:
UNLOCK TABLES;
setup backup dirs:
scp mysql-traffic-snapshot.tgz 10.1.4.5:/mnt/data1/db/mysql/traffic/</pre>
ssh backup3 mkdir -p /data/nat2/current


on slave:
on backup3, add the system to
<pre>mkdir /mnt/data1/db/mysql/traffic
vi /usr/local/sbin/snapshot_archive
cd /mnt/data1/db/mysql/traffic/
tar xzvf mysql-traffic-snapshot.tgz
(restart mysql)
CHANGE MASTER TO MASTER_HOST='10.1.4.203',MASTER_USER='repl',MASTER_PASSWORD='qERUG8wf',MASTER_LOG_FILE='bwdb-bin.000059',MASTER_LOG_POS=482502186;
START SLAVE;</pre>


<pre>cd /usr/home/database/traffic
<pre>scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup
scp *</pre>  
vi /usr/local/etc/rsync.backup
backup1 > backup3</pre>


<pre>optimize table dailyPortTotals_69_55_224;
crontab -e
optimize table dailyPortTotals_69_55_225;
1 0 * * * /usr/local/etc/rsync.backup
optimize table dailyPortTotals_69_55_226;
optimize table dailyPortTotals_69_55_227;
optimize table dailyPortTotals_69_55_228;
optimize table dailyPortTotals_69_55_229;
optimize table dailyPortTotals_69_55_230;
optimize table dailyPortTotals_69_55_231;
optimize table dailyPortTotals_69_55_232;
optimize table dailyPortTotals_69_55_233;
optimize table dailyPortTotals_69_55_234;
optimize table dailyPortTotals_69_55_235;
optimize table dailyPortTotals_69_55_236;
optimize table dailyPortTotals_69_55_237;
optimize table dailyPortTotals_69_55_238;
optimize table dailyPortTotals_69_55_239;</pre>


== Build ==
* edit sshd_config for security
<pre>vi /etc/ssh/sshd_config
ListenAddress 66.181.18.1
ListenAddress 69.55.229.2
ListenAddress 10.1.2.1


=== BIOS Config ===
kill -1 `cat /var/run/sshd.pid`</pre>
disable quiet boot


set to last state after power loss
* raid chk


set date/time to GMT
<pre>cat > /usr/local/sbin/lsiraidchk
#!/usr/bin/perl


enable serial console output (baud rate 115200)
my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;


=== Install OS ===
foreach (@out) {
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}</pre>


Install FreeBSD 8.3 amd64
* netflow stuff
add crontab entries
<pre>crontab -e
30 3 * * * /usr/local/etc/rsync.backup
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
*/5 * * * * /usr/local/sbin/lsiraidchk


* partition map:
#10 0 * * * rm /var/spool/clientmqueue/*</pre>
<pre>/ 500m
swap 4096m
/var 256m
/tmp 256m
/usr ~</pre>


* edit /etc/make.conf
<pre>scp /etc/makefwrules.pl user@64.163.14.48:~
Castle:
scp /etc/makepiperules.pl user@64.163.14.48:~
<pre>echo "WITHOUT_X11=yes \
mv /home/user/makefwrules.pl /etc
KERNCONF=bwdb \
mv /home/user/makepiperules.pl /etc
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf</pre>
touch /etc/firewall.sh
mkdir /etc/oldrules/</pre>


i2b:
other binaries
<pre>echo "WITHOUT_X11=yes \
KERNCONF=bwdb2 \
<pre>scp /usr/local/bin/rulemaker user@64.163.14.48:~
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf</pre>
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~</pre>


* add settings to /boot/loader.conf and /boot.config
* add nat rules
 
<pre>vi /etc/ipnat.rules
<pre>echo "-Dh" >> /boot.config
# sample entry
bimap fxp0 10.1.6.70/32 -> 10.1.6.59/32
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32


echo 'console="comconsole,vidconsole" \
ipnat -C -f /etc/ipnat.rules</pre>
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf</pre>


* turn off all ttyv's except 0 and 1 in /etc/ttys
* shell for user
also turn on ttyu0, change type to vt100:
<pre>cp /root/.cshrc ~user/
<pre>vi /etc/ttys
vi ~user/</pre>
change # to $


ttyv2  "/usr/libexec/getty Pc"        cons25  off secure
* mrtg
ttyv3  "/usr/libexec/getty Pc"        cons25  off secure
ttyv4  "/usr/libexec/getty Pc"        cons25  off secure
ttyv5  "/usr/libexec/getty Pc"        cons25  off secure
ttyv6  "/usr/libexec/getty Pc"        cons25  off secure
ttyv7  "/usr/libexec/getty Pc"        cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyu0  "/usr/libexec/getty std.9600"  vt100  on secure


kill -1 1</pre>
<pre>cd /usr/ports/net-mgmt/mrtg
make install clean</pre>
(no FONTCONFIG, v3)


on console server:
this didn't work cause of libtool incompat
vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console


so manually moved files:


* populate hosts
<pre>scp /usr/local/bin/cfgmaker user@nat2:/usr/local/bin/cfgmaker
i2b:
scp /usr/local/lib/perl5/site_perl/5.6.1/MRTG_lib.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
<pre>echo "69.55.230.10 backup2" >> /etc/hosts
scp /usr/local/lib/perl5/site_perl/5.6.1/SNMP_util.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
echo "69.55.230.11 backup1" >> /etc/hosts
scp /usr/local/lib/perl5/site_perl/5.6.1/BER.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
echo "10.1.2.3 backup3" >> /etc/hosts</pre>
scp /usr/local/lib/perl5/site_perl/5.6.1/SNMP_Session.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
scp /usr/local/bin/mrtg root@nat2:/usr/local/bin/mrtg
scp /usr/local/lib/perl5/site_perl/5.6.1/locales_mrtg.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/locales_mrtg.pm
scp /usr/local/bin/rrdtool root@nat2:/usr/local/bin/rrdtool
scp /usr/local/lib/perl5/site_perl/5.6.1/mach/RRDs.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/mach/RRDs.pm
rsync -av /usr/local/lib/perl5/site_perl/5.6.1/mach/auto/RRDs/ root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/mach/auto/RRDs/
scp /usr/lib/libz.so.2 root@nat2:/usr/lib/libz.so.2
scp /usr/lib/libm.so.2 root@nat2:/usr/lib/libm.so.2
rsync -av /usr/local/lib/librrd* root@nat2:/usr/local/lib/
scp /usr/lib/libc.so.4 root@nat2:/usr/lib/libc.so.4


castle:
rsync -av /usr/ports/net/rrdtool root@nat2:/usr/ports/net
<pre>echo "10.1.4.3 backup2 backup2.johncompanies.com" >> /etc/hosts
cd /usr/ports/net/rrdtool
echo "10.1.4.8 backup1 backup1.johncompanies.com" >> /etc/hosts
make install
echo "10.1.4.4 mail mail.johncompanies.com" >> /etc/hosts
</pre>


* put key in authorized_keys on backup1 and  backup2
mkdir -p /mnt/data1/mrtg/data
cd
scp /usr/local/www/mgmt/mrtg/template.pl root@nat2:/mnt/data1/mrtg/
ssh-keygen -t dsa -b 1024
scp /usr/local/www/mgmt/mrtg/host.pl root@nat2:/mnt/data1/mrtg/
(default location, leave password blank)


castle:
cfgmaker --if-template=template.pl --show-op-down --global "options[_]: growright,bits" --global 'WorkDir: /mnt/data1/mrtg/data' --global 'Interval: 1' --global 'LogFormat: rrdtool' --global 'PathAdd: /usr/local/bin' --global 'LibAdd: /usr/local/lib' --host-template=host.pl jc292401@10.1.2.50 --output=switch-p20.cfg
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'  
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'


i2b:
cat > /mnt/data1/mrtg/mrtg.sh
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'
#!/bin/sh
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
/usr/local/bin/mrtg /mnt/data1/mrtg/switch-p20.cfg
cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys'


confirm that you can ssh to backup2 and backup1 (and backup3 if at i2b) without getting a login prompt
chmod 0700 /mnt/data1/mrtg/mrtg.sh


ssh backup1 hostname
crontab -e
ssh backup2 hostname
* * * * * /mnt/data1/mrtg/mrtg.sh 2>&1 > /dev/null</pre>


* edit root's path and login script:
* snmp firewall block
vi /root/.cshrc
<pre>cat > /usr/local/etc/rc.d/boot.sh
ipfw add 10 allow udp from 69.55.230.2 to any 161
ipfw add 10 allow udp from 10.1.2.1 to any 161
ipfw add 11 deny udp from any to any 161
chmod 0700 /usr/local/etc/rc.d/boot.sh</pre>


Change alias entries (add G):
= bwdb =
<pre>alias la        ls -aG
== Summary ==
alias lf        ls -FAG
This machine tracks and stores network traffic (netflow) at castle. It is our means to monitor customer bandwidth usage.
alias ll        ls -lAG
alias ls        ls -AG
</pre>


and alter the prompt, set the following:
* Location: castle, cab 3-7
set prompt = "`/bin/hostname -s` %/# "
* OS: FreeBSD 4.10 x86
* Networking: Priv IP: 10.1.4.203 There are 2 onboard nic's, one of which is the "listener"
* Hardware: Custom 1U. Single power supply.
* Drives: one 250 GB (2 x 250GB) RAID1 array running on a Promise IDE RAID card.


* install cvsup
== Services Provided ==
cd /usr/ports/net/cvsup-without-gui
* netflow
make install clean; rehash; mail -s 'cvs installed' support@johncompanies.com < /dev/null
* mysql
* bigbrother
* snmp


* get latest sources for this release:
== netflow ==
<pre>cd /usr/src
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_8_3\
*default delete use-rel-suffix\
*default compress\
src-all" > sup


cvsup sup ; mail -s 'cvs sup done' support@johncompanies.com < /dev/null</pre>
The main function of this server is to run netflow on an eth device in promiscuous mode so as to hear everything happening on the port (wherein all network traffic is mirrored to that port via the cisco swith). Every 15min, it creates a flow file under <tt>/usr/home/flows/</tt> (organized by date). The flow file contains all traffic data for a 15min increment of time.


* configure new kernel
A cronjob moves that flow file (or files if there are multiple due to some delay)
1,16,31,46 * * * * /usr/home/flowbin/queue.pl


cd /usr/src/sys/amd64/conf
into a processing queue:
scp backup2:/mnt/data4/build/freebsd/kern_config-bwdb-8.3-amd64 ./bwdb
<tt>/usr/home/working</tt>


Edit config and change name:
Then a separate file processes whatever flow files it finds there, inserting the data into the local mysql database:
  vi bwdb
  2,17,32,47 * * * * /usr/home/flowbin/processflows.pl
ident  bwdb


* build, install kernel and world
== mysql ==


<pre>cd /boot
The database storing all the traffic data is named <tt>traffic</tt>
 
Tables:
mv kernel kernel.GENERIC
<pre>mysql> show tables;
cd kernel.GENERIC
+---------------------------+
cd /usr/src
| Tables_in_traffic        |
make buildkernel installkernel
+---------------------------+
 
| dailyIpTotals_69_55_224  |
make buildworld ; mail -s 'buildworld done' support@johncompanies.com < /dev/null
| dailyIpTotals_69_55_225  |
(2450: 1:56min, supermicro: 59mins, 2950: 38mins)
| dailyIpTotals_69_55_226  |
make installworld
| dailyIpTotals_69_55_227  |
(2450: 3min, supermicro: 1min, 2950: :34)
| dailyIpTotals_69_55_228  |
mergemaster -i</pre>
| dailyIpTotals_69_55_229  |
 
| dailyIpTotals_69_55_230  |
* populate /etc/rc.conf with IPs and NFS settings
| dailyIpTotals_69_55_231  |
 
| dailyIpTotals_69_55_232  |
castle:
| dailyIpTotals_69_55_233  |
<pre>vi /etc/rc.conf
| dailyIpTotals_69_55_234  |
 
| dailyIpTotals_69_55_235  |
hostname="bwdb.johncompanies.com"
| dailyIpTotals_69_55_236  |
kern_securelevel_enable="NO"
| dailyIpTotals_69_55_237  |
portmap_enable="NO"
| dailyIpTotals_69_55_238  |
sendmail_enable="NO"
| dailyIpTotals_69_55_239  |
usbd_enable="YES"
| dailyPortTotals_69_55_224 |
 
| dailyPortTotals_69_55_225 |
xntpd_enable="YES"
| dailyPortTotals_69_55_226 |
nfs_client_enable="YES"
| dailyPortTotals_69_55_227 |
nfs_reserved_port_only="YES"
| dailyPortTotals_69_55_228 |
ifconfig_fxp0="inet 10.1.4.203 netmask 255.255.255.0"
| dailyPortTotals_69_55_229 |
ifconfig_em0="up promisc"
| dailyPortTotals_69_55_230 |
defaultrouter="10.1.4.1"
| dailyPortTotals_69_55_231 |
snmpd_enable="YES"
| dailyPortTotals_69_55_232 |
 
| dailyPortTotals_69_55_233 |
inetd_enable="YES"
| dailyPortTotals_69_55_234 |
inetd_flags="-wW -a 10.1.4.203"
| dailyPortTotals_69_55_235 |
fsck_y_enable="YES"
| dailyPortTotals_69_55_236 |
background_fsck="NO"
| dailyPortTotals_69_55_237 |
sshd_enable="YES"
| dailyPortTotals_69_55_238 |
ipfw_load="YES"</pre>
| dailyPortTotals_69_55_239 |
| ipTotals_69_55_224        |
| ipTotals_69_55_225        |
| ipTotals_69_55_226        |
| ipTotals_69_55_227        |
| ipTotals_69_55_228        |
| ipTotals_69_55_229        |
| ipTotals_69_55_230        |
| ipTotals_69_55_231        |
| ipTotals_69_55_232        |
| ipTotals_69_55_233        |
| ipTotals_69_55_234        |
| ipTotals_69_55_235        |
| ipTotals_69_55_236        |
| ipTotals_69_55_237        |
| ipTotals_69_55_238        |
| ipTotals_69_55_239        |
| portTotals_69_55_224      |
| portTotals_69_55_225      |
| portTotals_69_55_226      |
| portTotals_69_55_227      |
| portTotals_69_55_228      |
| portTotals_69_55_229      |
| portTotals_69_55_230      |
| portTotals_69_55_231      |
| portTotals_69_55_232      |
| portTotals_69_55_233      |
| portTotals_69_55_234      |
| portTotals_69_55_235      |
| portTotals_69_55_236      |
| portTotals_69_55_237      |
| portTotals_69_55_238      |
| portTotals_69_55_239      |
+---------------------------+
</pre>


i2b:
So as you see we store each class-C block in its own table, for efficiency. Further, we store and organize data in 4 ways: "daily" tables and 15-minute granularity tables, and for each of those we track simple IP traffic and port-specific traffic. The daily tables contains 2 entries (one for each direction) for each IP for each day. For the current day, the row data is incremented as the day goes on.  
<pre>vi /etc/rc.conf


hostname="bwdb2.johncompanies.com"
<pre>mysql> describe dailyIpTotals_69_55_224;
kern_securelevel_enable="NO"
+-----------+-------------+------+-----+---------+-------+
portmap_enable="NO"
| Field    | Type        | Null | Key | Default | Extra |
sendmail_enable="NO"
+-----------+-------------+------+-----+---------+-------+
usbd_enable="YES"
| id        | varchar(23) |      | PRI |        |      |
| date      | date        | YES  |    | NULL    |      |
| ip        | varchar(15) | YES  | MUL | NULL    |      |
| direction | tinyint(1)  | YES  |    | NULL    |      |
| octets    | bigint(12)  | YES |    | NULL    |      |
| packets  | int(11)    | YES  |    | NULL    |      |
+-----------+-------------+------+-----+---------+-------+


xntpd_enable="YES"
mysql> select * from dailyIpTotals_69_55_224 limit 1\G
nfs_client_enable="YES"
*************************** 1. row ***************************
nfs_reserved_port_only="YES"
      id: 6955224194-20100917-1
ifconfig_fxp0="inet 10.1.2.4 netmask 255.255.255.0"
    date: 2010-09-17
ifconfig_em0="up promisc"
      ip: 69.55.224.194
defaultrouter="10.1.2.1"
direction: 1
snmpd_enable="YES"
  octets: 8821
  packets: 91
</pre>


inetd_enable="YES"
The <tt>id</tt> is a unique identifier (key), <tt>direction</tt> indicates incoming or outgoing traffic (outbound = 2, inbound = 1), <tt>octets</tt> are the amount of traffic in kilobytes, and <tt>packets</tt> is the total number of packets.
inetd_flags="-wW -a 10.1.2.4"
fsck_y_enable="YES"
background_fsck="NO"
sshd_enable="YES"
ipfw_load="YES"</pre>


* reboot. Confirm new kernel is loaded
The 15-minute table has similar information, but it's organized in 15 minute increments:


uname -a
<pre>mysql> describe ipTotals_69_55_224;
 
+-----------+------------+------+-----+---------+-------+
* update ports:
| Field    | Type      | Null | Key | Default | Extra |
<pre>cd /usr/ports
+-----------+------------+------+-----+---------+-------+
echo "*default host=cvsup4.FreeBSD.org\
| date      | datetime  | YES  |    | NULL    |      |
*default base=/usr\
| ip        | char(15)  | YES  | MUL | NULL    |      |
*default prefix=/usr\
| direction | tinyint(1) | YES  |    | NULL    |      |
*default release=cvs tag=RELENG_8_3\
| octets    | bigint(20) | YES  |    | NULL    |      |
*default delete use-rel-suffix\
| packets  | int(11)    | YES  |    | NULL    |      |
*default compress\
+-----------+------------+------+-----+---------+-------+
ports-all tag=." > sup


cvsup sup; mail -s 'cvs sup ports done' support@johncompanies.com < /dev/null</pre>
mysql> select * from ipTotals_69_55_224 limit 2\G
*************************** 1. row ***************************
    date: 2010-01-11 19:30:00
      ip: 69.55.224.13
direction: 1
  octets: 288
  packets: 6
*************************** 2. row ***************************
    date: 2010-01-11 19:30:00
      ip: 69.55.224.12
direction: 1
  octets: 216
  packets: 4</pre>


* Install raid mgmt tool
So for a given IP, there will be 192 rows in a given day: 4 rows per hour, *2 for 2 directions, *24 for 24hours in a day. Obviously this table is large which is why we broke it down into a daily table for quick, easy, daily-summary access.


<pre>cd /usr/local/sbin
That covers the simple traffic tabulation tables. We also track traffic by port:
scp backup2:/d4/build/3ware/tw_cli-freebsd-x86_64-9.5.0.1.tgz .
tar xzf tw_cli-freebsd-x86_64-9.5.0.1.tgz
rm tw_cli-freebsd-x86_64-9.5.0.1.tgz
chmod 0700 tw_cli</pre>


Test:
<pre>mysql> describe dailyPortTotals_69_55_224;
  ./tw_cli info c0
+-----------+-------------+------+-----+---------+-------+
 
| Field    | Type        | Null | Key | Default | Extra |
Grab raid check script:
+-----------+-------------+------+-----+---------+-------+
  scp backup1:/usr/local/sbin/3wraidchk /usr/local/etc
| id        | varchar(28) |      | PRI |        |      |
| date      | date        | YES  |    | NULL    |      |
| ip        | varchar(15) | YES | MUL | NULL    |      |
| direction | tinyint(1)  | YES  |    | NULL    |      |
| protocol  | smallint(3) | YES  |    | NULL    |      |
| port      | int(11)    | YES  |    | NULL    |      |
| octets    | bigint(11)  | YES  |    | NULL    |      |
| packets  | int(11)    | YES |    | NULL    |      |
+-----------+-------------+------+-----+---------+-------+
8 rows in set (0.00 sec)


Setup cronjob:
mysql> select * from dailyPortTotals_69_55_224 limit 1\G
<pre>crontab -e
*************************** 1. row ***************************
*/5 * * * * /usr/local/etc/3wraidchk</pre>
      id: 695522496-20091218-1-6-23
    date: 2009-12-18
      ip: 69.55.224.96
direction: 1
protocol: 6
    port: 23
  octets: 1796
  packets: 30


* install rsync from ports
mysql> select * from portTotals_69_55_224 limit 1\G
  cd /usr/ports/net/rsync
*************************** 1. row ***************************
make install clean
    date: 2010-09-07 18:45:00
      ip: 69.55.224.254
direction: 1
  protocol: 6
    port: 99999
  octets: 144
  packets: 3


choose default options
</pre>


* install perl from ports
This is largely the same with 2 more additions: <tt>protocol</tt> (1=ICMP, 6=TCP, 17=UDP), and <tt>port</tt> which we set to 99999 if the traffic is return traffic and the port is above 1024. Obviously the potential for number of rows grows quickly when you consider the addition of port and protocol tracking per IP.
cd /usr/ports/lang/perl5.8
make install clean


choose default options
== Regular maintenance ==
 
*[[Routine_Maintenance#Adaptec_Controllers|Check RAID array]]
* install bb client
* archive data from database
archive_daily.pl 2012 09
This will archive data for the given year and month from the daily summary tables. Generally we want to have a year of history in the database.


Compiling from source on AMD64 will not work. So, we use a linux-compiled version and rely on linux compat. Linux compat won't install on 8.x - libtool 2.4 need. So, instead we copy(ed) over linux:
archive_15min.pl 2012 09
rsync -aSHv --exclude=proc --exclude=sys 10.1.4.108:/usr/compat/linux/ /usr/compat/linux/
This will archive data for the given year and month from the 15min-increment tables. Generally, we want to have 6 months of history in the database.


adduser
* if space becomes tight, move flow files and exported data to a backup server, both located in <tt>/usr/home/flowbin/archive</tt> and <tt>/usr/home/exported</tt>, respectively


Output/response:
== Slaving ==


<pre>Username: bb
If we were going to setup traffic database slaving (we don't do this anymore), perhaps cause the bwdb machine gets busy and it cannot handle traffic requests and netflow, here's how it's done:
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username  : bb
Password  : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups    : bb
Home      : /home/bb
Shell      : /bin/sh
Locked    : no
OK? (yes/no): yes</pre>


cd /usr/home/bb
On the traffic master:
scp backup2:/mnt/data4/build/bb/bb-freebsd_linuxcompat.tgz .
tar xzf bb-freebsd_linuxcompat.tgz


edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.1.4.8' IDENTIFIED BY 'qERUG8wf';


echo "10.1.4.5 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
in my.cnf:
10.1.4.203 bwdb.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
<pre>bin-log
server-id=1
max_binlog_size=500M
expire_logs_days = 3</pre>


Edit for machine name and private IP.
on slave:
in my.cnf:
<pre>server-id      = 2
master-host    =  10.1.4.203
master-user    =  repl
master-password =  qERUG8wf
master-connect-retry=60
replicate-wild-do-table=traffic.daily%
max_relay_log_size=500M
expire_logs_days = 3


if this machine is at i2b:
replicate-wild-do-table=traffic.%</pre>
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.4 bwdb2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts


<pre>vi /home/bb/bbc1.9e-btf/ext/openfiles
on master:
touch /usr/home/working/.lock
(make sure processflows not running)


MACHINE="bwdb,johncompanies,com"      # HAS TO BE IN A,B,C FORM</pre>
<pre>FLUSH TABLES WITH READ LOCK;
Edit for machine name.
cd /usr/home/database/traffic
tar -czf mysql-traffic-snapshot.tgz ./daily*
(~1G)
SHOW MASTER STATUS;
+-----------------+-----------+--------------+------------------+
| File            | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+-----------+--------------+------------------+
| bwdb-bin.000039 | 154432615 |              |                  |
+-----------------+-----------+--------------+------------------+


Have bb watch for flow-capture, mysql
(write down info)
<pre>cat >> /home/bb/bbc1.9e-btf/etc/bb-proctab
UNLOCK TABLES;
localhost: flow-capture :
scp mysql-traffic-snapshot.tgz 10.1.4.5:/mnt/data1/db/mysql/traffic/</pre>
localhost: mysqld :</pre>


on slave:
<pre>mkdir /mnt/data1/db/mysql/traffic
cd /mnt/data1/db/mysql/traffic/
tar xzvf mysql-traffic-snapshot.tgz
(restart mysql)
CHANGE MASTER TO MASTER_HOST='10.1.4.203',MASTER_USER='repl',MASTER_PASSWORD='qERUG8wf',MASTER_LOG_FILE='bwdb-bin.000059',MASTER_LOG_POS=482502186;
START SLAVE;</pre>


<pre>cd /usr/home/bb/bbc1.9e-btf/etc
<pre>cd /usr/home/database/traffic
./bbchkcfg.sh
scp *</pre>  
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf
./runbb.sh start
more BBOUT
(look for errors)
exit</pre>
 
Put in script to start bb @ boot:
echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh


<pre>optimize table dailyPortTotals_69_55_224;
optimize table dailyPortTotals_69_55_225;
optimize table dailyPortTotals_69_55_226;
optimize table dailyPortTotals_69_55_227;
optimize table dailyPortTotals_69_55_228;
optimize table dailyPortTotals_69_55_229;
optimize table dailyPortTotals_69_55_230;
optimize table dailyPortTotals_69_55_231;
optimize table dailyPortTotals_69_55_232;
optimize table dailyPortTotals_69_55_233;
optimize table dailyPortTotals_69_55_234;
optimize table dailyPortTotals_69_55_235;
optimize table dailyPortTotals_69_55_236;
optimize table dailyPortTotals_69_55_237;
optimize table dailyPortTotals_69_55_238;
optimize table dailyPortTotals_69_55_239;</pre>


If this is at i2b, punch a hole in the firewall to allow it to communicate with bb monitor:
== Build ==


ipfw add 00096 allow tcp from 66.181.18.0/27 to 69.55.230.2
=== BIOS Config ===
disable quiet boot
 
set to last state after power loss


set date/time to GMT


* configure bb on mail
enable serial console output (baud rate 115200)
<pre>vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
 
10.1.4.203 bwdb.johncompanies.com # ssh
=== Install OS ===
 
Install FreeBSD 8.3 amd64


su bb
* partition map:
cd
<pre>/ 500m
bbsrc/bb/runbb.sh restart ; exit</pre>
swap 4096m
/var 256m
/tmp 256m
/usr ~</pre>


* configure ntp server
* edit /etc/make.conf
Castle:
Castle:
echo "server 10.1.4.1" > /etc/ntp.conf
<pre>echo "WITHOUT_X11=yes \
KERNCONF=bwdb \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf</pre>


I2b:
i2b:
echo "server 10.1.2.1" > /etc/ntp.conf
<pre>echo "WITHOUT_X11=yes \
KERNCONF=bwdb2 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf</pre>


<pre>/usr/sbin/ntpd -p /var/run/ntpd.pid
* add settings to /boot/loader.conf and /boot.config
sleep 2; ntpq -p</pre>
(confirm it’s able to reach our time server)


<pre>echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
<pre>echo "-Dh" >> /boot.config
chmod 0700 /usr/local/etc/rc.d/ntp.sh</pre>


* fwd and reverse lookups on ns1c
echo 'console="comconsole,vidconsole" \
vr johncompanies.com
boot_multicons="YES" \
(edit the PTR too)
boot_serial="YES" \
 
comconsole_speed="115200"' >> /boot/loader.conf</pre>
* setup backups
<pre>echo '#\!/bin/sh\
backupdir=/data/bwdb/current\
server=backup1\
\
## ENTRY /etc\
## ENTRY /usr/home/flowbin\
## ENTRY /usr/home/database' > /usr/local/etc/backup.config</pre>


Castle:
* turn off all ttyv's except 0 and 1 in /etc/ttys
setup backup dirs:
also turn on ttyu0, change type to vt100:
ssh backup1 mkdir -p /data/bwdb/current
<pre>vi /etc/ttys
on backup1, add the system to  
vi /usr/local/sbin/snapshot_rotate


I2b:
ttyv2  "/usr/libexec/getty Pc"        cons25  off secure
setup backup dirs:
ttyv3  "/usr/libexec/getty Pc"        cons25  off secure
  ssh backup3 mkdir -p /data/bwdb/current
ttyv4  "/usr/libexec/getty Pc"        cons25  off secure
on backup3, add the system to
ttyv5  "/usr/libexec/getty Pc"        cons25  off secure
vi /usr/local/sbin/snapshot_archive
ttyv6  "/usr/libexec/getty Pc"        cons25 off secure
ttyv7  "/usr/libexec/getty Pc"        cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyu0  "/usr/libexec/getty std.9600"  vt100  on secure


kill -1 1</pre>


Copy over the backup script:
on console server:
  scp backup2:/d4/bin/freebsd8.x/rsync.backup /usr/local/etc/
  vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console


Edit rsync.backup and change <tt>config</tt> var to point to correct config file location: <tt>/usr/local/etc/backup.config</tt>


<pre>crontab -e
* populate hosts
5 0 * * * /usr/local/etc/rsync.backup</pre>
i2b:
<pre>echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts</pre>


* make /root/logs
castle:
mkdir /root/logs
<pre>echo "10.1.4.3 backup2 backup2.johncompanies.com" >> /etc/hosts
echo "10.1.4.8 backup1 backup1.johncompanies.com" >> /etc/hosts
echo "10.1.4.4 mail mail.johncompanies.com" >> /etc/hosts
</pre>


* edit sshd_config for security
* put key in authorized_keys on backup1 and  backup2
cd
ssh-keygen -t dsa -b 1024
(default location, leave password blank)


<pre>vi /etc/ssh/sshd_config
castle:
ListenAddress 10.1.4.203
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'
PermitRootLogin yes
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'


kill -1 `cat /var/run/sshd.pid`</pre>
i2b:
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys'


Edit for private IP.
confirm that you can ssh to backup2 and backup1 (and backup3 if at i2b) without getting a login prompt


* snmp
ssh backup1 hostname
ssh backup2 hostname


(Before doing this you may need to take down the firewall and also add to resolv.conf 69.43.143.41)
* edit root's path and login script:
<pre>
vi /root/.cshrc
cd /usr/ports/net-mgmt/net-snmp
make install clean
(defaults)


cat >> /etc/rc.conf
Change alias entries (add G):
snmpd_enable="YES"
<pre>alias la        ls -aG
snmpd_flags="-a"
alias lf        ls -FAG
snmpd_conffile="/usr/local/share/snmp/snmpd.conf"
alias ll        ls -lAG
snmptrapd_enable="YES"
alias ls        ls -AG
snmptrapd_flags="-a -p /var/run/snmptrapd.pid"
 
cat > /usr/local/share/snmp/snmpd.conf
rocommunity  jcread 10.1.4.5
rocommunity  jcread 10.1.4.202
</pre>
</pre>


=== netflow ===
and alter the prompt, set the following:
set prompt = "`/bin/hostname -s` %/# "


Install flow tools:
* install cvsup
<pre>cd /usr/ports/net-mgmt/flow-tools
cd /usr/ports/net/cvsup-without-gui
make install clean</pre>
make install clean; rehash; mail -s 'cvs installed' support@johncompanies.com < /dev/null
Defaults.


mkdir /usr/home/flows
* get latest sources for this release:
<pre>cd /usr/src
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_8_3\
*default delete use-rel-suffix\
*default compress\
src-all" > sup


Flow start script:
cvsup sup ; mail -s 'cvs sup done' support@johncompanies.com < /dev/null</pre>
echo "/usr/local/bin/flow-capture -w /usr/home/flows -S5 -N -2 0/10.1.4.203/4444" > /usr/local/etc/rc.d/flow-capture.sh


chmod 0700 /usr/local/etc/rc.d/flow-capture.sh
* configure new kernel


Edit for private IP.
cd /usr/src/sys/amd64/conf
scp backup2:/mnt/data4/build/freebsd/kern_config-bwdb-8.3-amd64 ./bwdb


Netgraph start script:
Edit config and change name:
<pre>
vi bwdb
cat > /usr/local/etc/rc.d/netgraph.sh
ident  bwdb
 
* build, install kernel and world
 
<pre>cd /boot
 
mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel


/usr/sbin/ngctl -f- <<-SEQ
make buildworld ; mail -s 'buildworld done' support@johncompanies.com < /dev/null
mkpeer em0: netflow lower iface0
(2450: 1:56min, supermicro: 59mins, 2950: 38mins)
name em0:lower netflow
make installworld
connect em0: netflow: upper out0
(2450: 3min, supermicro: 1min, 2950: :34)
mkpeer netflow: ksocket export inet/dgram/udp
mergemaster -i</pre>
msg netflow:export connect inet/10.1.4.203:4444
SEQ


#/usr/sbin/ngctl -f- <<-SEQ
* populate /etc/rc.conf with IPs and NFS settings
#shutdown netflow:
#SEQ


chmod 0700 /usr/local/etc/rc.d/netgraph.sh</pre>
castle:
Edit for private IP.
<pre>vi /etc/rc.conf


Confirm netflow is running after running scripts:
hostname="bwdb.johncompanies.com"
<pre>newbwdb /usr/ports/net-mgmt/flow-tools# /usr/sbin/ngctl
kern_securelevel_enable="NO"
Available commands:
portmap_enable="NO"
  config    get or set configuration of node at <path>
sendmail_enable="NO"
  connect    Connects hook <peerhook> of the node at <relpath> to <hook>
usbd_enable="YES"
  debug      Get/set debugging verbosity level
  dot        Produce a GraphViz (.dot) of the entire netgraph.
  help      Show command summary or get more help on a specific command
  list      Show information about all nodes
  mkpeer    Create and connect a new node to the node at "path"
  msg        Send a netgraph control message to the node at "path"
  name      Assign name <name> to the node at <path>
  read      Read and execute commands from a file
  rmhook    Disconnect hook "hook" of the node at "path"
  show      Show information about the node at <path>
  shutdown  Shutdown the node at <path>
  status    Get human readable status information from the node at <path>
  types      Show information about all installed node types
  write      Send a data packet down the hook named by "hook".
  quit      Exit program
+ show netflow:
  Name: netflow        Type: netflow        ID: 00000004  Num hooks: 3
  Local hook      Peer name      Peer type    Peer ID        Peer hook
  ----------      ---------      ---------    -------        ---------
  export          <unnamed>      ksocket      00000005        inet/dgram/udp
  out0            em0            ether        00000001        upper
  iface0          em0            ether        00000001        lower
+
</pre>


We notice that sometimes flow-capture is failing due to swap exhaustion (even after adding more swap). So we crontab flow-capture to restart (it's ok to start if it's already running, it just quits):
xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
ifconfig_fxp0="inet 10.1.4.203 netmask 255.255.255.0"
ifconfig_em0="up promisc"
defaultrouter="10.1.4.1"
snmpd_enable="YES"


<pre>
inetd_enable="YES"
crontab -e
inetd_flags="-wW -a 10.1.4.203"
#restart flow-capture
fsck_y_enable="YES"
*/15 * * * * /usr/local/etc/rc.d/flow-capture.sh
background_fsck="NO"
</pre>
sshd_enable="YES"
ipfw_load="YES"</pre>


==== process flow tools ====
i2b:
<pre>vi /etc/rc.conf


<pre>mkdir /usr/home/flowbin
hostname="bwdb2.johncompanies.com"
mkdir /usr/home/working</pre>
kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"


Install modules:
xntpd_enable="YES"
<pre>cd /usr/ports/devel/p5-Date-Calc
nfs_client_enable="YES"
make install clean
nfs_reserved_port_only="YES"
cd /usr/ports/mail/p5-Mail-Sendmail
ifconfig_fxp0="inet 10.1.2.4 netmask 255.255.255.0"
make install clean</pre>
ifconfig_em0="up promisc"
defaultrouter="10.1.2.1"
snmpd_enable="YES"


Queue script:
inetd_enable="YES"
<pre>
inetd_flags="-wW -a 10.1.2.4"
cat > /usr/home/flowbin/queue.pl
fsck_y_enable="YES"
#!/usr/bin/perl
background_fsck="NO"
sshd_enable="YES"
ipfw_load="YES"</pre>


use strict;
* reboot. Confirm new kernel is loaded


BEGIN {
uname -a
    push @INC, "/usr/home/flowbin";
}


use date;
* update ports:
<pre>cd /usr/ports
echo "*default host=cvsup4.FreeBSD.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_8_3\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup


my $flowbase = "/usr/home/flows";
cvsup sup; mail -s 'cvs sup ports done' support@johncompanies.com < /dev/null</pre>
#my $flowqueue = "/usr/home/queue";
my $flowqueue = "/usr/home/working";


my ($date, $time) = date::CurrentDateTime();
* Install raid mgmt tool


my $flowdir = mkFlowDir($date);
<pre>cd /usr/local/sbin
`mv $flowdir/ft-* $flowqueue`;
scp backup2:/d4/build/3ware/tw_cli-freebsd-x86_64-9.5.0.1.tgz .
tar xzf tw_cli-freebsd-x86_64-9.5.0.1.tgz
rm tw_cli-freebsd-x86_64-9.5.0.1.tgz
chmod 0700 tw_cli</pre>


if (date::DateWindow($date, $time, $date, "00:00:00", 600)) {
Test:
    my $newdate = date::AddDays($date, -1);
./tw_cli info c0
    my $flowdir = mkFlowDir($newdate);
    `mv $flowdir/ft-* $flowqueue`;
}


sub mkFlowDir {
Grab raid check script:
    my $date = shift;
scp backup1:/usr/local/sbin/3wraidchk /usr/local/etc
    $date =~ /([0-9]{4}-[0-9]{2})/;
    my $yearmonth = $1;
    return "$flowbase/$yearmonth/$date";
}
</pre>


Date.pm module:
Setup cronjob:
<pre>
<pre>crontab -e
cat > /usr/home/flowbin/date.pm
*/5 * * * * /usr/local/etc/3wraidchk</pre>
#!/usr/local/bin/perl
#
# $Header: /usr/cvs/newgw/lib/date.pm,v 1.2 2003/11/24 17:06:02 glenn Exp $
#
# Copyright (c) 2001, 2002, 2003
#      e-Monitoring Networks, Inc.  All rights reserved.
#
#
#
# date.pl - Higher level functions written on top of Date::Calc


package date;
* install rsync from ports
cd /usr/ports/net/rsync
make install clean
 
choose default options
 
* install perl from ports
cd /usr/ports/lang/perl5.8
make install clean
 
choose default options
 
* install bb client


use strict;
Compiling from source on AMD64 will not work. So, we use a linux-compiled version and rely on linux compat. Linux compat won't install on 8.x - libtool 2.4 need. So, instead we copy(ed) over linux:
use Date::Calc qw(:all);
rsync -aSHv --exclude=proc --exclude=sys 10.1.4.108:/usr/compat/linux/ /usr/compat/linux/


sub DayDiff { #calculate the difference in days from two dates
adduser
    my $date1 = shift;
    my $date2 = shift;
    my ($year1, $month1, $day1) = &DateToymd($date1);
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my $diff = &Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
    return $diff;
}


sub AddDays { #adds specified number of days to the supplied date
Output/response:
    my $date = shift;
    my $days = shift;
    my ($year, $month, $day) = &DateToymd($date);
    my ($nyear, $nmonth, $nday) = &Add_Delta_Days($year, $month, $day, $days);
    my $ndate = &ymdToDate($nyear, $nmonth, $nday);
    return $ndate;
}


sub AddHours { #adds specified number of hours to the supplied date and time
<pre>Username: bb
    my $date = shift;
Full name: bb
    my $time = shift;
Uid (Leave empty for default): 1984
    my $addhours = shift;
Login group [bb]:
    my $adddays = 0;
Login group is bb. Invite bb into other groups? []:
    if (abs($addhours / 24) >= 1) {
Login class [default]:
        $adddays = int($addhours / 24);
Shell (sh csh tcsh nologin) [sh]:
        $addhours -= $adddays * 24;
Home directory [/home/bb]:
     }
Use password-based authentication? [yes]:
    my ($year, $month, $day) = &DateToymd($date);
Use an empty password? (yes/no) [no]:
     my ($hour, $minute, $second) = &TimeTohms($time);
Use a random password? (yes/no) [no]: yes
    my ($ny, $nm, $nd, $nh, $nmin, $ns) = &Add_Delta_DHMS($year, $month, $day,
Lock out the account after creation? [no]:
                                                          $hour, $minute, $second,
Username  : bb
                                                          $adddays, $addhours, 0, 0);
Password  : <random>
    my $ndate = &ymdToDate($ny, $nm, $nd);
Full Name  : bb
    my $ntime = &hmsToTime($nh, $nmin, $ns);
Uid        : 1984
    return $ndate, $ntime;
Class      :
}
Groups     : bb
Home      : /home/bb
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes</pre>
 
cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd_linuxcompat.tgz .
tar xzf bb-freebsd_linuxcompat.tgz
 
edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:


sub AddMinutes {
echo "10.1.4.5 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
    my $date = shift;
10.1.4.203 bwdb.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
    my $time = shift;
 
    my $minutes = shift;
Edit for machine name and private IP.
    my ($year, $month, $day) = &DateToymd($date);
    my ($hour, $minute, $second) = &TimeTohms($time);
    my ($ny, $nm, $nd, $nh, $nmin, $ns) = &Add_Delta_DHMS($year, $month, $day,
                                                          $hour, $minute, $second,
                                                          0, 0, $minutes, 0);
    my $ndate = &ymdToDate($ny, $nm, $nd);
    my $ntime = &hmsToTime($nh, $nmin, $ns);
    return $ndate, $ntime;
}


sub CurrentDateTime { #return the current date and time
if this machine is at i2b:
    my ($y, $m, $d, $h, $min, $s, $z, $z, $z) = &System_Clock;
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
    my $date = &ymdToDate($y, $m, $d);
10.1.2.4 bwdb2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
    my $time = &hmsToTime($h, $min, $s);
    return $date, $time;
}


sub Currentymd { #return the current year, month and day as separate variables
<pre>vi /home/bb/bbc1.9e-btf/ext/openfiles
    my ($y, $m, $d, $h, $min, $s, $z, $z, $z) = &System_Clock;
    return $y, $m, $d;
}


sub DateToymd { #takes a date and returns year, month, day as individual values
MACHINE="bwdb,johncompanies,com"      # HAS TO BE IN A,B,C FORM</pre>
    my $date = shift;
Edit for machine name.
    if ($date =~ /([0-9]{4})-([0-9]{2})-([0-9]{2})/) {
        my $day = $3;
        my $month = $2;
        my $year = $1;
        return $year, $month, $day;
    }
    return undef;
}


sub TimeTohms { #takes a time and return hours minutes and seconds as individual values
Have bb watch for flow-capture, mysql
    my $time = shift;
<pre>cat >> /home/bb/bbc1.9e-btf/etc/bb-proctab
    if ($time =~ /([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/) {
localhost: flow-capture :
        my $hour = $1;
localhost: mysqld :</pre>
        my $minute = $2;
        my $second = $3;
        if ($hour !~ /[0-9]{2}/) { $hour = "0$hour"; }
        if ($minute !~ /[0-9]{2}/) { $minute = "0$minute"; }
        if ($second !~ /[0-9]{2}/) { $second = "0$second"; }
        return $hour, $minute, $second;
    }
    return undef;
}


sub ymdToDate { #takes year, month, day and assembles them into our date format
    my $year = shift;
    my $month = shift;
    my $day = shift;
    if (defined($year) && defined($month) && defined ($day)) {
        $month = sprintf("%02d", $month);
        $day = sprintf("%02d", $day);
        return "$year-$month-$day";
    }
    return undef;
}


sub hmsToTime { #takes hour minute and second and assembles them into our time format
<pre>cd /usr/home/bb/bbc1.9e-btf/etc
    my $hour = shift;
./bbchkcfg.sh
    my $minute = shift;
(y to questions)
    my $second = shift;
./bbchkhosts.sh
    if (defined($hour) && defined($minute) && defined ($second)) {
(ignore ssh errors)
        if ($hour !~ /[0-9]{2}/) { $hour = "0$hour"; }
cd ../..
        if ($minute !~ /[0-9]{2}/) { $minute = "0$minute"; }
chown -R bb .
        if ($second !~ /[0-9]{2}/) { $second = "0$second"; }
su bb
        return sprintf ("%02d:%02d:%02d", $hour, $minute, $second);
cd
    }
cd bbc1.9e-btf
    return undef;
./runbb.sh start
}
more BBOUT
(look for errors)
exit</pre>


sub CompareDates { #compares two date and time pairs
Put in script to start bb @ boot:
    my $date1 = shift;
echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
    my $time1 = shift;
chmod +x /usr/local/etc/rc.d/bb.sh
    my $date2 = shift;
    my $time2 = shift;


    my ($year1, $month1, $day1) = &DateToymd($date1);
    my ($hour1, $minute1, $second1) = &TimeTohms($time1);
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my ($hour2, $minute2, $second2) = &TimeTohms($time2);


#    &debug("$year1, $month1, $day1, $year2, $month2, $day2");
If this is at i2b, punch a hole in the firewall to allow it to communicate with bb monitor:
    my $days = &Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
    if ($days > 0) { return 1;}
    if ($days < 0) { return -1;}
    if ($days == 0) { #same day, compare times
        my $seconds1 = $second1 + (60 * $minute1) + (3600 * $hour1);
        my $seconds2 = $second2 + (60 * $minute2) + (3600 * $hour2);
        if ($seconds1 < $seconds2) { return 1;}
        if ($seconds1 > $seconds2) { return -1;}
        if ($seconds1 == $seconds2) { return 0;}
    }
    return undef;
}


sub DateWindow { #compares two date time pairs to see if they are < X seconds apart
ipfw add 00096 allow tcp from 66.181.18.0/27 to 69.55.230.2
    my $date1 = shift;
    my $time1 = shift;
    my $date2 = shift;
    my $time2 = shift;
    my $window = shift;


    my ($year1, $month1, $day1) = &DateToymd($date1);
    my ($hour1, $minute1, $second1) = &TimeTohms($time1);
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my ($hour2, $minute2, $second2) = &TimeTohms($time2);


    my ($day, $hour, $minute, $second) =
* configure bb on mail
        &Delta_DHMS($year1, $month1, $day1, $hour1, $minute1, $second1,
<pre>vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
                    $year2, $month2, $day2, $hour2, $minute2, $second2);
10.1.4.203 bwdb.johncompanies.com # ssh
    $minute *= 60;
    $hour *= 3600;
    $day *= 86400;
    my $total = $second + $minute + $hour + $day;
    if (abs($total) < $window) {
        return 1;
    }
    return 0;
}


sub CheckDateOrder { #takes three dates/times, returns true if they are in chronological order
su bb
    my $date1 = shift;
cd
    my $time1 = shift;
bbsrc/bb/runbb.sh restart ; exit</pre>
    my $date2 = shift;
    my $time2 = shift;
    my $date3 = shift;
    my $time3 = shift;
    if (&CompareDates($date1, $time1, $date2, $time2) == -1) {
        return 0;
    }
    if (&CompareDates($date2, $time2, $date3, $time3) == -1) {
        return 0;
    }
    return 1;
}


sub EpochSeconds { #calculates number of seconds since the epoch for the given date/time
* configure ntp server
    my $date = shift;
Castle:
    my $time = shift;
echo "server 10.1.4.1" > /etc/ntp.conf
    my ($year, $month, $day) = &DateToymd($date);
    my ($hour, $minute, $second) = &TimeTohms($time);
    my ($d, $h, $m, $s) = &Delta_DHMS(1970, 1, 1, 0, 0, 0,
                                      $year, $month, $day, $hour, $minute, $second);
    my $seconds = $s + (60 * $m) + (3600 * $h) + (86400 * $d);
    return $seconds;
}


sub SecondsToDateTime { #converts seconds since epoch to date/time
I2b:
    my $seconds = shift;
echo "server 10.1.2.1" > /etc/ntp.conf
    my $days = int($seconds / 86400);
    $seconds -= $days * 86400;
    my $hours = int($seconds / 3600);
    $seconds -= $hours * 3600;
    my $minutes = int($seconds / 60);
    $seconds -= $minutes * 60;
    my ($year, $month, $day, $hour, $minute, $second) =
        &Add_Delta_DHMS(1970, 1, 1, 0, 0, 0, $days, $hours, $minutes, $seconds);
    $month = sprintf("%02d", $month);
    $day = sprintf("%02d", $day);
    $hour = sprintf("%02d", $hour);
    $minute = sprintf("%02d", $minute);
    $second = sprintf("%02d", $second);
    return "$year-$month-$day", "$hour:$minute:$second";
}


sub DateToDayName {
<pre>/usr/sbin/ntpd -p /var/run/ntpd.pid
    my $date = shift;
sleep 2; ntpq -p</pre>
    my ($year, $month, $day) = &DateToymd($date);
(confirm it’s able to reach our time server)
    my $name = &Day_of_Week_to_Text(&Day_of_Week($year, $month, $day));
    $name =~ /^[A-Za-z]{3}/;
    $name = $&;
    return $name;
}


sub ValiDate {
<pre>echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
    return @_;
chmod 0700 /usr/local/etc/rc.d/ntp.sh</pre>


* fwd and reverse lookups on ns1c
vr johncompanies.com
(edit the PTR too)


* setup backups
<pre>echo '#\!/bin/sh\
backupdir=/data/bwdb/current\
server=backup1\
\
## ENTRY /etc\
## ENTRY /usr/home/flowbin\
## ENTRY /usr/home/database' > /usr/local/etc/backup.config</pre>


}
Castle:
setup backup dirs:
ssh backup1 mkdir -p /data/bwdb/current
on backup1, add the system to
vi /usr/local/sbin/snapshot_rotate
 
I2b:
setup backup dirs:
ssh backup3 mkdir -p /data/bwdb/current
on backup3, add the system to
vi /usr/local/sbin/snapshot_archive


sub CheckBusinessDay { # checks to see if date is business day. 1=yes, 0=no
    my $date = shift;
    my ($year, $month, $day) = &DateToymd($date);
    if (Day_of_Week($year,$month,$day) < 6) { return 1; }
    else { return 0; }
}


1; #don't remove this line
Copy over the backup script:
</pre>
scp backup2:/d4/bin/freebsd8.x/rsync.backup /usr/local/etc/


chmod 0700 /usr/home/flowbin/queue.pl
Edit rsync.backup and change <tt>config</tt> var to point to correct config file location: <tt>/usr/local/etc/backup.config</tt>


Setup cronjob:
<pre>crontab -e
<pre>crontab -e
#move flow data into the queue
5 0 * * * /usr/local/etc/rsync.backup</pre>
1,16,31,46 * * * * /usr/home/flowbin/queue.pl</pre>


==== flow processing: i2b ====
* make /root/logs
<pre>cat > /usr/home/flowbin/processflows-sql.pl
mkdir /root/logs
#!/usr/bin/perl


#use strict;
* edit sshd_config for security
#$debug=1;
#$dry=1;


my $log = '/usr/home/flowbin/discards.log';
<pre>vi /etc/ssh/sshd_config
ListenAddress 10.1.4.203
PermitRootLogin yes


use Data::Dumper;
kill -1 `cat /var/run/sshd.pid`</pre>


BEGIN {
Edit for private IP.
    push @INC, "/usr/home/flowbin";
}


#my $queuedir = "/usr/home/queue";
* snmp
my $queuedir = "/usr/home/working";
my $archivedir = "/usr/home/archive";
my $sqldir = "/usr/home/sql";
my $sqldirworking = "/usr/home/sql/tmp";


unless ($dry) {
(Before doing this you may need to take down the firewall and also add to resolv.conf 69.43.143.41)
    if (-e "$queuedir/.lock") {
<pre>
        open(FILE, "$queuedir/.lock");
cd /usr/ports/net-mgmt/net-snmp
        my $pid = <FILE>;
make install clean
        chomp($pid);
(defaults)
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $queuedir/.lock`;
        }
    }
    open(FILE, "> $queuedir/.lock");
    print FILE "$$\n";
    close(FILE);
}


opendir(DIR, $queuedir);
cat >> /etc/rc.conf
my @files = readdir(DIR);
snmpd_enable="YES"
closedir(DIR);
snmpd_flags="-a"
snmpd_conffile="/usr/local/share/snmp/snmpd.conf"
snmptrapd_enable="YES"
snmptrapd_flags="-a -p /var/run/snmptrapd.pid"


foreach my $file (sort @files) {
cat > /usr/local/share/snmp/snmpd.conf
    unless($file =~ /^\./) {
rocommunity  jcread 10.1.4.5
        $file =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})\.([0-9]{2})([0-9]{2})([0-9]{2})/;
rocommunity  jcread 10.1.4.202
        my $date = "$1 $2:$3:$4";
</pre>
        my $outfile = "$1-$2:$3.sql";
 
        unless (open (SQL, "+> $sqldirworking/$outfile")) { die "cant open $sqldirworking/$outfile"; }
=== netflow ===
        my $condensedDate = $1;
        $condensedDate =~ s/-//g;
        my $iptotal = {};
        my $protototal = {};
        my $porttotal = {};


        &debug("started file $file at ");
Install flow tools:
        &debug(`date`);
<pre>cd /usr/ports/net-mgmt/flow-tools
        &debug("getting raw flow data (flow-print)");
make install clean</pre>
        `cat $queuedir/$file | /usr/local/bin/flow-print -f 5 > /usr/home/working/tmp-$file`;
Defaults.
        &debug("aggregating data at ");
        &debug(`date`);
        unless (open(DATA, "/usr/home/working/tmp-$file")) { die "can't open: $!"; }
        LOOP: while (my $line = readline DATA) {
            my @d = split /[\s]+/, $line;
            if ($d[0] ne '' && $d[0] ne 'Start') {
                my $addr = 0;
                my $port = 0;


                #Start End Sif SrcIPaddress SrcP DIf DstIPaddress DstP P Fl Pkts Octets
  mkdir /usr/home/flows
                #0    1  2  3            4    5  6            7    8 9 10  11
                          #|
                          # outbound = 2, inbound = 1


                my (@src_ip) = split '\.', $d[3];
Flow start script:
                my (@dst_ip) = split '\.', $d[6];
echo "/usr/local/bin/flow-capture -w /usr/home/flows -S5 -N -2 0/10.1.4.203/4444" > /usr/local/etc/rc.d/flow-capture.sh


                if ($src_ip[0] == 69 && $src_ip[1] == 55 && ($src_ip[2] == 229 || $src_ip[2] == 231)) { # for i2b
chmod 0700 /usr/local/etc/rc.d/flow-capture.sh
                  $d[2] = 2;
                  # hack for outbound bulk traffic counted 2x
                  #if ($src_ip[2] == 231) { $d[11] /= 2; $d[10] /= 2; }
                }
                # note- this is where we filter out IPs only found at i2b
                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 && ($dst_ip[2] == 229 || $dst_ip[2] == 231)) { # for i2b
                  $d[2] = 1;
                }
                else { next LOOP; }


                if ($d[2] == 2) {
Edit for private IP.
                    $addr = $d[3];
                    # if the dst-port is low, store that
                    if ($d[7] <= 1024) { $port = $d[7]; }
                    # if the src-port is low, store that
                    elsif ($d[4] <= 1024) { $port = $d[4]; }
                    else { $port = 99999; }
                }
                elsif ($d[2] == 1) {
                    $addr = $d[6];
                    # if the dst-port is high, assume its return traffic, try to store src-port if low
                    if ($d[7] > 1024) {
                        if ($d[4] <= 1024) { $port = $d[4]; }
                        else { $port = 99999; }
                    } else {
                        $port = $d[7];
                    }
                } else {
                    next LOOP;
                }


                my (@ip) = split '\.', $addr;
Netgraph start script:
                unless ($ip[0] == 69) { next LOOP; }
<pre>
                unless ($ip[1] == 55) { next LOOP; }
cat > /usr/local/etc/rc.d/netgraph.sh
                unless ($ip[2] == 229 || $ip[2] == 231) { next LOOP; }


                my $classC = "$ip[0]_$ip[1]_$ip[2]";
/usr/sbin/ngctl -f- <<-SEQ
mkpeer em0: netflow lower iface0
name em0:lower netflow
connect em0: netflow: upper out0
mkpeer netflow: ksocket export inet/dgram/udp
msg netflow:export connect inet/10.1.4.203:4444
SEQ


#                         IP        dir
#/usr/sbin/ngctl -f- <<-SEQ
#                if ($d[10] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10]; }
#shutdown netflow:
#                if ($d[11] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11]; }
#SEQ
#
#                if ($d[10] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10]; }
#               if ($d[11] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11]; }
#
#                if ($d[10] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'octetTotal'} += $d[11]; }
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10];
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11];


                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10];
chmod 0700 /usr/local/etc/rc.d/netgraph.sh</pre>
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11];
Edit for private IP.


                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'pktTotal'} += $d[10];
Confirm netflow is running after running scripts:
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'octetTotal'} += $d[11];
<pre>newbwdb /usr/ports/net-mgmt/flow-tools# /usr/sbin/ngctl
            }
Available commands:
        }
  config    get or set configuration of node at <path>
        close(DATA);
  connect    Connects hook <peerhook> of the node at <relpath> to <hook>
        `rm /usr/home/working/tmp-$file`;
  debug      Get/set debugging verbosity level
         &debug("processing ip totals at ");
  dot        Produce a GraphViz (.dot) of the entire netgraph.
         &debug(`date`);
  help      Show command summary or get more help on a specific command
         foreach my $classC (keys(%{$iptotal})) {
  list      Show information about all nodes
            my @values;
  mkpeer    Create and connect a new node to the node at "path"
            foreach my $ip (keys(%{$iptotal->{$classC}})) {
  msg        Send a netgraph control message to the node at "path"
                foreach my $dir (keys(%{$iptotal->{$classC}->{$ip}})) {
  name      Assign name <name> to the node at <path>
                    my $octets = $iptotal->{$classC}->{$ip}->{$dir}->{'octetTotal'};
  read      Read and execute commands from a file
                    my $packets = $iptotal->{$classC}->{$ip}->{$dir}->{'pktTotal'};
  rmhook    Disconnect hook "hook" of the node at "path"
#                    $packets = $packets > 2147483647 ? 0 : $packets;
  show      Show information about the node at <path>
                    if ($octets > 2147483647) {
  shutdown  Shutdown the node at <path>
                        my $ddir = $dir==1 ? 'in' : 'out';
  status    Get human readable status information from the node at <path>
                        #print SQL "$date $ip $ddir $octets\n";
  types      Show information about all installed node types
#                        $octets = 0;
  write      Send a data packet down the hook named by "hook".
                    }
  quit      Exit program
                    # dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
+ show netflow:
                    my $id = "$ip-$condensedDate-$dir";
  Name: netflow         Type: netflow         ID: 00000004  Num hooks: 3
                    $id =~ s/\.//g;
  Local hook      Peer name      Peer type    Peer ID         Peer hook
                    push @values, "('$date', '$ip', $dir, $octets, $packets)";
  ----------      ---------      ---------    -------         ---------
                    my $sql = "insert into dailyIpTotals_$classC values ('$id', '$date', '$ip', $dir, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
  export          <unnamed>      ksocket      00000005        inet/dgram/udp
                    print "$sql\n" if $dry;
  out0            em0            ether        00000001        upper
                    print SQL "$sql;\n";
  iface0          em0            ether        00000001        lower
#                    $db->query("insert into ipTotals values ('$date', '$ip', $dir, $octets, $packets)");
+
                }
</pre>
            }
 
We notice that sometimes flow-capture is failing due to swap exhaustion (even after adding more swap). So we crontab flow-capture to restart (it's ok to start if it's already running, it just quits):


            # break inserts into 100 records at a time
<pre>
            &debug("inserting $#values +1 values");
crontab -e
            while ($#values > 0) {
#restart flow-capture
                my $sql = "insert into ipTotals_$classC values ";
*/15 * * * * /usr/local/etc/rc.d/flow-capture.sh
                my $max_index = $#values > 100 ? 100 : $#values;
</pre>
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                print SQL "$sql;\n";
            }
        }


#        &debug("processing protocol totals at ");
==== process flow tools ====  
#        &debug(`date`);
#        foreach my $classC (keys(%{$protototal})) {
#            $db->query("lock tables dailyProtoTotals_$classC write") unless $dry;
#            my @values;
#            foreach my $ip (keys(%{$protototal->{$classC}})) {
#                foreach my $dir (keys(%{$protototal->{$classC}->{$ip}})) {
#                    foreach my $proto (keys(%{$protototal->{$classC}->{$ip}->{$dir}})) {
#                        my $octets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'octetTotal'};
#                        my $packets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'pktTotal'};
# #                        $octets = $octets > 2147483647 ? 0 : $octets;
# #                        $packets = $packets > 2147483647 ? 0 : $packets;
#                        # dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                        my $id = "$ip-$condensedDate-$dir-$proto";
#                        $id =~ s/\.//g;
#                        push @values, "('$date', '$ip', $dir, $proto, $octets, $packets)";
#                        my $sql = "insert into dailyProtoTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
#                        print "$sql\n" if $dry;
#                        $db->query($sql) unless $dry;
# #                        $db->query("insert into protoTotals values ('$date', '$ip', $dir, $proto, $octets, $packets)");
#                    }
#                }
#            }
#            $db->query("unlock tables") unless $dry;
#            my $sql = "insert into protoTotals_$classC values ";
#            $sql .= join ',', @values;
#            $db->query("lock tables protoTotals_$classC write") unless $dry;
#            print "$sql\n" if $dry;
#            $db->query($sql) unless $dry;
#            $db->query("unlock tables") unless $dry;
#        }


        &debug("processing port totals at ");
<pre>mkdir /usr/home/flowbin
        &debug(`date`);
mkdir /usr/home/working</pre>
        foreach my $classC (keys(%{$porttotal})) {
 
            my @values;
Install modules:
            foreach my $ip (keys(%{$porttotal->{$classC}})) {
<pre>cd /usr/ports/devel/p5-Date-Calc
                foreach my $dir (keys(%{$porttotal->{$classC}->{$ip}})) {
make install clean
                    foreach my $proto (keys(%{$porttotal->{$classC}->{$ip}->{$dir}})) {
cd /usr/ports/mail/p5-Mail-Sendmail
                        foreach my $port (keys(%{$porttotal->{$classC}->{$ip}->{$dir}->{$proto}})) {
make install clean</pre>
                            my $octets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'octetTotal'};
 
                            my $packets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'pktTotal'};
Queue script:
    #                        $octets = $octets > 2147483647 ? 0 : $octets;
<pre>
    #                       $packets = $packets > 2147483647 ? 0 : $packets;
cat > /usr/home/flowbin/queue.pl
#!/usr/bin/perl


                            # dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-protocol-port
use strict;
                            my $id = "$ip-$condensedDate-$dir-$proto-$port";
                            $id =~ s/\.//g;
                            push @values, "('$date', '$ip', $dir, $proto, $port, $octets, $packets)";
                            my $sql = "insert into dailyPortTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $port, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                            print "$sql\n" if $dry;
                            print SQL "$sql;\n";


     #                        $db->query("insert into portTotals values ('$date', '$ip', $dir, $port, $octets, $packets)");
BEGIN {
                        }
     push @INC, "/usr/home/flowbin";
                    }
}
                }
            }


            # break inserts into 100 records at a time
use date;
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into portTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                print SQL "$sql;\n";
            }
        }


#                      12    1 8      1    1= 23
my $flowbase = "/usr/home/flows";
# dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
#my $flowqueue = "/usr/home/queue";
#                      12        1  8    1  1      3=26
my $flowqueue = "/usr/home/working";
# dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                      12      1  8    1    1    5=28
# dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-port
        #print "finished at ";
        #print `date`;
        `mv $queuedir/$file $archivedir` unless $dry;
        close(SQL);
        `bzip2 $sqldirworking/$outfile`;
        `mv $sqldirworking/$outfile.bz2 $sqldir/`;
    }
}
`rm $queuedir/.lock` unless $dry;


sub debug {
my ($date, $time) = date::CurrentDateTime();
    my $message = shift;
    if ($debug) {
        print "$message\n";
    }
}


# var full during ft-v05.2005-03-28.084500-0800 and
my $flowdir = mkFlowDir($date);
# 2005-02-24 69.55.226
`mv $flowdir/ft-* $flowqueue`;


# all port/daily totals before 2005-04-07
if (date::DateWindow($date, $time, $date, "00:00:00", 600)) {
</pre>
    my $newdate = date::AddDays($date, -1);
    my $flowdir = mkFlowDir($newdate);
    `mv $flowdir/ft-* $flowqueue`;
}


This script sends the sql files to the traffic server for processing:
sub mkFlowDir {
<pre>cat > /usr/home/flowbin/sendsql.pl
    my $date = shift;
#!/usr/bin/perl
    $date =~ /([0-9]{4}-[0-9]{2})/;
    my $yearmonth = $1;
    return "$flowbase/$yearmonth/$date";
}
</pre>
 
Date.pm module:
<pre>
cat > /usr/home/flowbin/date.pm
#!/usr/local/bin/perl
#
# $Header: /usr/cvs/newgw/lib/date.pm,v 1.2 2003/11/24 17:06:02 glenn Exp $
#
# Copyright (c) 2001, 2002, 2003
#      e-Monitoring Networks, Inc.  All rights reserved.
#
#
#
# date.pl - Higher level functions written on top of Date::Calc
 
package date;


#use strict;
use strict;
#$debug=1;
use Date::Calc qw(:all);
#$dry=1;


my $remote = "69.55.233.199";
sub DayDiff { #calculate the difference in days from two dates
my $sqldir = "/usr/home/sql";
    my $date1 = shift;
my $archive = "/usr/home/archive";
    my $date2 = shift;
my $sqldirremote = "/data/bwdb2/pending/";
    my ($year1, $month1, $day1) = &DateToymd($date1);
my @err;
     my ($year2, $month2, $day2) = &DateToymd($date2);
unless ($dry) {
    my $diff = &Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
     if (-e "$sqldir/.lock") {
     return $diff;
        open(FILE, "$sqldir/.lock");
        my $pid = <FILE>;
        chomp($pid);
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $sqldir/.lock`;
        }
    }
    open(FILE, "> $sqldir/.lock");
     print FILE "$$\n";
    close(FILE);
}
}


opendir(DIR, $sqldir);
sub AddDays { #adds specified number of days to the supplied date
my @files = readdir(DIR);
    my $date = shift;
closedir(DIR);
    my $days = shift;
 
    my ($year, $month, $day) = &DateToymd($date);
foreach my $file (sort @files) {
    my ($nyear, $nmonth, $nday) = &Add_Delta_Days($year, $month, $day, $days);
  next unless $file =~ /bz2$/;
    my $ndate = &ymdToDate($nyear, $nmonth, $nday);
 
    return $ndate;
  my $r = `scp -Cq $sqldir/$file $remote:$sqldirremote 2>&1`;
#  print "scp $sqldir/$file $remote:$sqldirremote";
  unless ($?==0) {
      push @err, "scp -Cq $sqldir/$file $remote:$sqldirremote ($r)";
  }
  else {
      `mv $sqldir/$file $archive`;
      `ssh $remote mv $sqldirremote/$file $sqldirremote/${file}.done`;
  }
}
}


`rm $sqldir/.lock` unless $dry;
sub AddHours { #adds specified number of hours to the supplied date and time
 
    my $date = shift;
if (@err) {
    my $time = shift;
  email_support('bwdb2: sendsql.pl error',join "\n", @err);
    my $addhours = shift;
    my $adddays = 0;
    if (abs($addhours / 24) >= 1) {
        $adddays = int($addhours / 24);
        $addhours -= $adddays * 24;
    }
    my ($year, $month, $day) = &DateToymd($date);
    my ($hour, $minute, $second) = &TimeTohms($time);
    my ($ny, $nm, $nd, $nh, $nmin, $ns) = &Add_Delta_DHMS($year, $month, $day,
                                                          $hour, $minute, $second,
                                                          $adddays, $addhours, 0, 0);
    my $ndate = &ymdToDate($ny, $nm, $nd);
    my $ntime = &hmsToTime($nh, $nmin, $ns);
    return $ndate, $ntime;
}
}


sub email_support {
sub AddMinutes {
     my $subj=shift;
     my $date = shift;
     my $body=shift;
     my $time = shift;
     use Mail::Sendmail;
     my $minutes = shift;
 
     my ($year, $month, $day) = &DateToymd($date);
     # prepare message
     my ($hour, $minute, $second) = &TimeTohms($time);
     my %mail = (
    my ($ny, $nm, $nd, $nh, $nmin, $ns) = &Add_Delta_DHMS($year, $month, $day,
        To      => 'support@johncompanies.com,dave@johncompanies.com',
                                                          $hour, $minute, $second,
        From    => 'support@johncompanies.com',
                                                          0, 0, $minutes, 0);
        Subject => $subj,
    my $ndate = &ymdToDate($ny, $nm, $nd);
        Message => $body,
    my $ntime = &hmsToTime($nh, $nmin, $ns);
        smtp    => 'mail.johncompanies.com',
     return $ndate, $ntime;
    );
     sendmail(%mail) || warn "Error: $Mail::Sendmail::error";
}
}


sub debug {
sub CurrentDateTime { #return the current date and time
     my $message = shift;
     my ($y, $m, $d, $h, $min, $s, $z, $z, $z) = &System_Clock;
     if ($debug) {
     my $date = &ymdToDate($y, $m, $d);
        print "$message\n";
    my $time = &hmsToTime($h, $min, $s);
     }
     return $date, $time;
}
}


# var full during ft-v05.2005-03-28.084500-0800 and
sub Currentymd { #return the current year, month and day as separate variables
# 2005-02-24 69.55.226
    my ($y, $m, $d, $h, $min, $s, $z, $z, $z) = &System_Clock;
    return $y, $m, $d;
}


# all port/daily totals before 2005-04-07
sub DateToymd { #takes a date and returns year, month, day as individual values
</pre>
    my $date = shift;
    if ($date =~ /([0-9]{4})-([0-9]{2})-([0-9]{2})/) {
        my $day = $3;
        my $month = $2;
        my $year = $1;
        return $year, $month, $day;
    }
    return undef;
}


<pre>crontab -e
sub TimeTohms { #takes a time and return hours minutes and seconds as individual values
#process flows
    my $time = shift;
2,17,32,47 * * * * /usr/home/flowbin/processflows-sql.pl
    if ($time =~ /([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/) {
#move sql commands to traffic db
        my $hour = $1;
8,23,38,53 * * * * /usr/home/flowbin/sendsql.pl
        my $minute = $2;
</pre>
        my $second = $3;
 
        if ($hour !~ /[0-9]{2}/) { $hour = "0$hour"; }
==== flow processing: castle ====
        if ($minute !~ /[0-9]{2}/) { $minute = "0$minute"; }
<pre>
        if ($second !~ /[0-9]{2}/) { $second = "0$second"; }
cat > /usr/home/flowbin/processflows.pl
        return $hour, $minute, $second;
    }
    return undef;
}


#!/usr/bin/perl
sub ymdToDate { #takes year, month, day and assembles them into our date format
    my $year = shift;
    my $month = shift;
    my $day = shift;
    if (defined($year) && defined($month) && defined ($day)) {
        $month = sprintf("%02d", $month);
        $day = sprintf("%02d", $day);
        return "$year-$month-$day";
    }
    return undef;
}


#use strict;
sub hmsToTime { #takes hour minute and second and assembles them into our time format
#$debug=1;
    my $hour = shift;
#$dry=1;
    my $minute = shift;
    my $second = shift;
    if (defined($hour) && defined($minute) && defined ($second)) {
        if ($hour !~ /[0-9]{2}/) { $hour = "0$hour"; }
        if ($minute !~ /[0-9]{2}/) { $minute = "0$minute"; }
        if ($second !~ /[0-9]{2}/) { $second = "0$second"; }
        return sprintf ("%02d:%02d:%02d", $hour, $minute, $second);
    }
    return undef;
}


my $log = '/usr/home/flowbin/discards.log';
sub CompareDates { #compares two date and time pairs
    my $date1 = shift;
    my $time1 = shift;
    my $date2 = shift;
    my $time2 = shift;


use Data::Dumper;
    my ($year1, $month1, $day1) = &DateToymd($date1);
    my ($hour1, $minute1, $second1) = &TimeTohms($time1);
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my ($hour2, $minute2, $second2) = &TimeTohms($time2);


BEGIN {
#    &debug("$year1, $month1, $day1, $year2, $month2, $day2");
     push @INC, "/usr/home/flowbin";
    my $days = &Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
    if ($days > 0) { return 1;}
    if ($days < 0) { return -1;}
     if ($days == 0) { #same day, compare times
        my $seconds1 = $second1 + (60 * $minute1) + (3600 * $hour1);
        my $seconds2 = $second2 + (60 * $minute2) + (3600 * $hour2);
        if ($seconds1 < $seconds2) { return 1;}
        if ($seconds1 > $seconds2) { return -1;}
        if ($seconds1 == $seconds2) { return 0;}
    }
    return undef;
}
}


use db;
sub DateWindow { #compares two date time pairs to see if they are < X seconds apart
    my $date1 = shift;
    my $time1 = shift;
    my $date2 = shift;
    my $time2 = shift;
    my $window = shift;


#my $queuedir = "/usr/home/queue";
    my ($year1, $month1, $day1) = &DateToymd($date1);
my $queuedir = "/usr/home/working";
    my ($hour1, $minute1, $second1) = &TimeTohms($time1);
my $archivedir = "/usr/home/archive";
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my ($hour2, $minute2, $second2) = &TimeTohms($time2);


unless ($dry) {
    my ($day, $hour, $minute, $second) =
    if (-e "$queuedir/.lock") {
        &Delta_DHMS($year1, $month1, $day1, $hour1, $minute1, $second1,
        open(FILE, "$queuedir/.lock");
                    $year2, $month2, $day2, $hour2, $minute2, $second2);
        my $pid = <FILE>;
    $minute *= 60;
        chomp($pid);
    $hour *= 3600;
        close(FILE);
    $day *= 86400;
        if (kill(0, $pid)) {
    my $total = $second + $minute + $hour + $day;
            #another process is using the queue, bail out
    if (abs($total) < $window) {
            exit(0);
         return 1;
         }
        else {
            #dead lock file, remove it
            `rm $queuedir/.lock`;
        }
     }
     }
     open(FILE, "> $queuedir/.lock");
     return 0;
    print FILE "$$\n";
    close(FILE);
}
}


my $db = db->new();
sub CheckDateOrder { #takes three dates/times, returns true if they are in chronological order
$db->connect('traffic', '', 'root', '5over3') || die $db->{'error'};
    my $date1 = shift;
    my $time1 = shift;
    my $date2 = shift;
    my $time2 = shift;
    my $date3 = shift;
    my $time3 = shift;
    if (&CompareDates($date1, $time1, $date2, $time2) == -1) {
        return 0;
    }
    if (&CompareDates($date2, $time2, $date3, $time3) == -1) {
        return 0;
    }
    return 1;
}


opendir(DIR, $queuedir);
sub EpochSeconds { #calculates number of seconds since the epoch for the given date/time
my @files = readdir(DIR);
    my $date = shift;
closedir(DIR);
    my $time = shift;
    my ($year, $month, $day) = &DateToymd($date);
    my ($hour, $minute, $second) = &TimeTohms($time);
    my ($d, $h, $m, $s) = &Delta_DHMS(1970, 1, 1, 0, 0, 0,
                                      $year, $month, $day, $hour, $minute, $second);
    my $seconds = $s + (60 * $m) + (3600 * $h) + (86400 * $d);
    return $seconds;
}


foreach my $file (sort @files) {
sub SecondsToDateTime { #converts seconds since epoch to date/time
     unless($file =~ /^\./) {
    my $seconds = shift;
        $file =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})\.([0-9]{2})([0-9]{2})([0-9]{2})/;
    my $days = int($seconds / 86400);
        my $date = "$1 $2:$3:$4";
    $seconds -= $days * 86400;
        my $condensedDate = $1;
     my $hours = int($seconds / 3600);
        $condensedDate =~ s/-//g;
    $seconds -= $hours * 3600;
        my $iptotal = {};
    my $minutes = int($seconds / 60);
        my $protototal = {};
    $seconds -= $minutes * 60;
        my $porttotal = {};
    my ($year, $month, $day, $hour, $minute, $second) =
        &Add_Delta_DHMS(1970, 1, 1, 0, 0, 0, $days, $hours, $minutes, $seconds);
    $month = sprintf("%02d", $month);
    $day = sprintf("%02d", $day);
    $hour = sprintf("%02d", $hour);
    $minute = sprintf("%02d", $minute);
    $second = sprintf("%02d", $second);
    return "$year-$month-$day", "$hour:$minute:$second";
}


        &debug("started file $file at ");
sub DateToDayName {
        &debug(`date`);
    my $date = shift;
        &debug("getting raw flow data (flow-print)");
    my ($year, $month, $day) = &DateToymd($date);
        `cat $queuedir/$file | /usr/local/bin/flow-print -f 5 > /usr/home/working/tmp-$file`;
    my $name = &Day_of_Week_to_Text(&Day_of_Week($year, $month, $day));
        &debug("aggregating data at ");
    $name =~ /^[A-Za-z]{3}/;
        &debug(`date`);
    $name = $&;
        unless (open(DATA, "/usr/home/working/tmp-$file")) { die "can't open: $!"; }
    return $name;
        LOOP: while (my $line = readline DATA) {
}
            my @d = split /[\s]+/, $line;
            if ($d[0] ne '' && $d[0] ne 'Start') {
                my $addr = 0;
                my $port = 0;


                #Start End Sif SrcIPaddress SrcP DIf DstIPaddress DstP P Fl Pkts Octets
sub ValiDate {
                #0     1  2  3            4    5  6            7    8 9  10  11
     return @_;
                          #|
                          # outbound = 2, inbound = 1


                my (@src_ip) = split '\.', $d[3];
                my (@dst_ip) = split '\.', $d[6];


                if ($src_ip[0] == 69 && $src_ip[1] == 55 &&
                    $src_ip[2] >= 224 && $src_ip[2] <= 239 &&
                    $src_ip[2] != 229 && $src_ip[2] != 231) { # for castle
#                if ($src_ip[0] == 69 && $src_ip[1] == 55 && $src_ip[2] == 229) { # for i2b
                  $d[2] = 2;
                  # hack for outbound bulk traffic counted 2x
                  if ($dst_ip[2] == 234) { $d[11] /= 2; $d[10] /= 2; }
                }
                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 &&
                      $dst_ip[2] >= 224 && $dst_ip[2] <= 239 &&
                      $dst_ip[2] != 229 && $dst_ip[2] != 231) { # for castle
#                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 && $dst_ip[2] == 229) { # for i2b
                  $d[2] = 1;
                }
                else { next LOOP; }


                if ($d[2] == 2) {
}
                    $addr = $d[3];
                    # if the dst-port is low, store that
                    if ($d[7] <= 1024) { $port = $d[7]; }
                    # if the src-port is low, store that
                    elsif ($d[4] <= 1024) { $port = $d[4]; }
                    else { $port = 99999; }
                }
                elsif ($d[2] == 1) {
                    $addr = $d[6];
                    # if the dst-port is high, assume its return traffic, try to store src-port if low
                    if ($d[7] > 1024) {
                        if ($d[4] <= 1024) { $port = $d[4]; }
                        else { $port = 99999; }
                    } else {
                        $port = $d[7];
                    }
                } else {
                    next LOOP;
                }


                my (@ip) = split '\.', $addr;
sub CheckBusinessDay { # checks to see if date is business day. 1=yes, 0=no
                unless ($ip[0] == 69) { next LOOP; }
    my $date = shift;
                unless ($ip[1] == 55) { next LOOP; }
    my ($year, $month, $day) = &DateToymd($date);
                unless ($ip[2] >= 224 && $ip[2] <= 239 && $ip[2] != 229 && $ip[2] != 231) { next LOOP; }
    if (Day_of_Week($year,$month,$day) < 6) { return 1; }
#                unless ($ip[2] == 229) { next LOOP; }
    else { return 0; }
}
 
1; #don't remove this line
</pre>


                my $classC = "$ip[0]_$ip[1]_$ip[2]";
chmod 0700 /usr/home/flowbin/queue.pl


#                          IP        dir
Setup cronjob:
#                if ($d[10] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10]; }
<pre>crontab -e
#                if ($d[11] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11]; }
#move flow data into the queue
#
1,16,31,46 * * * * /usr/home/flowbin/queue.pl</pre>
#                if ($d[10] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11]; }
#
#               if ($d[10] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'octetTotal'} += $d[11]; }
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10];
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11];


                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10];
==== flow processing: i2b ====
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11];
<pre>cat > /usr/home/flowbin/processflows-sql.pl
#!/usr/bin/perl


                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'pktTotal'} += $d[10];
#use strict;
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'octetTotal'} += $d[11];
#$debug=1;
            }
#$dry=1;
        }
        close(DATA);
        `rm /usr/home/working/tmp-$file`;
        &debug("processing ip totals at ");
        &debug(`date`);
        foreach my $classC (keys(%{$iptotal})) {
            $db->query("lock tables dailyIpTotals_$classC write") unless $dry;
            my @values;
            foreach my $ip (keys(%{$iptotal->{$classC}})) {
                foreach my $dir (keys(%{$iptotal->{$classC}->{$ip}})) {
                    my $octets = $iptotal->{$classC}->{$ip}->{$dir}->{'octetTotal'};
                    my $packets = $iptotal->{$classC}->{$ip}->{$dir}->{'pktTotal'};
#                   $packets = $packets > 2147483647 ? 0 : $packets;
                    if ($octets > 2147483647) {
                        my $ddir = $dir==1 ? 'in' : 'out';
                        `echo "$date $ip $ddir $octets\n" >> $log`;
#                        $octets = 0;
                    }
                    # dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
                    my $id = "$ip-$condensedDate-$dir";
                    $id =~ s/\.//g;
                    push @values, "('$date', '$ip', $dir, $octets, $packets)";
                    my $sql = "insert into dailyIpTotals_$classC values ('$id', '$date', '$ip', $dir, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                    print "$sql\n" if $dry;
                    $db->query($sql) unless $dry;
#                    $db->query("insert into ipTotals values ('$date', '$ip', $dir, $octets, $packets)");
                }
            }
            $db->query("unlock tables") unless $dry;


            $db->query("lock tables ipTotals_$classC write") unless $dry;
my $log = '/usr/home/flowbin/discards.log';
            # break inserts into 100 records at a time
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into ipTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                $db->query($sql) unless $dry;
            }
            $db->query("unlock tables") unless $dry;
        }


        sleep 20;
use Data::Dumper;
#        &debug("processing protocol totals at ");
 
#        &debug(`date`);
BEGIN {
#        foreach my $classC (keys(%{$protototal})) {
    push @INC, "/usr/home/flowbin";
#            $db->query("lock tables dailyProtoTotals_$classC write") unless $dry;
}
#            my @values;
#            foreach my $ip (keys(%{$protototal->{$classC}})) {
#                foreach my $dir (keys(%{$protototal->{$classC}->{$ip}})) {
#                    foreach my $proto (keys(%{$protototal->{$classC}->{$ip}->{$dir}})) {
#                        my $octets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'octetTotal'};
#                        my $packets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'pktTotal'};
# #                        $octets = $octets > 2147483647 ? 0 : $octets;
# #                        $packets = $packets > 2147483647 ? 0 : $packets;
#                        # dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                        my $id = "$ip-$condensedDate-$dir-$proto";
#                        $id =~ s/\.//g;
#                        push @values, "('$date', '$ip', $dir, $proto, $octets, $packets)";
#                        my $sql = "insert into dailyProtoTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
#                        print "$sql\n" if $dry;
#                        $db->query($sql) unless $dry;
# #                        $db->query("insert into protoTotals values ('$date', '$ip', $dir, $proto, $octets, $packets)");
#                    }
#                }
#            }
#            $db->query("unlock tables") unless $dry;
#            my $sql = "insert into protoTotals_$classC values ";
#            $sql .= join ',', @values;
#            $db->query("lock tables protoTotals_$classC write") unless $dry;
#            print "$sql\n" if $dry;
#            $db->query($sql) unless $dry;
#            $db->query("unlock tables") unless $dry;
#        }


        &debug("processing port totals at ");
#my $queuedir = "/usr/home/queue";
        &debug(`date`);
my $queuedir = "/usr/home/working";
        foreach my $classC (keys(%{$porttotal})) {
my $archivedir = "/usr/home/archive";
            $db->query("lock tables dailyPortTotals_$classC write") unless $dry;
my $sqldir = "/usr/home/sql";
            my @values;
my $sqldirworking = "/usr/home/sql/tmp";
            foreach my $ip (keys(%{$porttotal->{$classC}})) {
                foreach my $dir (keys(%{$porttotal->{$classC}->{$ip}})) {
                    foreach my $proto (keys(%{$porttotal->{$classC}->{$ip}->{$dir}})) {
                        foreach my $port (keys(%{$porttotal->{$classC}->{$ip}->{$dir}->{$proto}})) {
                            my $octets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'octetTotal'};
                            my $packets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'pktTotal'};
    #                        $octets = $octets > 2147483647 ? 0 : $octets;
    #                        $packets = $packets > 2147483647 ? 0 : $packets;


                            # dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-protocol-port
unless ($dry) {
                            my $id = "$ip-$condensedDate-$dir-$proto-$port";
    if (-e "$queuedir/.lock") {
                            $id =~ s/\.//g;
        open(FILE, "$queuedir/.lock");
                            push @values, "('$date', '$ip', $dir, $proto, $port, $octets, $packets)";
        my $pid = <FILE>;
                            my $sql = "insert into dailyPortTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $port, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
        chomp($pid);
                            print "$sql\n" if $dry;
        close(FILE);
                            $db->query($sql) unless $dry;
        if (kill(0, $pid)) {
    #                        $db->query("insert into portTotals values ('$date', '$ip', $dir, $port, $octets, $packets)");
            #another process is using the queue, bail out
                        }
            exit(0);
                    }
        }
                }
        else {
            }
            #dead lock file, remove it
            $db->query("unlock tables") unless $dry;
            `rm $queuedir/.lock`;
        }
    }
    open(FILE, "> $queuedir/.lock");
    print FILE "$$\n";
    close(FILE);
}


            $db->query("lock tables portTotals_$classC write") unless $dry;
opendir(DIR, $queuedir);
            # break inserts into 100 records at a time
my @files = readdir(DIR);
            &debug("inserting $#values +1 values");
closedir(DIR);
            while ($#values > 0) {
                my $sql = "insert into portTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                $db->query($sql) unless $dry;
            }
            $db->query("unlock tables") unless $dry;
            sleep 10;
        }


#                      12    1 8      1    1= 23
foreach my $file (sort @files) {
# dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
     unless($file =~ /^\./) {
#                      12        1  8     1  1      3=26
        $file =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})\.([0-9]{2})([0-9]{2})([0-9]{2})/;
# dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
         my $date = "$1 $2:$3:$4";
#                      12      1  8    1    1    5=28
         my $outfile = "$1-$2:$3.sql";
# dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-port
         unless (open (SQL, "+> $sqldirworking/$outfile")) { die "cant open $sqldirworking/$outfile"; }
         #print "finished at ";
        my $condensedDate = $1;
         #print `date`;
        $condensedDate =~ s/-//g;
         `mv $queuedir/$file $archivedir` unless $dry;
        my $iptotal = {};
    }
        my $protototal = {};
}
        my $porttotal = {};
`rm $queuedir/.lock` unless $dry;


sub debug {
        &debug("started file $file at ");
    my $message = shift;
        &debug(`date`);
    if ($debug) {
        &debug("getting raw flow data (flow-print)");
        print "$message\n";
        `cat $queuedir/$file | /usr/local/bin/flow-print -f 5 > /usr/home/working/tmp-$file`;
    }
        &debug("aggregating data at ");
}
        &debug(`date`);
        unless (open(DATA, "/usr/home/working/tmp-$file")) { die "can't open: $!"; }
        LOOP: while (my $line = readline DATA) {
            my @d = split /[\s]+/, $line;
            if ($d[0] ne '' && $d[0] ne 'Start') {
                my $addr = 0;
                my $port = 0;


# var full during ft-v05.2005-03-28.084500-0800 and
                #Start End Sif SrcIPaddress SrcP DIf DstIPaddress DstP P Fl Pkts Octets
# 2005-02-24 69.55.226
                #0    1  2  3            4    5  6            7    8 9  10  11
                          #|
                          # outbound = 2, inbound = 1


# all port/daily totals before 2005-04-07
                my (@src_ip) = split '\.', $d[3];
</pre>
                my (@dst_ip) = split '\.', $d[6];


<pre>
                if ($src_ip[0] == 69 && $src_ip[1] == 55 && ($src_ip[2] == 229 || $src_ip[2] == 231)) { # for i2b
cat > /usr/home/flowbin/db.pm
                  $d[2] = 2;
                  # hack for outbound bulk traffic counted 2x
                  #if ($src_ip[2] == 231) { $d[11] /= 2; $d[10] /= 2; }
                }
                # note- this is where we filter out IPs only found at i2b
                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 && ($dst_ip[2] == 229 || $dst_ip[2] == 231)) { # for i2b
                  $d[2] = 1;
                }
                else { next LOOP; }


#!/usr/bin/perl
                if ($d[2] == 2) {
#
                    $addr = $d[3];
# $Header: /usr/cvs/newgw/lib/db.pm,v 1.4 2003/06/05 18:20:01 glenn Exp $
                    # if the dst-port is low, store that
                    if ($d[7] <= 1024) { $port = $d[7]; }
                    # if the src-port is low, store that
                    elsif ($d[4] <= 1024) { $port = $d[4]; }
                    else { $port = 99999; }
                }
                elsif ($d[2] == 1) {
                    $addr = $d[6];
                    # if the dst-port is high, assume its return traffic, try to store src-port if low
                    if ($d[7] > 1024) {
                        if ($d[4] <= 1024) { $port = $d[4]; }
                        else { $port = 99999; }
                    } else {
                        $port = $d[7];
                    }
                } else {
                    next LOOP;
                }
 
                my (@ip) = split '\.', $addr;
                unless ($ip[0] == 69) { next LOOP; }
                unless ($ip[1] == 55) { next LOOP; }
                unless ($ip[2] == 229 || $ip[2] == 231) { next LOOP; }
 
                my $classC = "$ip[0]_$ip[1]_$ip[2]";
 
#                          IP        dir
#                if ($d[10] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11]; }
#
#
# Copyright (c) 2003
#               if ($d[10] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10]; }
#     e-Monitoring Networks, Inc.  All rights reserved.
#               if ($d[11] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11]; }
#
#
#
#               if ($d[10] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'pktTotal'} += $d[10]; }
package db;
#                if ($d[11] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'octetTotal'} += $d[11]; }
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10];
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11];


use strict;
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10];
use DBI;
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11];


sub new {
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'pktTotal'} += $d[10];
    my $class = shift;
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'octetTotal'} += $d[11];
    my $self = {};
            }
        }
        close(DATA);
        `rm /usr/home/working/tmp-$file`;
        &debug("processing ip totals at ");
        &debug(`date`);
        foreach my $classC (keys(%{$iptotal})) {
            my @values;
            foreach my $ip (keys(%{$iptotal->{$classC}})) {
                foreach my $dir (keys(%{$iptotal->{$classC}->{$ip}})) {
                    my $octets = $iptotal->{$classC}->{$ip}->{$dir}->{'octetTotal'};
                    my $packets = $iptotal->{$classC}->{$ip}->{$dir}->{'pktTotal'};
#                    $packets = $packets > 2147483647 ? 0 : $packets;
                    if ($octets > 2147483647) {
                        my $ddir = $dir==1 ? 'in' : 'out';
                        #print SQL "$date $ip $ddir $octets\n";
#                        $octets = 0;
                    }
                    # dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
                    my $id = "$ip-$condensedDate-$dir";
                    $id =~ s/\.//g;
                    push @values, "('$date', '$ip', $dir, $octets, $packets)";
                    my $sql = "insert into dailyIpTotals_$classC values ('$id', '$date', '$ip', $dir, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                    print "$sql\n" if $dry;
                    print SQL "$sql;\n";
#                    $db->query("insert into ipTotals values ('$date', '$ip', $dir, $octets, $packets)");
                }
            }


    $self->{'debug'} = 0;
            # break inserts into 100 records at a time
    bless $self, $class;
            &debug("inserting $#values +1 values");
 
            while ($#values > 0) {
    return $self;
                my $sql = "insert into ipTotals_$classC values ";
}
                my $max_index = $#values > 100 ? 100 : $#values;
 
                for (my $i=0; $i<=$max_index; $i++) {
sub connect {
                    $sql .= shift @values;
    my $self = shift;
                    $sql .= ',';
    my $dbname = shift;
                }
    my $dbhost = shift;
                chop $sql;
    my $dbuser = shift;
                print "$sql\n" if $dry;
    my $dbpass = shift;
                print SQL "$sql;\n";
            }
        }


    my $host = '';
#        &debug("processing protocol totals at ");
    if (defined($dbhost)) {
#        &debug(`date`);
        $host = ";host=$dbhost";
#        foreach my $classC (keys(%{$protototal})) {
    }
#            $db->query("lock tables dailyProtoTotals_$classC write") unless $dry;
 
#            my @values;
    eval {
#            foreach my $ip (keys(%{$protototal->{$classC}})) {
        $self->debug("connecting to: DBI:mysql:database=$dbname;$host", 1);
#                foreach my $dir (keys(%{$protototal->{$classC}->{$ip}})) {
        $self->{'dbh'} = DBI->connect("DBI:mysql:database=$dbname;$host", $dbuser, $dbpass);
#                    foreach my $proto (keys(%{$protototal->{$classC}->{$ip}->{$dir}})) {
    };
#                        my $octets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'octetTotal'};
    if ($self->{'dbh'}) {
#                        my $packets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'pktTotal'};
        return 1;
# #                        $octets = $octets > 2147483647 ? 0 : $octets;
    }
# #                        $packets = $packets > 2147483647 ? 0 : $packets;
    $self->{'error'} = "Error connecting to database $@";
#                        # dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
    $self->debug("Error connecting to database $@");
#                        my $id = "$ip-$condensedDate-$dir-$proto";
    return 0;
#                        $id =~ s/\.//g;
}
#                        push @values, "('$date', '$ip', $dir, $proto, $octets, $packets)";
#                        my $sql = "insert into dailyProtoTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
#                        print "$sql\n" if $dry;
#                        $db->query($sql) unless $dry;
# #                        $db->query("insert into protoTotals values ('$date', '$ip', $dir, $proto, $octets, $packets)");
#                    }
#                }
#            }
#            $db->query("unlock tables") unless $dry;
#            my $sql = "insert into protoTotals_$classC values ";
#            $sql .= join ',', @values;
#            $db->query("lock tables protoTotals_$classC write") unless $dry;
#            print "$sql\n" if $dry;
#            $db->query($sql) unless $dry;
#            $db->query("unlock tables") unless $dry;
#        }


sub query {
        &debug("processing port totals at ");
     my $self = shift;
        &debug(`date`);
     my $query = shift;
        foreach my $classC (keys(%{$porttotal})) {
            my @values;
            foreach my $ip (keys(%{$porttotal->{$classC}})) {
                foreach my $dir (keys(%{$porttotal->{$classC}->{$ip}})) {
                    foreach my $proto (keys(%{$porttotal->{$classC}->{$ip}->{$dir}})) {
                        foreach my $port (keys(%{$porttotal->{$classC}->{$ip}->{$dir}->{$proto}})) {
                            my $octets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'octetTotal'};
                            my $packets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'pktTotal'};
     #                        $octets = $octets > 2147483647 ? 0 : $octets;
     #                        $packets = $packets > 2147483647 ? 0 : $packets;


    $self->debug($query, 1);
                            # dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-protocol-port
    my $sth;
                            my $id = "$ip-$condensedDate-$dir-$proto-$port";
    eval {
                            $id =~ s/\.//g;
        $sth = $self->{'dbh'}->prepare($query);
                            push @values, "('$date', '$ip', $dir, $proto, $port, $octets, $packets)";
    };
                            my $sql = "insert into dailyPortTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $port, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
    unless ($sth) {
                            print "$sql\n" if $dry;
        $self->{'error'} = "error preparing query $@";
                            print SQL "$sql;\n";
        $self->debug("error preparing query $@");
        return undef;
    }
    my $qty;
    eval {
        $qty = $sth->execute;
    };
    unless ($qty) {
        $self->{'error'} = "error executing query $@";
        warn "error executing query $@ $query";
        return undef;
    }
    $self->debug("returning $qty, $sth from query", 6);
    return ($qty, $sth);
}


sub disconnect {
     #                        $db->query("insert into portTotals values ('$date', '$ip', $dir, $port, $octets, $packets)");
     my $self = shift;
                        }
                    }
                }
            }


    $self->{'dbh'}->disconnect;
            # break inserts into 100 records at a time
    return 0;
            &debug("inserting $#values +1 values");
}
            while ($#values > 0) {
                my $sql = "insert into portTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                print SQL "$sql;\n";
            }
        }


sub debug {
#                      12    1 8      1    1= 23
     my $self = shift;
# dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
    my $msg = shift;
#                      12        1  8    1  1      3=26
     my $level = shift || 0;
# dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                      12      1  8    1    1     5=28
# dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-port
        #print "finished at ";
        #print `date`;
        `mv $queuedir/$file $archivedir` unless $dry;
        close(SQL);
        `bzip2 $sqldirworking/$outfile`;
        `mv $sqldirworking/$outfile.bz2 $sqldir/`;
     }
}
`rm $queuedir/.lock` unless $dry;


     if ($level < $self->{'debug'}) {
sub debug {
         print "$msg\n";
    my $message = shift;
     if ($debug) {
         print "$message\n";
     }
     }
    return 0;
}
}
1;
</pre>


mkdir /usr/home/archive
# var full during ft-v05.2005-03-28.084500-0800 and
mkdir -p /usr/home/sql/tmp
# 2005-02-24 69.55.226


<pre>crontab -e
# all port/daily totals before 2005-04-07
#process flows
</pre>
2,17,32,47 * * * * /usr/home/flowbin/processflows.pl</pre>


==== setup traffic db ====
This script sends the sql files to the traffic server for processing:
* Install mysql:
<pre>cat > /usr/home/flowbin/sendsql.pl
<pre>cd /usr/ports/databases/mysql50-server
#!/usr/bin/perl
make install clean</pre>


cat >> /etc/rc.conf
#use strict;
mysql_enable="YES"
#$debug=1;
#$dry=1;


Move db data dir:
my $remote = "69.55.233.199";
/usr/local/etc/rc.d/mysql-server stop
my $sqldir = "/usr/home/sql";
mkdir /usr/home/database/
my $archive = "/usr/home/archive";
mv /var/db/mysql/* /usr/home/database/
my $sqldirremote = "/data/bwdb2/pending/";
chown -R mysql:mysql /usr/home/database
my @err;
unless ($dry) {
    if (-e "$sqldir/.lock") {
        open(FILE, "$sqldir/.lock");
        my $pid = <FILE>;
        chomp($pid);
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $sqldir/.lock`;
        }
    }
    open(FILE, "> $sqldir/.lock");
    print FILE "$$\n";
    close(FILE);
}


Edit database location in startup script:
opendir(DIR, $sqldir);
vi /usr/local/etc/rc.d/mysql-server
my @files = readdir(DIR);
# : ${mysql_dbdir="/var/db/mysql"}
closedir(DIR);
: ${mysql_dbdir="/usr/home/database"}


/usr/local/etc/rc.d/mysql-server start
foreach my $file (sort @files) {
  next unless $file =~ /bz2$/;


  my $r = `scp -Cq $sqldir/$file $remote:$sqldirremote 2>&1`;
#  print "scp $sqldir/$file $remote:$sqldirremote";
  unless ($?==0) {
      push @err, "scp -Cq $sqldir/$file $remote:$sqldirremote ($r)";
  }
  else {
      `mv $sqldir/$file $archive`;
      `ssh $remote mv $sqldirremote/$file $sqldirremote/${file}.done`;
  }
}


* Install mysql perl database modules:
`rm $sqldir/.lock` unless $dry;
<pre>
cd /usr/ports/databases/p5-DBI
make install clean
cd /usr/ports/databases/p5-DBD-mysql50
make install clean
(no to SSL support)
</pre>
 
* Setting up database
<pre>
rehash
/usr/local/etc/rc.d/mysql-server start
mysql -u root
create database traffic;
grant all on *.* to root@localhost identified by '5over3';
grant all on traffic.* to jc@10.1.4.5 identified by '2gMKY3Wt';


</pre>
if (@err) {
  email_support('bwdb2: sendsql.pl error',join "\n", @err);
}


If this was a new server we'd setup new tables. See [[#mysql_2|mysql]] for how those tables would be setup.
sub email_support {
    my $subj=shift;
    my $body=shift;
    use Mail::Sendmail;


We are assuming here we are moving data from an existing db, here's how that's done (from the current traffic db):
    # prepare message
rsync -av --progress /usr/home/database/traffic/ 10.1.4.203:/usr/home/database/traffic/
    my %mail = (
        To      => 'support@johncompanies.com,dave@johncompanies.com',
        From    => 'support@johncompanies.com',
        Subject => $subj,
        Message => $body,
        smtp    => 'mail.johncompanies.com',
    );
    sendmail(%mail) || warn "Error: $Mail::Sendmail::error";
}


When you're ready to do the cutover, shut down mysql on both hosts and do one last sync.
sub debug {
    my $message = shift;
    if ($debug) {
        print "$message\n";
    }
}


# var full during ft-v05.2005-03-28.084500-0800 and
# 2005-02-24 69.55.226


 
# all port/daily totals before 2005-04-07
==== process flows from bwdb2 ====
</pre>
On traffic database server (bwdb):


<pre>crontab -e
<pre>crontab -e
#import sql from bwdb2
#process flows
10,25,40,55 * * * * /usr/home/flowbin/processsql.pl</pre>
2,17,32,47 * * * * /usr/home/flowbin/processflows-sql.pl
#move sql commands to traffic db
8,23,38,53 * * * * /usr/home/flowbin/sendsql.pl
</pre>


Add access to mysql:  
==== flow processing: castle ====
<pre>mysql -u root -p
<pre>
grant all on traffic.* to bwdb2@localhost identified by 's1lver4d';
cat > /usr/home/flowbin/processflows.pl
</pre>
 
<pre>cat > /usr/home/flowbin/processsql.pl


#!/usr/bin/perl
#!/usr/bin/perl
Line 2,700: Line 2,653:
#$dry=1;
#$dry=1;


my $sqldir = "/usr/home/bwdb2/pending";
my $log = '/usr/home/flowbin/discards.log';
my $mysql = '/usr/local/bin/mysql';
 
my @err;
use Data::Dumper;
unless ($dry) {
 
     if (-e "$sqldir/.lock") {
BEGIN {
         open(FILE, "$sqldir/.lock");
    push @INC, "/usr/home/flowbin";
         my $pid = <FILE>;
}
 
use db;
 
#my $queuedir = "/usr/home/queue";
my $queuedir = "/usr/home/working";
my $archivedir = "/usr/home/archive";
 
unless ($dry) {
     if (-e "$queuedir/.lock") {
         open(FILE, "$queuedir/.lock");
         my $pid = <FILE>;
         chomp($pid);
         chomp($pid);
         close(FILE);
         close(FILE);
Line 2,715: Line 2,679:
         else {
         else {
             #dead lock file, remove it
             #dead lock file, remove it
             `rm $sqldir/.lock`;
             `rm $queuedir/.lock`;
         }
         }
     }
     }
     open(FILE, "> $sqldir/.lock");
     open(FILE, "> $queuedir/.lock");
     print FILE "$$\n";
     print FILE "$$\n";
     close(FILE);
     close(FILE);
}
}


opendir(DIR, $sqldir);
my $db = db->new();
$db->connect('traffic', '', 'root', '5over3') || die $db->{'error'};
 
opendir(DIR, $queuedir);
my @files = readdir(DIR);
my @files = readdir(DIR);
closedir(DIR);
closedir(DIR);


foreach my $file (sort @files) {
foreach my $file (sort @files) {
  next unless $file =~ /done$/;
    unless($file =~ /^\./) {
  my $r = `bzcat $sqldir/$file | $mysql -u bwdb2 -ps1lver4d traffic`;
        $file =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})\.([0-9]{2})([0-9]{2})([0-9]{2})/;
  unless ($?==0) {
        my $date = "$1 $2:$3:$4";
      push @err, "bzcat $sqldir/$file | $mysql -u bwdb2 -pxxxxx traffic ($r)";
        my $condensedDate = $1;
  }
        $condensedDate =~ s/-//g;
  else {
        my $iptotal = {};
      `rm $sqldir/$file`;
        my $protototal = {};
  }
        my $porttotal = {};
}


`rm $sqldir/.lock` unless $dry;
        &debug("started file $file at ");
 
        &debug(`date`);
if (@err) {
        &debug("getting raw flow data (flow-print)");
  email_support('bwdb: processsql.pl error',join "\n", @err);
        `cat $queuedir/$file | /usr/local/bin/flow-print -f 5 > /usr/home/working/tmp-$file`;
}
        &debug("aggregating data at ");
        &debug(`date`);
        unless (open(DATA, "/usr/home/working/tmp-$file")) { die "can't open: $!"; }
        LOOP: while (my $line = readline DATA) {
            my @d = split /[\s]+/, $line;
            if ($d[0] ne '' && $d[0] ne 'Start') {
                my $addr = 0;
                my $port = 0;


sub email_support {
                #Start End Sif SrcIPaddress SrcP DIf DstIPaddress DstP P Fl Pkts Octets
     my $subj=shift;
                #0     1  2  3            4    5  6            7    8 9  10  11
    my $body=shift;
                          #|
    use Mail::Sendmail;
                          # outbound = 2, inbound = 1


    # prepare message
                my (@src_ip) = split '\.', $d[3];
    my %mail = (
                my (@dst_ip) = split '\.', $d[6];
        To      => 'dave@johncompanies.com',
        From    => 'support@johncompanies.com',
        Subject => $subj,
        Message => $body,
        smtp    => 'mail.johncompanies.com',
    );
    sendmail(%mail) || warn "Error: $Mail::Sendmail::error";
}


sub debug {
                if ($src_ip[0] == 69 && $src_ip[1] == 55 &&
    my $message = shift;
                    $src_ip[2] >= 224 && $src_ip[2] <= 239 &&
    if ($debug) {
                    $src_ip[2] != 229 && $src_ip[2] != 231) { # for castle
        print "$message\n";
#                if ($src_ip[0] == 69 && $src_ip[1] == 55 && $src_ip[2] == 229) { # for i2b
    }
                  $d[2] = 2;
}
                  # hack for outbound bulk traffic counted 2x
</pre>
                  if ($dst_ip[2] == 234) { $d[11] /= 2; $d[10] /= 2; }
                }
                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 &&
                      $dst_ip[2] >= 224 && $dst_ip[2] <= 239 &&
                      $dst_ip[2] != 229 && $dst_ip[2] != 231) { # for castle
#                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 && $dst_ip[2] == 229) { # for i2b
                  $d[2] = 1;
                }
                else { next LOOP; }


chmod 0700 /usr/home/flowbin/processsql.pl
                if ($d[2] == 2) {
                    $addr = $d[3];
                    # if the dst-port is low, store that
                    if ($d[7] <= 1024) { $port = $d[7]; }
                    # if the src-port is low, store that
                    elsif ($d[4] <= 1024) { $port = $d[4]; }
                    else { $port = 99999; }
                }
                elsif ($d[2] == 1) {
                    $addr = $d[6];
                    # if the dst-port is high, assume its return traffic, try to store src-port if low
                    if ($d[7] > 1024) {
                        if ($d[4] <= 1024) { $port = $d[4]; }
                        else { $port = 99999; }
                    } else {
                        $port = $d[7];
                    }
                } else {
                    next LOOP;
                }


Make sure bwdb is reachable from the outside only to bwdb2:
                my (@ip) = split '\.', $addr;
                unless ($ip[0] == 69) { next LOOP; }
                unless ($ip[1] == 55) { next LOOP; }
                unless ($ip[2] >= 224 && $ip[2] <= 239 && $ip[2] != 229 && $ip[2] != 231) { next LOOP; }
#                unless ($ip[2] == 229) { next LOOP; }


On nat, add to <tt>/etc/ipnat.rules</tt>
                my $classC = "$ip[0]_$ip[1]_$ip[2]";
<pre># bwdb
bimap fxp0 10.1.4.203/32 -> 69.55.233.199/32</pre>


Reload:
#                          IP        dir
ipnat -C -F -f /etc/ipnat.rules
#                if ($d[10] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11]; }
#
#                if ($d[10] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11]; }
#
#                if ($d[10] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'octetTotal'} += $d[11]; }
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10];
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11];


Setup firewall rule on firewall:
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10];
ipfw add 00094 allow ip from 66.181.18.5 to 69.55.233.199 22
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11];
ipfw add 00094 deny ip from any to 69.55.233.199


Setup firewall on bwdb to restrict access now that it's nat'd:
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'pktTotal'} += $d[10];
<pre>
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'octetTotal'} += $d[11];
cat >> /usr/local/etc/rc.d/boot.sh
            }
ipfw add 1 allow tcp from any to any established
        }
ipfw add 2 allow ip from 10.1.4.0/24,66.181.18.5,69.55.233.195 to me 22
        close(DATA);
ipfw add 3 allow ip from 10.1.4.5 to me 3306
        `rm /usr/home/working/tmp-$file`;
ipfw add 4 allow ip from 69.55.225.225 53 to me
        &debug("processing ip totals at ");
ipfw add 5 allow ip from 69.55.230.2 25 to me
        &debug(`date`);
ipfw add 6 allow ip from me to me 4444
        foreach my $classC (keys(%{$iptotal})) {
ipfw add 7 allow icmp from any to me
            $db->query("lock tables dailyIpTotals_$classC write") unless $dry;
ipfw add 8 allow udp from 10.1.4.203 to 10.1.4.203 dst-port 4444
            my @values;
ipfw add 9 allow udp from 10.1.4.5 to me 161
            foreach my $ip (keys(%{$iptotal->{$classC}})) {
ipfw add 100 deny ip from any to me
                foreach my $dir (keys(%{$iptotal->{$classC}->{$ip}})) {
</pre>  
                    my $octets = $iptotal->{$classC}->{$ip}->{$dir}->{'octetTotal'};
 
                    my $packets = $iptotal->{$classC}->{$ip}->{$dir}->{'pktTotal'};
chmod 0700 /usr/local/etc/rc.d/boot.sh
#                    $packets = $packets > 2147483647 ? 0 : $packets;
                    if ($octets > 2147483647) {
                        my $ddir = $dir==1 ? 'in' : 'out';
                        `echo "$date $ip $ddir $octets\n" >> $log`;
#                        $octets = 0;
                    }
                    # dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
                    my $id = "$ip-$condensedDate-$dir";
                    $id =~ s/\.//g;
                    push @values, "('$date', '$ip', $dir, $octets, $packets)";
                    my $sql = "insert into dailyIpTotals_$classC values ('$id', '$date', '$ip', $dir, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                    print "$sql\n" if $dry;
                    $db->query($sql) unless $dry;
#                    $db->query("insert into ipTotals values ('$date', '$ip', $dir, $octets, $packets)");
                }
            }
            $db->query("unlock tables") unless $dry;


From bwdb2, add ssh key:
            $db->query("lock tables ipTotals_$classC write") unless $dry;
cat /root/.ssh/id_dsa.pub | ssh 69.55.233.199 'cat - >> /root/.ssh/authorized_keys'
            # break inserts into 100 records at a time
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into ipTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                $db->query($sql) unless $dry;
            }
            $db->query("unlock tables") unless $dry;
        }


Confirm no password access:
        sleep 20;
ssh 69.55.233.199 hostname
#        &debug("processing protocol totals at ");
 
#        &debug(`date`);
= bwdb2 =
#        foreach my $classC (keys(%{$protototal})) {
== Summary ==
#            $db->query("lock tables dailyProtoTotals_$classC write") unless $dry;
This machine tracks and stores network traffic (netflow) at i2b. It is our means to monitor customer bandwidth usage.
#            my @values;
#            foreach my $ip (keys(%{$protototal->{$classC}})) {
#                foreach my $dir (keys(%{$protototal->{$classC}->{$ip}})) {
#                    foreach my $proto (keys(%{$protototal->{$classC}->{$ip}->{$dir}})) {
#                        my $octets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'octetTotal'};
#                        my $packets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'pktTotal'};
# #                        $octets = $octets > 2147483647 ? 0 : $octets;
# #                        $packets = $packets > 2147483647 ? 0 : $packets;
#                        # dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                        my $id = "$ip-$condensedDate-$dir-$proto";
#                        $id =~ s/\.//g;
#                        push @values, "('$date', '$ip', $dir, $proto, $octets, $packets)";
#                        my $sql = "insert into dailyProtoTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
#                        print "$sql\n" if $dry;
#                        $db->query($sql) unless $dry;
# #                        $db->query("insert into protoTotals values ('$date', '$ip', $dir, $proto, $octets, $packets)");
#                    }
#                }
#            }
#            $db->query("unlock tables") unless $dry;
#            my $sql = "insert into protoTotals_$classC values ";
#            $sql .= join ',', @values;
#            $db->query("lock tables protoTotals_$classC write") unless $dry;
#            print "$sql\n" if $dry;
#            $db->query($sql) unless $dry;
#            $db->query("unlock tables") unless $dry;
#        }


* Location: i2b, cab6
        &debug("processing port totals at ");
* OS: FreeBSD 6.4 x86
        &debug(`date`);
* Networking: Priv IP: 10.1.2.4 There are 2 onboard nic's, one of which is the "listener"
        foreach my $classC (keys(%{$porttotal})) {
* Hardware: Custom 2U. Single power supply.
            $db->query("lock tables dailyPortTotals_$classC write") unless $dry;
* Drives: two 150 GB (2 x 150GB) RAID1 arrays running on a 3ware 7006 RAID card.
            my @values;
 
            foreach my $ip (keys(%{$porttotal->{$classC}})) {
== Services Provided ==
                foreach my $dir (keys(%{$porttotal->{$classC}->{$ip}})) {
* netflow
                    foreach my $proto (keys(%{$porttotal->{$classC}->{$ip}->{$dir}})) {
* bigbrother
                        foreach my $port (keys(%{$porttotal->{$classC}->{$ip}->{$dir}->{$proto}})) {
                            my $octets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'octetTotal'};
                            my $packets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'pktTotal'};
    #                        $octets = $octets > 2147483647 ? 0 : $octets;
    #                        $packets = $packets > 2147483647 ? 0 : $packets;


== netflow ==
                            # dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-protocol-port
                            my $id = "$ip-$condensedDate-$dir-$proto-$port";
                            $id =~ s/\.//g;
                            push @values, "('$date', '$ip', $dir, $proto, $port, $octets, $packets)";
                            my $sql = "insert into dailyPortTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $port, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                            print "$sql\n" if $dry;
                            $db->query($sql) unless $dry;
    #                        $db->query("insert into portTotals values ('$date', '$ip', $dir, $port, $octets, $packets)");
                        }
                    }
                }
            }
            $db->query("unlock tables") unless $dry;


The main function of this server is to run netflow on an eth device in promiscuous mode so as to hear everything happening on the port (wherein all network traffic is mirrored to that port via the cisco swith). Every 15min, it creates a flow file under <tt>/usr/home/flows/</tt> (organized by date). The flow file contains all traffic data for a 15min increment of time.
            $db->query("lock tables portTotals_$classC write") unless $dry;
            # break inserts into 100 records at a time
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into portTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                $db->query($sql) unless $dry;
            }
            $db->query("unlock tables") unless $dry;
            sleep 10;
        }


A cronjob moves that flow file (or files if there are multiple due to some delay)  
#                      12    1 8      1    1= 23
  1,16,31,46 * * * * /usr/home/flowbin/queue.pl
# dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
#                      12        1 8    1  1      3=26
# dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                      12      1  8    1    1     5=28
# dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-port
        #print "finished at ";
        #print `date`;
        `mv $queuedir/$file $archivedir` unless $dry;
    }
}
`rm $queuedir/.lock` unless $dry;


into a processing queue:
sub debug {
<tt>/usr/home/working</tt>
    my $message = shift;
    if ($debug) {
        print "$message\n";
    }
}


Then a separate file processes whatever flow files it finds there, and builds sql files ready for insertion into the traffic database:
# var full during ft-v05.2005-03-28.084500-0800 and
2,17,32,47 * * * * /usr/home/flowbin/processflows-sql.pl
# 2005-02-24 69.55.226


Then yet another process copies the sql files to the traffic database server for processing and insertion into the mysql database:
# all port/daily totals before 2005-04-07
8,23,38,53 * * * * /usr/home/flowbin/sendsql.pl
</pre>


== Regular maintenance ==
<pre>
*[[Routine_Maintenance#Adaptec_Controllers|Check RAID array]]
cat > /usr/home/flowbin/db.pm


* if space becomes tight, move sql files and flow files to backup server, both located in <tt>/usr/home/flowbin/archive</tt>
#!/usr/bin/perl
#
# $Header: /usr/cvs/newgw/lib/db.pm,v 1.4 2003/06/05 18:20:01 glenn Exp $
#
# Copyright (c) 2003
#      e-Monitoring Networks, Inc.  All rights reserved.
#
#
package db;


= firewall (newgateway) =
use strict;
use DBI;


== Summary ==
sub new {
    my $class = shift;
    my $self = {};


This machine is the primary (only) firewall for the entire network at castle.
    $self->{'debug'} = 0;
    bless $self, $class;


* Location: castle, cab 3-8
    return $self;
* OS: FreeBSD 4.11 x86
}
* Networking: Priv IP: 10.1.4.223, Pub IPs: 69.55.233.164 (external), 69.55.233.156 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks. If you're looking at the back of the server, the internal-network-facing nic is on the right (em1), and the external-facing-network (3750) is on the left (em0).
* Hardware: 6 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: 36 GB (2 x 36GB) RAID1 array running on an Adaptec 2120S PCI RAID card.


== Services Provided ==
sub connect {
* firewall (ipfw)
    my $self = shift;
* snmp
    my $dbname = shift;
* bigbrother
    my $dbhost = shift;
    my $dbuser = shift;
    my $dbpass = shift;


== Firewall Rule Configuration ==
    my $host = '';
    if (defined($dbhost)) {
        $host = ";host=$dbhost";
    }


See [[FreeBSD_Reference#Firewall_Rule_Configuration|Firewall Rule Configuration]] for more discussion on how to actually manipulate firewall rules.
    eval {
        $self->debug("connecting to: DBI:mysql:database=$dbname;$host", 1);
        $self->{'dbh'} = DBI->connect("DBI:mysql:database=$dbname;$host", $dbuser, $dbpass);
    };
    if ($self->{'dbh'}) {
        return 1;
    }
    $self->{'error'} = "Error connecting to database $@";
    $self->debug("Error connecting to database $@");
    return 0;
}


== Disaster Recovery ==
sub query {
    my $self = shift;
    my $query = shift;


If there is ever an outage with the firewall, the old firewall "gate" is located just below and is running with the proper network configuration, but with no firewall rules in place (to facilitate good throughput). Have castle move the cable on the left on the current firewall to the left port in the old firewall and the right cable to the right port.
    $self->debug($query, 1);
    my $sth;
    eval {
        $sth = $self->{'dbh'}->prepare($query);
    };
    unless ($sth) {
        $self->{'error'} = "error preparing query $@";
        $self->debug("error preparing query $@");
        return undef;
    }
    my $qty;
    eval {
        $qty = $sth->execute;
    };
    unless ($qty) {
        $self->{'error'} = "error executing query $@";
        warn "error executing query $@ $query";
        return undef;
    }
    $self->debug("returning $qty, $sth from query", 6);
    return ($qty, $sth);
}


Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)
sub disconnect {
    my $self = shift;


<pre>hostname="newgateway.johncompanies.com"
    $self->{'dbh'}->disconnect;
firewall_script="/etc/firewall.sh"
    return 0;
firewall_enable="NO"
}
sendmail_enable="NONE"
sshd_enable="YES"
inetd_enable="NO"
xntpd_enable="YES"
snmpd_enable="YES"
#snmpd_flags="-as -p /var/run/snmpd.pid"
#ipnat_enable="YES"
#ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"


defaultrouter="69.55.233.161"
sub debug {
 
    my $self = shift;
ifconfig_xl0="inet 10.1.4.223 netmask 255.255.255.0"
    my $msg = shift;
ifconfig_em0="inet 69.55.233.164 netmask 255.255.255.248"
    my $level = shift || 0;


#
    if ($level < $self->{'debug'}) {
# Original JohnCompanies 69.55.224.0/20
        print "$msg\n";
#
    }
ifconfig_em1="inet 69.55.233.156 netmask 255.255.255.248"
    return 0;
}
1;
</pre>


static_routes="route1 route2 route3 route4 route5 route6 route7 route8 route9 route10 route11 route1
mkdir /usr/home/archive
2 route13 route14 route15 route16 route17 route18"
mkdir -p /usr/home/sql/tmp


route_route1="-net 69.55.224.0 69.55.233.153"
<pre>crontab -e
route_route2="-net 69.55.225.0 69.55.233.153"
#process flows
route_route3="-net 69.55.226.0 69.55.233.153"
2,17,32,47 * * * * /usr/home/flowbin/processflows.pl</pre>
route_route4="-net 69.55.227.0 69.55.233.153"
route_route5="-net 69.55.228.0 69.55.233.153"
route_route6="-net 69.55.229.0 69.55.233.153"
route_route7="-net 69.55.230.0 69.55.233.153"
route_route8="-net 69.55.231.0 69.55.233.153"
route_route9="-net 69.55.232.0 69.55.233.153"
route_route10="-net 69.55.233.0 69.55.233.153"
route_route11="-net 69.55.234.0 69.55.233.153"
route_route12="-net 69.55.235.0 69.55.233.153"
route_route13="-net 69.55.236.0 69.55.233.153"
route_route14="-net 69.55.237.0 69.55.233.153"
route_route15="-net 69.55.238.0 69.55.233.153"
route_route16="-net 69.55.239.0 69.55.233.153"
route_route17="-net 10.1.5.0 10.1.4.2"
route_route18="-net 10.1.6.0 10.1.4.2"


==== setup traffic db ====
* Install mysql:
<pre>cd /usr/ports/databases/mysql50-server
make install clean</pre>


#In case of 3750 failure:
cat >> /etc/rc.conf
#defaultrouter="69.43.128.81"
mysql_enable="YES"  
#ifconfig_em0="inet 69.43.129.84 netmask 255.255.255.248"


#bind .1's here:
Move db data dir:
#ifconfig_em1="inet 69.55.224.1 netmask 255.255.255.0"
/usr/local/etc/rc.d/mysql-server stop
#ifconfig_em1_alias0="inet 69.55.225.1 netmask 255.255.255.0"
mkdir /usr/home/database/
#ifconfig_em1_alias1="inet 69.55.226.1 netmask 255.255.255.0"
mv /var/db/mysql/* /usr/home/database/
#ifconfig_em1_alias2="inet 69.55.227.1 netmask 255.255.255.0"
chown -R mysql:mysql /usr/home/database
#ifconfig_em1_alias3="inet 69.55.228.1 netmask 255.255.255.0"
#ifconfig_em1_alias4="inet 69.55.229.1 netmask 255.255.255.0"
#ifconfig_em1_alias5="inet 69.55.230.1 netmask 255.255.255.0"
#ifconfig_em1_alias6="inet 69.55.231.1 netmask 255.255.255.0"
#ifconfig_em1_alias7="inet 69.55.232.1 netmask 255.255.255.0"
#ifconfig_em1_alias8="inet 69.55.233.1 netmask 255.255.255.0"
#ifconfig_em1_alias9="inet 69.55.234.1 netmask 255.255.255.0"
#ifconfig_em1_alias10="inet 69.55.235.1 netmask 255.255.255.0"
#ifconfig_em1_alias11="inet 69.55.236.1 netmask 255.255.255.0"
#ifconfig_em1_alias12="inet 69.55.237.1 netmask 255.255.255.0"
#ifconfig_em1_alias13="inet 69.55.238.1 netmask 255.255.255.0"
#ifconfig_em1_alias14="inet 69.55.239.1 netmask 255.255.255.0"


#bulk:
Edit database location in startup script:
# reassign 69.55.231.1 to the int iface on the firewall
vi /usr/local/etc/rc.d/mysql-server
# set the DG on the firewall to 69.43.138.9
# : ${mysql_dbdir="/var/db/mysql"}
# set the ext firewall IP to 69.43.138.12, NM: 255.255.255.248</pre>
: ${mysql_dbdir="/usr/home/database"}


== Cronjobs ==
  /usr/local/etc/rc.d/mysql-server start
  1 0 * * * /usr/local/etc/rsync.backup
Backup to backup1


0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3  4 5 17331
Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).


Inside <tt>/etc/daily.local</tt> you will see a call to <tt>/etc/makepiperules.pl</tt>
* Install mysql perl database modules:
This script will create <tt>/etc/firewall.sh</tt> which contains all the firewall and pipe rules in place at the time the script was run.
<pre>
cd /usr/ports/databases/p5-DBI
make install clean
cd /usr/ports/databases/p5-DBD-mysql50
make install clean
(no to SSL support)
</pre>


== DOS attacks ==
* Setting up database
<pre>
rehash
/usr/local/etc/rc.d/mysql-server start
mysql -u root
create database traffic;
grant all on *.* to root@localhost identified by '5over3';
grant all on traffic.* to jc@10.1.4.5 identified by '2gMKY3Wt';


See [[FreeBSD_Reference#Handling_a_DoS_attack|Handling a DoS attack]] regarding how to handle a DOS attack.
</pre>


Theres a background process (running from user shell) that monitors the firewall for incoming UDP DoS attacks. When it notices packets above a certain level it will
If this was a new server we'd setup new tables. See [[#mysql_2|mysql]] for how those tables would be setup.
# enter a rule that allows all UDP to go through
# send an emergency email to support and indicating an attack is in progress
# send an email to castle (nocstaff@castleaccess.com and jcsupport@castleaccess.com) telling them to investigate and put up a null if warranted
# wait for a couple minutes to see if the attack subsides- if so it will remove the pass-all UDP rule, if not it will repeat the process from #1
This file lives under /usr/home/user/doswatch.pl
To run:
cd /usr/home/user
./doswatch.pl &


To kill;
We are assuming here we are moving data from an existing db, here's how that's done (from the current traffic db):
  fg
  rsync -av --progress /usr/home/database/traffic/ 10.1.4.203:/usr/home/database/traffic/
^C


It writes its findings to /usr/home/user/doswatch.log
When you're ready to do the cutover, shut down mysql on both hosts and do one last sync.


= backup1 =


== Summary ==


This machine acts as the primary backup location for all VPS-based customers. No customer directly accesses this server to perform their backups. We also store cancelled customers on this server.
==== process flows from bwdb2 ====
On traffic database server (bwdb):


* Location: castle, cab 3-8
<pre>crontab -e
* OS: Ubuntu 8.04.1 server x86
#import sql from bwdb2
* Networking: Priv IP: 10.1.4.8, Pub IP: 69.55.230.11 (firewalled from all but JC infrastructure @ i2b)
10,25,40,55 * * * * /usr/home/flowbin/processsql.pl</pre>
* Hardware: 6 SATA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Single power supply.
* Drives: 4.5 TB (6 x 1TB) RAID5 array running on a 3ware 9650SE-8LPML (8-port) card


== Services provided ==
Add access to mysql:
* backup via rsync
<pre>mysql -u root -p
* mysql
grant all on traffic.* to bwdb2@localhost identified by 's1lver4d';
* nfs
</pre>
* snmp
* bigbrother


== Usage and Notes ==
<pre>cat > /usr/home/flowbin/processsql.pl
* all data is stored under /data
* virtually all jc infrastructure, and all VPS machines are setup to mount to backup1 via nfs (mountpoint: <tt>/backup1</tt>), and they all have their ssh keys setup to allow passwordless rsync's
* each virt or jail backs up each evening to backup1. Each server has it's own directory (named for the server). Under those directories are 7 daily snapshots (0-6)
* at the time of writing, the mysql server running here is replicating from (slave to) the mysql instance on bwdb. Requests for bandwidth data usage for customers (coming from management, account manager, and accounting scripts running on mail) all direct towards the database "traffic" running on this server.
* cancelled customer systems are compressed and stored under <tt>/data/deprecated</tt>
* archived bwdb2 flow files are stored under <tt>/data/bwdb2</tt>
* critical files from backup2 are stored under <tt>/data/backup2</tt>


== Cronjobs ==
#!/usr/bin/perl
<pre>
00 5 * * * /usr/local/sbin/backupwatch.pl 2>&1 > /dev/null
35 5 * * * /usr/local/sbin/usage_check; /usr/local/sbin/snapshot_archive; /usr/local/sbin/snapshot_rotate  /data/backuplog.log</pre>
this runs daily the scripts to report on how much disk space each customer system occupies and how long their backups took. Then it rotates backups for each system, removing the oldest backup. It will email support@johncompanies.com at it’s conclusion. This email can be deleted, however note when it begins to take significantly longer to complete, ie runs past 2200 pm – this usually indicates a problem on the backup server.


<pre>10,25,40,55 * * * * /usr/local/sbin/processsql.pl
#use strict;
</pre>
#$debug=1;
this processes prepared sql command files sent from/by bwdb2 (@ i2b) and imports them into the traffic database.
#$dry=1;
<pre>0 0 * * * /usr/local/sbin/3wraidchk
</pre>
checks the health of the RAID array


== Regular maintenance ==
my $sqldir = "/usr/home/bwdb2/pending";
*[[Routine_Maintenance#Free_up_space_on_backup1|Remove old backups]]
my $mysql = '/usr/local/bin/mysql';
*[[Routine_Maintenance#3ware|Check on auto-verify]]
my @err;
unless ($dry) {
    if (-e "$sqldir/.lock") {
        open(FILE, "$sqldir/.lock");
        my $pid = <FILE>;
        chomp($pid);
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $sqldir/.lock`;
        }
    }
    open(FILE, "> $sqldir/.lock");
    print FILE "$$\n";
    close(FILE);
}


== build ==
opendir(DIR, $sqldir);
my @files = readdir(DIR);
closedir(DIR);


<pre>Setup raid5 with a boot vol of 12G 5.45tb
foreach my $file (sort @files) {
12G boot
  next unless $file =~ /done$/;
4664 GB
  my $r = `bzcat $sqldir/$file | $mysql -u bwdb2 -ps1lver4d traffic`;
  unless ($?==0) {
      push @err, "bzcat $sqldir/$file | $mysql -u bwdb2 -pxxxxx traffic ($r)";
  }
  else {
      `rm $sqldir/$file`;
  }
}


Install ubuntu 8.04
`rm $sqldir/.lock` unless $dry;


Swap 4G
if (@err) {
  email_support('bwdb: processsql.pl error',join "\n", @err);
}


Don’t format data drive
sub email_support {
    my $subj=shift;
    my $body=shift;
    use Mail::Sendmail;


http://www.unixgods.org/~tilo/linux_larger_2TB.html
    # prepare message
    my %mail = (
        To      => 'dave@johncompanies.com',
        From    => 'support@johncompanies.com',
        Subject => $subj,
        Message => $body,
        smtp    => 'mail.johncompanies.com',
    );
    sendmail(%mail) || warn "Error: $Mail::Sendmail::error";
}


parted /dev/sdb
sub debug {
print
    my $message = shift;
mklabel gpt
    if ($debug) {
print
        print "$message\n";
    }
}
</pre>


#Disk /dev/sdb: 4987GB
chmod 0700 /usr/home/flowbin/processsql.pl
#Sector size (logical/physical): 512B/512B
#Partition Table: gpt


#Number  Start  End  Size  File system  Name  Flags
Make sure bwdb is reachable from the outside only to bwdb2:


mkpart primary ext3 0 4987GB
On nat, add to <tt>/etc/ipnat.rules</tt>
print
<pre># bwdb
bimap fxp0 10.1.4.203/32 -> 69.55.233.199/32</pre>


#Disk /dev/sdb: 5987GB
Reload:
#Sector size (logical/physical): 512B/512B
ipnat -C -F -f /etc/ipnat.rules
#Partition Table: gpt


#Number Start  End    Size    File system Name    Flags
Setup firewall rule on firewall:
# 1      17.4kB  4987GB  4987GB              primary
  ipfw add 00094 allow ip from 66.181.18.5 to 69.55.233.199 22
  ipfw add 00094 deny ip from any to 69.55.233.199


quit
Setup firewall on bwdb to restrict access now that it's nat'd:
<pre>
cat >> /usr/local/etc/rc.d/boot.sh
ipfw add 1 allow tcp from any to any established
ipfw add 2 allow ip from 10.1.4.0/24,66.181.18.5,69.55.233.195 to me 22
ipfw add 3 allow ip from 10.1.4.5 to me 3306
ipfw add 4 allow ip from 69.55.225.225 53 to me
ipfw add 5 allow ip from 69.55.230.2 25 to me
ipfw add 6 allow ip from me to me 4444
ipfw add 7 allow icmp from any to me
ipfw add 8 allow udp from 10.1.4.203 to 10.1.4.203 dst-port 4444
ipfw add 9 allow udp from 10.1.4.5 to me 161
ipfw add 100 deny ip from any to me
</pre>


mkfs.ext3 /dev/sdb1
chmod 0700 /usr/local/etc/rc.d/boot.sh
#mke2fs 1.40.8 (13-Mar-2008)
#Filesystem label=
#OS type: Linux
#Block size=4096 (log=2)
#Fragment size=4096 (log=2)
#304390144 inodes, 1217544183 blocks
#60877209 blocks (5.00%) reserved for the super user
#First data block=0
#Maximum filesystem blocks=0
#37157 block groups
#32768 blocks per group, 32768 fragments per group
#8192 inodes per group
#Superblock backups stored on blocks:
#        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
#        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
#        102400000, 214990848, 512000000, 550731776, 644972544
#
#Writing inode tables:  967/37157


mkdir /data
From bwdb2, add ssh key:
cat /root/.ssh/id_dsa.pub | ssh 69.55.233.199 'cat - >> /root/.ssh/authorized_keys'


#root@backup1:~# df -h
Confirm no password access:
#Filesystem            Size Used Avail Use% Mounted on
  ssh 69.55.233.199 hostname
#/dev/sda2            8.3G  540M  7.3G  7% /
 
#varrun              1013M  40K 1013M  1% /var/run
= bwdb2 =
#varlock              1013M    0 1013M  0% /var/lock
== Summary ==
#udev                1013M  56K 1013M  1% /dev
This machine tracks and stores network traffic (netflow) at i2b. It is our means to monitor customer bandwidth usage.
#devshm              1013M    0 1013M  0% /dev/shm
#/dev/sdb1            4.5T  192M  4.3T  1% /data


* Location: i2b, cab6
* OS: FreeBSD 6.4 x86
* Networking: Priv IP: 10.1.2.4 There are 2 onboard nic's, one of which is the "listener"
* Hardware: Custom 2U. Single power supply.
* Drives: two 150 GB (2 x 150GB) RAID1 arrays running on a 3ware 7006 RAID card.


apt-get update
== Services Provided ==
apt-get upgrade
* netflow
apt-get install snmp snmpd ntp nfs-kernel-server
* bigbrother


echo "\"\e[5~\": history-search-backward" >> ~/.inputrc
== netflow ==
echo "\"\e[6~\": history-search-forward" >> ~/.inputrc


vi /etc/ntp.conf
The main function of this server is to run netflow on an eth device in promiscuous mode so as to hear everything happening on the port (wherein all network traffic is mirrored to that port via the cisco swith). Every 15min, it creates a flow file under <tt>/usr/home/flows/</tt> (organized by date). The flow file contains all traffic data for a 15min increment of time.
server 10.1.4.5


scp root@10.1.4.3:/root/.ssh/authorized_keys /root/.ssh/
A cronjob moves that flow file (or files if there are multiple due to some delay)
cd /root/
1,16,31,46 * * * * /usr/home/flowbin/queue.pl
ssh-keygen -t dsa
echo "10.1.4.3        backup2" >> /etc/hosts


cat .ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
into a processing queue:
<tt>/usr/home/working</tt>


ssh backup2
Then a separate file processes whatever flow files it finds there, and builds sql files ready for insertion into the traffic database:
2,17,32,47 * * * * /usr/home/flowbin/processflows-sql.pl


vi /root/.bashrc
Then yet another process copies the sql files to the traffic database server for processing and insertion into the mysql database:
export PS1="[\u@\h \w]# "
8,23,38,53 * * * * /usr/home/flowbin/sendsql.pl
alias h='history'
alias vi='vim'
alias j='jobs'
export PS1="[\u@\h \w]# "
alias dr='screen -dr'
export EDITOR=vim
export GREP_OPTIONS='--color=auto'
export HISTFILESIZE=1000


source /root/.bashrc
== Regular maintenance ==
*[[Routine_Maintenance#Adaptec_Controllers|Check RAID array]]


echo "# ttyS0 - getty
* if space becomes tight, move sql files and flow files to backup server, both located in <tt>/usr/home/flowbin/archive</tt>
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.


start on runlevel 2
= firewall (newgateway) =
start on runlevel 3
start on runlevel 4
start on runlevel 5


stop on runlevel 0
== Summary ==
stop on runlevel 1
stop on runlevel 6


respawn
This machine is the primary (only) firewall for the entire network at castle.  
exec /sbin/getty 38400 ttyS0" > /etc/event.d/ttyS0


* Location: castle, cab 3-8
* OS: FreeBSD 4.11 x86
* Networking: Priv IP: 10.1.4.223, Pub IPs: 69.55.233.164 (external), 69.55.233.156 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks. If you're looking at the back of the server, the internal-network-facing nic is on the right (em1), and the external-facing-network (3750) is on the left (em0).
* Hardware: 6 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: 36 GB (2 x 36GB) RAID1 array running on an Adaptec 2120S PCI RAID card.


vi /boot/grub/menu.lst
== Services Provided ==
* firewall (ipfw)
* snmp
* bigbrother


serial --unit=0 --speed=38400 --word=8 --parity=no --stop=1
== Firewall Rule Configuration ==
terminal --timeout=15 serial console


append to kernel lines:
See [[FreeBSD_Reference#Firewall_Rule_Configuration|Firewall Rule Configuration]] for more discussion on how to actually manipulate firewall rules.
console=tty0 console=ttyS0,38400n8


show menu:
== Disaster Recovery ==
#hiddenmenu


echo 'rocommunity  jcread 10.1.4.5
If there is ever an outage with the firewall, the old firewall "gate" is located just below and is running with the proper network configuration, but with no firewall rules in place (to facilitate good throughput). Have castle move the cable on the left on the current firewall to the left port in the old firewall and the right cable to the right port.
rocommunity  jcread 10.1.4.3
agentaddress 10.1.4.8:161' > /etc/snmp/snmpd.conf


# to see which iface it is, on backup2:
Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)


snmpwalk -v 1 -c jcread 10.1.4.8 interface
<pre>hostname="newgateway.johncompanies.com"
firewall_script="/etc/firewall.sh"
firewall_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
inetd_enable="NO"
xntpd_enable="YES"
snmpd_enable="YES"
#snmpd_flags="-as -p /var/run/snmpd.pid"
#ipnat_enable="YES"
#ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"


defaultrouter="69.55.233.161"


echo "bb:x:1984:1984:Big Brother:/home/bb:/bin/bash" >> /etc/passwd
ifconfig_xl0="inet 10.1.4.223 netmask 255.255.255.0"
ifconfig_em0="inet 69.55.233.164 netmask 255.255.255.248"


echo "bb:x:1984:" >> /etc/group
#
# Original JohnCompanies 69.55.224.0/20
#
ifconfig_em1="inet 69.55.233.156 netmask 255.255.255.248"


pwconv
static_routes="route1 route2 route3 route4 route5 route6 route7 route8 route9 route10 route11 route1
2 route13 route14 route15 route16 route17 route18"


mkdir /home/bb
route_route1="-net 69.55.224.0 69.55.233.153"
chown bb.bb /home/bb
route_route2="-net 69.55.225.0 69.55.233.153"
 
route_route3="-net 69.55.226.0 69.55.233.153"
cd ~bb
route_route4="-net 69.55.227.0 69.55.233.153"
scp backup2:/mnt/data4/build/bb/bb-linux.tar .
route_route5="-net 69.55.228.0 69.55.233.153"
route_route6="-net 69.55.229.0 69.55.233.153"
route_route7="-net 69.55.230.0 69.55.233.153"
route_route8="-net 69.55.231.0 69.55.233.153"
route_route9="-net 69.55.232.0 69.55.233.153"
route_route10="-net 69.55.233.0 69.55.233.153"
route_route11="-net 69.55.234.0 69.55.233.153"
route_route12="-net 69.55.235.0 69.55.233.153"
route_route13="-net 69.55.236.0 69.55.233.153"
route_route14="-net 69.55.237.0 69.55.233.153"
route_route15="-net 69.55.238.0 69.55.233.153"
route_route16="-net 69.55.239.0 69.55.233.153"
route_route17="-net 10.1.5.0 10.1.4.2"
route_route18="-net 10.1.6.0 10.1.4.2"


tar xf bb-linux.tar


cd /home/bb/bbc1.9e-btf/etc
#In case of 3750 failure:
#defaultrouter="69.43.128.81"
#ifconfig_em0="inet 69.43.129.84 netmask 255.255.255.248"


echo "10.1.4.5 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
#bind .1's here:
echo "10.1.4.8 backup1.johncompanies.com # ssh" >> /home/bb/bbc1.9e-btf/etc/bb-hosts
#ifconfig_em1="inet 69.55.224.1 netmask 255.255.255.0"
#ifconfig_em1_alias0="inet 69.55.225.1 netmask 255.255.255.0"
#ifconfig_em1_alias1="inet 69.55.226.1 netmask 255.255.255.0"
#ifconfig_em1_alias2="inet 69.55.227.1 netmask 255.255.255.0"
#ifconfig_em1_alias3="inet 69.55.228.1 netmask 255.255.255.0"
#ifconfig_em1_alias4="inet 69.55.229.1 netmask 255.255.255.0"
#ifconfig_em1_alias5="inet 69.55.230.1 netmask 255.255.255.0"
#ifconfig_em1_alias6="inet 69.55.231.1 netmask 255.255.255.0"
#ifconfig_em1_alias7="inet 69.55.232.1 netmask 255.255.255.0"
#ifconfig_em1_alias8="inet 69.55.233.1 netmask 255.255.255.0"
#ifconfig_em1_alias9="inet 69.55.234.1 netmask 255.255.255.0"
#ifconfig_em1_alias10="inet 69.55.235.1 netmask 255.255.255.0"
#ifconfig_em1_alias11="inet 69.55.236.1 netmask 255.255.255.0"
#ifconfig_em1_alias12="inet 69.55.237.1 netmask 255.255.255.0"
#ifconfig_em1_alias13="inet 69.55.238.1 netmask 255.255.255.0"
#ifconfig_em1_alias14="inet 69.55.239.1 netmask 255.255.255.0"


echo "/:90:95
#bulk:
/var:90:95
# reassign 69.55.231.1 to the int iface on the firewall
/data:85:99" > /home/bb/bbc1.9e-btf/etc/bb-dftab
# set the DG on the firewall to 69.43.138.9
# set the ext firewall IP to 69.43.138.12, NM: 255.255.255.248</pre>


== Cronjobs ==
1 0 * * * /usr/local/etc/rsync.backup
Backup to backup1


vi /home/bb/bbc1.9e-btf/bin/bb-disk.sh
0 0 1 * * /sbin/ipfw zero
(remove all | SORT xxxx)
0 0 1 * * /sbin/ipfw del 3  4 5 17331
Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).


chmod +r /var/log/messages
Inside <tt>/etc/daily.local</tt> you will see a call to <tt>/etc/makepiperules.pl</tt>
This script will create <tt>/etc/firewall.sh</tt> which contains all the firewall and pipe rules in place at the time the script was run.


./bbchkcfg.sh
== DOS attacks ==
#(y to questions)
./bbchkhosts.sh
#(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src


#make; make install
See [[FreeBSD_Reference#Handling_a_DoS_attack|Handling a DoS attack]] regarding how to handle a DOS attack.
cd ..
./runbb.sh start
more BBOUT
(look for errors)
exit


vi /etc/rc.local
Theres a background process (running from user shell) that monitors the firewall for incoming UDP DoS attacks. When it notices packets above a certain level it will
su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"
# enter a rule that allows all UDP to go through
# send an emergency email to support and indicating an attack is in progress
# send an email to castle (nocstaff@castleaccess.com and jcsupport@castleaccess.com) telling them to investigate and put up a null if warranted
# wait for a couple minutes to see if the attack subsides- if so it will remove the pass-all UDP rule, if not it will repeat the process from #1
This file lives under /usr/home/user/doswatch.pl
To run:
cd /usr/home/user
./doswatch.pl &


To kill;
fg
^C


echo '/data 10.1.4.0/24(rw, no_root_squash,async,no_subtree_check)' >> /etc/exports
It writes its findings to /usr/home/user/doswatch.log


/etc/init.d/nfs-kernel-server restart
= backup1 =


== Summary ==


echo 'chmod o+r /var/log/messages' >> /etc/cron.weekly/sysklogd
This machine acts as the primary backup location for all VPS-based customers. No customer directly accesses this server to perform their backups. We also store cancelled customers on this server.  


* Location: castle, cab 3-8
* OS: Ubuntu 8.04.1 server x86
* Networking: Priv IP: 10.1.4.8, Pub IP: 69.55.230.11 (firewalled from all but JC infrastructure @ i2b)
* Hardware: 6 SATA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Single power supply.
* Drives: 4.5 TB (6 x 1TB) RAID5 array running on a 3ware 9650SE-8LPML (8-port) card


echo '10.1.4.8                backup1' >> /etc/hosts
== Services provided ==
echo '/dev/sdb1 /data ext3  rw,noatime  0  0' >> /etc/fstab
* backup via rsync
* mysql - traffic data
* nfs server - for backups
* snmp client - for big brother
* bigbrother client


== Usage and Notes ==
* all data is stored under /data
* virtually all jc infrastructure, and all VPS machines are setup to mount to backup1 via nfs (mountpoint: <tt>/backup1</tt>), and they all have their ssh keys setup to allow passwordless rsync's
* each virt or jail backs up each evening to backup1. Each server has it's own directory (named for the server). Under those directories are 7 daily snapshots (0-6)
* at the time of writing, the mysql server running here is replicating from (slave to) the mysql instance on bwdb. Requests for bandwidth data usage for customers (coming from management, account manager, and accounting scripts running on mail) all direct towards the database "traffic" running on this server.
* cancelled customer systems are compressed and stored under <tt>/data/deprecated</tt>
* archived bwdb2 flow files are stored under <tt>/data/bwdb2</tt>
* critical files from backup2 are stored under <tt>/data/backup2</tt>


to install digi drivers:
== Cronjobs ==
<pre>
00 5 * * * /usr/local/sbin/backupwatch.pl 2>&1 > /dev/null
35 5 * * * /usr/local/sbin/usage_check; /usr/local/sbin/snapshot_archive; /usr/local/sbin/snapshot_rotate  /data/backuplog.log</pre>
this runs daily the scripts to report on how much disk space each customer system occupies and how long their backups took. Then it rotates backups for each system, removing the oldest backup. It will email support@johncompanies.com at it’s conclusion. This email can be deleted, however note when it begins to take significantly longer to complete, ie runs past 2200 pm – this usually indicates a problem on the backup server.


wget http://ftp1.digi.com/support/driver/40002086_n.tgz
<pre>10,25,40,55 * * * * /usr/local/sbin/processsql.pl
apt-get install linux-image-2.6.24-19-server
</pre>
apt-get install linux-source-2.6.24 (not needed?)
this processes prepared sql command files sent from/by bwdb2 (@ i2b) and imports them into the traffic database.
apt-get install linux-headers-2.6.24-19-server
<pre>0 0 * * * /usr/local/sbin/3wraidchk
apt-get install make
</pre>
apt-get install gcc
checks the health of the RAID array
apt-get install g++
apt-get install libncurses5-dev
apt-get install expect
apt-get install libdbi-perl libdate-calc-perl libdbd-mysql-perl


cd /usr/src; ln -s linux-headers-2.6.24-19-server linux
== Regular maintenance ==
./configure
*[[Routine_Maintenance#Free_up_space_on_backup1|Remove old backups]]
make all
*[[Routine_Maintenance#3ware|Check on auto-verify]]
make install
make postinstall


/usr/bin/dgrp_cfg_node -v -v init el 65.116.11.2 8
== build ==


apt-get install mysql
<pre>Setup raid5 with a boot vol of 12G 5.45tb
12G boot
4664 GB


mkdir /data/mysql
Install ubuntu 8.04
chown mysql:mysql /data/mysql
/etc/init.d/mysql stop
mv /var/lib/mysql/* /data/mysql/
mv /data/mysql/ib_* /var/lib/mysql/
vi /etc/mysql/my.cnf
(change datadir to /data/mysql)
vi /etc/apparmor.d/usr.sbin.mysqld
add:
  /data/mysql/ r,
  /data/mysql/** rwk,
Comment out:
#  /var/lib/mysql/ r,
#  /var/lib/mysql/** rwk,


/etc/init.d/apparmor restart
Swap 4G
/etc/init.d/mysql start


tw_cli /c0/u0 set ignoreECC=on
Don’t format data drive
tw_cli /c0/u0 set storsave=balance
tw_cli /c0/u0 set cache=on


http://www.unixgods.org/~tilo/linux_larger_2TB.html


0 0 * * * /usr/local/sbin/3wraidchk
parted /dev/sdb
</pre>
print
mklabel gpt
print


= backup2 =
#Disk /dev/sdb: 4987GB
#Sector size (logical/physical): 512B/512B
#Partition Table: gpt


== Summary ==
#Number  Start  End  Size  File system  Name  Flags


This machine is used for archiving data and is a backup server for colo customers. It was the former primary backup location for all VPS-based customers before backup1 was installed. Only dedicated customers directly accesses this server to perform their backups. NOTE: power button is broken, so the reset button (paper clip) was rewired to be the power button.
mkpart primary ext3 0 4987GB
print


* Location: castle, cab 3-7
#Disk /dev/sdb: 5987GB
* OS: FreeBSD 6.1 x86
#Sector size (logical/physical): 512B/512B
* Networking: Priv IP: 10.1.4.3, Pub IP: 69.55.230.10 (firewalled from all but JC infrastructure @ i2b)
#Partition Table: gpt
* Hardware: 16 IDE drive bays (4 columns of 4, drive 0-0 top left, drive 0-1 just to the right TODO) all hot-swap. Triple power supply.
* Drives:  
**3ware 7500-8:
***200 GB JBOD (1 x 200G) labeled 0-0
***500 GB RAID5 (3 x 250G) 0-1 thru 0-3
***700 GB RAID5 (4 x 250G) 0-4 thru 0-7
**3ware 7500-8:
***700 GB RAID5 (4 x 250G) 1-0 thru 1-3
***700 GB RAID5 (4 x 250G) 1-4 thru 1-7


All drives MUST be western digital IDE drives. Other brands will not fit.
#Number  Start  End    Size    File system  Name    Flags
# 1      17.4kB  4987GB  4987GB              primary


In case of an outage, nfs will hang on all connected servers until the nfs service returns. If you can't get backup2 back online, you can get nfs running elsewhere and fake backup2's MAC's: priv: 00:0e:0c:59:c1:a6, pub: 00:07:e9:5b:c6:45
quit


To configure:
mkfs.ext3 /dev/sdb1
ifconfig fxp0 link 00:90:27:f9:0a:d9
#mke2fs 1.40.8 (13-Mar-2008)
 
#Filesystem label=
== Services provided ==
#OS type: Linux
* backup via rsync and nfs
#Block size=4096 (log=2)
* samba
#Fragment size=4096 (log=2)
* nfs
#304390144 inodes, 1217544183 blocks
* snmp
#60877209 blocks (5.00%) reserved for the super user
* bigbrother
#First data block=0
#Maximum filesystem blocks=0
#37157 block groups
#32768 blocks per group, 32768 fragments per group
#8192 inodes per group
#Superblock backups stored on blocks:
#        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
#        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
#        102400000, 214990848, 512000000, 550731776, 644972544
#
#Writing inode tables:  967/37157


== Usage ==
mkdir /data
* all data is stored under 4 mount points, corresponding to the 4 large RAID5 arrays: <tt>/mnt/data1 /mnt/data2 /mnt/data3 /mnt/data4</tt>
* iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under <tt>/mnt/data2/iso</tt>
* this used to be our primary backup server so you will see old backups from virt and jails around- missing customer data though, just the machine's data
* this server serves as an archive for exported db data from bwdb and old flow files.
* isys backs up here
* customers are nfs-moutned under /mnt/data3/customers as file-backed md devices
* in <tt>/mnt/data4</tt> there are lots of useful things used for building our vps servers, customer servers, and management scripts:
** <tt>/bin</tt>: the master repository of scripts and custom binaries we use on jails and virts. Each night every virt and jail rsync's what's in here to update the local files. So any global updates to scripts would need to be made here (or will be overwritten with what's in here)
** <tt>/build</tt>: files we use for setting up big brother, 3ware cli and scripts for colo's, vzcp customized setup files and so on
** <tt>/vzrpms</tt>: contains the OS templates for many-to-most of the OS's we offer on vz systems


== Cronjobs ==
#root@backup1:~# df -h
* backs itself up nightly to nfs-mounted backup1 (mountpoint: <tt>/backup2</tt>)
#Filesystem            Size  Used Avail Use% Mounted on
#/dev/sda2            8.3G  540M  7.3G  7% /
#varrun              1013M  40K 1013M  1% /var/run
#varlock              1013M    0 1013M  0% /var/lock
#udev                1013M  56K 1013M  1% /dev
#devshm              1013M    0 1013M  0% /dev/shm
#/dev/sdb1            4.5T  192M  4.3T  1% /data


== Regular maintenance ==
*[[Routine_Maintenance#3ware|Check on health]]


= backup3 =
apt-get update
== Summary ==
apt-get upgrade
This machine is used for archiving data, is a backup server for colo customers, runs a samba server to make available iso's to the IPKVMs, and allows us to connect to the digi serial multiplexer at i2b. Only dedicated customers directly accesses this server to perform their backups.
apt-get install snmp snmpd ntp nfs-kernel-server


* Location: i2b, cab 6
echo "\"\e[5~\": history-search-backward" >> ~/.inputrc
* OS: Ubuntu 10.04.1 server amd64
echo "\"\e[6~\": history-search-forward" >> ~/.inputrc
* Networking: Priv IP: 10.1.2.3, Pub IPs: 69.55.229.4 AND 69.55.231.2
* Hardware: 16 drive SATA bays (4 columns of 4, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
* Drives: 5 TB (6 x 1TB) RAID5 array running on an Areca Technology Corp. ARC-1160 16-Port


== Services provided ==
vi /etc/ntp.conf
* backup via rsync and nfs
server 10.1.4.5
* samba
* nfs
* digi realport
* snmp
* bigbrother


== Usage ==
scp root@10.1.4.3:/root/.ssh/authorized_keys /root/.ssh/
* all data is stored under /data
cd /root/
* iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under <tt>/data/iso</tt>
ssh-keygen -t dsa
* this server serves as an archive for exported db data from bwdb and old flow files.
echo "10.1.4.3        backup2" >> /etc/hosts
* inftrastructure machines at i2b back up here
* customers are nfs-moutned under /data/customers as file-backed loopback devices


== management scripts ==
cat .ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
* mkbackups


== Cronjobs ==
ssh backup2
0 0 * * * /usr/local/sbin/arecaraidchk
RAID checks


35 4 * * * /usr/local/sbin/snapshot_archive
vi /root/.bashrc
Rotate daily snapshots for infrastructure machine backups
export PS1="[\u@\h \w]# "
alias h='history'
alias vi='vim'
alias j='jobs'
export PS1="[\u@\h \w]# "
alias dr='screen -dr'
export EDITOR=vim
export GREP_OPTIONS='--color=auto'
export HISTFILESIZE=1000


== Regular maintenance ==
source /root/.bashrc
*[[Routine_Maintenance#Areca|Check on RAID health]]


== Build ==
echo "# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.


=== BIOS Config ===
start on runlevel 2
disable quiet boot
start on runlevel 3
start on runlevel 4
start on runlevel 5


set to last state after power loss
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6


set date/time to GMT
respawn
exec /sbin/getty 38400 ttyS0" > /etc/event.d/ttyS0


enable serial console output (baud rate 115200)


=== Install OS ===
vi /boot/grub/menu.lst
<pre>Ubuntu 10.04.1 amd64 (couldn't get 12.04 to load cause the H/W was incompat)
10G / ext3
2G swap
~ /data ext4


Install packages:
serial --unit=0 --speed=38400 --word=8 --parity=no --stop=1
openssh
terminal --timeout=15 serial console
samba</pre>


=== DNS and private IP ===
append to kernel lines:
console=tty0 console=ttyS0,38400n8


echo "nameserver 69.55.225.225" >> /etc/resolv.conf
show menu:
#hiddenmenu


Add a 2nd IP to eth0 and setup priv net
echo 'rocommunity  jcread 10.1.4.5
<pre>vi /etc/network/interfaces
rocommunity  jcread 10.1.4.3
agentaddress 10.1.4.8:161' > /etc/snmp/snmpd.conf


auto eth0
# to see which iface it is, on backup2:
iface eth0 inet static
        address 69.55.229.4
        netmask 255.255.255.0
        network 69.55.229.0
        broadcast 69.55.229.255
        gateway 69.55.229.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 69.55.229.3 66.181.0.2
        dns-search johncompanies.com


auto eth0:1
snmpwalk -v 1 -c jcread 10.1.4.8 interface
iface eth0:1 inet static
        address 69.55.231.2
        netmask 255.255.255.0
        network 69.55.231.0
        broadcast 69.55.231.255


auto eth1
iface eth1 inet static
        address 10.1.2.3
        netmask 255.255.255.0
        network 10.1.2.0
        broadcast 10.1.2.255


</pre>
echo "bb:x:1984:1984:Big Brother:/home/bb:/bin/bash" >> /etc/passwd


=== Install packages ===
echo "bb:x:1984:" >> /etc/group
<pre>apt-get update
apt-get upgrade
apt-get install gcc
apt-get install libssl-dev
apt-get install libncurses5-dev
apt-get install cu
apt-get install unzip
apt-get install snmp snmpd ntp nfs-kernel-server</pre>


=== tweak grub, enable serial ===
pwconv


<pre>vi /etc/default/grub
mkdir /home/bb
#GRUB_HIDDEN_TIMEOUT=0
chown bb.bb /home/bb
GRUB_CMDLINE_LINUX_DEFAULT="max_loop=64"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0"
update-grub</pre>


<pre>echo "start on stopped rc RUNLEVEL=[2345]
cd ~bb
stop on runlevel [!2345]
scp backup2:/mnt/data4/build/bb/bb-linux.tar .
respawn
exec /sbin/getty -L ttyS0 38400 vt102" > /etc/init/ttyS0.conf</pre>


=== install realport (digi) driver ===
tar xf bb-linux.tar


give the digi an ip with DgIpServ.exe
cd /home/bb/bbc1.9e-btf/etc


<pre>cd /usr/src/
echo "10.1.4.5 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
wget ftp://ftp1.digi.com/support/beta/linux/dgrp/dgrp-1.9.tgz
echo "10.1.4.8 backup1.johncompanies.com # ssh" >> /home/bb/bbc1.9e-btf/etc/bb-hosts
tar xzf dgrp-1.9.tgz
cd dgrp-1.9/
./configure
make
make install
make postinstall
update-rc.d dgrp_daemon defaults</pre>


configure ports:
echo "/:90:95
dgrp_cfg_node init el 10.1.2.10 16
/var:90:95
/data:85:99" > /home/bb/bbc1.9e-btf/etc/bb-dftab


try connecting with:
cu -l /dev/ttyel00 -s 38400


=== shell, ntp, ssh key, hosts ===
vi /home/bb/bbc1.9e-btf/bin/bb-disk.sh
(remove all | SORT xxxx)


Shell autocompletion search:
chmod +r /var/log/messages
<pre>echo "\"\e[5~\": history-search-backward" >> ~/.inputrc
echo "\"\e[6~\": history-search-forward" >> ~/.inputrc</pre>


Setup ntp:
./bbchkcfg.sh
<pre>vi /etc/ntp.conf
#(y to questions)
server 10.1.2.1
./bbchkhosts.sh
server ntp.ubuntu.com</pre>
#(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
 
#make; make install
cd ..
./runbb.sh start
more BBOUT
(look for errors)
exit
 
vi /etc/rc.local
su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"


Generate ssh keys:
<pre>cd /root/
ssh-keygen -t dsa</pre>
Defaults, no password


Setup hosts:
echo '/data 10.1.4.0/24(rw, no_root_squash,async,no_subtree_check)' >> /etc/exports
<pre>echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.4 bwdb2" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts</pre>


Copy keys to servers where we need passwordless login:
/etc/init.d/nfs-kernel-server restart
<pre>cat .ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
cat .ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'</pre>


Setup shell:
<pre>vi /root/.bashrc
(add to bottom)
alias h='history'
alias vi='vim'
alias j='jobs'
export PS1="[\u@\h \w]# "
alias dr='screen -dr'
export EDITOR=vim
export GREP_OPTIONS='--color=auto'
export HISTFILESIZE=1000


alias tip-switch-p20='cu -l ttyel00 -s 9600'
echo 'chmod o+r /var/log/messages' >> /etc/cron.weekly/sysklogd
alias tip-switch-p21='cu -l ttyel15 -s 9600'
alias tip-switch-p22='cu -l ttyel14 -s 9600'
alias tip-switch-p23='cu -l ttyel05 -s 9600'
alias tip-switch-p24='cu -l ttyel06 -s 9600'
alias tip-switch-p25='cu -l ttyel09 -s 9600'
alias tip-switch-p26='cu -l ttyel07 -s 9600'
alias tip-switch-p27='cu -l ttyel08 -s 9600'
alias tip-firewall2='cu -l ttyel01 -s 115200'
alias tip-nat2='cu -l /dev/ttyel02 -s 115200'
alias tip-backup3='cu -l ttyel04 -s 38400'
alias tip-bwdb2='cu -l ttyel03 -s 115200'
alias tip-backup4='cu -l ttyel13 -s 115200'
alias tip-jail3='cu -l ttyel11 -s 115200'


Load new shell:
source /root/.bashrc


Setup snmpd (this is only valid for a server at castle):
echo '10.1.4.8                backup1' >> /etc/hosts
echo 'rocommunity  jcread 10.1.4.5
echo '/dev/sdb1 /data  ext3  rw,noatime  0 0' >> /etc/fstab
rocommunity jcread 10.1.4.3
agentaddress 10.1.4.8:161' > /etc/snmp/snmpd.conf


to see which iface it is, on backup2:


snmpwalk -v 1 -c jcread 10.1.4.8 interface
to install digi drivers:


=== nfs ===
wget http://ftp1.digi.com/support/driver/40002086_n.tgz
apt-get install linux-image-2.6.24-19-server
apt-get install linux-source-2.6.24 (not needed?)
apt-get install linux-headers-2.6.24-19-server
apt-get install make
apt-get install gcc
apt-get install g++
apt-get install libncurses5-dev
apt-get install expect
apt-get install libdbi-perl libdate-calc-perl libdbd-mysql-perl


Allow mounts from private net:
cd /usr/src; ln -s linux-headers-2.6.24-19-server linux
echo '/data 10.1.2.0/24(rw,no_root_squash,async,no_subtree_check)' >> /etc/exports
./configure
make all
make install
make postinstall


Restart nfsd:
/usr/bin/dgrp_cfg_node -v -v init el 65.116.11.2 8
/etc/init.d/nfs-kernel-server restart


=== bb ===
apt-get install mysql


Add user, group:
mkdir /data/mysql
echo "bb:x:1984:1984:Big Brother:/home/bb:/bin/bash" >> /etc/passwd
chown mysql:mysql /data/mysql
echo "bb:x:1984:" >> /etc/group
/etc/init.d/mysql stop
  pwconv
mv /var/lib/mysql/* /data/mysql/
mv /data/mysql/ib_* /var/lib/mysql/
vi /etc/mysql/my.cnf
(change datadir to /data/mysql)
vi /etc/apparmor.d/usr.sbin.mysqld
add:
  /data/mysql/ r,
  /data/mysql/** rwk,
Comment out:
#  /var/lib/mysql/ r,
# /var/lib/mysql/** rwk,


Create home:
/etc/init.d/apparmor restart
mkdir /home/bb
/etc/init.d/mysql start
chown bb.bb /home/bb
cd ~bb


Copy over and install files:
tw_cli /c0/u0 set ignoreECC=on
<pre>scp backup2:/mnt/data4/build/bb/bb-linux.tar .
tw_cli /c0/u0 set storsave=balance
tar xf bb-linux.tar
tw_cli /c0/u0 set cache=on
cd /home/bb/bbc1.9e-btf/etc</pre>


Configure main bb server:
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
echo "10.1.2.3 backup3.johncompanies.com # ssh" >> /home/bb/bbc1.9e-btf/etc/bb-hosts


Configure low disk alerts:
0 0 * * * /usr/local/sbin/3wraidchk
<pre>echo "/:90:95
</pre>
/var:90:95
/data:85:99" > /home/bb/bbc1.9e-btf/etc/bb-dftab</pre>


vi /home/bb/bbc1.9e-btf/bin/bb-disk.sh
= backup2 =
(remove all | SORT xxxx since SORT is broken)


chmod +r /var/log/messages
== Summary ==


./bbchkcfg.sh
THIS SERVER IS OUT OF SERVICE AND REPLACED BY BACKUP4
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
<pre>cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src</pre>


<pre>make; make install
This machine is used for archiving data and is a backup server for colo customers. It was the former primary backup location for all VPS-based customers before backup1 was installed. Only dedicated customers directly accesses this server to perform their backups. NOTE: power button is broken, so the reset button (paper clip) was rewired to be the power button.
cd ..
./runbb.sh start
more BBOUT</pre>
(look for errors)
exit


<pre>vi /etc/rc.local
* Location: castle, cab 3-7
su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"
* OS: FreeBSD 6.1 x86
</pre>
* Networking: Priv IP: 10.1.4.3, Pub IP: 69.55.230.10 (firewalled from all but JC infrastructure @ i2b)
(before the exit 0)
* Hardware: 16 IDE drive bays (4 columns of 4, drive 0-0 top left, drive 0-1 just to the right TODO) all hot-swap. Triple power supply.  
* Drives:
**3ware 7500-8:
***200 GB JBOD (1 x 200G) labeled 0-0
***500 GB RAID5 (3 x 250G) 0-1 thru 0-3
***700 GB RAID5 (4 x 250G) 0-4 thru 0-7
**3ware 7500-8:
***700 GB RAID5 (4 x 250G) 1-0 thru 1-3
***700 GB RAID5 (4 x 250G) 1-4 thru 1-7


echo 'chmod o+r /var/log/messages' >> /etc/cron.weekly/sysklogd
All drives MUST be western digital IDE drives. Other brands will not fit.


Add f/w rule:
In case of an outage, nfs will hang on all connected servers until the nfs service returns. If you can't get backup2 back online, you can get nfs running elsewhere and fake backup2's MAC's: priv: 00:0e:0c:59:c1:a6, pub: 00:07:e9:5b:c6:45
ipfw add 00096 allow ip from { 69.55.229.4 or 69.55.229.3 } to 69.55.230.2 1984


<pre>vi ~bb/bbc1.9e-btf/etc/bbdef-client.sh
To configure:
DFWARN=199
ifconfig fxp0 link 00:90:27:f9:0a:d9
DFPANIC=199</pre>


== Services provided ==
* backup via rsync and nfs
* samba
* nfs
* snmp
* bigbrother


=== raid check ===
== Usage ==
* all data is stored under 4 mount points, corresponding to the 4 large RAID5 arrays: <tt>/mnt/data1 /mnt/data2 /mnt/data3 /mnt/data4</tt>
* iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under <tt>/mnt/data2/iso</tt>
* this used to be our primary backup server so you will see old backups from virt and jails around- missing customer data though, just the machine's data
* this server serves as an archive for exported db data from bwdb and old flow files.
* isys backs up here
* customers are nfs-moutned under /mnt/data3/customers as file-backed md devices
* in <tt>/mnt/data4</tt> there are lots of useful things used for building our vps servers, customer servers, and management scripts:
** <tt>/bin</tt>: the master repository of scripts and custom binaries we use on jails and virts. Each night every virt and jail rsync's what's in here to update the local files. So any global updates to scripts would need to be made here (or will be overwritten with what's in here)
** <tt>/build</tt>: files we use for setting up big brother, 3ware cli and scripts for colo's, vzcp customized setup files and so on
** <tt>/vzrpms</tt>: contains the OS templates for many-to-most of the OS's we offer on vz systems


==== 3ware ====
== Cronjobs ==
<pre>
* backs itself up nightly to nfs-mounted backup1 (mountpoint: <tt>/backup2</tt>)
scp backup1:/usr/local/sbin/tw_cli /usr/local/sbin/tw_cli
scp backup1:/usr/local/sbin/checkraid.sh /usr/local/sbin/checkraid.sh
scp backup1:/usr/local/sbin/3wraidchk /usr/local/sbin/3wraidchk
vi /usr/local/sbin/checkraid.sh
:%s/c0/c2/g


crontab -e
== Regular maintenance ==
0 0 * * * /usr/local/sbin/3wraidchk</pre>
*[[Routine_Maintenance#3ware|Check on health]]


==== areca ====
= backup3 =
<pre>
== Summary ==
cd /tmp
This machine is used for archiving data, is a backup server for colo customers, runs a samba server to make available iso's to the IPKVMs, and allows us to connect to the digi serial multiplexer at i2b. Only dedicated customers directly accesses this server to perform their backups.  
wget http://www.areca.us/support/s_linux/cli/linuxcli_V1.10.0_120815.zip
unzip linuxcli_V1.10.0_120815.zip
cp linuxcli_V1.10.0_120815/x86_64/cli64 /usr/local/sbin/
chmod 0700 /usr/local/sbin/cli64
cli64 rsf info
</pre>


<pre>scp backup2:/data4/bin/arecaraidchk /usr/local/sbin
* Location: i2b, cab 6
scp backup1:/usr/local/sbin/Sendmail.pm /usr/local/sbin
* OS: Ubuntu 10.04.1 server amd64
* Networking: Priv IP: 10.1.2.3, Pub IPs: 69.55.229.4 AND 69.55.231.2
* Hardware: 16 drive SATA bays (4 columns of 4, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: 5 TB (6 x 1TB) RAID5 array running on an Areca Technology Corp. ARC-1160 16-Port


crontab -e
== Services provided ==
0 0 * * * /usr/local/sbin/arecaraidchk
* backup via rsync and nfs
</pre>
* samba
* nfs
* digi realport
* snmp
* bigbrother


<pre>cat > /root/verify.sh
== Usage ==
cli64 vsf info
* all data is stored under /data
cli64 rsf info
* iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under <tt>/data/iso</tt>
cli64 disk info
* this server serves as an archive for exported db data from bwdb and old flow files.
cli64 event info
* inftrastructure machines at i2b back up here
echo press enter when ready to run verify ; read x
* customers are nfs-moutned under /data/customers as file-backed loopback devices


cli64 vsf check vol=1
== management scripts ==
</pre>
* mkbackups


=== misc binaries ===
mkbackup <cid> GB <ip>


scp backup1:/usr/local/sbin/snapshot_archive /usr/local/sbin/snapshot_archive
== Cronjobs ==
  vi /usr/local/sbin/snapshot_archive
  0 0 * * * /usr/local/sbin/arecaraidchk
(remove entries)
RAID checks


crontab -e
  35 4 * * * /usr/local/sbin/snapshot_archive
  35 4 * * * /usr/local/sbin/snapshot_archive
Rotate daily snapshots for infrastructure machine backups


scp backup1:/usr/local/sbin/pagedave /usr/local/sbin/pagedave
== Regular maintenance ==
scp backup1:/usr/local/sbin/taskdone /usr/local/sbin/taskdone
*[[Routine_Maintenance#Areca|Check on RAID health]]


Since installing /bin/mail requires all sorts of packages (lame) we write a simple one here...which can only email johncompanies.com addr's unless you add relaying for this host:
== Build ==


<pre>
=== BIOS Config ===
cat > /bin/mail
disable quiet boot
#!/usr/bin/perl
use strict;
use warnings;


use lib '/usr/local/sbin';
set to last state after power loss
use Sendmail qw(sendmail);


my $sub = $ARGV[1];
set date/time to GMT
my $to = $ARGV[2];


enable serial console output (baud rate 115200)


my %mail = (
=== Install OS ===
  To      => $to,
<pre>Ubuntu 10.04.1 amd64 (couldn't get 12.04 to load cause the H/W was incompat)
  From    => $to,
10G / ext3
  Subject => $sub,
2G swap
  Message => '',
~ /data ext4
  smtp    => 'mail.johncompanies.com'
);
sendmail(%mail) || print "Error: $Sendmail::error";


</pre>
Install packages:
openssh
samba</pre>


chmod 0700 /bin/mail
=== DNS and private IP ===


=== mkbackup ===
echo "nameserver 69.55.225.225" >> /etc/resolv.conf


mkdir /data/customers
Add a 2nd IP to eth0 and setup priv net
<pre>vi /etc/network/interfaces


<pre>cat > /usr/local/sbin/mkbackup
auto eth0
#!/bin/sh
iface eth0 inet static
        address 69.55.229.4
        netmask 255.255.255.0
        network 69.55.229.0
        broadcast 69.55.229.255
        gateway 69.55.229.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 69.55.229.3 66.181.0.2
        dns-search johncompanies.com


if test $1; then
auto eth0:1
  cid=$1
iface eth0:1 inet static
else
        address 69.55.231.2
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
        netmask 255.255.255.0
  exit
        network 69.55.231.0
fi
        broadcast 69.55.231.255


if test $2; then
auto eth1
  gb=$2
iface eth1 inet static
else
        address 10.1.2.3
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
        netmask 255.255.255.0
  exit
        network 10.1.2.0
fi
        broadcast 10.1.2.255


if test $3; then
</pre>
  ip=$3
else
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
  exit
fi


=== Install packages ===
<pre>apt-get update
apt-get upgrade
apt-get install gcc
apt-get install libssl-dev
apt-get install libncurses5-dev
apt-get install cu
apt-get install unzip
apt-get install snmp snmpd ntp nfs-kernel-server</pre>


if test -e /data/customers/${cid}-file; then
=== tweak grub, enable serial ===
  echo "ERROR: /data/customers/${cid}-file exists"
  exit
else
  echo "touch /data/customers/${cid}-file"
  touch /data/customers/${cid}-file
  count=`echo $gb|awk '{print $1*1000}'`
  echo "dd if=/dev/zero of=/data/customers/${cid}-file bs=1024K count=$count"
  dd if=/dev/zero of=/data/customers/${cid}-file bs=1024K count=$count
  echo "/sbin/mkfs -t ext3 -F -j -q /data/customers/${cid}-file"
  /sbin/mkfs -t ext3 -F -j -q /data/customers/${cid}-file
fi
 
if test -e /data/customers/$cid; then
  echo "ERROR: /data/customers/$cid exists"
  exit
else
  echo "mkdir /data/customers/${cid}"
  mkdir /data/customers/${cid}
  echo "mount -o loop /data/customers/${cid}-file /data/customers/$cid"
  mount -o loop /data/customers/${cid}-file /data/customers/$cid
  df -h /data/customers/$cid


  echo "fsck -y /data/customers/${cid}-file" >> /etc/nfs_backup_mounts.sh
<pre>vi /etc/default/grub
  echo "mount -o loop /data/customers/${cid}-file /data/customers/$cid" >> /etc/nfs_backup_mounts.sh
#GRUB_HIDDEN_TIMEOUT=0
  echo "" >> /etc/nfs_backup_mounts.sh
GRUB_CMDLINE_LINUX_DEFAULT="max_loop=64"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0"
update-grub</pre>


  echo "/data/customers/$cid $ip/32(rw,no_root_squash,async,no_subtree_check)" >> /etc/exports
<pre>echo "start on stopped rc RUNLEVEL=[2345]
  /etc/init.d/nfs-kernel-server restart
stop on runlevel [!2345]
  tail /var/log/messages
respawn
fi</pre>
exec /sbin/getty -L ttyS0 38400 vt102" > /etc/init/ttyS0.conf</pre>


chmod 0700 /usr/local/sbin/mkbackup
=== install realport (digi) driver ===


vi /etc/rc.local
give the digi an ip with DgIpServ.exe
add:
/etc/nfs_backup_mounts.sh


=== samba ===
<pre>cd /usr/src/
wget ftp://ftp1.digi.com/support/beta/linux/dgrp/dgrp-1.9.tgz
tar xzf dgrp-1.9.tgz
cd dgrp-1.9/
./configure
make
make install
make postinstall
update-rc.d dgrp_daemon defaults</pre>


  apt-get install samba
configure ports:
  dgrp_cfg_node init el 10.1.2.10 16


  vi /etc/samba/smb.conf
try connecting with:
  cu -l /dev/ttyel00 -s 38400


; comment out any mounts, add:
=== shell, ntp, ssh key, hosts ===


<pre>[data]
Shell autocompletion search:
  read only = yes
<pre>echo "\"\e[5~\": history-search-backward" >> ~/.inputrc
  locking = no
echo "\"\e[6~\": history-search-forward" >> ~/.inputrc</pre>
  path = /data/iso
  guest ok = yes</pre>


/etc/init.d/smbd restart
Setup ntp:
<pre>vi /etc/ntp.conf
server 10.1.2.1
server ntp.ubuntu.com</pre>


mkdir /data/iso
Generate ssh keys:
<pre>cd /root/
ssh-keygen -t dsa</pre>
Defaults, no password


Bring over some stuff from backup2
Setup hosts:
<pre>echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.4 bwdb2" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts</pre>


<pre>cd /data/iso
Copy keys to servers where we need passwordless login:
scp backup2:/d2/iso/3wfirmware.iso .
<pre>cat .ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
scp backup2:/d2/iso/MD5SUMS .
cat .ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'</pre>  
scp backup2:/d2/iso/bootimg.iso .
scp backup2:/d2/iso/systemrescuecd-x86-0.2.19.iso .
scp backup2:/d2/iso/win98bootcd.iso .
scp backup2:/d2/iso/acronis_bootdisk.iso .
scp backup2:/d2/iso/memtest86-3.2.iso .</pre>


=== Moving from one server to another ===
Setup shell:
<pre>vi /root/.bashrc
(add to bottom)
alias h='history'
alias vi='vim'
alias j='jobs'
export PS1="[\u@\h \w]# "
alias dr='screen -dr'
export EDITOR=vim
export GREP_OPTIONS='--color=auto'
export HISTFILESIZE=1000


Here are the steps you would take to move settings and data from one server to a new backup server:
alias tip-switch-p20='cu -l ttyel00 -s 9600'
alias tip-switch-p21='cu -l ttyel15 -s 9600'
alias tip-switch-p22='cu -l ttyel14 -s 9600'
alias tip-switch-p23='cu -l ttyel05 -s 9600'
alias tip-switch-p24='cu -l ttyel06 -s 9600'
alias tip-switch-p25='cu -l ttyel09 -s 9600'
alias tip-switch-p26='cu -l ttyel07 -s 9600'
alias tip-switch-p27='cu -l ttyel08 -s 9600'
alias tip-firewall2='cu -l ttyel01 -s 115200'
alias tip-nat2='cu -l /dev/ttyel02 -s 115200'
alias tip-backup3='cu -l ttyel04 -s 38400'
alias tip-bwdb2='cu -l ttyel03 -s 115200'
alias tip-backup4='cu -l ttyel13 -s 115200'
alias tip-jail3='cu -l ttyel11 -s 115200'


* rsync over all /data/customers (we do this cause if we didn't use *-file it would copy over the files AND the data in the mountpoint)
Load new shell:
  rsync -av --progress --ignore-times *-file root@10.1.2.33:/data/customers/
  source /root/.bashrc
after umounting all the customers, copy over the (empty) directories separately:
for f in `find . -type d`; do rsync -av $f root@69.55.229.25:/data/customers; done


* copy mount script
Setup snmpd (this is only valid for a server at castle):
  [root@backup3 /data/customers]# scp /etc/nfs_backup_mounts.sh root@69.55.229.25:/etc/nfs_backup_mounts.sh
echo 'rocommunity  jcread 10.1.4.5
rocommunity jcread 10.1.4.3
agentaddress 10.1.4.8:161' > /etc/snmp/snmpd.conf


* copy rc.local
to see which iface it is, on backup2:
[root@backup3 /data/customers]# scp /etc/rc.local root@69.55.229.25:/etc/rc.local


* copy /etc/exports
snmpwalk -v 1 -c jcread 10.1.4.8 interface
[root@backup3 /data/customers]# scp /etc/exports root@69.55.229.25:/etc/exports


* edit /etc/hostname on both machines (set current to oldbackup3)
=== nfs ===


* edit /etc/network/interfaces (swap IPs).
Allow mounts from private net:
echo '/data 10.1.2.0/24(rw,no_root_squash,async,no_subtree_check)' >> /etc/exports


* stop mounts from mounting on old and new servers so it doesnt start with reboot right away:
Restart nfsd:
  chmod 000 /etc/nfs_backup_mounts.sh
  /etc/init.d/nfs-kernel-server restart


* reboot both servers @ same time
=== bb ===


* check everything out
Add user, group:
echo "bb:x:1984:1984:Big Brother:/home/bb:/bin/bash" >> /etc/passwd
echo "bb:x:1984:" >> /etc/group
pwconv


* run /etc/nfs_backup_mounts.sh on new server
Create home:
mkdir /home/bb
chown bb.bb /home/bb
cd ~bb


* if switch port changed update mrtg to reflect correct port pub nic is on (on p20):
Copy over and install files:
vi /usr/local/www/mgmt/mrtg/mrtg1.cfg
<pre>scp backup2:/mnt/data4/build/bb/bb-linux.tar .
tar xf bb-linux.tar
cd /home/bb/bbc1.9e-btf/etc</pre>


= console =
Configure main bb server:
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
echo "10.1.2.3 backup3.johncompanies.com # ssh" >> /home/bb/bbc1.9e-btf/etc/bb-hosts


== Summary ==
Configure low disk alerts:
This box's only purpose is to serve as a means to connect to the digi serial multiplexer boxes at castle. Connect to it using the blue (cisco) ribbon cable with the beige RJ-45 to serial connector, 9600 8N1.
<pre>echo "/:90:95
/var:90:95
/data:85:99" > /home/bb/bbc1.9e-btf/etc/bb-dftab</pre>


* Location: castle, cab 3-8
vi /home/bb/bbc1.9e-btf/bin/bb-disk.sh
* OS: SunOS 5.8 (solaris)
(remove all | SORT xxxx since SORT is broken)
* Networking: Priv IP: 10.1.4.4
* Hardware: Sun Netra


chmod +r /var/log/messages


To connect to consoles, ssh in as user 'console' and use the <tt>tip</tt> command to connect to devices listed in <tt>/etc/remote</tt>
./bbchkcfg.sh
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
<pre>cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src</pre>


i.e.
<pre>make; make install
tip switch-p1
cd ..
  tip jail1
./runbb.sh start
more BBOUT</pre>
(look for errors)
  exit


== Configuring digi/ports ==
<pre>vi /etc/rc.local
su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"
</pre>
(before the exit 0)


=== /etc/remote ===
echo 'chmod o+r /var/log/messages' >> /etc/cron.weekly/sysklogd
This is where the configuration/mapping for ports and custom names which we use along with the tip command to connect to various ports on the digi switches.


We have 2 digi's at castle we connect to:
Add f/w rule:
ipfw add 00096 allow ip from { 69.55.229.4 or 69.55.229.3 } to 69.55.230.2 1984


#3-7 10.1.4.10
<pre>vi ~bb/bbc1.9e-btf/etc/bbdef-client.sh
virt15:dv=/dev/dty/CO001s:br#38400:el=^C^S^Q^U^D:ie=%$:oe=^D:
DFWARN=199
virt13:dv=/dev/dty/CO002s:br#115200:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:
DFPANIC=199</pre>


and


#3-6 10.1.4.11
=== raid check ===
jail4:dv=/dev/dty/CP001s:br#9600:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:
jail16:dv=/dev/dty/CP002s:br#9600:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:


The only things you need to edit are the first part (i.e. <tt>jail4</tt>) and the speed (i.e. <tt>9600</tt>). You can decipher which port on the digi each line corresponds to by the <tt>CP001s or CO001s</tt> (port 1 on digi1 and digi2), <tt>CP002s or CO002s</tt> (port 2 on digi1 and digi2)
==== 3ware ====
<pre>
scp backup1:/usr/local/sbin/tw_cli /usr/local/sbin/tw_cli
scp backup1:/usr/local/sbin/checkraid.sh /usr/local/sbin/checkraid.sh
scp backup1:/usr/local/sbin/3wraidchk /usr/local/sbin/3wraidchk
vi /usr/local/sbin/checkraid.sh
:%s/c0/c2/g


=== drpadmin ===
crontab -e
The tool you use to configure a device to a digi box is drpadmin:
0 0 * * * /usr/local/sbin/3wraidchk</pre>


<pre>bash-2.03$ su
==== areca ====
Password:
<pre>
# drpadmin
cd /tmp
wget http://www.areca.us/support/s_linux/cli/linuxcli_V1.10.0_120815.zip
unzip linuxcli_V1.10.0_120815.zip
cp linuxcli_V1.10.0_120815/x86_64/cli64 /usr/local/sbin/
chmod 0700 /usr/local/sbin/cli64
cli64 rsf info
</pre>


Please select an option (a)dd (d)elete (s)how (r)eset (q)uit : s
<pre>scp backup2:/data4/bin/arecaraidchk /usr/local/sbin
0      10.1.4.10      32      CO      771    never  1027
scp backup1:/usr/local/sbin/Sendmail.pm /usr/local/sbin
1      10.1.4.11      32      CP      771    never  1027
2      65.116.11.2    8      el      771    never  1027


Please select an option (a)dd (d)elete (s)how (r)eset (q)uit :</pre>
crontab -e
0 0 * * * /usr/local/sbin/arecaraidchk
</pre>


Use those commands above to modify the devices available.
<pre>cat > /root/verify.sh
cli64 vsf info
cli64 rsf info
cli64 disk info
cli64 event info
echo press enter when ready to run verify ; read x


== Switching IP/hostname ==
cli64 vsf check vol=1
</pre>


Edit:
=== misc binaries ===
/etc/defaultrouter
/etc/hosts
/etc/hostname.hme0
/etc/nodename
Maybe needed to run: # ifconfig hme0 10.1.4.4 up


= devweb =
scp backup1:/usr/local/sbin/snapshot_archive /usr/local/sbin/snapshot_archive
vi /usr/local/sbin/snapshot_archive
(remove entries)


We do web development on devweb.johncompanies.com
crontab -e
35 4 * * * /usr/local/sbin/snapshot_archive


Currently this is a jail running on jail17 / 69.55.230.8
scp backup1:/usr/local/sbin/pagedave /usr/local/sbin/pagedave
scp backup1:/usr/local/sbin/taskdone /usr/local/sbin/taskdone


If the jail is restarted, you will need to manually restart the web service with:
Since installing /bin/mail requires all sorts of packages (lame) we write a simple one here...which can only email johncompanies.com addr's unless you add relaying for this host:
httpsdctl restart


All website development work should be done here first. It works exactly like and is setup like our [[Management_System_/_Public_Website_/_Signup_/_Account_Manager|main site]].
<pre>
cat > /bin/mail
#!/usr/bin/perl
use strict;
use warnings;


use lib '/usr/local/sbin';
use Sendmail qw(sendmail);


= firewall2 =
my $sub = $ARGV[1];
my $to = $ARGV[2];


== Summary ==


This machine is the primary (only) firewall for the entire network at i2b.
my %mail = (
  To      => $to,
  From    => $to,
  Subject => $sub,
  Message => '',
  smtp    => 'mail.johncompanies.com'
);
sendmail(%mail) || print "Error: $Sendmail::error";


* Location: i2b, cab 6
</pre>
* OS: FreeBSD 6.4 x86
* Networking: Priv IP: 10.1.2.2, Pub IPs: 66.181.18.3 (external), 69.55.229.1 & 69.55.231.1 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks. TODO: describe NIC location/orientation


* Hardware: 2 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
chmod 0700 /bin/mail
* Drives: 73 GB (2 x 73GB) RAID1 array running on an LSI MegaRAID SCSI 320 PCI RAID card.


== Services Provided ==
=== mkbackup ===
* firewall (ipfw)
* bigbrother


== Firewall Rule Configuration ==
mkdir /data/customers


See [[FreeBSD_Reference#Firewall_Rule_Configuration|Firewall Rule Configuration]] for more discussion on how to actually manipulate firewall rules.
<pre>cat > /usr/local/sbin/mkbackup
#!/bin/sh


== Disaster Recovery ==
if test $1; then
  cid=$1
else
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
  exit
fi


TODO: need backup f/w and instructions on how to move cables.
if test $2; then
  gb=$2
else
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
  exit
fi


Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)
if test $3; then
 
  ip=$3
TODO
else
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
  exit
fi


Here's the config on the live firewall:


<pre>kern_securelevel_enable="NO"
if test -e /data/customers/${cid}-file; then
portmap_enable="NO"
  echo "ERROR: /data/customers/${cid}-file exists"
sendmail_enable="NO"
  exit
usbd_enable="YES"
else
gateway_enable="YES"
  echo "touch /data/customers/${cid}-file"
  touch /data/customers/${cid}-file
  count=`echo $gb|awk '{print $1*1000}'`
  echo "dd if=/dev/zero of=/data/customers/${cid}-file bs=1024K count=$count"
  dd if=/dev/zero of=/data/customers/${cid}-file bs=1024K count=$count
  echo "/sbin/mkfs -t ext3 -F -j -q /data/customers/${cid}-file"
  /sbin/mkfs -t ext3 -F -j -q /data/customers/${cid}-file
fi


xntpd_enable="YES"
if test -e /data/customers/$cid; then
nfs_client_enable="YES"
  echo "ERROR: /data/customers/$cid exists"
nfs_reserved_port_only="YES"
  exit
inetd_enable="YES"
else
inetd_flags="-wW -a 10.1.2.2"
  echo "mkdir /data/customers/${cid}"
  mkdir /data/customers/${cid}
  echo "mount -o loop /data/customers/${cid}-file /data/customers/$cid"
  mount -o loop /data/customers/${cid}-file /data/customers/$cid
  df -h /data/customers/$cid


fsck_y_enable="YES"
  echo "fsck -y /data/customers/${cid}-file" >> /etc/nfs_backup_mounts.sh
background_fsck="NO"
  echo "mount -o loop /data/customers/${cid}-file /data/customers/$cid" >> /etc/nfs_backup_mounts.sh
  echo "" >> /etc/nfs_backup_mounts.sh


defaultrouter="66.181.18.2"
  echo "/data/customers/$cid $ip/32(rw,no_root_squash,async,no_subtree_check)" >> /etc/exports
hostname="firewall2.johncompanies.com"
  /etc/init.d/nfs-kernel-server restart
ifconfig_bge0="inet 66.181.18.3  netmask 255.255.255.224"
  tail /var/log/messages
ifconfig_bge1="inet 69.55.229.1 netmask 255.255.255.0"
fi</pre>
ifconfig_bge1_alias0="inet 69.55.231.1 netmask 255.255.255.0"
ifconfig_bge1_alias1="inet 65.50.228.1  netmask 255.255.255.0"
ifconfig_bge1_alias2="inet 65.50.229.1  netmask 255.255.255.0"
ifconfig_bge1_alias3="inet 65.50.230.1  netmask 255.255.255.0"
ifconfig_bge1_alias4="inet 65.50.231.1  netmask 255.255.255.0"
ifconfig_bge1_alias5="inet 65.50.232.1  netmask 255.255.255.0"
ifconfig_bge1_alias6="inet 65.50.233.1  netmask 255.255.255.0"
ifconfig_bge1_alias7="inet 65.50.234.1  netmask 255.255.255.0"
ifconfig_bge1_alias8="inet 65.50.235.1  netmask 255.255.255.0"
ifconfig_fxp0="inet 10.1.2.2 netmask 255.255.255.0"
sshd_enable="YES"
usbd_enable="YES"
</pre>


chmod 0700 /usr/local/sbin/mkbackup


== Cronjobs ==
vi /etc/rc.local
30 3 * * * /usr/local/etc/rsync.backup
add:
Backup to backup3
/etc/nfs_backup_mounts.sh


0 0 1 * * /sbin/ipfw zero
=== samba ===
0 0 1 * * /sbin/ipfw del 3 4 5
Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).


  59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
  apt-get install samba
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
Capture counts periodically


  0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
  vi /etc/samba/smb.conf
This script will create <tt>/etc/firewall.sh</tt> which contains all the firewall and pipe rules in place at the time the script was run.


*/5 * * * * /usr/local/sbin/lsiraidchk
; comment out any mounts, add:
Checking the health of the RAID array


<pre>[data]
  read only = yes
  locking = no
  path = /data/iso
  guest ok = yes</pre>


== DOS attacks ==
/etc/init.d/smbd restart
 
mkdir /data/iso


See [[FreeBSD_Reference#Handling_a_DoS_attack|Handling a DoS attack]] regarding how to handle a DOS attack.
Bring over some stuff from backup2


<pre>cd /data/iso
scp backup2:/d2/iso/3wfirmware.iso .
scp backup2:/d2/iso/MD5SUMS .
scp backup2:/d2/iso/bootimg.iso .
scp backup2:/d2/iso/systemrescuecd-x86-0.2.19.iso .
scp backup2:/d2/iso/win98bootcd.iso .
scp backup2:/d2/iso/acronis_bootdisk.iso .
scp backup2:/d2/iso/memtest86-3.2.iso .</pre>


== build ==
=== Moving from one server to another ===


<pre>partition map:
Here are the steps you would take to move settings and data from one server to a new backup server:
/ 58g
swap 4g
/var 512m
/tmp 512m
/usr 5.5g


4. edit /etc/make.conf
* rsync over all /data/customers (we do this cause if we didn't use *-file it would copy over the files AND the data in the mountpoint)
echo "WITHOUT_X11=yes \
rsync -av --progress --ignore-times *-file root@10.1.2.33:/data/customers/
KERNCONF=firewall2 \
after umounting all the customers, copy over the (empty) directories separately:
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf
for f in `find .  -type d`; do rsync -av $f root@69.55.229.25:/data/customers; done


5. add settings to /boot/loader.conf and /boot.config
* copy mount script
[root@backup3 /data/customers]# scp /etc/nfs_backup_mounts.sh root@69.55.229.25:/etc/nfs_backup_mounts.sh


echo "-Dh" >> /boot.config
* copy rc.local
[root@backup3 /data/customers]# scp /etc/rc.local root@69.55.229.25:/etc/rc.local


echo 'console="comconsole,vidconsole" \
* copy /etc/exports
boot_multicons="YES" \
[root@backup3 /data/customers]# scp /etc/exports root@69.55.229.25:/etc/exports
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf


* edit /etc/hostname on both machines (set current to oldbackup3)


6. turn off all ttyv's except 0 and 1 in /etc/ttys
* edit /etc/network/interfaces (swap IPs).
also turn on ttyd0, change type to vt100:
vi /etc/ttys


ttyv2  "/usr/libexec/getty Pc"        cons25  off secure
* stop mounts from mounting on old and new servers so it doesnt start with reboot right away:
ttyv3  "/usr/libexec/getty Pc"        cons25  off secure
  chmod 000 /etc/nfs_backup_mounts.sh
ttyv4  "/usr/libexec/getty Pc"        cons25 off secure
ttyv5  "/usr/libexec/getty Pc"        cons25  off secure
ttyv6  "/usr/libexec/getty Pc"        cons25  off secure
ttyv7  "/usr/libexec/getty Pc"        cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0  "/usr/libexec/getty std.9600"  vt100  on  secure


kill -1 1
* reboot both servers @ same time


on console server:
* check everything out
vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console


* run /etc/nfs_backup_mounts.sh on new server


7. populate hosts
* if switch port changed update mrtg to reflect correct port pub nic is on (on p20):
echo "69.55.230.10 backup2" >> /etc/hosts
vi /usr/local/www/mgmt/mrtg/mrtg1.cfg
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts


8. put key in authorized_keys on backup3
= backup4 =
cd
== Summary ==
ssh-keygen -t dsa -b 1024
This machine is used for archiving data, is a backup server for colo customers, runs a samba server to make available iso's to the IPKVMs.  Only FreeBSD virt customers directly accesses this server to perform their backups.
(default location, leave password blank)


Punch a hole in firewall1 to allow traffic to backup servers @ castle:
* Location: castle, cab 3-7
* OS: FreeNAS 9.3 (FreeBSD 9.3)
* Networking: Priv IP: 10.1.2.9/24 AND 10.1.7.9/24,  Pub IPs: 69.55.230.6/24
* Hardware: JC-08014
            Intel S5000VSA Motherboard
            1 x Intel Xeon E5410  @ 2.33GHz CPU
            3ware 9690SA-8I RAID Card w BBU
            16GB RAM
            Dual power supply.
* Drives: 7 TB (6 x 2TB) ZFS RAIDZ2 array running on JBOD
      1 128 GB SSD system drive and 6 drive SATA bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap.


ipfw add 99 allow ip from 66.181.18.0/27 to 69.55.230.10 22
* GUI management at http://backup4.johncompanies.com
ipfw add 95 allow ip from 66.181.18.0/27 to 69.55.230.11 22


cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys'
== Services provided ==
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
* backup via rsync and nfs
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'
* samba
* nfs
* snmp?
* bigbrother?


confirm that you can ssh to backup3 and backup 2 without getting a login prompt
== Usage ==
* all data is stored under /data
* iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under <tt>/data/iso</tt>  ??
* this server serves as an archive for exported db data from bwdb and old flow files. ??
* customers are nfs-moutned under /data/users (/mnt/zfs/users) as zfs ?


ssh backup3 hostname
== management scripts ==
* mkbackups?


ssh backup2 hostname
mkbackup <cid> GB <ip>


ssh backup1 hostname
== Cronjobs ==
0 0 * * * /usr/local/sbin/arecaraidchk 
RAID checks ?


35 4 * * * /usr/local/sbin/snapshot_archive
Rotate daily snapshots for infrastructure machine backups


10. edit root's path and login script:
00 15 * * * /usr/local/sbin/snapshot_rotate
vi /root/.cshrc
Rotate daily snapshots for customer machine backups


Change alias entries (add G):
== Regular maintenance ==
alias la        ls -aG
*[[Routine_Maintenance#A|Check on RAID health]]
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm      mb mount
alias mbu      mb umount


and alter the prompt, set the following:
== Build ==
set prompt = "`/bin/hostname -s` %/# "


11. install cvsup
= console =
cd /usr/ports/net/cvsup-without-gui
make install clean; rehash; mail -s 'cvs installed' dave.boodman@vtext.com < /dev/null


12. get latest sources for this release:
== Summary ==
cd /usr/src
This box's only purpose is to serve as a means to connect to the digi serial multiplexer boxes at castle. Connect to it using the blue (cisco) ribbon cable with the beige RJ-45 to serial connector, 9600 8N1.
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
src-all" > sup


cvsup sup ; mail -s 'cvs sup done' dave.boodman@vtext.com < /dev/null
OBSOLETE
* Location: castle, cab 3-8
* OS: SunOS 5.8 (solaris)
* Networking: Priv IP: 10.1.4.4
* Hardware: Sun Netra


13. configure new kernel.


cd /usr/src/sys/i386/conf
To connect to consoles, ssh in as user 'console' and use the <tt>tip</tt> command to connect to devices listed in <tt>/etc/remote</tt>
scp backup2:/mnt/data4/build/freebsd/firewall2-6.4 ./firewall2


15. build, install kernel and world
SSH WORK ~2021
ssh user@console.johncompanies.com <br>


cd /boot
PW: 674*****


mv kernel kernel.GENERIC
i.e.
cd kernel.GENERIC
tip switch-p1
cd /usr/src
tip jail1
make buildkernel installkernel


make buildworld ; mail -s 'buildworld done' dave.boodman@vtext.com < /dev/null
== Configuring digi/ports ==
(2450: 1:56min, supermicro: 59mins, 2950: 38mins)
make installworld
(2450: 3min, supermicro: 1min, 2950: :34)
mergemaster -i


17. populate /etc/rc.conf with IPs and NFS settings
=== /etc/remote ===
vi /etc/rc.conf
This is where the configuration/mapping for ports and custom names which we use along with the tip command to connect to various ports on the digi switches.


kern_securelevel_enable="NO"
We have 2 digi's at castle we connect to:
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"


xntpd_enable="YES"
#3-7 10.1.4.10
nfs_client_enable="YES"
virt15:dv=/dev/dty/CO001s:br#38400:el=^C^S^Q^U^D:ie=%$:oe=^D:
nfs_reserved_port_only="YES"
virt13:dv=/dev/dty/CO002s:br#115200:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.2"


ifconfig_bce1="inet 10.1.2.2 netmask 255.255.255.0"
and
fsck_y_enable="YES"
background_fsck="NO"


defaultrouter="66.181.18.2"
#3-6 10.1.4.11
hostname="firewall2.johncompanies.com"
jail4:dv=/dev/dty/CP001s:br#9600:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:
ifconfig_bge0="inet 66.181.18.3 netmask 255.255.255.224"
  jail16:dv=/dev/dty/CP002s:br#9600:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:
ifconfig_bge1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_fxp0="inet 10.1.2.2 netmask 255.255.255.0"
sshd_enable="YES"
usbd_enable="YES"


20. reboot. Confirm new kernel is loaded
The only things you need to edit are the first part (i.e. <tt>jail4</tt>) and the speed (i.e. <tt>9600</tt>). You can decipher which port on the digi each line corresponds to by the <tt>CP001s or CO001s</tt> (port 1 on digi1 and digi2), <tt>CP002s or CO002s</tt> (port 2 on digi1 and digi2)


uname -a
=== drpadmin ===
The tool you use to configure a device to a digi box is drpadmin:


21. update ports:
<pre>bash-2.03$ su
cd /usr/ports
Password:
echo "*default host=cvsup4.FreeBSD.org\
# drpadmin
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup


cvsup sup; mail -s 'cvs sup ports done' dave.boodman@vtext.com < /dev/null
Please select an option (a)dd (d)elete (s)how (r)eset (q)uit : s
0      10.1.4.10      32      CO      771    never  1027
1      10.1.4.11      32      CP      771    never  1027
2      65.116.11.2    8      el      771    never  1027


22. Install raid mgmt tool
Please select an option (a)dd (d)elete (s)how (r)eset (q)uit :</pre>


# linux base
Use those commands above to modify the devices available.
cd /usr/ports/devel/libtool22
make install base


cd /usr/ports/emulators/linux_base-fc4
== Switching IP/hostname ==
make install clean


#linux-megamgr-5.20
Edit:
cd /usr/ports/sysutils/linux-megamgr
/etc/defaultrouter
make install clean
/etc/hosts
/etc/hostname.hme0
/etc/nodename
Maybe needed to run: # ifconfig hme0 10.1.4.4 up


# megarc-1.51
= devweb =
cd /usr/ports/sysutils/megarc
make install clean


Test:
We do web development on devweb.johncompanies.com
rehash; megarc -ldInfo -a0 -l0


23. install rsync from ports
Currently this is a jail running on jail17 / 69.55.230.8
cd /usr/ports/net/rsync
make install clean


choose default options
If the jail is restarted, you will need to manually restart the web service with:
httpsdctl restart


25. install bb client
All website development work should be done here first. It works exactly like and is setup like our [[Management_System_/_Public_Website_/_Signup_/_Account_Manager|main site]].
adduser
Username: bb
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username  : bb
Password  : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups    : bb
Home      : /home/bb
Shell      : /bin/sh
Locked    : no
OK? (yes/no): yes


cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
tar xvf bb-freebsd.tar


edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
= firewall2 =
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.1 firewall2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts


vi /home/bb/bbc1.9e-btf/ext/openfiles
== Summary ==
MACHINE="firewall2,johncompanies,com"      # HAS TO BE IN A,B,C FORM


cd /usr/home/bb/bbc1.9e-btf/etc
This machine is the primary firewall for the entire network at i2b.   firewall3 is a hot standby replacement for
./bbchkcfg.sh
firewall2. Both firewall2 and firewall3 should not be connected at the same time since they use the same internal
(y to questions)
and external IP addresses.
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..


vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
* Location: i2b, cab 6
        $1 $TOPARGS > $BBTMP/TOP.$$
* OS: FreeBSD 6.4 x86
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$
* Networking: Priv IP: 10.1.2.2, Pub IPs: 66.181.18.3 (external), 69.55.229.1 & 69.55.231.1 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks. TODO: describe NIC location/orientation


./runbb.sh start
* Hardware: 2 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.  
more BBOUT
* Drives: 73 GB (2 x 73GB) RAID1 array running on an LSI MegaRAID SCSI 320 PCI RAID card.
(look for errors)
exit


echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
== Services Provided ==
chmod +x /usr/local/etc/rc.d/bb.sh
* firewall (ipfw)
* bigbrother for customer machines


Punch a hole in the firewall to allow it to communicate with bb monitor:
== Firewall Rule Configuration ==


ipfw add 00096 allow ip from 66.181.18.0/27 to 69.55.230.2
See [[FreeBSD_Reference#Firewall_Rule_Configuration|Firewall Rule Configuration]] for more discussion on how to actually manipulate firewall rules.


== Disaster Recovery ==


27. configure bb on mail:
TODO: need backup f/w and instructions on how to move cables.
vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
66.181.18.3 firewall2.johncompanies.com # ssh


su bb
Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)
cd
 
bbsrc/bb/runbb.sh restart ; exit
TODO
 
Here's the config on the live firewall:
 
<pre>kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"
 
xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.2"
 
fsck_y_enable="YES"
background_fsck="NO"
 
defaultrouter="66.181.18.2"
hostname="firewall2.johncompanies.com"
ifconfig_bge0="inet 66.181.18.3  netmask 255.255.255.224"
ifconfig_bge1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_bge1_alias0="inet 69.55.231.1 netmask 255.255.255.0"
ifconfig_bge1_alias1="inet 65.50.228.1  netmask 255.255.255.0"
ifconfig_bge1_alias2="inet 65.50.229.1  netmask 255.255.255.0"
ifconfig_bge1_alias3="inet 65.50.230.1  netmask 255.255.255.0"
ifconfig_bge1_alias4="inet 65.50.231.1  netmask 255.255.255.0"
ifconfig_bge1_alias5="inet 65.50.232.1  netmask 255.255.255.0"
ifconfig_bge1_alias6="inet 65.50.233.1  netmask 255.255.255.0"
ifconfig_bge1_alias7="inet 65.50.234.1  netmask 255.255.255.0"
ifconfig_bge1_alias8="inet 65.50.235.1  netmask 255.255.255.0"
ifconfig_fxp0="inet 10.1.2.2 netmask 255.255.255.0"
sshd_enable="YES"
usbd_enable="YES"
</pre>
 
 
== Cronjobs ==
30 3 * * * /usr/local/etc/rsync.backup
Backup to backup3
 
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).
 
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
Capture counts periodically
 
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
This script will create <tt>/etc/firewall.sh</tt> which contains all the firewall and pipe rules in place at the time the script was run.
 
*/5 * * * * /usr/local/sbin/lsiraidchk
Checking the health of the RAID array
 
 
== DOS attacks ==
 
See [[FreeBSD_Reference#Handling_a_DoS_attack|Handling a DoS attack]] regarding how to handle a DOS attack.
 
 
== build ==
 
<pre>partition map:
/ 58g
swap 4g
/var 512m
/tmp 512m
/usr 5.5g
 
4. edit /etc/make.conf
echo "WITHOUT_X11=yes \
KERNCONF=firewall2 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf
 
5. add settings to /boot/loader.conf and /boot.config
 
echo "-Dh" >> /boot.config
 
echo 'console="comconsole,vidconsole" \
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf
 
 
6. turn off all ttyv's except 0 and 1 in /etc/ttys
also turn on ttyd0, change type to vt100:
vi /etc/ttys
 
ttyv2  "/usr/libexec/getty Pc"        cons25  off secure
ttyv3  "/usr/libexec/getty Pc"        cons25  off secure
ttyv4  "/usr/libexec/getty Pc"        cons25  off secure
ttyv5  "/usr/libexec/getty Pc"        cons25  off secure
ttyv6  "/usr/libexec/getty Pc"        cons25  off secure
ttyv7  "/usr/libexec/getty Pc"        cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0  "/usr/libexec/getty std.9600"  vt100  on  secure
 
kill -1 1
 
on console server:
vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console
 
 
7. populate hosts
echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts
 
8. put key in authorized_keys on backup3
cd
ssh-keygen -t dsa -b 1024
(default location, leave password blank)
 
Punch a hole in firewall1 to allow traffic to backup servers @ castle:
 
ipfw add 99 allow ip from 66.181.18.0/27 to 69.55.230.10 22
ipfw add 95 allow ip from 66.181.18.0/27 to 69.55.230.11 22
 
cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys'
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'
 
confirm that you can ssh to backup3 and backup 2 without getting a login prompt
 
ssh backup3 hostname
 
ssh backup2 hostname
 
ssh backup1 hostname
 
 
10. edit root's path and login script:
vi /root/.cshrc
 
Change alias entries (add G):
alias la        ls -aG
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm      mb mount
alias mbu      mb umount
 
and alter the prompt, set the following:
set prompt = "`/bin/hostname -s` %/# "
 
11. install cvsup
cd /usr/ports/net/cvsup-without-gui
make install clean; rehash; mail -s 'cvs installed' dave.boodman@vtext.com < /dev/null
 
12. get latest sources for this release:
cd /usr/src
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
src-all" > sup
 
cvsup sup ; mail -s 'cvs sup done' dave.boodman@vtext.com < /dev/null
 
13. configure new kernel.
 
cd /usr/src/sys/i386/conf
scp backup2:/mnt/data4/build/freebsd/firewall2-6.4 ./firewall2
 
15. build, install kernel and world
 
cd /boot
 
mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel
 
make buildworld ; mail -s 'buildworld done' dave.boodman@vtext.com < /dev/null
(2450: 1:56min, supermicro: 59mins, 2950: 38mins)
make installworld
(2450: 3min, supermicro: 1min, 2950: :34)
mergemaster -i
 
17. populate /etc/rc.conf with IPs and NFS settings
vi /etc/rc.conf
 
kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"
 
xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.2"
 
ifconfig_bce1="inet 10.1.2.2 netmask 255.255.255.0"
fsck_y_enable="YES"
background_fsck="NO"
 
defaultrouter="66.181.18.2"
hostname="firewall2.johncompanies.com"
ifconfig_bge0="inet 66.181.18.3  netmask 255.255.255.224"
ifconfig_bge1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_fxp0="inet 10.1.2.2 netmask 255.255.255.0"
sshd_enable="YES"
usbd_enable="YES"
 
20. reboot. Confirm new kernel is loaded
 
uname -a
 
21. update ports:
cd /usr/ports
echo "*default host=cvsup4.FreeBSD.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup
 
cvsup sup; mail -s 'cvs sup ports done' dave.boodman@vtext.com < /dev/null
 
22. Install raid mgmt tool
 
# linux base
cd /usr/ports/devel/libtool22
make install base
 
cd /usr/ports/emulators/linux_base-fc4
make install clean
 
#linux-megamgr-5.20
cd /usr/ports/sysutils/linux-megamgr
make install clean
 
# megarc-1.51
cd /usr/ports/sysutils/megarc
make install clean
 
Test:
rehash; megarc -ldInfo -a0 -l0
 
23. install rsync from ports
cd /usr/ports/net/rsync
make install clean
 
choose default options
 
25. install bb client
adduser
Username: bb
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username  : bb
Password  : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups    : bb
Home      : /home/bb
Shell      : /bin/sh
Locked    : no
OK? (yes/no): yes
 
cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
tar xvf bb-freebsd.tar
 
edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.1 firewall2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
 
vi /home/bb/bbc1.9e-btf/ext/openfiles
MACHINE="firewall2,johncompanies,com"      # HAS TO BE IN A,B,C FORM
 
cd /usr/home/bb/bbc1.9e-btf/etc
./bbchkcfg.sh
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..
 
vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
        $1 $TOPARGS > $BBTMP/TOP.$$
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$
 
./runbb.sh start
more BBOUT
(look for errors)
exit
 
echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh
 
Punch a hole in the firewall to allow it to communicate with bb monitor:
 
ipfw add 00096 allow ip from 66.181.18.0/27 to 69.55.230.2
 
 
27. configure bb on mail:
vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
66.181.18.3 firewall2.johncompanies.com # ssh
 
su bb
cd
bbsrc/bb/runbb.sh restart ; exit
 
29. configure ntp
echo "server 10.1.2.1" > /etc/ntp.conf
 
/usr/sbin/ntpd -p /var/run/ntpd.pid
sleep 2; ntpq -p
(confirm it’s able to reach our time server)
 
echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
chmod 0700 /usr/local/etc/rc.d/ntp.sh
 
30. fwd and reverse lookups on ns1c
vr johncompanies.com
(edit the PTR too)
 
 
33. setup backups
echo '#\!/bin/sh\
backupdir=/data/firewall2/current\
\
## ENTRY /etc ' > /usr/local/etc/backup.config
 
on backup3:
setup backup dirs:
ssh backup3 mkdir -p /data/firewall2/current
 
on backup3, add the system to
vi /usr/local/sbin/snapshot_archive
 
scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup
vi /usr/local/etc/rsync.backup
backup1 > backup3
 
crontab -e
1 0 * * * /usr/local/etc/rsync.backup
 
 
34. mkdir /root/logs
 
35. edit sshd_config for security
vi /etc/ssh/sshd_config
ListenAddress 66.181.18.3
ListenAddress 10.1.2.1
 
kill -1 `cat /var/run/sshd.pid`
 
35. raid chk
 
cat > /usr/local/sbin/lsiraidchk
#!/usr/bin/perl
 
my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;
 
foreach (@out) {
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}
 
36. add crontab entries
crontab -e
30 3 * * * /usr/local/etc/rsync.backup
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
*/5 * * * * /usr/local/sbin/lsiraidchk
 
#10 0 * * * rm /var/spool/clientmqueue/*
 
scp /etc/makefwrules.pl user@64.163.14.48:~
scp /etc/makepiperules.pl user@64.163.14.48:~
mv /home/user/makefwrules.pl /etc
mv /home/user/makepiperules.pl /etc
touch /etc/firewall.sh
mkdir /etc/oldrules/
 
other binaries
scp /usr/local/bin/rulemaker user@64.163.14.48:~
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~
 
Setup basic ruleset
 
ipfw add 00009 count udp from any to any
ipfw add 00010 allow tcp from any to any established
ipfw add 00012 deny tcp from any to any tcpflags syn tcpoptions !mss
ipfw add 00012 deny icmp from any to any icmptypes 4,5,9,10,12,13,14,15,16,17,18
ipfw add 00012 deny tcp from any to any tcpflags syn,fin
ipfw add 00012 deny tcp from any to any tcpflags fin,psh,rst,urg
ipfw add 00012 allow icmp from any to any
ipfw add 00014 deny tcp from any to any dst-port 135
ipfw add 00150 skipto 65535 ip from any to any via em1 in
 
IPKVM3:
00098 allow ip from { 69.55.230.6 or 69.55.230.7 } to 69.55.230.10 dst-port 139
00098 deny ip from any to 69.55.230.10 dst-port 139
</pre>
 
 
= firewall3 =
 
== Summary ==
 
This machine is the backup firewall for the network at i2b.
 
* Location: i2b, cab ?
* OS: FreeBSD 9.1 amd64
* Networking: Priv IP: 10.1.2.5, Pub IPs: 66.181.18.3 (external), 69.55.229.1 & 69.55.231.1 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks.
 
<pre>
 
The internal network NIC is the left one on the motherboard (69.55.229.1/24, ...).
The external network NIC is the right one on the motherboard (66.181.18.3/28).
The PCI ethernet card is connected to our private network (10.1.2.5/24).
 
</pre>
 
* Hardware: 2 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
* Drives: 160 GB (2 x 160GB) RAID1 array running on an LSI MegaRAID SCSI 320 PCI RAID card.
 
== Services Provided ==
* firewall (ipfw)
* bigbrother
 
== Firewall Rule Configuration ==
 
See [[FreeBSD_Reference#Firewall_Rule_Configuration|Firewall Rule Configuration]] for more discussion on how to actually manipulate firewall rules.
 
== Disaster Recovery ==
 
'''To put the backup firewall3 into service:'''
 
<pre>
Move the internal cable (to our networks) from firewall2 to em1 which is the left most ethernet port (69.55.229.1).
Move the external cable (to outside world) from firewall2 to em0 which is the port to the right on the motherboard (66.181.18.3).
The PCI ethernet port (fxp0) should already be connected to private network (10.1.2.5).
</pre>
 
Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)
 
<pre>
kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"
 
xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.5"
 
fsck_y_enable="YES"
background_fsck="NO"
 
defaultrouter="66.181.18.2"
hostname="firewall3.johncompanies.com"
ifconfig_em0="inet 66.181.18.3  netmask 255.255.255.224"
 
ifconfig_em1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_em1_alias0="inet 69.55.231.1 netmask 255.255.255.0"
 
# ifconfig_em1_alias1="inet 65.50.228.1  netmask 255.255.255.0"
# ifconfig_em1_alias2="inet 65.50.229.1  netmask 255.255.255.0"
# ifconfig_em1_alias3="inet 65.50.230.1  netmask 255.255.255.0"
# ifconfig_em1_alias4="inet 65.50.231.1  netmask 255.255.255.0"
# ifconfig_em1_alias5="inet 65.50.232.1  netmask 255.255.255.0"
# ifconfig_em1_alias6="inet 65.50.233.1  netmask 255.255.255.0"
# ifconfig_em1_alias7="inet 65.50.234.1  netmask 255.255.255.0"
# ifconfig_em1_alias8="inet 65.50.235.1  netmask 255.255.255.0"
 
ifconfig_fxp0="inet 10.1.2.5 netmask 255.255.255.0"
 
sshd_enable="YES"
usbd_enable="YES"
</pre>
 
== Cronjobs ==
30 3 * * * /usr/local/etc/rsync.backup
Backup to backup3
 
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).
 
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
Capture counts periodically
 
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
This script will create <tt>/etc/firewall.sh</tt> which contains all the firewall and pipe rules in place at the time the script was run.
 
*/5 * * * * /usr/local/sbin/lsiraidchk
Checking the health of the RAID array
 
 
== DOS attacks ==
 
See [[FreeBSD_Reference#Handling_a_DoS_attack|Handling a DoS attack]] regarding how to handle a DOS attack.
 
 
== build ==
 
<pre>partition map:
/ 58g
swap 4g
/var 512m
/tmp 512m
/usr 5.5g
 
4. edit /etc/make.conf
echo "WITHOUT_X11=yes \
KERNCONF=firewall3 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf
 
5. add settings to /boot/loader.conf and /boot.config
 
echo "-Dh" >> /boot.config
 
echo 'console="comconsole,vidconsole" \
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf
 
 
6. turn off all ttyv's except 0 and 1 in /etc/ttys
also turn on ttyd0, change type to vt100:
vi /etc/ttys
 
ttyv2  "/usr/libexec/getty Pc"        cons25  off secure
ttyv3  "/usr/libexec/getty Pc"        cons25  off secure
ttyv4  "/usr/libexec/getty Pc"        cons25  off secure
ttyv5  "/usr/libexec/getty Pc"        cons25  off secure
ttyv6  "/usr/libexec/getty Pc"        cons25  off secure
ttyv7  "/usr/libexec/getty Pc"        cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0  "/usr/libexec/getty std.9600"  vt100  on  secure
 
kill -1 1
 
on console server:
vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console
 
 
7. populate hosts
echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts
 
8. put key in authorized_keys on backup3
cd
ssh-keygen -t dsa -b 1024
(default location, leave password blank)
 
Punch a hole in firewall1 to allow traffic to backup servers @ castle:
 
ipfw add 99 allow ip from 66.181.18.0/27 to 69.55.230.10 22
ipfw add 95 allow ip from 66.181.18.0/27 to 69.55.230.11 22
 
cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys'
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys'
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'
 
confirm that you can ssh to backup3 and backup 2 without getting a login prompt
 
ssh backup3 hostname
 
ssh backup2 hostname
 
ssh backup1 hostname
 
 
10. edit root's path and login script:
vi /root/.cshrc
 
Change alias entries (add G):
alias la        ls -aG
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm      mb mount
alias mbu      mb umount
 
and alter the prompt, set the following:
set prompt = "`/bin/hostname -s` %/# "
 
11. install cvsup
cd /usr/ports/net/cvsup-without-gui
make install clean; rehash; mail -s 'cvs installed' 8583619553@vtext.com < /dev/null
 
12. get latest sources for this release:
cd /usr/src
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_9_1\
*default delete use-rel-suffix\
*default compress\
src-all" > sup
 
cvsup sup ; mail -s 'cvs sup done' 8583619553@vtext.com < /dev/null
 
13. configure new kernel.
 
cd /usr/src/sys/amd64/conf
scp backup2:/mnt/data4/build/freebsd/firewall3-9.1 ./firewall3
 
15. build, install kernel and world
 
cd /boot
 
mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel
 
make buildworld ; mail -s 'buildworld done' 8583619553@vtext.com < /dev/null
(supermicro: 2:15 mins, 2950: 38? mins)
make installworld
(2450: 3min, supermicro: 1min, 2950: :34)
mergemaster -i
 
17. populate /etc/rc.conf with IPs and NFS settings
vi /etc/rc.conf
 
kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"
 
xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
 
fsck_y_enable="YES"
background_fsck="NO"
 
hostname="firewall3.johncompanies.com"
#  external network
ifconfig_em0="inet 66.181.18.3  netmask 255.255.255.224"
 
#  internal network
ifconfig_em1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_em1_alias0="inet 69.55.231.1  netmask 255.255.255.0"
 
ifconfig_em1_alias1="inet 65.50.228.1  netmask 255.255.255.0"
ifconfig_em1_alias2="inet 65.50.229.1  netmask 255.255.255.0"
ifconfig_em1_alias3="inet 65.50.230.1  netmask 255.255.255.0"
ifconfig_em1_alias4="inet 65.50.231.1  netmask 255.255.255.0"
ifconfig_em1_alias5="inet 65.50.232.1  netmask 255.255.255.0"
ifconfig_em1_alias6="inet 65.50.233.1  netmask 255.255.255.0"
ifconfig_em1_alias7="inet 65.50.234.1  netmask 255.255.255.0"
ifconfig_em1_alias8="inet 65.50.235.1  netmask 255.255.255.0"
 
defaultrouter="66.181.18.2"
 
#  private network
ifconfig_fxp0="inet 10.1.2.5 netmask 255.255.255.0"
 
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.5"
 
sshd_enable="YES"
usbd_enable="YES"
ntpd_enable="YES"
# powerd_enable="YES"
 
 
20. reboot. Confirm new kernel is loaded
 
uname -a
 
21. update ports:
cd /usr/ports
 
echo "*default host=cvsup4.FreeBSD.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_9_1\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup
 
cvsup sup; mail -s 'cvs sup ports done' 8583619553@vtext.com < /dev/null
 
22. Install raid mgmt tool
 
# linux base
cd /usr/ports/devel/libtool22
make install base
 
cd /usr/ports/emulators/linux_base-fc4
make install clean
 
scp backup2:/d4/build/3ware/tw_cli-freebsd-x86_64-9.5.0.1.tgz /usr/local/sbin
cd /usr/local/sbin
tar xzvf tw_cli-freebsd-x86_64-9.5.0.1.tgz
rm tw_cli-freebsd-x86_64-9.5.0.1.tgz
 
23. install rsync from ports
cd /usr/ports/net/rsync
make install clean
 
choose default options
 
25. install bb client
adduser
Username: bb
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username  : bb
Password  : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups    : bb
Home      : /home/bb
Shell      : /bin/sh
Locked    : no
OK? (yes/no): yes
 
cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
tar xvf bb-freebsd.tar
 
edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.5 firewall3.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
 
vi /home/bb/bbc1.9e-btf/ext/openfiles
MACHINE="firewall3,johncompanies,com"      # HAS TO BE IN A,B,C FORM
 
cd /usr/home/bb/bbc1.9e-btf/etc
./bbchkcfg.sh
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..
 
vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
        $1 $TOPARGS > $BBTMP/TOP.$$
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$
 
./runbb.sh start
more BBOUT
(look for errors)
exit
 
echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh
 
Punch a hole in the firewall to allow it to communicate with bb monitor:
 
ipfw add 00096 allow ip from 66.181.18.0/27 to 69.55.230.2
 
 
27. configure bb on mail:
vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
66.181.18.3 firewall3.johncompanies.com # ssh
 
su bb
cd
bbsrc/bb/runbb.sh restart ; exit
 
29. configure ntp
echo "server 10.1.2.1" > /etc/ntp.conf
 
/usr/sbin/ntpd -p /var/run/ntpd.pid
sleep 2; ntpq -p
(confirm it’s able to reach our time server)
 
echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
chmod 0700 /usr/local/etc/rc.d/ntp.sh
 
30. fwd and reverse lookups on ns1c
vr johncompanies.com
(edit the PTR too)
 
 
33. setup backups
echo '#\!/bin/sh\
backupdir=/data/firewall2/current\
\
## ENTRY /etc ' > /usr/local/etc/backup.config
 
on backup3:
setup backup dirs:
ssh backup3 mkdir -p /data/firewall2/current
 
on backup3, add the system to
vi /usr/local/sbin/snapshot_archive
 
scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup
vi /usr/local/etc/rsync.backup
backup1 > backup3
 
crontab -e
1 0 * * * /usr/local/etc/rsync.backup
 
 
34. mkdir /root/logs
 
35. edit sshd_config for security
vi /etc/ssh/sshd_config
ListenAddress 66.181.18.3
ListenAddress 10.1.2.5
 
kill -1 `cat /var/run/sshd.pid`
 
35. raid chk
 
cat > /usr/local/sbin/lsiraidchk
#!/usr/bin/perl
 
my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;
 
foreach (@out) {
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}
 
36. add crontab entries
crontab -e
30 3 * * * /usr/local/etc/rsync.backup
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
*/5 * * * * /usr/local/sbin/lsiraidchk
 
#10 0 * * * rm /var/spool/clientmqueue/*
 
scp /etc/makefwrules.pl user@64.163.14.48:~
scp /etc/makepiperules.pl user@64.163.14.48:~
mv /home/user/makefwrules.pl /etc
mv /home/user/makepiperules.pl /etc
touch /etc/firewall.sh
mkdir /etc/oldrules/
 
other binaries
scp /usr/local/bin/rulemaker user@64.163.14.48:~
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~
 
Setup basic ruleset
 
ipfw add 00009 count udp from any to any
ipfw add 00010 allow tcp from any to any established
ipfw add 00012 deny tcp from any to any tcpflags syn tcpoptions !mss
ipfw add 00012 deny icmp from any to any icmptypes 4,5,9,10,12,13,14,15,16,17,18
ipfw add 00012 deny tcp from any to any tcpflags syn,fin
ipfw add 00012 deny tcp from any to any tcpflags fin,psh,rst,urg
ipfw add 00012 allow icmp from any to any
ipfw add 00014 deny tcp from any to any dst-port 135
ipfw add 00150 skipto 65535 ip from any to any via em1 in
 
IPKVM3:
00098 allow ip from { 69.55.230.6 or 69.55.230.7 } to 69.55.230.10 dst-port 139
00098 deny ip from any to 69.55.230.10 dst-port 139
</pre>
 
= wiki =
 
The wiki (mediawiki) runs on nat2 in a jail running off 69.55.229.8
 
The backup wiki lives on virt13 in CT 5 / 69.55.230.18
 
== Setup jail ==
 
<pre>
mkdir /mnt/data1/wiki-dir
cd /usr/src
make installworld DESTDIR=/mnt/data1/wiki-dir
cd etc
make distribution DESTDIR=/mnt/data1/wiki-dir
 
mount -t devfs devfs /mnt/data1/wiki-dir/dev
devfs -m /mnt/data1/wiki-dir/dev rule -s 3 applyset
 
cd /mnt/data1/wiki-dir
 
ln -sf dev/null kernel
 
scp jail9:/usr/local/sbin/jkill /mnt/data1/wiki-dir/sbin
 
jail /mnt/data1/wiki-dir wiki.johncompanies.com 69.55.229.8 /bin/sh
csh
 
touch /etc/fstab
echo 'network_interfaces=""\
hostname="wiki.johncompanies.com"\
kern_securelevel_enable="NO"\
sendmail_enable="YES"\
sshd_enable="YES"' > /etc/rc.conf
 
echo "nameserver 69.55.229.3\
nameserver 69.55.225.225" >> /etc/resolv.conf
 
vi /etc/crontab
(remove the adjkerntz lines )
vi /etc/periodic/security/100.chksetuid
replace: MP=`mount -t ufs | grep -v " nosuid" | awk '{ print $3 }' | sort`
with: MP='/' (use single quotes)
 
mkdir -p /usr/compat/linux/dev
adduser
 
Username: user
Full name: user
Uid (Leave empty for default):
Login group [user]:
Login group is user. Invite user into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/user]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: y
Lock out the account after creation? [no]:
Username  : user
Password  : <random>
Full Name  : user
Uid        : 1001
Class      :
Groups    : user
Home      : /home/user
Home Mode  :
Shell      : /bin/sh
Locked    : no
OK? (yes/no): y
adduser: INFO: Successfully added (user) to the user database.
adduser: INFO: Password for (user) is: 901gmYjO
Add another user? (yes/no): n
Goodbye!
 
vi /usr/home/user/.profile
TERM=vt100;    export TERM
tzsetup
newaliases
rm /sbin/halt /sbin/reboot
ln /sbin/jkill /sbin/halt
ln /sbin/jkill /sbin/reboot
vi /etc/syslog.conf
#*.err;kern.warning;auth.notice;mail.crit              /dev/console
*.err;kern.warning;auth.notice;mail.crit                /var/log/messages
 
exit
exit
cd libexec
chflags noschg ld-elf32.so.1
chflags noschg ld-elf.so.1
mv ld-elf32.so.1 ld-elf32.so.1-orig
ln ld-elf.so.1 ld-elf32.so.1
chflags schg ld-elf.so.1
chflags schg ld-elf32.so.1
cp -r /usr/ports /mnt/data1/wiki-dir/usr
 
cat > /usr/local/etc/rc.d/wiki.sh
mount -t devfs devfs /mnt/data1/wiki-dir/dev/
devfs -m /mnt/data1/wiki-dir/dev rule -s 3 applyset
jail /mnt/data1/wiki-dir wiki.johncompanies.com 69.55.229.8 /bin/sh /etc/rc
 
chmod 0700 /usr/local/etc/rc.d/wiki.sh
</pre>
 
== mediawiki setup ==
 
<pre>
 
cd /usr/ports/net/rsync
make install clean
 
cd /usr/ports/distfiles/
fetch http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.4-m3.tar.gz
cd /usr/ports/databases/mysql55-server
make install clean
 
cd /usr/ports/distfiles/
fetch http://downloads.php.net/johannes/php-5.3.2.tar.bz2
cd /usr/ports/lang/php52
make install clean
(build apache module)
 
cd /usr/ports/lang/php5-extensions
make install clean
 
cd /usr/ports/www/apache22
make install clean
 
cd /usr/local/www/
fetch http://download.wikimedia.org/mediawiki/1.19/mediawiki-1.19.2.tar.gz
tar xzf mediawiki-1.19.2.tar.gz
mv mediawiki-1.19.2 wiki
 
vi /usr/local/etc/apache22/httpd.conf
DocumentRoot "/usr/local/www/"
 
Include etc/apache22/extra/vhost-wiki.conf
Listen 443
 
<IfModule mod_php5.c>
    <FilesMatch "\.ph(p3?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
    # To re-enable php in user directories comment the following lines
    # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
    # prevents .htaccess files from disabling it.
    <IfModule mod_userdir.c>
        <Directory /home/*/public_html>
            php_admin_value engine Off
        </Directory>
    </IfModule>
</IfModule>
 
 
cat > /usr/local/etc/apache22/extra/vhost-wiki.conf
<VirtualHost *:443>
        ServerAdmin support@johncompanies.com
 
        DocumentRoot /usr/local/www/wiki
#        <Directory />
#                Options FollowSymLinks
#                AllowOverride None
#                Order deny,allow
#        </Directory>
        <Directory /usr/local/www/wiki>
                Options Indexes FollowSymLinks MultiViews
                Deny from all
                AllowOverride AuthConfig
                Order allow,deny
                DirectoryIndex index.php
                #Allow from 69.55.233.195
                #Allow from boody.dyndns.org
        </Directory>
 
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
 
        ErrorLog /var/log/httpd-error.log
 
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
 
        CustomLog /var/log/httpd-access.log combined
 
    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
 
    SSLEngine on
    SSLCertificateFile /usr/local/etc/apache22/ssl/server.crt
    SSLCertificateKeyFile /usr/local/etc/apache22/ssl/server.key
 
</VirtualHost>
 
mkdir ssl
cd ssl
 
openssl req -days 1999 -new -x509 -nodes -out server.crt -keyout server.key
US
CA
San Diego
johncompanies.com
johncompanies.com
wiki.johncompanies.com
support@johncompanies.com
 
cat > /usr/local/www/wiki/.htaccess
AuthType Basic
AuthUserFile /usr/local/etc/apache22/wiki.passwd
AuthName wiki
require valid-user
satisfy any
 
cd /usr/local/etc/apache22
htpasswd -c wiki.passwd admin
 
https://69.55.229.8/index.php
 
use mysql (innodb)
wiki name: JCWiki
Support / (mail pass) / support@johncompanies.com
 
cat > /usr/local/www/wiki/LocalSettings.php
 
<?php
# This file was automatically generated by the MediaWiki 1.19.2
# installer. If you make manual changes, please keep track in case you
# need to recreate them later.
#
# See includes/DefaultSettings.php for all configurable settings
# and their default values, but don't forget to make changes in _this_
# file, not there.
#
# Further documentation for configuration settings may be found at:
# http://www.mediawiki.org/wiki/Manual:Configuration_settings
 
# Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
exit;
}
 
## Uncomment this to disable output compression
# $wgDisableOutputCompression = true;
 
$wgSitename      = "JCWiki";
 
## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs please see:
## http://www.mediawiki.org/wiki/Manual:Short_URL
$wgScriptPath      = "";
$wgScriptExtension  = ".php";
 
## The protocol and server name to use in fully-qualified URLs
$wgServer          = "https://69.55.229.8";
 
## The relative URL path to the skins directory
$wgStylePath        = "$wgScriptPath/skins";
 
## The relative URL path to the logo.  Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
#$wgLogo            = "$wgStylePath/common/images/wiki.png";
$wgLogo            = "$wgStylePath/common/images/jclogo.gif";
 
## UPO means: this is also a user preference option
 
$wgEnableEmail      = true;
$wgEnableUserEmail  = true; # UPO
 
$wgEmergencyContact = "apache@69.55.229.8";
$wgPasswordSender  = "apache@69.55.229.8";
 
$wgEnotifUserTalk      = false; # UPO
$wgEnotifWatchlist    = false; # UPO
$wgEmailAuthentication = true;
 
## Database settings
$wgDBtype          = "mysql";
$wgDBserver        = "localhost";
$wgDBname          = "my_wiki";
$wgDBuser          = "root";
$wgDBpassword      = "";
 
# MySQL specific settings
$wgDBprefix        = "";
 
# MySQL table options to use during installation or update
$wgDBTableOptions  = "ENGINE=InnoDB, DEFAULT CHARSET=binary";
 
# Experimental charset support for MySQL 5.0.
$wgDBmysql5 = false;
 
## Shared memory settings
$wgMainCacheType    = CACHE_NONE;
$wgMemCachedServers = array();
 
## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads  = false;
#$wgUseImageMagick = true;
#$wgImageMagickConvertCommand = "/usr/bin/convert";
 
# InstantCommons allows wiki to use images from http://commons.wikimedia.org
$wgUseInstantCommons  = false;
 
## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## available UTF-8 locale
$wgShellLocale = "en_US.utf8";
 
## If you want to use image uploads under safe mode,
## create the directories images/archive, images/thumb and
## images/temp, and make them all writable. Then uncomment
## this, if it's not already uncommented:
#$wgHashedUploadDirectory = false;
 
## Set $wgCacheDirectory to a writable directory on the web server
## to make your wiki go slightly faster. The directory should not
## be publically accessible from the web.
#$wgCacheDirectory = "$IP/cache";
 
# Site language code, should be one of the list in ./languages/Names.php
$wgLanguageCode = "en";
 
$wgSecretKey = "abc699ef26890b49b4055430f8ebbd25e84cce21a7e53aeaec4d4313af4c9739";
 
# Site upgrade key. Must be set to a string (default provided) to turn on the
# web installer while LocalSettings.php is in place
$wgUpgradeKey = "3196710f4a7d7332";


29. configure ntp
## Default skin: you can change the default skin. Use the internal symbolic
echo "server 10.1.2.1" > /etc/ntp.conf
## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
$wgDefaultSkin = "vector";


/usr/sbin/ntpd -p /var/run/ntpd.pid
## For attaching licensing metadata to pages, and displaying an
sleep 2; ntpq -p
## appropriate copyright notice / icon. GNU Free Documentation
(confirm it’s able to reach our time server)
## License and Creative Commons licenses are supported so far.
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl  = "";
$wgRightsText = "";
$wgRightsIcon = "";


echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
# Path to the GNU diff3 utility. Used for conflict resolution.
chmod 0700 /usr/local/etc/rc.d/ntp.sh
$wgDiff3 = "/usr/bin/diff3";


30. fwd and reverse lookups on ns1c
# Query string length limit for ResourceLoader. You should only set this if
vr johncompanies.com
# your web server has a query string length limit (then set it to that limit),
(edit the PTR too)
# or if you have suhosin.get.max_value_length set in php.ini (then set it to
# that value)
$wgResourceLoaderMaxQueryLength = -1;




33. setup backups
echo '#\!/bin/sh\
backupdir=/data/firewall2/current\
\
## ENTRY /etc ' > /usr/local/etc/backup.config


on backup3:
# End of automatically generated settings.
setup backup dirs:
# Add more configuration options below.
ssh backup3 mkdir -p /data/firewall2/current


on backup3, add the system to
vi /usr/local/sbin/snapshot_archive


scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup
</pre>
vi /usr/local/etc/rsync.backup
backup1 > backup3


crontab -e
== copy/backup wiki ==
1 0 * * * /usr/local/etc/rsync.backup
on main/primary wiki:
 
<pre>
 
/usr/local/etc/rc.d/mysql-server stop
34. mkdir /root/logs
ssh 69.55.230.18 "/etc/init.d/mysql stop"
 
rsync -av /var/db/mysql/my_wiki/ 69.55.230.18:/var/lib/mysql/my_wiki/
35. edit sshd_config for security
rsync -av /var/db/mysql/ib* 69.55.230.18:/var/lib/mysql/
vi /etc/ssh/sshd_config
/usr/local/etc/rc.d/mysql-server start
ListenAddress 66.181.18.3
ssh 69.55.230.18 "/etc/init.d/mysql start"
ListenAddress 10.1.2.1
 
kill -1 `cat /var/run/sshd.pid`
 
35. raid chk
 
cat > /usr/local/sbin/lsiraidchk
#!/usr/bin/perl
 
my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;
 
foreach (@out) {
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}
 
36. add crontab entries
crontab -e
30 3 * * * /usr/local/etc/rsync.backup
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;
*/5 * * * * /usr/local/sbin/lsiraidchk
 
#10 0 * * * rm /var/spool/clientmqueue/*
 
scp /etc/makefwrules.pl user@64.163.14.48:~
scp /etc/makepiperules.pl user@64.163.14.48:~
mv /home/user/makefwrules.pl /etc
mv /home/user/makepiperules.pl /etc
touch /etc/firewall.sh
mkdir /etc/oldrules/
 
other binaries
scp /usr/local/bin/rulemaker user@64.163.14.48:~
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~
 
Setup basic ruleset
 
ipfw add 00009 count udp from any to any
ipfw add 00010 allow tcp from any to any established
ipfw add 00012 deny tcp from any to any tcpflags syn tcpoptions !mss
ipfw add 00012 deny icmp from any to any icmptypes 4,5,9,10,12,13,14,15,16,17,18
ipfw add 00012 deny tcp from any to any tcpflags syn,fin
ipfw add 00012 deny tcp from any to any tcpflags fin,psh,rst,urg
ipfw add 00012 allow icmp from any to any
ipfw add 00014 deny tcp from any to any dst-port 135
ipfw add 00150 skipto 65535 ip from any to any via em1 in


IPKVM3:
00098 allow ip from { 69.55.230.6 or 69.55.230.7 } to 69.55.230.10 dst-port 139
00098 deny ip from any to 69.55.230.10 dst-port 139
</pre>
</pre>

Latest revision as of 15:05, 3 October 2023

jails[edit]

jail1[edit]

  • Location: castle, SHUTDOWN
  • OS: FreeBSD 6.2 i386
  • Networking: Priv IP: 10.1.4.101 (PCI nic), Pub IP: 69.55.230.107 (onboard)
  • Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 74 GB (4 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
  • Remote management: none
  • Disk accounting: gvinum

jail2[edit]

  • Location: castle, cab 6-16
  • OS: FreeBSD 7.2 amd64
  • Networking: Priv IP: 10.1.4.102, Pub IP: 69.55.228.53 (2 onboard nics)
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 146 GB (2 x 146GB) RAID1 array, two 300 GB (4 x 300GB) RAID1 arrays running on an LSI-based, Dell-branded (PERC 6/i) RAID card.
  • Remote management: DRAC @ 10.1.4.232
  • Disk accounting: md

jail3[edit]

  • Location: I2b SHUTDOWN
  • OS: FreeBSD 8.3 amd64
  • Networking: Priv IP: 10.1.2.103, Pub IP: 69.55.229.7 (2 onboard nics)
  • Hardware: Supermicro (custom build). 6 SATA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 300 GB (2 x 300GB) RAID1 array running on a 3ware 8006-2LP RAID card.
  • Remote management: none
  • Disk accounting: md

Notes[edit]

  • We should not add users to this server since it is at I2B
  • must be ssh'd to from nat2
  • is a super jail for customer col01737

jail4[edit]

  • Location: castle, cab 6-17
  • OS: FreeBSD 9.1 x86_64
  • Networking: Priv IP: 10.1.4.104, Pub IP: 69.55.228.104 (2 onboard nics)
  • Hardware: Dell 2850. 6 x 300GB SCSI drives (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • CPU: 2 x Intel(R) Xeon(TM) CPU 2.80GHz (8 virtual CPUs)
  • RAM: 16 GB ( 4 x 4GB Reg ECC )
  • Drives: one 1.4 TB RAID 5 array (6 x 300GB SCSI) Dell-branded (PERC 4e)LSI megarc RAID card.
  • Remote management: None
  • Disk accounting: md


Notes[edit]

Only FreeBSD 9.1 jail Not upgraded to FBSD 9.2 or 9.3 because too many libraries modified (would require customers to rebuild apps).

jail5[edit]

  • Location: castle, cab 3-6
  • OS: FreeBSD 10.1 x86_64
  • Networking: Priv IP: 10.1.4.105, Pub IP: 69.55.230.105 (2 onboard nics)
  • Hardware: Supermicro JC-14004 - Intel S1200BTL motherboard - 6 SATA/SAS drive bays (2 colums of 3), Dual power supply.
  • CPU: 1 x Intel(R) Xeon(TM) E3-1230 V2 CPU 3.30 GHz (8 virtual CPUs)
  • RAM: 32 GB ( 4 x 8GB ECC )
  • Drives: 1x80 GB SATA SSD on motherboard + one 2.6 TB RAID 5 array 4x1 TB + 3ware 9650 RAID card.
  • Remote management: Intel RMM 4 - 10.1.4.235
  • Disk accounting: md

Notes[edit]

Only FreeBSD 10.1 jail used for bhyve virtuals.

Use ~+Ctrl-D to disconnect from console (vm attach colXXXXX).

jail6[edit]

  • Location: castle, cab 6-16
  • OS: FreeBSD 10.3 x86_64
  • Networking: Priv IP: 10.1.4.106, Pub IP: 69.55.230.106 (2 onboard nics)
  • Hardware: Supermicro JC-14004 - Intel S1200BTL motherboard - 6 SATA/SAS drive bays (2 colums of 3), Dual power supply.
  • CPU: 1 x Intel(R) Xeon(TM) E3-1230 V2 CPU 3.30 GHz (8 virtual CPUs)
  • RAM: 32 GB ( 4 x 8GB ECC )
  • Drives: one 2.7 TB ZFS RAID 6 array 5x1 TB
  • Remote management: Intel RMM 4 - 10.1.4.236
  • Disk accounting: zfs

jail7[edit]

  • Location: castle, cab 3-5 SCHEUDLED SHUTDOWN 9/30/19
  • OS: FreeBSD 6.3 i386
  • Networking: Priv IP: 10.1.4.107, Pub IP: 69.55.230.108 (2 onboard nics)
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 146 GB (4 x 146GB) RAID1 arrays, one 74 GB (2 x 74GB) RAID1 array running on an LSI-based, Dell-branded (PERC 6/i) RAID card.
  • Remote management: DRAC @ 10.1.4.237
  • Disk accounting: gvinum

Notes[edit]

Do not run a verify while OS/jails running, will crash.

jail8[edit]

  • Location: castle, cab 3-6
  • OS: FreeBSD 8.0 amd64
  • Networking: Priv IP: 10.1.4.108, Pub IP: 69.55.234.2 (2 onboard nics)
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 146 GB (2 x 146GB) RAID1 array, one 300 GB (2 x 300GB) RAID1 array, one 400 GB (2 x 400GB) RAID1 array, running on an LSI-based, Dell-branded (PERC 6/i) RAID card.
  • Remote management: DRAC @ 10.1.4.238
  • Disk accounting: md


jail9[edit]

  • Location: castle, cab 3-6
  • OS: FreeBSD 8.2 amd64
  • Networking: Priv IP: 10.1.4.109, Pub IP: 69.55.232.36 (2 onboard nics)
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 146 GB (2 x 146GB) RAID1 array, one 400 GB (2 x 300GB) RAID1 array running on an LSI-based, Dell-branded (PERC 5/i) RAID card.
  • Remote management: DRAC @ 10.1.4.239
  • Disk accounting: md


jail11[edit]

  • Location: castle, cab 3-7
  • OS: FreeBSD 4.7 i386
  • Networking: Priv IP: 10.1.4.111 (PCI nic), Pub IP: 69.55.236.92 (onboard)
  • Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 74 GB (4 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
  • Remote management: none
  • Disk accounting: vinum


mx1[edit]

  • Location: castle, SHUTDOWN AND SCRAPPED
  • OS: FreeBSD 4.11 i386
  • Networking: Priv IP: 10.1.4.201 (PCI nic), Pub IP: 69.55.237.3 (onboard)
  • Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 36 GB (2 x 36GB) RAID1 array, one 74 GB (2 x 74GB) RAID1 array running on an Adaptec-based, Dell-branded (perc) RAID card.
  • Remote management: none
  • Disk accounting: vinum

Notes[edit]

  • is our (old) backup mail/dns vps service host

mx2[edit]

  • Location: castle, SHUTDOWN AND SCRAPPED
  • OS: FreeBSD 7.1 i386
  • Networking: Priv IP: 10.1.4.202 (PCI nic), Pub IP: 69.55.237.90 (onboard)
  • Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 74 GB (4 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
  • Disk accounting: gvinum

Notes[edit]

  • is our latest backup mail/dns vps service host

jail17[edit]

  • Location: castle, cab 3-7
  • OS: FreeBSD 4.10 i386
  • Networking: Priv IP: 10.1.4.117 (PCI nic), Pub IP: 69.55.228.2 (onboard nics)
  • Hardware: Supermicro (custom build). 6 SCA SCSI drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 74 GB (4 x 74GB) RAID1 arrays, one 146 GB (2 x 146GB) RAID1 array, running on an Adaptec 2120S RAID card.
  • Remote management: none
  • Disk accounting: vinum
  • Host of devweb.johncompanies.com and www.utopian.com/mail.utopian.com

jail18[edit]

  • Location: castle, cab 3-5 SCHEDULED SHUTDOWN 9/30/19
  • OS: FreeBSD 4.10 i386
  • Networking: Priv IP: 10.1.4.118 (PCI nic), Pub IP: 69.55.228.2 (onboard nics)
  • Hardware: Supermicro (custom build). 6 SCA SCSI drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 74 GB (4 x 74GB) RAID1 arrays, one 146 GB (2 x 146GB) RAID1 array, running on an Adaptec 2120S RAID card.
  • Remote management: none
  • Disk accounting: vinum
  • Host of ns2c.johncompanies.com (now on ns2c.johncompanies.com on ganeti)

jail19[edit]

  • Location: castle, cab 3-5 SCHEDULED SHUTDOWN 9/30/19
  • OS: FreeBSD 6.1 i386
  • Networking: Priv IP: 10.1.4.119 (PCI nic), Pub IP: 69.55.228.200 (onboard nics)
  • Hardware: Supermicro (custom build). 6 SCA SCSI drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 74 GB (2 x 74GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an Adaptec 2120S RAID card.
  • Remote management: none
  • Disk accounting: gvinum

virts[edit]

quar1[edit]

  • Location: castle, SHUTDOWN AND SCRAPPED
  • OS: RedHat 7.3 x86
  • Networking: Priv IP: 10.1.4.151 (PCI nic), Pub IP: 69.55.227.2 (onboard nic)
  • Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 36 GB (2 x 36GB) RAID1 array, one 74 GB (2 x 74GB) RAID1 array, running on an Adaptec-based, Dell-branded (perc) RAID card.
  • Remote management: none
  • Virtuozzo version: 2.6.1
  • VZ license: hwid=23C0.C0E1.6FDD.08BA.8971.8E1C.EBD5.1EDC serial=0DE6.903E.E239.E23F.470C.4369.4104.A5A4

Notes[edit]

  • used to be the home of customers who's VE's would just run out of control/badly
  • has a max of 10 VE's allowed to run

virt9[edit]

  • Location: castle, cab 3-7
  • OS: RedHat 7.3 x86
  • Networking: Priv IP: 10.1.4.59 (PCI nic), Pub IP: 69.55.226.161 (onboard nic)
  • Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 74 GB (2 x 74GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.
  • Remote management: none
  • Virtuozzo version: 2.6.1
  • VZ license: hwid=BC15.B4D6.0D25.A5FE.F3BA.D518.E351.AE3F serial=F6AD.B6B4.5650.8869.C97C.73EE.AF65.FA8B


virt11[edit]

  • Location: castle, cab 3-6
  • OS: CentOS 5.4 x86
  • Networking: Priv IP: 10.1.4.61, Pub IP: 69.55.238.3, 2 onboard nics
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 146 GB (2 x 146GB) RAID1 array, one 400 GB (2 x 400GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an LSI-based, Dell-branded (perc 6/i) RAID card.
  • Remote management: DRAC @ 10.1.4.211
  • Virtuozzo version: 4.0.0
  • VZ license: hwid="029D.A187.78E1.480F.49E3.E20A.7389.7F79" serial="163C.F3E2.195F.96B5.2D38.8937.9600.4A05" key_number="VZ.00172378.0006"
 vzlicload -p A40R00-D8CS00-5D8817-A2RB23-8Y9J78

virt12[edit]

  • Location: castle, cab 3-7
  • OS: CentOS 5.2 x86
  • Networking: Priv IP: 10.1.4.62, Pub IP: 69.55.227.70, 2 onboard nics
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 300 GB (2 x 300GB) RAID1 arrays one 400 GB (2 x 400GB) RAID1 array, running on an LSI-based, Dell-branded (perc 6/i) RAID card.
  • Remote management: DRAC @ 10.1.4.212
  • Virtuozzo version: 4.0.0
  • VZ license: hwid="0C53.A413.E095.B4F4.51BC.D740.6919.A77B" serial="84E5.9498.3759.E683.E24B.2514.CA72.DC31"

virt13[edit]

  • Location: castle, cab 6-17
  • Switch port: P13-
  • OS: CentOS 6.2 x86_64
  • Networking: Priv IP: 10.1.4.63, Pub IP: 69.55.226.2, 2 onboard nics
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • CPU: 2 x Intel(R) Xeon(R) CPU E5420 @ 2.50GHz (8 virtual cores)
  • RAM: 32 GB (8 x 4GB DDR2 FB-DIMM ECC 667MHz)
  • Drives: one 146 GB (2 x 146GB) RAID1 array, one 600 GB (2 x 600GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an LSI-based, Dell-branded (perc 6/i) RAID card.
  • Remote management: DRAC @ 10.1.4.213
  • Virtuozzo version: 4.7.0
  • VZ license: hwid="7D07.93BE.0B1F.7D2B.B039.4B5B.48B6.453B" serial="60A4.A94C.44BB.DCD6.8D03.1778.605B.10FE"

Notes[edit]

  • home to our latest/current signups
  • currently the only 64bit vz host

virt14[edit]

  • Location: castle, cab 6-16
  • Switch Port: p13-
  • OS: CentOS 6.4 x86_64
  • Networking: Priv IP: 10.1.4.64 Pub IP: 69.55.225.14 2 onboard nics
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • CPU: 2 x Xeon 5140 Dual Core @ 2.33GHz (4 virtual CPUs)
  • RAM: 32 GB (8 x 4GB Reg ECC)
  • Drives: one 146 GB (2 x 146 GB SAS) RAID1 array, and one 1TB RAID1 array (2 x 1 TB SATA), running on an LSI-based, Dell-branded (perc 5/i) RAID card.
  • Remote management: DRAC @ 10.1.4.214
  • Virtuozzo version: 4.7.0
  • VZ license: hwid="EA32.2CA0.2368.F5FC.DFBE.6724.5AC0.8ED0" serial="DA0D.F464.0BCE.35B8.C0C0.28B6.D921.F3FD" key_number="VZ.02634184.0070"
  • Activation Key="A00E00-A0WC02-W1A863-482N41-BQAY84"

Notes[edit]

  • our latest virt
  • Temp server to offload Virt13 till we can get a Cloud going.
  • virt 13 and 14 currently the only 64bit vz hosts

virt15[edit]

  • Location: SHUTDOWN
  • OS: RedHat 9 x86
  • Networking: Priv IP: 10.1.4.65, Pub IP: 69.55.232.160 (2 onboard nics)
  • Hardware: Supermicro (custom build). 6 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 74 GB (2 x 74GB) RAID1 array, two 146 GB (2 x 146GB) RAID1 arrays, running on an LSI MegaRAID SCSI 320-1 RAID card.
  • Remote management: none
  • Virtuozzo version: 2.6.2
  • VZ license: hwid=A90F.6F48.E723.D8BA.3025.184A.5B73.D11E serial=E94B.5164.C1E6.A67F.67D1.7D96.0B6C.5524

virt16[edit]

  • Location: castle, cab 3-7
  • OS: Fedora Core 4 x86
  • Networking: Priv IP: 10.1.4.66, Pub IP: 69.55.232.2 (2 onboard nics)
  • Hardware: Supermicro (custom build). 6 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 74 GB (2 x 74GB) RAID1 array, one 146 GB (2 x 146GB) RAID1 array, running on an LSI MegaRAID SCSI 320-1 RAID card.
  • Remote management: none
  • Virtuozzo version: 3.0.0
  • VZ license: hwid=DEFA.A325.7230.BBC8.9715.8B52.3FD7.27BE serial=66C0.41EA.3FBB.11D3.9CC6.55C7.09AE.14AB


virt17[edit]

  • Location: castle, cab 3-6
  • OS: CentOS 4.4 x86
  • Networking: Priv IP: 10.1.4.67, Pub IP: 69.55.232.162, 2 onboard nics
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 146 GB (2 x 146GB) RAID1 arrays running on an LSI-based, Dell-branded (perc 5/i) RAID card.
  • Remote management: DRAC @ 10.1.4.217
  • Virtuozzo version: 3.0.0
  • VZ license: hwid=2E14.AED9.70B8.C26E.D99F.B0D3.BCD2.229C serial=2A11.DAD0.61DB.E889.8DF4.9AF7.CF82.3C37


virt19[edit]

  • Location: castle, cab 3-6
  • OS: CentOS 5.2 x86
  • Networking: Priv IP: 10.1.4.69, Pub IP: 69.55.236.2, 2 onboard nics
  • Hardware: Dell 2950. 6 SATA/SAS drive bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: one 146 GB (2 x 146GB) RAID1 array, one 300 GB (2 x 300GB) RAID1 array, running on an LSI-based, Dell-branded (perc 5/i) RAID card.
  • Remote management: DRAC @ 10.1.4.219
  • Virtuozzo version: 3.0.0
  • VZ license: hwid=3968.13F7.B2AC.8952.8E19.13A9.6EF5.5822 serial=061D.84CD.CCE5.B213.15B5.C061.D6A7.B034

mail[edit]

Summary[edit]

This machine (mail) is the swiss army knife of the company, playing host to many services and functions.

  • Location: castle, cab 3-7
  • OS: FreeBSD 4.10 x86
  • Networking: Priv IP: 10.1.4.5, Pub IPs: 69.55.230.2, 69.55.225.225 (ns1c jail), 69.55.230.9. 1 onboard and 1 PCI
  • Hardware: Dell 2450. 4 SCSI SCA drive bays (2 columns of 2, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: two 36 GB (2 x 36GB) RAID1 arrays running on an Adaptec-based, Dell-branded (perc) RAID card.

Services Provided[edit]

  • mail
  • web
  • mysql
  • bigbrother server/pager
  • snmp
  • named in a jail (ns1c)

email[edit]

This server hosts mail for johncompanies.com (mail.johncompanies.com). Sendmail 8.13.6/8.13.6 is listening on 69.55.230.2 port 25 for incoming mail. Relaying is allowed per /etc/mail/relay-domains Other addresses (aliases) are defined per /etc/mail/aliases

The following active users have mail hosted on this server:

  • dave
  • linux
  • support
  • payments
  • sales
  • tech1
  • info

Traditionally, mail is checked via shell apps (pine). qpopper (pop3s) is running to allow mail downloading. Checking mail in this way causes an opened INBOX in pine to lock read-only. For this reason, we tee incoming mail to support and linux to tech1.

Procmail rules are setup to filter spam and send text messages. They are enabled for info, support, linux, tech1, dave and can be found in ~/Procmail/, for example:

# more ~support/Procmail/rc.emergency
:0c # use c only if you want to forward a copy and file the original later
* ^Subject:.*\<emergency\>
* ! ^Subject:\<re\>
  {
   :0h
   FROMANDSUBJECT=|formail -XFrom: -XSubject:

   :0fwh
   | /usr/local/bin/formail -I"Subject: " -I"To: pager@johncompanies.com" ; echo $FROMANDSUBJECT ; echo

   :0
  ! -t
  }

control: cd /etc/mail; make stop (stop), cd /etc/mail; make start (start)

The following aliases are also in place:

debian:         linux
jobs:   info
careers:        info
#reboot:         6128102202@txt.att.net
#reboot:         8582298897@vtext.com
reboot:         pager
#pager: 8582298897@vtext.com
pager:  4158718324@txt.att.net
tech1on:  "| /usr/local/sbin/tech1on.sh"
tech1off:  "| /usr/local/sbin/tech1off.sh"

To change them, edit /etc/aliases and then run newaliases

Note on tech1: this address was setup as a read-only address to be mirrored on all email coming into support and linux. We set this up so we could easily check support mail via a pop client- popping email locks out the user in pine so checking support/linux directly via pop was not an option. When checking and responding to email that comes into tech1, care should be taken to make sure it is sent as/under an address other than tech1. This is cause tech1 is not monitored by support staff as closely as email to support/linux. Further, the tech on call may not be checking tech1. Lastly, because of the nature of the copying, you will sometimes notice certain automated email/notices are received 2x in support- this is because of/related to the tech1 mirror.

To enable it (on mail, run):

~support/tech1on.sh

To disable

~support/tech1off.sh

Or via email:

tech1on@johncompanies.com tech1off@johncompanies.com

IP Blocking[edit]

01000 deny ip from 188.92.72.5 to any
01003 deny ip from any to 122.49.31.50
01004 deny ip from 122.49.31.50 to any
01014 deny ip from 74.208.225.225 to any
01015 deny ip from any to 216.243.118.35
01016 deny ip from 216.243.118.35 to any
01017 deny ip from any to 216.243.118.36
01018 deny ip from 216.243.118.36 to any
01020 deny ip from 112.215.0.0/18 to any   2014-08-13 Blocked PT Excelcomindo Pratama (Indonesia) for fradulent credit card attempts 
01020 deny ip from 112.215.64.0/20 to any  2014-08-13 Blocked PT Excelcomindo Pratama (Indonesia) for fradulent credit card attempts 
01022 deny ip from 120.168.0.0/24 to any   2014-08-13 Blocked Indosat 3G Broadband (Indonesia) for fradulent credit card attempts
01022 deny ip from 120.175.213.0/24 to any 2014-08-13 Blocked Indosat 3G Broadband (Indonesia) for fradulent credit card attempts

web[edit]

See Management System / Public Website / Signup

mysql[edit]

mysql 4.1.22 is running on port 3306

  • datadir: /mnt/data1/db/mysql/
  • config: /etc/my.cnf
  • database: jc
  • control: /usr/local/etc/rc.d/mysql-server.sh stop (stop), /usr/local/etc/rc.d/mysql-server.sh start (start)

bigbrother[edit]

There is a client running on mail (which monitors the services running on mail and mail itself), installed under /usr/home/bb/bbc1.9e-btf
And the big brother pager/server (which displays information gathered from all bb-monitored machines, including mail) is installed under /usr/home/bb/bbsrc/bb1.9i-btf

Both are running under the user bb

Refer to BigBrother for more about use.

DNS (ns1c.johncompanies.com)[edit]

ns1c is a jail running on the mail server, who's IP is 69.55.225.225

It's running from /mnt/data1/ns1c-dir

See DNS for more details

Usage and Notes[edit]

  • always mounted to backup1 and backup2 via nfs:
backup2:/mnt/data1 on /backup (nfs)
backup2:/mnt/data2 on /backup2 (nfs)
backup2:/mnt/data3 on /backup3 (nfs)
backup2:/mnt/data4 on /backup4 (nfs)
backup1:/data on /backup1 (nfs)

Cronjobs[edit]

* * * * * /usr/local/www/mgmt/mrtg/mrtg.sh > /dev/null 2>&1

Gathers up data for our mrtg/load graphs

*/5 * * * * /usr/local/bin/rsync -a root@nat2:/mnt/data1/mrtg/data/ /usr/local/www/mgmt/mrtg/data/

Gathers up data from i2b servers for our mrtg/load graphs

40 0 * * * /usr/local/bin/rsync -a root@nat2:"/mnt/data1/mrtg/*.cfg" /usr/local/www/mgmt/mrtg

Gathers up mrtg configuration (port names) from i2b switches for our mrtg/load graphs

41 0 * * * for f in `grep -l "mnt\/data1" /usr/local/www/mgmt/mrtg/switch-p*.cfg`; do cat $f | sed s#\/mnt\/data1#\/usr\/local\/www\/mgmt# > $f.new; mv $f.new $f; done

Gathers up mrtg configuration (port names) from castle switches for our mrtg/load graphs

1 0 1 * * cp /usr/local/www/mgmt/html/top20ip /usr/local/www/mgmt/html/top20ip_last
1 0 1 * * cp /usr/local/www/mgmt/html/top20customers /usr/local/www/mgmt/html/top20customers_last
2 * * * * /usr/local/www/cronjobs/top20ip.pl > /dev/null 2>&1
15 * * * * /usr/local/www/cronjobs/top20customer.pl > /dev/null 2>&1
1 0 1 * * rm /usr/local/www/mgmt/html/bandtrack

Archiving and generation of bandwidth statistics presented in mgmt -> Reference -> Bandwidth

1 0 * * * /usr/local/etc/rsync.backup

Nightly backup script

0 1 * * * /usr/local/www/mgmt/awstats/wwwroot/cgi-bin/awstats.pl -config=jcpub -update

Public web traffic stats

15 0 * * * rm /usr/local/www/mgmt/bwgraphs/*.png
16 0 * * * rm /usr/local/www/am/bwgraphs/*

Cleanup for graph-related temp data generated by customers using the bandwidth reports via the AM

10 0 1 * * /usr/local/www/cronjobs/monthly_bandwidth_report.pl

Monthly bandwidth overage report

*/3 * * * * /usr/local/www/cronjobs/bbcheck.pl

Updates mgmt with bb monitoring issues

5 0 * * * /usr/local/www/cronjobs/shutdownreminder.pl

Emails customers reminding them of upcoming shutdown date

7 0 * * * /usr/local/www/cronjobs/invoice_email.pl

Emails customers who have invoices and are set to auto-email (currently no customer gets these)

8 */4 * * * /usr/local/www/cronjobs/mysqlrepchk.pl

Checking that we are properly replicating (mysql) traffic data from bwdb to backup1

16 0 1 * * /usr/local/www/cronjobs/purge_traffic.pl

Removed old traffic data from the traffic database (running on backup1)

*/5 * * * * chmod 0700 /usr/local/www/ccard_orders/* && mv /usr/local/www/ccard_orders/* /usr/local/www/ccard_orders/done

Secure credit card data: set root-read-only

25 0 * * * /usr/local/www/cronjobs/biller.pl

Enters service charges in customer billing ledgers

10 13 * * * /usr/local/www/cronjobs/pfp_batch_gather.pl

Looks for customers with balance due and active credit card on file, prepares a payflow batch

10 14 * * * /usr/local/www/cronjobs/pfp_batch_process.pl

Tries to collect ccard funds for items in payflow batch - communicates with payflow

15 13 * * * /usr/local/www/cronjobs/pb_batch_gather.pl

Looks for customers with balance due and active paypal billing agreement on file, prepares a paypal batch

15 14 * * * /usr/local/www/cronjobs/pb_batch_process.pl

Tries to collect paypal funds for items in paypal batch - communicates with paypal

0 7 * * 1 /usr/local/www/cronjobs/email_pmt_reminder.pl

Emails customers in arrears, reminding them to pay

0 0 1 * * /usr/bin/mail -s 'archive sent mail in pine' support@johncompanies.com < /dev/null

Reminds us to archive sent mail

0 3 * * * /usr/local/bin/rsync -a isys.e-monitoring.net:/var/mail /backup2/isys; /usr/local/bin/rsync -a isys.e-monitoring.net:/usr/home /backup2/isys

Backup data on isys

Regular maintenance[edit]

Building a new Mail Server[edit]

Installations[edit]

I used FreeBSD 11.2

The order is important especially for the Web Server.

Web Server[edit]

I used FreeBSD 11.2

 perl 5.26 
 OpenSSL 1.0.2o-freebsd
 pcre
 apache22 
 mod_perl2
 PayflowPro
 mariadb 55 server and client

Installation order is important

install perl 5.26.2 from ports

<ore> cd /usr/ports/lang/perl5.26/ make [X] PERL_64BITINT Use 64 bit integers (on i386) [X] USE_PERL Rewrite links in /usr/bin (the rest unchecked make install

install OpenSSL 1.0.2o-freebsd

cd /usr/ports/
make install

install pcre

cd /usr/ports/
make install


install Apache22

cd /usr/ports/distfiles
fetch http://archive.apache.org/dist/httpd/httpd-2.2.32.tar.gz


cd /usr/ports/www/apache22/tmp
fetch --no-verify-peer http://mirror.nexcess.net/apache//httpd/httpd-2.2.34.tar.gz
tar xvzf httpd-2.2.34.tar.gz
./configure --prefix=/usr/local/apache --with-ssl=/usr/local/openssl/ --enable-ssl --enable-so --with-mpm=prefork --enable-threads --enable-mods-shared='mime alias setenvif dir' --enable-modules='mime alias setenvif dir' --with-pcre=/usr/local
make install
apachectl restart

cd /usr/ports/www/apache22
echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
make DISABLE_VULNERABILITIES=yes
make install


install mod_perl2

cd /usr/ports/www/mod_perl2
echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
make DISABLE_VULNERABILITIES=yes
make install


install mariadb

cd /usr/ports/databases/mariadb-103-server
echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
make DISABLE_VULNERABILITIES=yes
make install


Mail Server[edit]

I used Postfix for email

DNS Server (ns1c.johncompanies.com)[edit]

ns2c[edit]

Summary[edit]

  • Location: castle, on lamphost ganeti cloud
  • OS: FreeBSD 11.2 x86_64
  • Networking: Pub IP: 69.55.230.3 Private access: gnt-instance console ns2c.johncompanies.com
  • Hardware: on ganeti cloud gn6.jcihosting.net secondary gn1.jcihosting.net
  • CPU: 1
  • RAM: 1 GB
  • Drives: 10 GB
  • Remote management: gnt-instance console ns2c.johncompanies.com

nat[edit]

Summary[edit]

This is the main machine to which we ssh and runs all our screen sessions. Further, it's ip runs in a special block which is not routed through the firewall and this is somewhat immune to DoS attacks which hobble our firewall. Lastly, it acts as a nat server for certain/random devices on the private network.

  • Location: castle, cab 3-7
  • OS: FreeBSD 9.1 i386
  • Networking: Priv IP: 10.1.4.1, Pub IPs: 69.55.233.195, 69.55.233.196, 69.55.233.197, 69.55.233.198, 69.55.233.199. 1 onboard and 1 PCI
  • Hardware: Custom 1U. single power supply.
  • Drives: one 8 GB IDE drive

Services Provided[edit]

  • nat

nat control[edit]

All rules are contained in and look like:

cat /etc/ipnat.rules
# www (was 69.55.230.12)
# virt19
#bimap fxp0 10.1.4.209/32 -> 69.55.233.198/32
# virt18
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32
# virt13
#bimap fxp0 10.1.4.213/32 -> 69.55.233.196/32
# virt12
#bimap fxp0 10.1.4.212/32 -> 69.55.233.196/32
# virt17
bimap fxp0 10.1.4.217/32 -> 69.55.233.196/32
# virt11
#bimap fxp0 10.1.4.211/32 -> 69.55.233.196/32
# ASA
#bimap fxp0 10.1.4.172/32 -> 69.55.233.196/32
# P1A
bimap fxp0 10.1.4.240/32 -> 69.55.233.197/32
#bimap fxp0 10.1.4.238/32 -> 69.55.233.197/32
# developer (was 69.55.230.17)
# jail2
#bimap fxp0 10.1.4.232/32 -> 69.55.233.198/32
# jail8
#bimap fxp0 10.1.4.238/32 -> 69.55.233.198/32
# jail9
#bimap fxp0 10.1.4.239/32 -> 69.55.233.198/32
# POLL
#BIMAP EM0 10.1.6.134/32 -> 69.55.230.20/32
# 1U SUN
#BIMAP EM0 10.1.4.4/32 -> 69.55.227.46/32
# ??
#BIMAP EM0 10.1.6.3/32 -> 69.55.230.100/32
# random machine
#bimap fxp0 10.1.6.13/32 -> 69.55.233.199/32
#bimap fxp0 10.1.4.232/32 -> 69.55.233.199/32
# OFFICE OUTBOUND TRAFFIC
#map fxp0 10.1.6.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
#map fxp0 10.1.6.0/24 -> 0.0.0.0/32

A simple entry looks like:

bimap fxp0 10.1.4.240/32 -> 69.55.233.197/32

Which essentially means make private IP 10.1.4.240 reachable on 69.55.233.197 and allow 10.1.4.240 to communicate with the public internet via 69.55.233.197

To reload new rule config:

ipnat -C -F -f /etc/ipnat.rules

You may want to setup natting, as above, when you need to reach a DRAC card's web interface, wherin the DRAC card only has a private IP.

nat2[edit]

Summary[edit]

This is the main machine to which we ssh and runs all our screen sessions at i2b, and runs ns3c (this is kind of the what mail is to castle). Further, it's ip runs in IP space provided by i2b: 66.181.18.1 - 66.181.18.30, which is not routed through the firewall and this is somewhat immune to DoS attacks which hobble our firewall. Lastly, it acts as a nat server for certain/random devices on the private network.

  • Location: i2b, cab 6
  • OS: FreeBSD 6.4 x86
  • Networking: Priv IP: 10.1.2.1, Pub IPs: 69.55.229.2, 69.55.229.3, 66.181.18.4, 66.181.18.5, 66.181.18.6, 66.181.18.7, 66.181.18.8, 66.181.18.9, 66.181.18.10, 66.181.18.11, 66.181.18.12, 66.181.18.13, 66.181.18.14 1 onboard and 1 PCI
  • Hardware: Custom 2U. 6 drive bays, non-hot-swappable. single power supply.
  • Drives: one 150 GB (2 x 150GB) RAID1 array running on a 3ware 8006 RAID card.

Services Provided[edit]

  • nat
  • bigbrother
  • ns3c (jail)
  • wiki (jail)
  • ntp

nat config[edit]

Here's what's currently nat'd on nat2:

cat /etc/ipnat.rules
# sample entry
#ATS-9
bimap em0 10.1.2.79/32 -> 66.181.18.14/32
#ATS-8
bimap em0 10.1.2.78/32 -> 66.181.18.13/32
#ATS-7
bimap em0 10.1.2.77/32 -> 66.181.18.12/32
#ATS-6
bimap em0 10.1.2.76/32 -> 66.181.18.6/32
#ATS-5
bimap em0 10.1.2.75/32 -> 66.181.18.7/32
#ATS-4
bimap em0 10.1.2.74/32 -> 66.181.18.8/32
#ATS-3
bimap em0 10.1.2.73/32 -> 66.181.18.9/32
#ATS-2
bimap em0 10.1.2.72/32 -> 66.181.18.10/32
#ATS-1
bimap em0 10.1.2.71/32 -> 66.181.18.11/32
#bwdb2
bimap em0 10.1.2.4/32 -> 66.181.18.5/32

# spare

map em0 10.1.2.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp

#bimap fxp0 10.1.6.49/32 -> 10.1.1.2/32
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32

build[edit]

  • partition map:
/ 512m
swap 1G
/var 256m
/tmp 256m
/usr 5g
/mnt/data1 ~
  • edit /etc/make.conf
echo "WITHOUT_X11=yes \
KERNCONF=nat2 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf
  • add settings to /boot/loader.conf and /boot.config
echo "-Dh" >> /boot.config

echo 'console="comconsole,vidconsole" \
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf
  • turn off all ttyv's except 0 and 1 in /etc/ttys

also turn on ttyd0, change type to vt100:

vi /etc/ttys

ttyv2   "/usr/libexec/getty Pc"         cons25  off secure
ttyv3   "/usr/libexec/getty Pc"         cons25  off secure
ttyv4   "/usr/libexec/getty Pc"         cons25  off secure
ttyv5   "/usr/libexec/getty Pc"         cons25  off secure
ttyv6   "/usr/libexec/getty Pc"         cons25  off secure
ttyv7   "/usr/libexec/getty Pc"         cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0   "/usr/libexec/getty std.9600"   vt100   on  secure

kill -1 1

on console server:

vi /etc/remote

(rename port to jail8 depending on where and which digi plugged into) test serial console


  • populate hosts
echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.4 bwdb2" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts
  • put key in authorized_keys on backup3
cd
ssh-keygen -t dsa -b 1024

(default location, leave password blank)

cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'

confirm that you can ssh to backup3 and backup 2 without getting a login prompt

ssh backup3 hostname
ssh backup2 hostname
ssh backup1 hostname


  • edit root's path and login script:
vi /root/.cshrc

Change alias entries (add G):

alias la        ls -aG
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm       mb mount
alias mbu       mb umount

and alter the prompt, set the following:

set prompt = "`/bin/hostname -s` %/# "
  • install cvsup
cd /usr/ports/net/cvsup-without-gui 
make install clean; rehash; mail -s 'cvs installed' dave.boodman@vtext.com < /dev/null
  • get latest sources for this release:
cd /usr/src 
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
src-all" > sup

cvsup sup ; mail -s 'cvs sup done' dave.boodman@vtext.com < /dev/null


  • configure new kernel.
cd /usr/src/sys/i386/conf 
scp backup2:/mnt/data4/build/freebsd/nat2-6.4 ./nat2
  • build, install kernel and world
cd /boot

mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel

make buildworld ; mail -s 'buildworld done' support@johncompanies.com < /dev/null
make installworld 
mergemaster -i
  • populate /etc/rc.conf with IPs and NFS settings
vi /etc/rc.conf

hostname="nat2.johncompanies.com"
kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"

xntpd_enable="YES"
xntpd_flags="-A -p /var/run/ntpd.pid"

nfs_client_enable="YES"
nfs_reserved_port_only="YES"
ifconfig_em0="inet 10.1.6.50 netmask 255.255.255.0"
#ifconfig_em0="inet 69.55.229.2 netmask 255.255.255.0"
#ifconfig_em0_alias0="inet 69.55.229.229 netmask 255.255.255.255"
ifconfig_fxp0="inet 69.55.229.2 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 69.55.229.3 netmask 255.255.255.255"
ifconfig_fxp1="inet 10.1.2.1 netmask 255.255.255.0"
defaultrouter="10.1.6.1"
#defaultrouter=" 66.181.14.250"
snmpd_enable="YES"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"

inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.1"
fsck_y_enable="YES"
background_fsck="NO"
sshd_enable="YES"
  • reboot. Confirm new kernel is loaded
uname -a
  • update ports:
cd /usr/ports
echo "*default host=cvsup4.FreeBSD.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup

cvsup sup; mail -s 'cvs sup ports done' dave.boodman@vtext.com < /dev/null
  • Install raid mgmt tool
cd /usr/local/sbin
fetch http://3ware.com/download/Escalade9690SA-Series/9.5.3/tw_cli-freebsd-x86-9.5.3.tgz
tar xzf tw_cli-freebsd-x86-9.5.3.tgz
rm tw_cli-freebsd-x86-9.5.3.tgz
chmod 0700 tw_cli

Test:

./tw_cli info c0
  • install rsync from ports
cd /usr/ports/net/rsync
make install clean

choose default options

  • install perl from ports
cd /usr/ports/lang/perl5.8
make install clean
  • install screen from ports
cd /usr/ports/sysutils/screen
make install clean
  • install bb client
adduser
Username: bb
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username   : bb
Password   : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups     : bb
Home       : /home/bb
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes

cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
tar xvf bb-freebsd.tar

edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:

echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.1 nat2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
vi /home/bb/bbc1.9e-btf/ext/openfiles 
MACHINE="nat2,johncompanies,com"      # HAS TO BE IN A,B,C FORM

cd /usr/home/bb/bbc1.9e-btf/etc
./bbchkcfg.sh 
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..

vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
        $1 $TOPARGS > $BBTMP/TOP.$$
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$

./runbb.sh start
more BBOUT 
(look for errors)
exit

echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh

Punch a hole in the firewall to allow it to communicate with bb monitor (probably already exists):

ipfw add 96 allow ip from 66.181.18.0/27 to 69.55.230.2
  • configure bb on mail:
vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
64.163.14.48 nat2.johncompanies.com # ssh

su bb
cd
bbsrc/bb/runbb.sh restart ; exit
  • configure ntp
echo "server 69.55.230.2
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
server 3.pool.ntp.org
server 66.187.233.4
server 217.204.76.170
server 64.112.189.11
server 66.69.112.130
server 80.85.129.25
server 80.237.234.15
server 130.60.7.44
server 134.99.176.3
server 198.144.202.250
server 202.74.170.194
server 204.17.42.199
server 204.87.183.6
server 213.15.3.1
server 213.239.178.33
server 217.114.97.97
server 69.55.230.2" > /etc/ntp.conf
/usr/sbin/ntpd -A -p /var/run/ntpd.pid 
sleep 2; ntpq -p

(confirm it’s able to reach our time server)

echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
chmod 0700 /usr/local/etc/rc.d/ntp.sh
  • fwd and reverse lookups on ns1c
vr johncompanies.com
(edit the PTR too)
  • setup backups, nfs mount
mkdir /backup3
echo 'backup3:/data           /backup3        nfs     rw,bg           0       0' >> /etc/fstab

echo '#\!/bin/sh\
backupdir=/data/nat2/current\
\
## ENTRY /etc ' > /usr/local/etc/backup.config

on backup3: setup backup dirs:

ssh backup3 mkdir -p /data/nat2/current

on backup3, add the system to

vi /usr/local/sbin/snapshot_archive
scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup 
vi /usr/local/etc/rsync.backup 
backup1 > backup3
crontab -e
1 0 * * * /usr/local/etc/rsync.backup
  • edit sshd_config for security
vi /etc/ssh/sshd_config
ListenAddress 66.181.18.1
ListenAddress 69.55.229.2
ListenAddress 10.1.2.1

kill -1 `cat /var/run/sshd.pid`
  • raid chk
cat > /usr/local/sbin/lsiraidchk
#!/usr/bin/perl

my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;

foreach (@out) {
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}
  • netflow stuff

add crontab entries

crontab -e
30 3 * * * /usr/local/etc/rsync.backup
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl; 
*/5 * * * * /usr/local/sbin/lsiraidchk

#10 0 * * * rm /var/spool/clientmqueue/*
scp /etc/makefwrules.pl user@64.163.14.48:~
scp /etc/makepiperules.pl user@64.163.14.48:~
mv /home/user/makefwrules.pl /etc
mv /home/user/makepiperules.pl /etc
touch /etc/firewall.sh
mkdir /etc/oldrules/

other binaries

scp /usr/local/bin/rulemaker user@64.163.14.48:~
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~
  • add nat rules
vi /etc/ipnat.rules
# sample entry
bimap fxp0 10.1.6.70/32 -> 10.1.6.59/32
#bimap fxp0 10.1.4.208/32 -> 69.55.233.196/32

ipnat -C -f /etc/ipnat.rules
  • shell for user
cp /root/.cshrc ~user/
vi ~user/

change # to $

  • mrtg
cd /usr/ports/net-mgmt/mrtg
make install clean

(no FONTCONFIG, v3)

this didn't work cause of libtool incompat

so manually moved files:

scp /usr/local/bin/cfgmaker user@nat2:/usr/local/bin/cfgmaker
scp /usr/local/lib/perl5/site_perl/5.6.1/MRTG_lib.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
scp /usr/local/lib/perl5/site_perl/5.6.1/SNMP_util.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
scp /usr/local/lib/perl5/site_perl/5.6.1/BER.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
scp /usr/local/lib/perl5/site_perl/5.6.1/SNMP_Session.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/
scp /usr/local/bin/mrtg root@nat2:/usr/local/bin/mrtg
scp /usr/local/lib/perl5/site_perl/5.6.1/locales_mrtg.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/locales_mrtg.pm
scp /usr/local/bin/rrdtool root@nat2:/usr/local/bin/rrdtool
scp /usr/local/lib/perl5/site_perl/5.6.1/mach/RRDs.pm root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/mach/RRDs.pm
rsync -av /usr/local/lib/perl5/site_perl/5.6.1/mach/auto/RRDs/ root@nat2:/usr/local/lib/perl5/site_perl/5.8.9/mach/auto/RRDs/
scp /usr/lib/libz.so.2 root@nat2:/usr/lib/libz.so.2
scp /usr/lib/libm.so.2 root@nat2:/usr/lib/libm.so.2
rsync -av /usr/local/lib/librrd* root@nat2:/usr/local/lib/
scp /usr/lib/libc.so.4 root@nat2:/usr/lib/libc.so.4

rsync -av /usr/ports/net/rrdtool root@nat2:/usr/ports/net
cd /usr/ports/net/rrdtool
make install

mkdir -p /mnt/data1/mrtg/data
scp /usr/local/www/mgmt/mrtg/template.pl root@nat2:/mnt/data1/mrtg/
scp /usr/local/www/mgmt/mrtg/host.pl root@nat2:/mnt/data1/mrtg/

cfgmaker --if-template=template.pl --show-op-down --global "options[_]: growright,bits" --global 'WorkDir: /mnt/data1/mrtg/data' --global 'Interval: 1' --global 'LogFormat: rrdtool' --global 'PathAdd: /usr/local/bin' --global 'LibAdd: /usr/local/lib' --host-template=host.pl jc292401@10.1.2.50 --output=switch-p20.cfg

cat > /mnt/data1/mrtg/mrtg.sh
#!/bin/sh
/usr/local/bin/mrtg /mnt/data1/mrtg/switch-p20.cfg

chmod 0700 /mnt/data1/mrtg/mrtg.sh

crontab -e
* * * * * /mnt/data1/mrtg/mrtg.sh 2>&1 > /dev/null
  • snmp firewall block
cat > /usr/local/etc/rc.d/boot.sh
ipfw add 10 allow udp from 69.55.230.2 to any 161
ipfw add 10 allow udp from 10.1.2.1 to any 161
ipfw add 11 deny udp from any to any 161
chmod 0700 /usr/local/etc/rc.d/boot.sh

bwdb[edit]

Summary[edit]

This machine tracks and stores network traffic (netflow) at castle. It is our means to monitor customer bandwidth usage.

  • Location: castle, cab 3-7
  • OS: FreeBSD 4.10 x86
  • Networking: Priv IP: 10.1.4.203 There are 2 onboard nic's, one of which is the "listener"
  • Hardware: Custom 1U. Single power supply.
  • Drives: one 250 GB (2 x 250GB) RAID1 array running on a Promise IDE RAID card.

Services Provided[edit]

  • netflow
  • mysql
  • bigbrother
  • snmp

netflow[edit]

The main function of this server is to run netflow on an eth device in promiscuous mode so as to hear everything happening on the port (wherein all network traffic is mirrored to that port via the cisco swith). Every 15min, it creates a flow file under /usr/home/flows/ (organized by date). The flow file contains all traffic data for a 15min increment of time.

A cronjob moves that flow file (or files if there are multiple due to some delay)

1,16,31,46 * * * * /usr/home/flowbin/queue.pl

into a processing queue: /usr/home/working

Then a separate file processes whatever flow files it finds there, inserting the data into the local mysql database:

2,17,32,47 * * * * /usr/home/flowbin/processflows.pl

mysql[edit]

The database storing all the traffic data is named traffic Tables:

mysql> show tables;
+---------------------------+
| Tables_in_traffic         |
+---------------------------+
| dailyIpTotals_69_55_224   |
| dailyIpTotals_69_55_225   |
| dailyIpTotals_69_55_226   |
| dailyIpTotals_69_55_227   |
| dailyIpTotals_69_55_228   |
| dailyIpTotals_69_55_229   |
| dailyIpTotals_69_55_230   |
| dailyIpTotals_69_55_231   |
| dailyIpTotals_69_55_232   |
| dailyIpTotals_69_55_233   |
| dailyIpTotals_69_55_234   |
| dailyIpTotals_69_55_235   |
| dailyIpTotals_69_55_236   |
| dailyIpTotals_69_55_237   |
| dailyIpTotals_69_55_238   |
| dailyIpTotals_69_55_239   |
| dailyPortTotals_69_55_224 |
| dailyPortTotals_69_55_225 |
| dailyPortTotals_69_55_226 |
| dailyPortTotals_69_55_227 |
| dailyPortTotals_69_55_228 |
| dailyPortTotals_69_55_229 |
| dailyPortTotals_69_55_230 |
| dailyPortTotals_69_55_231 |
| dailyPortTotals_69_55_232 |
| dailyPortTotals_69_55_233 |
| dailyPortTotals_69_55_234 |
| dailyPortTotals_69_55_235 |
| dailyPortTotals_69_55_236 |
| dailyPortTotals_69_55_237 |
| dailyPortTotals_69_55_238 |
| dailyPortTotals_69_55_239 |
| ipTotals_69_55_224        |
| ipTotals_69_55_225        |
| ipTotals_69_55_226        |
| ipTotals_69_55_227        |
| ipTotals_69_55_228        |
| ipTotals_69_55_229        |
| ipTotals_69_55_230        |
| ipTotals_69_55_231        |
| ipTotals_69_55_232        |
| ipTotals_69_55_233        |
| ipTotals_69_55_234        |
| ipTotals_69_55_235        |
| ipTotals_69_55_236        |
| ipTotals_69_55_237        |
| ipTotals_69_55_238        |
| ipTotals_69_55_239        |
| portTotals_69_55_224      |
| portTotals_69_55_225      |
| portTotals_69_55_226      |
| portTotals_69_55_227      |
| portTotals_69_55_228      |
| portTotals_69_55_229      |
| portTotals_69_55_230      |
| portTotals_69_55_231      |
| portTotals_69_55_232      |
| portTotals_69_55_233      |
| portTotals_69_55_234      |
| portTotals_69_55_235      |
| portTotals_69_55_236      |
| portTotals_69_55_237      |
| portTotals_69_55_238      |
| portTotals_69_55_239      |
+---------------------------+

So as you see we store each class-C block in its own table, for efficiency. Further, we store and organize data in 4 ways: "daily" tables and 15-minute granularity tables, and for each of those we track simple IP traffic and port-specific traffic. The daily tables contains 2 entries (one for each direction) for each IP for each day. For the current day, the row data is incremented as the day goes on.

mysql> describe dailyIpTotals_69_55_224;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id        | varchar(23) |      | PRI |         |       |
| date      | date        | YES  |     | NULL    |       |
| ip        | varchar(15) | YES  | MUL | NULL    |       |
| direction | tinyint(1)  | YES  |     | NULL    |       |
| octets    | bigint(12)  | YES  |     | NULL    |       |
| packets   | int(11)     | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

mysql> select * from dailyIpTotals_69_55_224 limit 1\G
*************************** 1. row ***************************
       id: 6955224194-20100917-1
     date: 2010-09-17
       ip: 69.55.224.194
direction: 1
   octets: 8821
  packets: 91

The id is a unique identifier (key), direction indicates incoming or outgoing traffic (outbound = 2, inbound = 1), octets are the amount of traffic in kilobytes, and packets is the total number of packets.

The 15-minute table has similar information, but it's organized in 15 minute increments:

mysql> describe ipTotals_69_55_224;
+-----------+------------+------+-----+---------+-------+
| Field     | Type       | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| date      | datetime   | YES  |     | NULL    |       |
| ip        | char(15)   | YES  | MUL | NULL    |       |
| direction | tinyint(1) | YES  |     | NULL    |       |
| octets    | bigint(20) | YES  |     | NULL    |       |
| packets   | int(11)    | YES  |     | NULL    |       |
+-----------+------------+------+-----+---------+-------+

mysql> select * from ipTotals_69_55_224 limit 2\G
*************************** 1. row ***************************
     date: 2010-01-11 19:30:00
       ip: 69.55.224.13
direction: 1
   octets: 288
  packets: 6
*************************** 2. row ***************************
     date: 2010-01-11 19:30:00
       ip: 69.55.224.12
direction: 1
   octets: 216
  packets: 4

So for a given IP, there will be 192 rows in a given day: 4 rows per hour, *2 for 2 directions, *24 for 24hours in a day. Obviously this table is large which is why we broke it down into a daily table for quick, easy, daily-summary access.

That covers the simple traffic tabulation tables. We also track traffic by port:

mysql> describe dailyPortTotals_69_55_224;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id        | varchar(28) |      | PRI |         |       |
| date      | date        | YES  |     | NULL    |       |
| ip        | varchar(15) | YES  | MUL | NULL    |       |
| direction | tinyint(1)  | YES  |     | NULL    |       |
| protocol  | smallint(3) | YES  |     | NULL    |       |
| port      | int(11)     | YES  |     | NULL    |       |
| octets    | bigint(11)  | YES  |     | NULL    |       |
| packets   | int(11)     | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

mysql> select * from dailyPortTotals_69_55_224 limit 1\G
*************************** 1. row ***************************
       id: 695522496-20091218-1-6-23
     date: 2009-12-18
       ip: 69.55.224.96
direction: 1
 protocol: 6
     port: 23
   octets: 1796
  packets: 30

mysql> select * from portTotals_69_55_224 limit 1\G
*************************** 1. row ***************************
     date: 2010-09-07 18:45:00
       ip: 69.55.224.254
direction: 1
 protocol: 6
     port: 99999
   octets: 144
  packets: 3

This is largely the same with 2 more additions: protocol (1=ICMP, 6=TCP, 17=UDP), and port which we set to 99999 if the traffic is return traffic and the port is above 1024. Obviously the potential for number of rows grows quickly when you consider the addition of port and protocol tracking per IP.

Regular maintenance[edit]

archive_daily.pl 2012 09

This will archive data for the given year and month from the daily summary tables. Generally we want to have a year of history in the database.

archive_15min.pl 2012 09

This will archive data for the given year and month from the 15min-increment tables. Generally, we want to have 6 months of history in the database.

  • if space becomes tight, move flow files and exported data to a backup server, both located in /usr/home/flowbin/archive and /usr/home/exported, respectively

Slaving[edit]

If we were going to setup traffic database slaving (we don't do this anymore), perhaps cause the bwdb machine gets busy and it cannot handle traffic requests and netflow, here's how it's done:

On the traffic master:

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.1.4.8' IDENTIFIED BY 'qERUG8wf';

in my.cnf:

bin-log
server-id=1
max_binlog_size=500M
expire_logs_days = 3

on slave: in my.cnf:

server-id       = 2
master-host     =   10.1.4.203
master-user     =   repl
master-password =   qERUG8wf
master-connect-retry=60
replicate-wild-do-table=traffic.daily%
max_relay_log_size=500M
expire_logs_days = 3

replicate-wild-do-table=traffic.%

on master:

touch /usr/home/working/.lock

(make sure processflows not running)

FLUSH TABLES WITH READ LOCK;
cd /usr/home/database/traffic
tar -czf mysql-traffic-snapshot.tgz ./daily*
(~1G)
SHOW MASTER STATUS;
+-----------------+-----------+--------------+------------------+
| File            | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+-----------+--------------+------------------+
| bwdb-bin.000039 | 154432615 |              |                  |
+-----------------+-----------+--------------+------------------+

(write down info)
UNLOCK TABLES;
scp mysql-traffic-snapshot.tgz 10.1.4.5:/mnt/data1/db/mysql/traffic/

on slave:

mkdir /mnt/data1/db/mysql/traffic
cd /mnt/data1/db/mysql/traffic/
tar xzvf mysql-traffic-snapshot.tgz
(restart mysql)
CHANGE MASTER TO MASTER_HOST='10.1.4.203',MASTER_USER='repl',MASTER_PASSWORD='qERUG8wf',MASTER_LOG_FILE='bwdb-bin.000059',MASTER_LOG_POS=482502186;
START SLAVE;
cd /usr/home/database/traffic
scp *
optimize table dailyPortTotals_69_55_224;
optimize table dailyPortTotals_69_55_225;
optimize table dailyPortTotals_69_55_226;
optimize table dailyPortTotals_69_55_227;
optimize table dailyPortTotals_69_55_228;
optimize table dailyPortTotals_69_55_229;
optimize table dailyPortTotals_69_55_230;
optimize table dailyPortTotals_69_55_231;
optimize table dailyPortTotals_69_55_232;
optimize table dailyPortTotals_69_55_233;
optimize table dailyPortTotals_69_55_234;
optimize table dailyPortTotals_69_55_235;
optimize table dailyPortTotals_69_55_236;
optimize table dailyPortTotals_69_55_237;
optimize table dailyPortTotals_69_55_238;
optimize table dailyPortTotals_69_55_239;

Build[edit]

BIOS Config[edit]

disable quiet boot

set to last state after power loss

set date/time to GMT

enable serial console output (baud rate 115200)

Install OS[edit]

Install FreeBSD 8.3 amd64

  • partition map:
/ 500m
swap 4096m
/var 256m
/tmp 256m
/usr ~
  • edit /etc/make.conf

Castle:

echo "WITHOUT_X11=yes \
KERNCONF=bwdb \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf

i2b:

echo "WITHOUT_X11=yes \
KERNCONF=bwdb2 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf
  • add settings to /boot/loader.conf and /boot.config
echo "-Dh" >> /boot.config

echo 'console="comconsole,vidconsole" \
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf
  • turn off all ttyv's except 0 and 1 in /etc/ttys

also turn on ttyu0, change type to vt100:

vi /etc/ttys

ttyv2   "/usr/libexec/getty Pc"         cons25  off secure
ttyv3   "/usr/libexec/getty Pc"         cons25  off secure
ttyv4   "/usr/libexec/getty Pc"         cons25  off secure
ttyv5   "/usr/libexec/getty Pc"         cons25  off secure
ttyv6   "/usr/libexec/getty Pc"         cons25  off secure
ttyv7   "/usr/libexec/getty Pc"         cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyu0   "/usr/libexec/getty std.9600"   vt100   on secure

kill -1 1

on console server:

vi /etc/remote

(rename port to jail8 depending on where and which digi plugged into) test serial console


  • populate hosts

i2b:

echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts

castle:

echo "10.1.4.3 backup2 backup2.johncompanies.com" >> /etc/hosts
echo "10.1.4.8 backup1 backup1.johncompanies.com" >> /etc/hosts
echo "10.1.4.4 mail mail.johncompanies.com" >> /etc/hosts
  • put key in authorized_keys on backup1 and backup2
cd
ssh-keygen -t dsa -b 1024 

(default location, leave password blank)

castle:

cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys' 

i2b:

cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys' 

confirm that you can ssh to backup2 and backup1 (and backup3 if at i2b) without getting a login prompt

ssh backup1 hostname
ssh backup2 hostname
  • edit root's path and login script:
vi /root/.cshrc

Change alias entries (add G):

alias la        ls -aG
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG

and alter the prompt, set the following:

set prompt = "`/bin/hostname -s` %/# "
  • install cvsup
cd /usr/ports/net/cvsup-without-gui 
make install clean; rehash; mail -s 'cvs installed' support@johncompanies.com < /dev/null
  • get latest sources for this release:
cd /usr/src 
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_8_3\
*default delete use-rel-suffix\
*default compress\
src-all" > sup

cvsup sup ; mail -s 'cvs sup done' support@johncompanies.com < /dev/null
  • configure new kernel
cd /usr/src/sys/amd64/conf 
scp backup2:/mnt/data4/build/freebsd/kern_config-bwdb-8.3-amd64 ./bwdb

Edit config and change name:

vi bwdb
ident  bwdb
  • build, install kernel and world
cd /boot

mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel

make buildworld ; mail -s 'buildworld done' support@johncompanies.com < /dev/null
(2450: 1:56min, supermicro: 59mins, 2950: 38mins)
make installworld 
(2450: 3min, supermicro: 1min, 2950: :34)
mergemaster -i
  • populate /etc/rc.conf with IPs and NFS settings

castle:

vi /etc/rc.conf

hostname="bwdb.johncompanies.com"
kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"

xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
ifconfig_fxp0="inet 10.1.4.203 netmask 255.255.255.0"
ifconfig_em0="up promisc"
defaultrouter="10.1.4.1"
snmpd_enable="YES"

inetd_enable="YES"
inetd_flags="-wW -a 10.1.4.203"
fsck_y_enable="YES"
background_fsck="NO"
sshd_enable="YES"
ipfw_load="YES"

i2b:

vi /etc/rc.conf

hostname="bwdb2.johncompanies.com"
kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"

xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
ifconfig_fxp0="inet 10.1.2.4 netmask 255.255.255.0"
ifconfig_em0="up promisc"
defaultrouter="10.1.2.1"
snmpd_enable="YES"

inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.4"
fsck_y_enable="YES"
background_fsck="NO"
sshd_enable="YES"
ipfw_load="YES"
  • reboot. Confirm new kernel is loaded
uname -a
  • update ports:
cd /usr/ports
echo "*default host=cvsup4.FreeBSD.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_8_3\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup

cvsup sup; mail -s 'cvs sup ports done' support@johncompanies.com < /dev/null
  • Install raid mgmt tool
cd /usr/local/sbin
scp backup2:/d4/build/3ware/tw_cli-freebsd-x86_64-9.5.0.1.tgz .
tar xzf tw_cli-freebsd-x86_64-9.5.0.1.tgz
rm tw_cli-freebsd-x86_64-9.5.0.1.tgz
chmod 0700 tw_cli

Test:

./tw_cli info c0

Grab raid check script:

scp backup1:/usr/local/sbin/3wraidchk /usr/local/etc

Setup cronjob:

crontab -e
*/5 * * * * /usr/local/etc/3wraidchk
  • install rsync from ports
cd /usr/ports/net/rsync
make install clean

choose default options

  • install perl from ports
cd /usr/ports/lang/perl5.8
make install clean

choose default options

  • install bb client

Compiling from source on AMD64 will not work. So, we use a linux-compiled version and rely on linux compat. Linux compat won't install on 8.x - libtool 2.4 need. So, instead we copy(ed) over linux:

rsync -aSHv --exclude=proc --exclude=sys 10.1.4.108:/usr/compat/linux/ /usr/compat/linux/
adduser

Output/response:

Username: bb
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username   : bb
Password   : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups     : bb
Home       : /home/bb
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd_linuxcompat.tgz .
tar xzf bb-freebsd_linuxcompat.tgz

edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:

echo "10.1.4.5 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.4.203 bwdb.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts

Edit for machine name and private IP.

if this machine is at i2b:

echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.4 bwdb2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
vi /home/bb/bbc1.9e-btf/ext/openfiles 

MACHINE="bwdb,johncompanies,com"      # HAS TO BE IN A,B,C FORM

Edit for machine name.

Have bb watch for flow-capture, mysql

cat >> /home/bb/bbc1.9e-btf/etc/bb-proctab
localhost: flow-capture :
localhost: mysqld :


cd /usr/home/bb/bbc1.9e-btf/etc
./bbchkcfg.sh 
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf
./runbb.sh start
more BBOUT 
(look for errors)
exit

Put in script to start bb @ boot:

echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh


If this is at i2b, punch a hole in the firewall to allow it to communicate with bb monitor:

ipfw add 00096 allow tcp from 66.181.18.0/27 to 69.55.230.2


  • configure bb on mail
vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
10.1.4.203 bwdb.johncompanies.com # ssh

su bb
cd
bbsrc/bb/runbb.sh restart ; exit
  • configure ntp server

Castle:

echo "server 10.1.4.1" > /etc/ntp.conf

I2b:

echo "server 10.1.2.1" > /etc/ntp.conf
/usr/sbin/ntpd -p /var/run/ntpd.pid
sleep 2; ntpq -p

(confirm it’s able to reach our time server)

echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
chmod 0700 /usr/local/etc/rc.d/ntp.sh
  • fwd and reverse lookups on ns1c

vr johncompanies.com

(edit the PTR too)
  • setup backups
echo '#\!/bin/sh\
backupdir=/data/bwdb/current\
server=backup1\
\
## ENTRY /etc\
## ENTRY /usr/home/flowbin\
## ENTRY /usr/home/database' > /usr/local/etc/backup.config

Castle: setup backup dirs:

ssh backup1 mkdir -p /data/bwdb/current

on backup1, add the system to

vi /usr/local/sbin/snapshot_rotate

I2b: setup backup dirs:

ssh backup3 mkdir -p /data/bwdb/current

on backup3, add the system to

vi /usr/local/sbin/snapshot_archive


Copy over the backup script:

scp backup2:/d4/bin/freebsd8.x/rsync.backup /usr/local/etc/

Edit rsync.backup and change config var to point to correct config file location: /usr/local/etc/backup.config

crontab -e
5 0 * * * /usr/local/etc/rsync.backup
  • make /root/logs
mkdir /root/logs
  • edit sshd_config for security
vi /etc/ssh/sshd_config
ListenAddress 10.1.4.203
PermitRootLogin yes

kill -1 `cat /var/run/sshd.pid`

Edit for private IP.

  • snmp

(Before doing this you may need to take down the firewall and also add to resolv.conf 69.43.143.41)

cd /usr/ports/net-mgmt/net-snmp
make install clean
(defaults)

cat >> /etc/rc.conf
snmpd_enable="YES"
snmpd_flags="-a"
snmpd_conffile="/usr/local/share/snmp/snmpd.conf"
snmptrapd_enable="YES"
snmptrapd_flags="-a -p /var/run/snmptrapd.pid"

cat > /usr/local/share/snmp/snmpd.conf
rocommunity  jcread 10.1.4.5
rocommunity  jcread 10.1.4.202

netflow[edit]

Install flow tools:

cd /usr/ports/net-mgmt/flow-tools
make install clean

Defaults.

mkdir /usr/home/flows

Flow start script:

echo "/usr/local/bin/flow-capture -w /usr/home/flows -S5 -N -2 0/10.1.4.203/4444" > /usr/local/etc/rc.d/flow-capture.sh
chmod 0700 /usr/local/etc/rc.d/flow-capture.sh

Edit for private IP.

Netgraph start script:

cat > /usr/local/etc/rc.d/netgraph.sh

/usr/sbin/ngctl -f- <<-SEQ
mkpeer em0: netflow lower iface0
name em0:lower netflow
connect em0: netflow: upper out0
mkpeer netflow: ksocket export inet/dgram/udp
msg netflow:export connect inet/10.1.4.203:4444
SEQ

#/usr/sbin/ngctl -f- <<-SEQ
#shutdown netflow:
#SEQ

chmod 0700 /usr/local/etc/rc.d/netgraph.sh

Edit for private IP.

Confirm netflow is running after running scripts:

newbwdb /usr/ports/net-mgmt/flow-tools# /usr/sbin/ngctl
Available commands:
  config     get or set configuration of node at <path>
  connect    Connects hook <peerhook> of the node at <relpath> to <hook>
  debug      Get/set debugging verbosity level
  dot        Produce a GraphViz (.dot) of the entire netgraph.
  help       Show command summary or get more help on a specific command
  list       Show information about all nodes
  mkpeer     Create and connect a new node to the node at "path"
  msg        Send a netgraph control message to the node at "path"
  name       Assign name <name> to the node at <path>
  read       Read and execute commands from a file
  rmhook     Disconnect hook "hook" of the node at "path"
  show       Show information about the node at <path>
  shutdown   Shutdown the node at <path>
  status     Get human readable status information from the node at <path>
  types      Show information about all installed node types
  write      Send a data packet down the hook named by "hook".
  quit       Exit program
+ show netflow:
  Name: netflow         Type: netflow         ID: 00000004   Num hooks: 3
  Local hook      Peer name       Peer type    Peer ID         Peer hook
  ----------      ---------       ---------    -------         ---------
  export          <unnamed>       ksocket      00000005        inet/dgram/udp
  out0            em0             ether        00000001        upper
  iface0          em0             ether        00000001        lower
+

We notice that sometimes flow-capture is failing due to swap exhaustion (even after adding more swap). So we crontab flow-capture to restart (it's ok to start if it's already running, it just quits):

crontab -e
#restart flow-capture
*/15 * * * * /usr/local/etc/rc.d/flow-capture.sh

process flow tools[edit]

mkdir /usr/home/flowbin
mkdir /usr/home/working

Install modules:

cd /usr/ports/devel/p5-Date-Calc
make install clean
cd /usr/ports/mail/p5-Mail-Sendmail
make install clean

Queue script:

cat > /usr/home/flowbin/queue.pl
#!/usr/bin/perl

use strict;

BEGIN {
    push @INC, "/usr/home/flowbin";
}

use date;

my $flowbase = "/usr/home/flows";
#my $flowqueue = "/usr/home/queue";
my $flowqueue = "/usr/home/working";

my ($date, $time) = date::CurrentDateTime();

my $flowdir = mkFlowDir($date);
`mv $flowdir/ft-* $flowqueue`;

if (date::DateWindow($date, $time, $date, "00:00:00", 600)) {
    my $newdate = date::AddDays($date, -1);
    my $flowdir = mkFlowDir($newdate);
    `mv $flowdir/ft-* $flowqueue`;
}

sub mkFlowDir {
    my $date = shift;
    $date =~ /([0-9]{4}-[0-9]{2})/;
    my $yearmonth = $1;
    return "$flowbase/$yearmonth/$date";
}

Date.pm module:

cat > /usr/home/flowbin/date.pm
#!/usr/local/bin/perl
#
# $Header: /usr/cvs/newgw/lib/date.pm,v 1.2 2003/11/24 17:06:02 glenn Exp $
#
# Copyright (c) 2001, 2002, 2003
#      e-Monitoring Networks, Inc.  All rights reserved.
#
#
#
# date.pl - Higher level functions written on top of Date::Calc

package date;

use strict;
use Date::Calc qw(:all);

sub DayDiff { #calculate the difference in days from two dates
    my $date1 = shift;
    my $date2 = shift;
    my ($year1, $month1, $day1) = &DateToymd($date1);
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my $diff = &Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
    return $diff;
}

sub AddDays { #adds specified number of days to the supplied date
    my $date = shift;
    my $days = shift;
    my ($year, $month, $day) = &DateToymd($date);
    my ($nyear, $nmonth, $nday) = &Add_Delta_Days($year, $month, $day, $days);
    my $ndate = &ymdToDate($nyear, $nmonth, $nday);
    return $ndate;
}

sub AddHours { #adds specified number of hours to the supplied date and time
    my $date = shift;
    my $time = shift;
    my $addhours = shift;
    my $adddays = 0;
    if (abs($addhours / 24) >= 1) {
        $adddays = int($addhours / 24);
        $addhours -= $adddays * 24;
    }
    my ($year, $month, $day) = &DateToymd($date);
    my ($hour, $minute, $second) = &TimeTohms($time);
    my ($ny, $nm, $nd, $nh, $nmin, $ns) = &Add_Delta_DHMS($year, $month, $day,
                                                          $hour, $minute, $second,
                                                          $adddays, $addhours, 0, 0);
    my $ndate = &ymdToDate($ny, $nm, $nd);
    my $ntime = &hmsToTime($nh, $nmin, $ns);
    return $ndate, $ntime;
}

sub AddMinutes {
    my $date = shift;
    my $time = shift;
    my $minutes = shift;
    my ($year, $month, $day) = &DateToymd($date);
    my ($hour, $minute, $second) = &TimeTohms($time);
    my ($ny, $nm, $nd, $nh, $nmin, $ns) = &Add_Delta_DHMS($year, $month, $day,
                                                          $hour, $minute, $second,
                                                          0, 0, $minutes, 0);
    my $ndate = &ymdToDate($ny, $nm, $nd);
    my $ntime = &hmsToTime($nh, $nmin, $ns);
    return $ndate, $ntime;
}

sub CurrentDateTime { #return the current date and time
    my ($y, $m, $d, $h, $min, $s, $z, $z, $z) = &System_Clock;
    my $date = &ymdToDate($y, $m, $d);
    my $time = &hmsToTime($h, $min, $s);
    return $date, $time;
}

sub Currentymd { #return the current year, month and day as separate variables
    my ($y, $m, $d, $h, $min, $s, $z, $z, $z) = &System_Clock;
    return $y, $m, $d;
}

sub DateToymd { #takes a date and returns year, month, day as individual values
    my $date = shift;
    if ($date =~ /([0-9]{4})-([0-9]{2})-([0-9]{2})/) {
        my $day = $3;
        my $month = $2;
        my $year = $1;
        return $year, $month, $day;
    }
    return undef;
}

sub TimeTohms { #takes a time and return hours minutes and seconds as individual values
    my $time = shift;
    if ($time =~ /([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})/) {
        my $hour = $1;
        my $minute = $2;
        my $second = $3;
        if ($hour !~ /[0-9]{2}/) { $hour = "0$hour"; }
        if ($minute !~ /[0-9]{2}/) { $minute = "0$minute"; }
        if ($second !~ /[0-9]{2}/) { $second = "0$second"; }
        return $hour, $minute, $second;
    }
    return undef;
}

sub ymdToDate { #takes year, month, day and assembles them into our date format
    my $year = shift;
    my $month = shift;
    my $day = shift;
    if (defined($year) && defined($month) && defined ($day)) {
        $month = sprintf("%02d", $month);
        $day = sprintf("%02d", $day);
        return "$year-$month-$day";
    }
    return undef;
}

sub hmsToTime { #takes hour minute and second and assembles them into our time format
    my $hour = shift;
    my $minute = shift;
    my $second = shift;
    if (defined($hour) && defined($minute) && defined ($second)) {
        if ($hour !~ /[0-9]{2}/) { $hour = "0$hour"; }
        if ($minute !~ /[0-9]{2}/) { $minute = "0$minute"; }
        if ($second !~ /[0-9]{2}/) { $second = "0$second"; }
        return sprintf ("%02d:%02d:%02d", $hour, $minute, $second);
    }
    return undef;
}

sub CompareDates { #compares two date and time pairs
    my $date1 = shift;
    my $time1 = shift;
    my $date2 = shift;
    my $time2 = shift;

    my ($year1, $month1, $day1) = &DateToymd($date1);
    my ($hour1, $minute1, $second1) = &TimeTohms($time1);
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my ($hour2, $minute2, $second2) = &TimeTohms($time2);

#    &debug("$year1, $month1, $day1, $year2, $month2, $day2");
    my $days = &Delta_Days($year1, $month1, $day1, $year2, $month2, $day2);
    if ($days > 0) { return 1;}
    if ($days < 0) { return -1;}
    if ($days == 0) { #same day, compare times
        my $seconds1 = $second1 + (60 * $minute1) + (3600 * $hour1);
        my $seconds2 = $second2 + (60 * $minute2) + (3600 * $hour2);
        if ($seconds1 < $seconds2) { return 1;}
        if ($seconds1 > $seconds2) { return -1;}
        if ($seconds1 == $seconds2) { return 0;}
    }
    return undef;
}

sub DateWindow { #compares two date time pairs to see if they are < X seconds apart
    my $date1 = shift;
    my $time1 = shift;
    my $date2 = shift;
    my $time2 = shift;
    my $window = shift;

    my ($year1, $month1, $day1) = &DateToymd($date1);
    my ($hour1, $minute1, $second1) = &TimeTohms($time1);
    my ($year2, $month2, $day2) = &DateToymd($date2);
    my ($hour2, $minute2, $second2) = &TimeTohms($time2);

    my ($day, $hour, $minute, $second) =
        &Delta_DHMS($year1, $month1, $day1, $hour1, $minute1, $second1,
                    $year2, $month2, $day2, $hour2, $minute2, $second2);
    $minute *= 60;
    $hour *= 3600;
    $day *= 86400;
    my $total = $second + $minute + $hour + $day;
    if (abs($total) < $window) {
        return 1;
    }
    return 0;
}

sub CheckDateOrder { #takes three dates/times, returns true if they are in chronological order
    my $date1 = shift;
    my $time1 = shift;
    my $date2 = shift;
    my $time2 = shift;
    my $date3 = shift;
    my $time3 = shift;
    if (&CompareDates($date1, $time1, $date2, $time2) == -1) {
        return 0;
    }
    if (&CompareDates($date2, $time2, $date3, $time3) == -1) {
        return 0;
    }
    return 1;
}

sub EpochSeconds { #calculates number of seconds since the epoch for the given date/time
    my $date = shift;
    my $time = shift;
    my ($year, $month, $day) = &DateToymd($date);
    my ($hour, $minute, $second) = &TimeTohms($time);
    my ($d, $h, $m, $s) = &Delta_DHMS(1970, 1, 1, 0, 0, 0,
                                      $year, $month, $day, $hour, $minute, $second);
    my $seconds = $s + (60 * $m) + (3600 * $h) + (86400 * $d);
    return $seconds;
}

sub SecondsToDateTime { #converts seconds since epoch to date/time
    my $seconds = shift;
    my $days = int($seconds / 86400);
    $seconds -= $days * 86400;
    my $hours = int($seconds / 3600);
    $seconds -= $hours * 3600;
    my $minutes = int($seconds / 60);
    $seconds -= $minutes * 60;
    my ($year, $month, $day, $hour, $minute, $second) =
        &Add_Delta_DHMS(1970, 1, 1, 0, 0, 0, $days, $hours, $minutes, $seconds);
    $month = sprintf("%02d", $month);
    $day = sprintf("%02d", $day);
    $hour = sprintf("%02d", $hour);
    $minute = sprintf("%02d", $minute);
    $second = sprintf("%02d", $second);
    return "$year-$month-$day", "$hour:$minute:$second";
}

sub DateToDayName {
    my $date = shift;
    my ($year, $month, $day) = &DateToymd($date);
    my $name = &Day_of_Week_to_Text(&Day_of_Week($year, $month, $day));
    $name =~ /^[A-Za-z]{3}/;
    $name = $&;
    return $name;
}

sub ValiDate {
    return @_;



}

sub CheckBusinessDay { # checks to see if date is business day. 1=yes, 0=no
    my $date = shift;
    my ($year, $month, $day) = &DateToymd($date);
    if (Day_of_Week($year,$month,$day) < 6) { return 1; }
    else { return 0; }
}

1; #don't remove this line
chmod 0700 /usr/home/flowbin/queue.pl

Setup cronjob:

crontab -e
#move flow data into the queue
1,16,31,46 * * * * /usr/home/flowbin/queue.pl

flow processing: i2b[edit]

cat > /usr/home/flowbin/processflows-sql.pl
#!/usr/bin/perl

#use strict;
#$debug=1;
#$dry=1;

my $log = '/usr/home/flowbin/discards.log';

use Data::Dumper;

BEGIN {
    push @INC, "/usr/home/flowbin";
}

#my $queuedir = "/usr/home/queue";
my $queuedir = "/usr/home/working";
my $archivedir = "/usr/home/archive";
my $sqldir = "/usr/home/sql";
my $sqldirworking = "/usr/home/sql/tmp";

unless ($dry) {
    if (-e "$queuedir/.lock") {
        open(FILE, "$queuedir/.lock");
        my $pid = <FILE>;
        chomp($pid);
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $queuedir/.lock`;
        }
    }
    open(FILE, "> $queuedir/.lock");
    print FILE "$$\n";
    close(FILE);
}

opendir(DIR, $queuedir);
my @files = readdir(DIR);
closedir(DIR);

foreach my $file (sort @files) {
    unless($file =~ /^\./) {
        $file =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})\.([0-9]{2})([0-9]{2})([0-9]{2})/;
        my $date = "$1 $2:$3:$4";
        my $outfile = "$1-$2:$3.sql";
        unless (open (SQL, "+> $sqldirworking/$outfile")) { die "cant open $sqldirworking/$outfile"; }
        my $condensedDate = $1;
        $condensedDate =~ s/-//g;
        my $iptotal = {};
        my $protototal = {};
        my $porttotal = {};

        &debug("started file $file at ");
        &debug(`date`);
        &debug("getting raw flow data (flow-print)");
        `cat $queuedir/$file | /usr/local/bin/flow-print -f 5 > /usr/home/working/tmp-$file`;
        &debug("aggregating data at ");
        &debug(`date`);
        unless (open(DATA, "/usr/home/working/tmp-$file")) { die "can't open: $!"; }
        LOOP: while (my $line = readline DATA) {
            my @d = split /[\s]+/, $line;
            if ($d[0] ne '' && $d[0] ne 'Start') {
                my $addr = 0;
                my $port = 0;

                #Start End Sif SrcIPaddress SrcP DIf DstIPaddress DstP P Fl Pkts Octets
                #0     1   2   3            4    5   6            7    8 9  10   11
                          #|
                          # outbound = 2, inbound = 1

                my (@src_ip) = split '\.', $d[3];
                my (@dst_ip) = split '\.', $d[6];

                if ($src_ip[0] == 69 && $src_ip[1] == 55 && ($src_ip[2] == 229 || $src_ip[2] == 231)) { # for i2b
                   $d[2] = 2;
                   # hack for outbound bulk traffic counted 2x
                   #if ($src_ip[2] == 231) { $d[11] /= 2; $d[10] /= 2; }
                }
                # note- this is where we filter out IPs only found at i2b
                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 && ($dst_ip[2] == 229 || $dst_ip[2] == 231)) { # for i2b
                   $d[2] = 1;
                }
                else { next LOOP; }

                if ($d[2] == 2) {
                    $addr = $d[3];
                    # if the dst-port is low, store that
                    if ($d[7] <= 1024) { $port = $d[7]; }
                    # if the src-port is low, store that
                    elsif ($d[4] <= 1024) { $port = $d[4]; }
                    else { $port = 99999; }
                }
                elsif ($d[2] == 1) {
                    $addr = $d[6];
                    # if the dst-port is high, assume its return traffic, try to store src-port if low
                    if ($d[7] > 1024) {
                        if ($d[4] <= 1024) { $port = $d[4]; }
                        else { $port = 99999; }
                    } else {
                        $port = $d[7];
                    }
                } else {
                    next LOOP;
                }

                my (@ip) = split '\.', $addr;
                unless ($ip[0] == 69) { next LOOP; }
                unless ($ip[1] == 55) { next LOOP; }
                unless ($ip[2] == 229 || $ip[2] == 231) { next LOOP; }

                my $classC = "$ip[0]_$ip[1]_$ip[2]";

#                          IP        dir
#                if ($d[10] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11]; }
#
#                if ($d[10] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11]; }
#
#                if ($d[10] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'octetTotal'} += $d[11]; }
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10];
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11];

                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10];
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11];

                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'pktTotal'} += $d[10];
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'octetTotal'} += $d[11];
            }
        }
        close(DATA);
        `rm /usr/home/working/tmp-$file`;
        &debug("processing ip totals at ");
        &debug(`date`);
        foreach my $classC (keys(%{$iptotal})) {
            my @values;
            foreach my $ip (keys(%{$iptotal->{$classC}})) {
                foreach my $dir (keys(%{$iptotal->{$classC}->{$ip}})) {
                    my $octets = $iptotal->{$classC}->{$ip}->{$dir}->{'octetTotal'};
                    my $packets = $iptotal->{$classC}->{$ip}->{$dir}->{'pktTotal'};
#                    $packets = $packets > 2147483647 ? 0 : $packets;
                    if ($octets > 2147483647) {
                        my $ddir = $dir==1 ? 'in' : 'out';
                        #print SQL "$date $ip $ddir $octets\n";
#                        $octets = 0;
                    }
                    # dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
                    my $id = "$ip-$condensedDate-$dir";
                    $id =~ s/\.//g;
                    push @values, "('$date', '$ip', $dir, $octets, $packets)";
                    my $sql = "insert into dailyIpTotals_$classC values ('$id', '$date', '$ip', $dir, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                    print "$sql\n" if $dry;
                    print SQL "$sql;\n";
#                    $db->query("insert into ipTotals values ('$date', '$ip', $dir, $octets, $packets)");
                }
            }

            # break inserts into 100 records at a time
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into ipTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                print SQL "$sql;\n";
            }
        }

#        &debug("processing protocol totals at ");
#        &debug(`date`);
#        foreach my $classC (keys(%{$protototal})) {
#            $db->query("lock tables dailyProtoTotals_$classC write") unless $dry;
#            my @values;
#            foreach my $ip (keys(%{$protototal->{$classC}})) {
#                foreach my $dir (keys(%{$protototal->{$classC}->{$ip}})) {
#                    foreach my $proto (keys(%{$protototal->{$classC}->{$ip}->{$dir}})) {
#                        my $octets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'octetTotal'};
#                        my $packets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'pktTotal'};
# #                        $octets = $octets > 2147483647 ? 0 : $octets;
# #                        $packets = $packets > 2147483647 ? 0 : $packets;
#                        # dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                        my $id = "$ip-$condensedDate-$dir-$proto";
#                        $id =~ s/\.//g;
#                        push @values, "('$date', '$ip', $dir, $proto, $octets, $packets)";
#                        my $sql = "insert into dailyProtoTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
#                        print "$sql\n" if $dry;
#                        $db->query($sql) unless $dry;
# #                        $db->query("insert into protoTotals values ('$date', '$ip', $dir, $proto, $octets, $packets)");
#                    }
#                }
#            }
#            $db->query("unlock tables") unless $dry;
#            my $sql = "insert into protoTotals_$classC values ";
#            $sql .= join ',', @values;
#            $db->query("lock tables protoTotals_$classC write") unless $dry;
#            print "$sql\n" if $dry;
#            $db->query($sql) unless $dry;
#            $db->query("unlock tables") unless $dry;
#        }

        &debug("processing port totals at ");
        &debug(`date`);
        foreach my $classC (keys(%{$porttotal})) {
            my @values;
            foreach my $ip (keys(%{$porttotal->{$classC}})) {
                foreach my $dir (keys(%{$porttotal->{$classC}->{$ip}})) {
                    foreach my $proto (keys(%{$porttotal->{$classC}->{$ip}->{$dir}})) {
                        foreach my $port (keys(%{$porttotal->{$classC}->{$ip}->{$dir}->{$proto}})) {
                            my $octets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'octetTotal'};
                            my $packets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'pktTotal'};
    #                        $octets = $octets > 2147483647 ? 0 : $octets;
    #                        $packets = $packets > 2147483647 ? 0 : $packets;

                            # dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-protocol-port
                            my $id = "$ip-$condensedDate-$dir-$proto-$port";
                            $id =~ s/\.//g;
                            push @values, "('$date', '$ip', $dir, $proto, $port, $octets, $packets)";
                            my $sql = "insert into dailyPortTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $port, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                            print "$sql\n" if $dry;
                            print SQL "$sql;\n";

    #                        $db->query("insert into portTotals values ('$date', '$ip', $dir, $port, $octets, $packets)");
                        }
                    }
                }
            }

            # break inserts into 100 records at a time
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into portTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                print SQL "$sql;\n";
            }
        }

#                       12     1 8      1    1= 23
# dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
#                       12        1  8     1   1       3=26
# dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                       12       1   8    1     1     5=28
# dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-port
        #print "finished at ";
        #print `date`;
        `mv $queuedir/$file $archivedir` unless $dry;
        close(SQL);
        `bzip2 $sqldirworking/$outfile`;
        `mv $sqldirworking/$outfile.bz2 $sqldir/`;
    }
}
`rm $queuedir/.lock` unless $dry;

sub debug {
    my $message = shift;
    if ($debug) {
        print "$message\n";
    }
}

# var full during ft-v05.2005-03-28.084500-0800 and
# 2005-02-24 69.55.226

# all port/daily totals before 2005-04-07

This script sends the sql files to the traffic server for processing:

cat > /usr/home/flowbin/sendsql.pl
#!/usr/bin/perl

#use strict;
#$debug=1;
#$dry=1;

my $remote = "69.55.233.199";
my $sqldir = "/usr/home/sql";
my $archive = "/usr/home/archive";
my $sqldirremote = "/data/bwdb2/pending/";
my @err;
unless ($dry) {
    if (-e "$sqldir/.lock") {
        open(FILE, "$sqldir/.lock");
        my $pid = <FILE>;
        chomp($pid);
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $sqldir/.lock`;
        }
    }
    open(FILE, "> $sqldir/.lock");
    print FILE "$$\n";
    close(FILE);
}

opendir(DIR, $sqldir);
my @files = readdir(DIR);
closedir(DIR);

foreach my $file (sort @files) {
   next unless $file =~ /bz2$/;

   my $r = `scp -Cq $sqldir/$file $remote:$sqldirremote 2>&1`;
#   print "scp $sqldir/$file $remote:$sqldirremote";
   unless ($?==0) {
      push @err, "scp -Cq $sqldir/$file $remote:$sqldirremote ($r)";
   }
   else {
      `mv $sqldir/$file $archive`;
      `ssh $remote mv $sqldirremote/$file $sqldirremote/${file}.done`;
   }
}

`rm $sqldir/.lock` unless $dry;

if (@err) {
   email_support('bwdb2: sendsql.pl error',join "\n", @err);
}

sub email_support {
    my $subj=shift;
    my $body=shift;
    use Mail::Sendmail;

    # prepare message
    my %mail = (
        To      => 'support@johncompanies.com,dave@johncompanies.com',
        From    => 'support@johncompanies.com',
        Subject => $subj,
        Message => $body,
        smtp    => 'mail.johncompanies.com',
    );
    sendmail(%mail) || warn "Error: $Mail::Sendmail::error";
}

sub debug {
    my $message = shift;
    if ($debug) {
        print "$message\n";
    }
}

# var full during ft-v05.2005-03-28.084500-0800 and
# 2005-02-24 69.55.226

# all port/daily totals before 2005-04-07
crontab -e
#process flows
2,17,32,47 * * * * /usr/home/flowbin/processflows-sql.pl
#move sql commands to traffic db
8,23,38,53 * * * * /usr/home/flowbin/sendsql.pl

flow processing: castle[edit]

cat > /usr/home/flowbin/processflows.pl

#!/usr/bin/perl

#use strict;
#$debug=1;
#$dry=1;

my $log = '/usr/home/flowbin/discards.log';

use Data::Dumper;

BEGIN {
    push @INC, "/usr/home/flowbin";
}

use db;

#my $queuedir = "/usr/home/queue";
my $queuedir = "/usr/home/working";
my $archivedir = "/usr/home/archive";

unless ($dry) {
    if (-e "$queuedir/.lock") {
        open(FILE, "$queuedir/.lock");
        my $pid = <FILE>;
        chomp($pid);
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $queuedir/.lock`;
        }
    }
    open(FILE, "> $queuedir/.lock");
    print FILE "$$\n";
    close(FILE);
}

my $db = db->new();
$db->connect('traffic', '', 'root', '5over3') || die $db->{'error'};

opendir(DIR, $queuedir);
my @files = readdir(DIR);
closedir(DIR);

foreach my $file (sort @files) {
    unless($file =~ /^\./) {
        $file =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})\.([0-9]{2})([0-9]{2})([0-9]{2})/;
        my $date = "$1 $2:$3:$4";
        my $condensedDate = $1;
        $condensedDate =~ s/-//g;
        my $iptotal = {};
        my $protototal = {};
        my $porttotal = {};

        &debug("started file $file at ");
        &debug(`date`);
        &debug("getting raw flow data (flow-print)");
        `cat $queuedir/$file | /usr/local/bin/flow-print -f 5 > /usr/home/working/tmp-$file`;
        &debug("aggregating data at ");
        &debug(`date`);
        unless (open(DATA, "/usr/home/working/tmp-$file")) { die "can't open: $!"; }
        LOOP: while (my $line = readline DATA) {
            my @d = split /[\s]+/, $line;
            if ($d[0] ne '' && $d[0] ne 'Start') {
                my $addr = 0;
                my $port = 0;

                #Start End Sif SrcIPaddress SrcP DIf DstIPaddress DstP P Fl Pkts Octets
                #0     1   2   3            4    5   6            7    8 9  10   11
                          #|
                          # outbound = 2, inbound = 1

                my (@src_ip) = split '\.', $d[3];
                my (@dst_ip) = split '\.', $d[6];

                if ($src_ip[0] == 69 && $src_ip[1] == 55 &&
                    $src_ip[2] >= 224 && $src_ip[2] <= 239 &&
                    $src_ip[2] != 229 && $src_ip[2] != 231) { # for castle
#                if ($src_ip[0] == 69 && $src_ip[1] == 55 && $src_ip[2] == 229) { # for i2b
                   $d[2] = 2;
                   # hack for outbound bulk traffic counted 2x
                   if ($dst_ip[2] == 234) { $d[11] /= 2; $d[10] /= 2; }
                }
                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 &&
                       $dst_ip[2] >= 224 && $dst_ip[2] <= 239 &&
                       $dst_ip[2] != 229 && $dst_ip[2] != 231) { # for castle
#                elsif ($dst_ip[0] == 69 && $dst_ip[1] == 55 && $dst_ip[2] == 229) { # for i2b
                   $d[2] = 1;
                }
                else { next LOOP; }

                if ($d[2] == 2) {
                    $addr = $d[3];
                    # if the dst-port is low, store that
                    if ($d[7] <= 1024) { $port = $d[7]; }
                    # if the src-port is low, store that
                    elsif ($d[4] <= 1024) { $port = $d[4]; }
                    else { $port = 99999; }
                }
                elsif ($d[2] == 1) {
                    $addr = $d[6];
                    # if the dst-port is high, assume its return traffic, try to store src-port if low
                    if ($d[7] > 1024) {
                        if ($d[4] <= 1024) { $port = $d[4]; }
                        else { $port = 99999; }
                    } else {
                        $port = $d[7];
                    }
                } else {
                    next LOOP;
                }

                my (@ip) = split '\.', $addr;
                unless ($ip[0] == 69) { next LOOP; }
                unless ($ip[1] == 55) { next LOOP; }
                unless ($ip[2] >= 224 && $ip[2] <= 239 && $ip[2] != 229 && $ip[2] != 231) { next LOOP; }
#                unless ($ip[2] == 229) { next LOOP; }

                my $classC = "$ip[0]_$ip[1]_$ip[2]";

#                          IP        dir
#                if ($d[10] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11]; }
#
#                if ($d[10] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11]; }
#
#                if ($d[10] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'pktTotal'} += $d[10]; }
#                if ($d[11] < 2147483647) { $porttotal->{$classC}->{$addr}->{$d[2]}->{$port}->{'octetTotal'} += $d[11]; }
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'pktTotal'} += $d[10];
                $iptotal->{$classC}->{$addr}->{$d[2]}->{'octetTotal'} += $d[11];

                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'pktTotal'} += $d[10];
                $protototal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{'octetTotal'} += $d[11];

                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'pktTotal'} += $d[10];
                $porttotal->{$classC}->{$addr}->{$d[2]}->{$d[8]}->{$port}->{'octetTotal'} += $d[11];
            }
        }
        close(DATA);
        `rm /usr/home/working/tmp-$file`;
        &debug("processing ip totals at ");
        &debug(`date`);
        foreach my $classC (keys(%{$iptotal})) {
            $db->query("lock tables dailyIpTotals_$classC write") unless $dry;
            my @values;
            foreach my $ip (keys(%{$iptotal->{$classC}})) {
                foreach my $dir (keys(%{$iptotal->{$classC}->{$ip}})) {
                    my $octets = $iptotal->{$classC}->{$ip}->{$dir}->{'octetTotal'};
                    my $packets = $iptotal->{$classC}->{$ip}->{$dir}->{'pktTotal'};
#                    $packets = $packets > 2147483647 ? 0 : $packets;
                    if ($octets > 2147483647) {
                        my $ddir = $dir==1 ? 'in' : 'out';
                        `echo "$date $ip $ddir $octets\n" >> $log`;
#                        $octets = 0;
                    }
                    # dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
                    my $id = "$ip-$condensedDate-$dir";
                    $id =~ s/\.//g;
                    push @values, "('$date', '$ip', $dir, $octets, $packets)";
                    my $sql = "insert into dailyIpTotals_$classC values ('$id', '$date', '$ip', $dir, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                    print "$sql\n" if $dry;
                    $db->query($sql) unless $dry;
#                    $db->query("insert into ipTotals values ('$date', '$ip', $dir, $octets, $packets)");
                }
            }
            $db->query("unlock tables") unless $dry;

            $db->query("lock tables ipTotals_$classC write") unless $dry;
            # break inserts into 100 records at a time
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into ipTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                $db->query($sql) unless $dry;
            }
            $db->query("unlock tables") unless $dry;
        }

        sleep 20;
#        &debug("processing protocol totals at ");
#        &debug(`date`);
#        foreach my $classC (keys(%{$protototal})) {
#            $db->query("lock tables dailyProtoTotals_$classC write") unless $dry;
#            my @values;
#            foreach my $ip (keys(%{$protototal->{$classC}})) {
#                foreach my $dir (keys(%{$protototal->{$classC}->{$ip}})) {
#                    foreach my $proto (keys(%{$protototal->{$classC}->{$ip}->{$dir}})) {
#                        my $octets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'octetTotal'};
#                        my $packets = $protototal->{$classC}->{$ip}->{$dir}->{$proto}->{'pktTotal'};
# #                        $octets = $octets > 2147483647 ? 0 : $octets;
# #                        $packets = $packets > 2147483647 ? 0 : $packets;
#                        # dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                        my $id = "$ip-$condensedDate-$dir-$proto";
#                        $id =~ s/\.//g;
#                        push @values, "('$date', '$ip', $dir, $proto, $octets, $packets)";
#                        my $sql = "insert into dailyProtoTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
#                        print "$sql\n" if $dry;
#                        $db->query($sql) unless $dry;
# #                        $db->query("insert into protoTotals values ('$date', '$ip', $dir, $proto, $octets, $packets)");
#                    }
#                }
#            }
#            $db->query("unlock tables") unless $dry;
#            my $sql = "insert into protoTotals_$classC values ";
#            $sql .= join ',', @values;
#            $db->query("lock tables protoTotals_$classC write") unless $dry;
#            print "$sql\n" if $dry;
#            $db->query($sql) unless $dry;
#            $db->query("unlock tables") unless $dry;
#        }

        &debug("processing port totals at ");
        &debug(`date`);
        foreach my $classC (keys(%{$porttotal})) {
            $db->query("lock tables dailyPortTotals_$classC write") unless $dry;
            my @values;
            foreach my $ip (keys(%{$porttotal->{$classC}})) {
                foreach my $dir (keys(%{$porttotal->{$classC}->{$ip}})) {
                    foreach my $proto (keys(%{$porttotal->{$classC}->{$ip}->{$dir}})) {
                        foreach my $port (keys(%{$porttotal->{$classC}->{$ip}->{$dir}->{$proto}})) {
                            my $octets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'octetTotal'};
                            my $packets = $porttotal->{$classC}->{$ip}->{$dir}->{$proto}->{$port}->{'pktTotal'};
    #                        $octets = $octets > 2147483647 ? 0 : $octets;
    #                        $packets = $packets > 2147483647 ? 0 : $packets;

                            # dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-protocol-port
                            my $id = "$ip-$condensedDate-$dir-$proto-$port";
                            $id =~ s/\.//g;
                            push @values, "('$date', '$ip', $dir, $proto, $port, $octets, $packets)";
                            my $sql = "insert into dailyPortTotals_$classC values ('$id', '$date', '$ip', $dir, $proto, $port, $octets, $packets) ON DUPLICATE KEY UPDATE octets=octets+$octets, packets=packets+$packets";
                            print "$sql\n" if $dry;
                            $db->query($sql) unless $dry;
    #                        $db->query("insert into portTotals values ('$date', '$ip', $dir, $port, $octets, $packets)");
                        }
                    }
                }
            }
            $db->query("unlock tables") unless $dry;

            $db->query("lock tables portTotals_$classC write") unless $dry;
            # break inserts into 100 records at a time
            &debug("inserting $#values +1 values");
            while ($#values > 0) {
                my $sql = "insert into portTotals_$classC values ";
                my $max_index = $#values > 100 ? 100 : $#values;
                for (my $i=0; $i<=$max_index; $i++) {
                    $sql .= shift @values;
                    $sql .= ',';
                }
                chop $sql;
                print "$sql\n" if $dry;
                $db->query($sql) unless $dry;
            }
            $db->query("unlock tables") unless $dry;
            sleep 10;
        }

#                       12     1 8      1    1= 23
# dailyIpTotals.id = ip(no .'s)-yyyymmdd-direction
#                       12        1  8     1   1       3=26
# dailyProtoTotals.id = ip(no .'s)-yyyymmdd-direction-proto
#                       12       1   8    1     1     5=28
# dailyPortTotals.id = ip(no .'s)-yyyymmdd-direction-port
        #print "finished at ";
        #print `date`;
        `mv $queuedir/$file $archivedir` unless $dry;
    }
}
`rm $queuedir/.lock` unless $dry;

sub debug {
    my $message = shift;
    if ($debug) {
        print "$message\n";
    }
}

# var full during ft-v05.2005-03-28.084500-0800 and
# 2005-02-24 69.55.226

# all port/daily totals before 2005-04-07
cat > /usr/home/flowbin/db.pm

#!/usr/bin/perl
#
# $Header: /usr/cvs/newgw/lib/db.pm,v 1.4 2003/06/05 18:20:01 glenn Exp $
#
# Copyright (c) 2003
#      e-Monitoring Networks, Inc.  All rights reserved.
#
#
package db;

use strict;
use DBI;

sub new {
    my $class = shift;
    my $self = {};

    $self->{'debug'} = 0;
    bless $self, $class;

    return $self;
}

sub connect {
    my $self = shift;
    my $dbname = shift;
    my $dbhost = shift;
    my $dbuser = shift;
    my $dbpass = shift;

    my $host = '';
    if (defined($dbhost)) {
        $host = ";host=$dbhost";
    }

    eval {
        $self->debug("connecting to: DBI:mysql:database=$dbname;$host", 1);
        $self->{'dbh'} = DBI->connect("DBI:mysql:database=$dbname;$host", $dbuser, $dbpass);
    };
    if ($self->{'dbh'}) {
        return 1;
    }
    $self->{'error'} = "Error connecting to database $@";
    $self->debug("Error connecting to database $@");
    return 0;
}

sub query {
    my $self = shift;
    my $query = shift;

    $self->debug($query, 1);
    my $sth;
    eval {
        $sth = $self->{'dbh'}->prepare($query);
    };
    unless ($sth) {
        $self->{'error'} = "error preparing query $@";
        $self->debug("error preparing query $@");
        return undef;
    }
    my $qty;
    eval {
        $qty = $sth->execute;
    };
    unless ($qty) {
        $self->{'error'} = "error executing query $@";
        warn "error executing query $@ $query";
        return undef;
    }
    $self->debug("returning $qty, $sth from query", 6);
    return ($qty, $sth);
}

sub disconnect {
    my $self = shift;

    $self->{'dbh'}->disconnect;
    return 0;
}

sub debug {
    my $self = shift;
    my $msg = shift;
    my $level = shift || 0;

    if ($level < $self->{'debug'}) {
        print "$msg\n";
    }
    return 0;
}
1;
mkdir /usr/home/archive
mkdir -p /usr/home/sql/tmp
crontab -e
#process flows
2,17,32,47 * * * * /usr/home/flowbin/processflows.pl

setup traffic db[edit]

  • Install mysql:
cd /usr/ports/databases/mysql50-server
make install clean
cat >> /etc/rc.conf
mysql_enable="YES" 

Move db data dir:

/usr/local/etc/rc.d/mysql-server stop
mkdir /usr/home/database/
mv /var/db/mysql/* /usr/home/database/
chown -R mysql:mysql /usr/home/database

Edit database location in startup script:

vi /usr/local/etc/rc.d/mysql-server
# : ${mysql_dbdir="/var/db/mysql"}
: ${mysql_dbdir="/usr/home/database"}
/usr/local/etc/rc.d/mysql-server start


  • Install mysql perl database modules:
cd /usr/ports/databases/p5-DBI
make install clean
cd /usr/ports/databases/p5-DBD-mysql50
make install clean
(no to SSL support)
  • Setting up database
rehash
/usr/local/etc/rc.d/mysql-server start
mysql -u root
create database traffic;
grant all on *.* to root@localhost identified by '5over3';
grant all on traffic.* to jc@10.1.4.5 identified by '2gMKY3Wt';

If this was a new server we'd setup new tables. See mysql for how those tables would be setup.

We are assuming here we are moving data from an existing db, here's how that's done (from the current traffic db):

rsync -av --progress /usr/home/database/traffic/ 10.1.4.203:/usr/home/database/traffic/

When you're ready to do the cutover, shut down mysql on both hosts and do one last sync.


process flows from bwdb2[edit]

On traffic database server (bwdb):

crontab -e
#import sql from bwdb2
10,25,40,55 * * * * /usr/home/flowbin/processsql.pl

Add access to mysql:

mysql -u root -p 
grant all on traffic.* to bwdb2@localhost identified by 's1lver4d';
cat > /usr/home/flowbin/processsql.pl

#!/usr/bin/perl

#use strict;
#$debug=1;
#$dry=1;

my $sqldir = "/usr/home/bwdb2/pending";
my $mysql = '/usr/local/bin/mysql';
my @err;
unless ($dry) {
    if (-e "$sqldir/.lock") {
        open(FILE, "$sqldir/.lock");
        my $pid = <FILE>;
        chomp($pid);
        close(FILE);
        if (kill(0, $pid)) {
            #another process is using the queue, bail out
            exit(0);
        }
        else {
            #dead lock file, remove it
            `rm $sqldir/.lock`;
        }
    }
    open(FILE, "> $sqldir/.lock");
    print FILE "$$\n";
    close(FILE);
}

opendir(DIR, $sqldir);
my @files = readdir(DIR);
closedir(DIR);

foreach my $file (sort @files) {
   next unless $file =~ /done$/;
   my $r = `bzcat $sqldir/$file | $mysql -u bwdb2 -ps1lver4d traffic`;
   unless ($?==0) {
      push @err, "bzcat $sqldir/$file | $mysql -u bwdb2 -pxxxxx traffic ($r)";
   }
   else {
      `rm $sqldir/$file`;
   }
}

`rm $sqldir/.lock` unless $dry;

if (@err) {
   email_support('bwdb: processsql.pl error',join "\n", @err);
}

sub email_support {
    my $subj=shift;
    my $body=shift;
    use Mail::Sendmail;

    # prepare message
    my %mail = (
        To      => 'dave@johncompanies.com',
        From    => 'support@johncompanies.com',
        Subject => $subj,
        Message => $body,
        smtp    => 'mail.johncompanies.com',
    );
    sendmail(%mail) || warn "Error: $Mail::Sendmail::error";
}

sub debug {
    my $message = shift;
    if ($debug) {
        print "$message\n";
    }
}
chmod 0700 /usr/home/flowbin/processsql.pl

Make sure bwdb is reachable from the outside only to bwdb2:

On nat, add to /etc/ipnat.rules

# bwdb
bimap fxp0 10.1.4.203/32 -> 69.55.233.199/32

Reload:

ipnat -C -F -f /etc/ipnat.rules

Setup firewall rule on firewall:

ipfw add 00094 allow ip from 66.181.18.5 to 69.55.233.199 22
ipfw add 00094 deny ip from any to 69.55.233.199

Setup firewall on bwdb to restrict access now that it's nat'd:

cat >> /usr/local/etc/rc.d/boot.sh
ipfw add 1 allow tcp from any to any established
ipfw add 2 allow ip from 10.1.4.0/24,66.181.18.5,69.55.233.195 to me 22
ipfw add 3 allow ip from 10.1.4.5 to me 3306
ipfw add 4 allow ip from 69.55.225.225 53 to me 
ipfw add 5 allow ip from 69.55.230.2 25 to me 
ipfw add 6 allow ip from me to me 4444
ipfw add 7 allow icmp from any to me
ipfw add 8 allow udp from 10.1.4.203 to 10.1.4.203 dst-port 4444
ipfw add 9 allow udp from 10.1.4.5 to me 161
ipfw add 100 deny ip from any to me
chmod 0700 /usr/local/etc/rc.d/boot.sh

From bwdb2, add ssh key:

cat /root/.ssh/id_dsa.pub | ssh 69.55.233.199 'cat - >> /root/.ssh/authorized_keys' 

Confirm no password access:

ssh 69.55.233.199 hostname

bwdb2[edit]

Summary[edit]

This machine tracks and stores network traffic (netflow) at i2b. It is our means to monitor customer bandwidth usage.

  • Location: i2b, cab6
  • OS: FreeBSD 6.4 x86
  • Networking: Priv IP: 10.1.2.4 There are 2 onboard nic's, one of which is the "listener"
  • Hardware: Custom 2U. Single power supply.
  • Drives: two 150 GB (2 x 150GB) RAID1 arrays running on a 3ware 7006 RAID card.

Services Provided[edit]

  • netflow
  • bigbrother

netflow[edit]

The main function of this server is to run netflow on an eth device in promiscuous mode so as to hear everything happening on the port (wherein all network traffic is mirrored to that port via the cisco swith). Every 15min, it creates a flow file under /usr/home/flows/ (organized by date). The flow file contains all traffic data for a 15min increment of time.

A cronjob moves that flow file (or files if there are multiple due to some delay)

1,16,31,46 * * * * /usr/home/flowbin/queue.pl

into a processing queue: /usr/home/working

Then a separate file processes whatever flow files it finds there, and builds sql files ready for insertion into the traffic database:

2,17,32,47 * * * * /usr/home/flowbin/processflows-sql.pl

Then yet another process copies the sql files to the traffic database server for processing and insertion into the mysql database:

8,23,38,53 * * * * /usr/home/flowbin/sendsql.pl

Regular maintenance[edit]

  • if space becomes tight, move sql files and flow files to backup server, both located in /usr/home/flowbin/archive

firewall (newgateway)[edit]

Summary[edit]

This machine is the primary (only) firewall for the entire network at castle.

  • Location: castle, cab 3-8
  • OS: FreeBSD 4.11 x86
  • Networking: Priv IP: 10.1.4.223, Pub IPs: 69.55.233.164 (external), 69.55.233.156 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks. If you're looking at the back of the server, the internal-network-facing nic is on the right (em1), and the external-facing-network (3750) is on the left (em0).
  • Hardware: 6 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: 36 GB (2 x 36GB) RAID1 array running on an Adaptec 2120S PCI RAID card.

Services Provided[edit]

  • firewall (ipfw)
  • snmp
  • bigbrother

Firewall Rule Configuration[edit]

See Firewall Rule Configuration for more discussion on how to actually manipulate firewall rules.

Disaster Recovery[edit]

If there is ever an outage with the firewall, the old firewall "gate" is located just below and is running with the proper network configuration, but with no firewall rules in place (to facilitate good throughput). Have castle move the cable on the left on the current firewall to the left port in the old firewall and the right cable to the right port.

Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)

hostname="newgateway.johncompanies.com"
firewall_script="/etc/firewall.sh"
firewall_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
inetd_enable="NO"
xntpd_enable="YES"
snmpd_enable="YES"
#snmpd_flags="-as -p /var/run/snmpd.pid"
#ipnat_enable="YES"
#ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"

defaultrouter="69.55.233.161"

ifconfig_xl0="inet 10.1.4.223 netmask 255.255.255.0"
ifconfig_em0="inet 69.55.233.164 netmask 255.255.255.248"

#
# Original JohnCompanies 69.55.224.0/20
#
ifconfig_em1="inet 69.55.233.156 netmask 255.255.255.248"

static_routes="route1 route2 route3 route4 route5 route6 route7 route8 route9 route10 route11 route1
2 route13 route14 route15 route16 route17 route18"

route_route1="-net 69.55.224.0 69.55.233.153"
route_route2="-net 69.55.225.0 69.55.233.153"
route_route3="-net 69.55.226.0 69.55.233.153"
route_route4="-net 69.55.227.0 69.55.233.153"
route_route5="-net 69.55.228.0 69.55.233.153"
route_route6="-net 69.55.229.0 69.55.233.153"
route_route7="-net 69.55.230.0 69.55.233.153"
route_route8="-net 69.55.231.0 69.55.233.153"
route_route9="-net 69.55.232.0 69.55.233.153"
route_route10="-net 69.55.233.0 69.55.233.153"
route_route11="-net 69.55.234.0 69.55.233.153"
route_route12="-net 69.55.235.0 69.55.233.153"
route_route13="-net 69.55.236.0 69.55.233.153"
route_route14="-net 69.55.237.0 69.55.233.153"
route_route15="-net 69.55.238.0 69.55.233.153"
route_route16="-net 69.55.239.0 69.55.233.153"
route_route17="-net 10.1.5.0 10.1.4.2"
route_route18="-net 10.1.6.0 10.1.4.2"


#In case of 3750 failure:
#defaultrouter="69.43.128.81"
#ifconfig_em0="inet 69.43.129.84 netmask 255.255.255.248"

#bind .1's here:
#ifconfig_em1="inet 69.55.224.1 netmask 255.255.255.0"
#ifconfig_em1_alias0="inet 69.55.225.1 netmask 255.255.255.0"
#ifconfig_em1_alias1="inet 69.55.226.1 netmask 255.255.255.0"
#ifconfig_em1_alias2="inet 69.55.227.1 netmask 255.255.255.0"
#ifconfig_em1_alias3="inet 69.55.228.1 netmask 255.255.255.0"
#ifconfig_em1_alias4="inet 69.55.229.1 netmask 255.255.255.0"
#ifconfig_em1_alias5="inet 69.55.230.1 netmask 255.255.255.0"
#ifconfig_em1_alias6="inet 69.55.231.1 netmask 255.255.255.0"
#ifconfig_em1_alias7="inet 69.55.232.1 netmask 255.255.255.0"
#ifconfig_em1_alias8="inet 69.55.233.1 netmask 255.255.255.0"
#ifconfig_em1_alias9="inet 69.55.234.1 netmask 255.255.255.0"
#ifconfig_em1_alias10="inet 69.55.235.1 netmask 255.255.255.0"
#ifconfig_em1_alias11="inet 69.55.236.1 netmask 255.255.255.0"
#ifconfig_em1_alias12="inet 69.55.237.1 netmask 255.255.255.0"
#ifconfig_em1_alias13="inet 69.55.238.1 netmask 255.255.255.0"
#ifconfig_em1_alias14="inet 69.55.239.1 netmask 255.255.255.0"

#bulk:
# reassign 69.55.231.1 to the int iface on the firewall
# set the DG on the firewall to 69.43.138.9
# set the ext firewall IP to 69.43.138.12, NM: 255.255.255.248

Cronjobs[edit]

1 0 * * * /usr/local/etc/rsync.backup

Backup to backup1

0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3  4 5 17331

Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).

Inside /etc/daily.local you will see a call to /etc/makepiperules.pl This script will create /etc/firewall.sh which contains all the firewall and pipe rules in place at the time the script was run.

DOS attacks[edit]

See Handling a DoS attack regarding how to handle a DOS attack.

Theres a background process (running from user shell) that monitors the firewall for incoming UDP DoS attacks. When it notices packets above a certain level it will

  1. enter a rule that allows all UDP to go through
  2. send an emergency email to support and indicating an attack is in progress
  3. send an email to castle (nocstaff@castleaccess.com and jcsupport@castleaccess.com) telling them to investigate and put up a null if warranted
  4. wait for a couple minutes to see if the attack subsides- if so it will remove the pass-all UDP rule, if not it will repeat the process from #1

This file lives under /usr/home/user/doswatch.pl To run:

cd /usr/home/user
./doswatch.pl &

To kill;

fg
^C

It writes its findings to /usr/home/user/doswatch.log

backup1[edit]

Summary[edit]

This machine acts as the primary backup location for all VPS-based customers. No customer directly accesses this server to perform their backups. We also store cancelled customers on this server.

  • Location: castle, cab 3-8
  • OS: Ubuntu 8.04.1 server x86
  • Networking: Priv IP: 10.1.4.8, Pub IP: 69.55.230.11 (firewalled from all but JC infrastructure @ i2b)
  • Hardware: 6 SATA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Single power supply.
  • Drives: 4.5 TB (6 x 1TB) RAID5 array running on a 3ware 9650SE-8LPML (8-port) card

Services provided[edit]

  • backup via rsync
  • mysql - traffic data
  • nfs server - for backups
  • snmp client - for big brother
  • bigbrother client

Usage and Notes[edit]

  • all data is stored under /data
  • virtually all jc infrastructure, and all VPS machines are setup to mount to backup1 via nfs (mountpoint: /backup1), and they all have their ssh keys setup to allow passwordless rsync's
  • each virt or jail backs up each evening to backup1. Each server has it's own directory (named for the server). Under those directories are 7 daily snapshots (0-6)
  • at the time of writing, the mysql server running here is replicating from (slave to) the mysql instance on bwdb. Requests for bandwidth data usage for customers (coming from management, account manager, and accounting scripts running on mail) all direct towards the database "traffic" running on this server.
  • cancelled customer systems are compressed and stored under /data/deprecated
  • archived bwdb2 flow files are stored under /data/bwdb2
  • critical files from backup2 are stored under /data/backup2

Cronjobs[edit]

00 5 * * * /usr/local/sbin/backupwatch.pl 2>&1 > /dev/null
35 5 * * * /usr/local/sbin/usage_check; /usr/local/sbin/snapshot_archive; /usr/local/sbin/snapshot_rotate  /data/backuplog.log

this runs daily the scripts to report on how much disk space each customer system occupies and how long their backups took. Then it rotates backups for each system, removing the oldest backup. It will email support@johncompanies.com at it’s conclusion. This email can be deleted, however note when it begins to take significantly longer to complete, ie runs past 2200 pm – this usually indicates a problem on the backup server.

10,25,40,55 * * * * /usr/local/sbin/processsql.pl

this processes prepared sql command files sent from/by bwdb2 (@ i2b) and imports them into the traffic database.

0 0 * * * /usr/local/sbin/3wraidchk

checks the health of the RAID array

Regular maintenance[edit]

build[edit]

Setup raid5 with a boot vol of 12G 5.45tb 
12G boot
4664 GB 

Install ubuntu 8.04

Swap 4G

Don’t format data drive

http://www.unixgods.org/~tilo/linux_larger_2TB.html

parted /dev/sdb
print
mklabel gpt
print

#Disk /dev/sdb: 4987GB
#Sector size (logical/physical): 512B/512B
#Partition Table: gpt

#Number  Start  End  Size  File system  Name  Flags

mkpart primary ext3 0 4987GB
print

#Disk /dev/sdb: 5987GB
#Sector size (logical/physical): 512B/512B
#Partition Table: gpt

#Number  Start   End     Size    File system  Name     Flags
# 1      17.4kB  4987GB  4987GB               primary

quit

mkfs.ext3 /dev/sdb1
#mke2fs 1.40.8 (13-Mar-2008)
#Filesystem label=
#OS type: Linux
#Block size=4096 (log=2)
#Fragment size=4096 (log=2)
#304390144 inodes, 1217544183 blocks
#60877209 blocks (5.00%) reserved for the super user
#First data block=0
#Maximum filesystem blocks=0
#37157 block groups
#32768 blocks per group, 32768 fragments per group
#8192 inodes per group
#Superblock backups stored on blocks:
#        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
#        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
#        102400000, 214990848, 512000000, 550731776, 644972544
#
#Writing inode tables:   967/37157

mkdir /data

#root@backup1:~# df -h
#Filesystem            Size  Used Avail Use% Mounted on
#/dev/sda2             8.3G  540M  7.3G   7% /
#varrun               1013M   40K 1013M   1% /var/run
#varlock              1013M     0 1013M   0% /var/lock
#udev                 1013M   56K 1013M   1% /dev
#devshm               1013M     0 1013M   0% /dev/shm
#/dev/sdb1             4.5T  192M  4.3T   1% /data


apt-get update
apt-get upgrade
apt-get install snmp snmpd ntp nfs-kernel-server

echo "\"\e[5~\": history-search-backward" >> ~/.inputrc
echo "\"\e[6~\": history-search-forward" >> ~/.inputrc

vi /etc/ntp.conf
server 10.1.4.5

scp root@10.1.4.3:/root/.ssh/authorized_keys /root/.ssh/
cd /root/
ssh-keygen -t dsa
echo "10.1.4.3        backup2" >> /etc/hosts

cat .ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys' 

ssh backup2

vi /root/.bashrc
export PS1="[\u@\h \w]# "
alias h='history'
alias vi='vim'
alias j='jobs'
export PS1="[\u@\h \w]# "
alias dr='screen -dr'
export EDITOR=vim
export GREP_OPTIONS='--color=auto'
export HISTFILESIZE=1000

source /root/.bashrc

echo "# ttyS0 - getty 
# 
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.

start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

respawn
exec /sbin/getty 38400 ttyS0" > /etc/event.d/ttyS0 


vi /boot/grub/menu.lst

serial --unit=0 --speed=38400 --word=8 --parity=no --stop=1
terminal --timeout=15 serial console

append to kernel lines: 
console=tty0 console=ttyS0,38400n8

show menu:
#hiddenmenu

echo 'rocommunity  jcread 10.1.4.5
rocommunity  jcread 10.1.4.3
agentaddress 10.1.4.8:161' > /etc/snmp/snmpd.conf

# to see which iface it is, on backup2:

snmpwalk -v 1 -c jcread 10.1.4.8 interface


echo "bb:x:1984:1984:Big Brother:/home/bb:/bin/bash" >> /etc/passwd

echo "bb:x:1984:" >> /etc/group

pwconv

mkdir /home/bb
chown bb.bb /home/bb

cd ~bb
scp backup2:/mnt/data4/build/bb/bb-linux.tar .

tar xf bb-linux.tar

cd /home/bb/bbc1.9e-btf/etc

echo "10.1.4.5 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
echo "10.1.4.8 backup1.johncompanies.com # ssh" >> /home/bb/bbc1.9e-btf/etc/bb-hosts

echo "/:90:95
/var:90:95
/data:85:99" > /home/bb/bbc1.9e-btf/etc/bb-dftab


vi /home/bb/bbc1.9e-btf/bin/bb-disk.sh
(remove all | SORT xxxx)

chmod +r /var/log/messages

./bbchkcfg.sh 
#(y to questions)
./bbchkhosts.sh
#(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src

#make; make install
cd ..
./runbb.sh start
more BBOUT 
(look for errors)
exit

vi /etc/rc.local
su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"


echo '/data 10.1.4.0/24(rw, no_root_squash,async,no_subtree_check)' >> /etc/exports

/etc/init.d/nfs-kernel-server restart


echo 'chmod o+r /var/log/messages' >> /etc/cron.weekly/sysklogd


echo '10.1.4.8                backup1' >> /etc/hosts
echo '/dev/sdb1	/data  ext3  rw,noatime  0  0' >> /etc/fstab


to install digi drivers:

wget http://ftp1.digi.com/support/driver/40002086_n.tgz
apt-get install linux-image-2.6.24-19-server
apt-get install linux-source-2.6.24 (not needed?)
apt-get install linux-headers-2.6.24-19-server 
apt-get install make
apt-get install gcc
apt-get install g++	
apt-get install libncurses5-dev
apt-get install expect
apt-get install libdbi-perl libdate-calc-perl libdbd-mysql-perl

cd /usr/src; ln -s linux-headers-2.6.24-19-server linux
./configure
make all
make install
make postinstall

/usr/bin/dgrp_cfg_node -v -v init el 65.116.11.2 8

apt-get install mysql

mkdir /data/mysql
chown mysql:mysql /data/mysql
/etc/init.d/mysql stop
mv /var/lib/mysql/* /data/mysql/
mv /data/mysql/ib_* /var/lib/mysql/
vi /etc/mysql/my.cnf
(change datadir to /data/mysql)
vi /etc/apparmor.d/usr.sbin.mysqld
add:
  /data/mysql/ r,
  /data/mysql/** rwk,
Comment out:
#  /var/lib/mysql/ r,
#  /var/lib/mysql/** rwk,

/etc/init.d/apparmor restart
/etc/init.d/mysql start

tw_cli /c0/u0 set ignoreECC=on
tw_cli /c0/u0 set storsave=balance
tw_cli /c0/u0 set cache=on


0 0 * * * /usr/local/sbin/3wraidchk

backup2[edit]

Summary[edit]

THIS SERVER IS OUT OF SERVICE AND REPLACED BY BACKUP4

This machine is used for archiving data and is a backup server for colo customers. It was the former primary backup location for all VPS-based customers before backup1 was installed. Only dedicated customers directly accesses this server to perform their backups. NOTE: power button is broken, so the reset button (paper clip) was rewired to be the power button.

  • Location: castle, cab 3-7
  • OS: FreeBSD 6.1 x86
  • Networking: Priv IP: 10.1.4.3, Pub IP: 69.55.230.10 (firewalled from all but JC infrastructure @ i2b)
  • Hardware: 16 IDE drive bays (4 columns of 4, drive 0-0 top left, drive 0-1 just to the right TODO) all hot-swap. Triple power supply.
  • Drives:
    • 3ware 7500-8:
      • 200 GB JBOD (1 x 200G) labeled 0-0
      • 500 GB RAID5 (3 x 250G) 0-1 thru 0-3
      • 700 GB RAID5 (4 x 250G) 0-4 thru 0-7
    • 3ware 7500-8:
      • 700 GB RAID5 (4 x 250G) 1-0 thru 1-3
      • 700 GB RAID5 (4 x 250G) 1-4 thru 1-7

All drives MUST be western digital IDE drives. Other brands will not fit.

In case of an outage, nfs will hang on all connected servers until the nfs service returns. If you can't get backup2 back online, you can get nfs running elsewhere and fake backup2's MAC's: priv: 00:0e:0c:59:c1:a6, pub: 00:07:e9:5b:c6:45

To configure:

ifconfig fxp0 link 00:90:27:f9:0a:d9

Services provided[edit]

  • backup via rsync and nfs
  • samba
  • nfs
  • snmp
  • bigbrother

Usage[edit]

  • all data is stored under 4 mount points, corresponding to the 4 large RAID5 arrays: /mnt/data1 /mnt/data2 /mnt/data3 /mnt/data4
  • iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under /mnt/data2/iso
  • this used to be our primary backup server so you will see old backups from virt and jails around- missing customer data though, just the machine's data
  • this server serves as an archive for exported db data from bwdb and old flow files.
  • isys backs up here
  • customers are nfs-moutned under /mnt/data3/customers as file-backed md devices
  • in /mnt/data4 there are lots of useful things used for building our vps servers, customer servers, and management scripts:
    • /bin: the master repository of scripts and custom binaries we use on jails and virts. Each night every virt and jail rsync's what's in here to update the local files. So any global updates to scripts would need to be made here (or will be overwritten with what's in here)
    • /build: files we use for setting up big brother, 3ware cli and scripts for colo's, vzcp customized setup files and so on
    • /vzrpms: contains the OS templates for many-to-most of the OS's we offer on vz systems

Cronjobs[edit]

  • backs itself up nightly to nfs-mounted backup1 (mountpoint: /backup2)

Regular maintenance[edit]

backup3[edit]

Summary[edit]

This machine is used for archiving data, is a backup server for colo customers, runs a samba server to make available iso's to the IPKVMs, and allows us to connect to the digi serial multiplexer at i2b. Only dedicated customers directly accesses this server to perform their backups.

  • Location: i2b, cab 6
  • OS: Ubuntu 10.04.1 server amd64
  • Networking: Priv IP: 10.1.2.3, Pub IPs: 69.55.229.4 AND 69.55.231.2
  • Hardware: 16 drive SATA bays (4 columns of 4, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: 5 TB (6 x 1TB) RAID5 array running on an Areca Technology Corp. ARC-1160 16-Port

Services provided[edit]

  • backup via rsync and nfs
  • samba
  • nfs
  • digi realport
  • snmp
  • bigbrother

Usage[edit]

  • all data is stored under /data
  • iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under /data/iso
  • this server serves as an archive for exported db data from bwdb and old flow files.
  • inftrastructure machines at i2b back up here
  • customers are nfs-moutned under /data/customers as file-backed loopback devices

management scripts[edit]

  • mkbackups

mkbackup <cid> GB <ip>

Cronjobs[edit]

0 0 * * * /usr/local/sbin/arecaraidchk

RAID checks

35 4 * * * /usr/local/sbin/snapshot_archive

Rotate daily snapshots for infrastructure machine backups

Regular maintenance[edit]

Build[edit]

BIOS Config[edit]

disable quiet boot

set to last state after power loss

set date/time to GMT

enable serial console output (baud rate 115200)

Install OS[edit]

Ubuntu 10.04.1 amd64 (couldn't get 12.04 to load cause the H/W was incompat)
10G / ext3
2G swap
~ /data ext4

Install packages:
openssh
samba

DNS and private IP[edit]

echo "nameserver 69.55.225.225" >> /etc/resolv.conf

Add a 2nd IP to eth0 and setup priv net

vi /etc/network/interfaces

auto eth0
iface eth0 inet static
        address 69.55.229.4
        netmask 255.255.255.0
        network 69.55.229.0
        broadcast 69.55.229.255
        gateway 69.55.229.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 69.55.229.3 66.181.0.2
        dns-search johncompanies.com

auto eth0:1
iface eth0:1 inet static
        address 69.55.231.2
        netmask 255.255.255.0
        network 69.55.231.0
        broadcast 69.55.231.255

auto eth1
iface eth1 inet static
        address 10.1.2.3
        netmask 255.255.255.0
        network 10.1.2.0
        broadcast 10.1.2.255

Install packages[edit]

apt-get update
apt-get upgrade
apt-get install gcc
apt-get install libssl-dev
apt-get install libncurses5-dev
apt-get install cu
apt-get install unzip
apt-get install snmp snmpd ntp nfs-kernel-server

tweak grub, enable serial[edit]

vi /etc/default/grub
#GRUB_HIDDEN_TIMEOUT=0
GRUB_CMDLINE_LINUX_DEFAULT="max_loop=64"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0"
update-grub
echo "start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
exec /sbin/getty -L ttyS0 38400 vt102" > /etc/init/ttyS0.conf

install realport (digi) driver[edit]

give the digi an ip with DgIpServ.exe

cd /usr/src/
wget ftp://ftp1.digi.com/support/beta/linux/dgrp/dgrp-1.9.tgz
tar xzf dgrp-1.9.tgz 
cd dgrp-1.9/
./configure
make
make install
make postinstall
update-rc.d dgrp_daemon defaults

configure ports:

dgrp_cfg_node init el 10.1.2.10 16

try connecting with:

cu -l /dev/ttyel00 -s 38400

shell, ntp, ssh key, hosts[edit]

Shell autocompletion search:

echo "\"\e[5~\": history-search-backward" >> ~/.inputrc
echo "\"\e[6~\": history-search-forward" >> ~/.inputrc

Setup ntp:

vi /etc/ntp.conf
server 10.1.2.1
server ntp.ubuntu.com

Generate ssh keys:

cd /root/
ssh-keygen -t dsa

Defaults, no password

Setup hosts:

echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.4 bwdb2" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts

Copy keys to servers where we need passwordless login:

cat .ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys' 
cat .ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys'

Setup shell:

vi /root/.bashrc
(add to bottom)
alias h='history'
alias vi='vim'
alias j='jobs'
export PS1="[\u@\h \w]# "
alias dr='screen -dr'
export EDITOR=vim
export GREP_OPTIONS='--color=auto'
export HISTFILESIZE=1000

alias tip-switch-p20='cu -l ttyel00 -s 9600'
alias tip-switch-p21='cu -l ttyel15 -s 9600'
alias tip-switch-p22='cu -l ttyel14 -s 9600'
alias tip-switch-p23='cu -l ttyel05 -s 9600'
alias tip-switch-p24='cu -l ttyel06 -s 9600'
alias tip-switch-p25='cu -l ttyel09 -s 9600'
alias tip-switch-p26='cu -l ttyel07 -s 9600'
alias tip-switch-p27='cu -l ttyel08 -s 9600'
alias tip-firewall2='cu -l ttyel01 -s 115200'
alias tip-nat2='cu -l /dev/ttyel02 -s 115200'
alias tip-backup3='cu -l ttyel04 -s 38400'
alias tip-bwdb2='cu -l ttyel03 -s 115200'
alias tip-backup4='cu -l ttyel13 -s 115200'
alias tip-jail3='cu -l ttyel11 -s 115200'

Load new shell:
 source /root/.bashrc

Setup snmpd (this is only valid for a server at castle):
echo 'rocommunity  jcread 10.1.4.5
rocommunity  jcread 10.1.4.3
agentaddress 10.1.4.8:161' > /etc/snmp/snmpd.conf

to see which iface it is, on backup2:

snmpwalk -v 1 -c jcread 10.1.4.8 interface

=== nfs ===

Allow mounts from private net:
 echo '/data 10.1.2.0/24(rw,no_root_squash,async,no_subtree_check)' >> /etc/exports

Restart nfsd:
 /etc/init.d/nfs-kernel-server restart

=== bb ===

Add user, group:
 echo "bb:x:1984:1984:Big Brother:/home/bb:/bin/bash" >> /etc/passwd
 echo "bb:x:1984:" >> /etc/group
 pwconv

Create home:
 mkdir /home/bb
 chown bb.bb /home/bb
 cd ~bb

Copy over and install files:
<pre>scp backup2:/mnt/data4/build/bb/bb-linux.tar .
tar xf bb-linux.tar
cd /home/bb/bbc1.9e-btf/etc

Configure main bb server:

echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts
echo "10.1.2.3 backup3.johncompanies.com # ssh" >> /home/bb/bbc1.9e-btf/etc/bb-hosts

Configure low disk alerts:

echo "/:90:95
/var:90:95
/data:85:99" > /home/bb/bbc1.9e-btf/etc/bb-dftab
vi /home/bb/bbc1.9e-btf/bin/bb-disk.sh

(remove all | SORT xxxx since SORT is broken)

chmod +r /var/log/messages
./bbchkcfg.sh 

(y to questions)

./bbchkhosts.sh

(ignore ssh errors)

cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..
./runbb.sh start
more BBOUT

(look for errors)

exit
vi /etc/rc.local
su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"

(before the exit 0)

echo 'chmod o+r /var/log/messages' >> /etc/cron.weekly/sysklogd

Add f/w rule:

ipfw add 00096 allow ip from { 69.55.229.4 or 69.55.229.3 } to 69.55.230.2 1984
vi ~bb/bbc1.9e-btf/etc/bbdef-client.sh
DFWARN=199
DFPANIC=199


raid check[edit]

3ware[edit]

scp backup1:/usr/local/sbin/tw_cli /usr/local/sbin/tw_cli
scp backup1:/usr/local/sbin/checkraid.sh /usr/local/sbin/checkraid.sh
scp backup1:/usr/local/sbin/3wraidchk /usr/local/sbin/3wraidchk
vi /usr/local/sbin/checkraid.sh
:%s/c0/c2/g

crontab -e
0 0 * * * /usr/local/sbin/3wraidchk

areca[edit]

cd /tmp
wget http://www.areca.us/support/s_linux/cli/linuxcli_V1.10.0_120815.zip
unzip linuxcli_V1.10.0_120815.zip
cp linuxcli_V1.10.0_120815/x86_64/cli64 /usr/local/sbin/
chmod 0700 /usr/local/sbin/cli64
cli64 rsf info
scp backup2:/data4/bin/arecaraidchk /usr/local/sbin
scp backup1:/usr/local/sbin/Sendmail.pm /usr/local/sbin

crontab -e
0 0 * * * /usr/local/sbin/arecaraidchk
cat > /root/verify.sh
cli64 vsf info
cli64 rsf info
cli64 disk info
cli64 event info
echo press enter when ready to run verify ; read x

cli64 vsf check vol=1

misc binaries[edit]

scp backup1:/usr/local/sbin/snapshot_archive /usr/local/sbin/snapshot_archive
vi /usr/local/sbin/snapshot_archive

(remove entries)

crontab -e
35 4 * * * /usr/local/sbin/snapshot_archive
scp backup1:/usr/local/sbin/pagedave /usr/local/sbin/pagedave
scp backup1:/usr/local/sbin/taskdone /usr/local/sbin/taskdone

Since installing /bin/mail requires all sorts of packages (lame) we write a simple one here...which can only email johncompanies.com addr's unless you add relaying for this host:

cat > /bin/mail
#!/usr/bin/perl
use strict;
use warnings;

use lib '/usr/local/sbin';
use Sendmail qw(sendmail);

my $sub = $ARGV[1];
my $to = $ARGV[2];


my %mail = (
   To      => $to,
   From    => $to,
   Subject => $sub,
   Message => '',
   smtp    => 'mail.johncompanies.com'
);
sendmail(%mail) || print "Error: $Sendmail::error";

chmod 0700 /bin/mail

mkbackup[edit]

mkdir /data/customers
cat > /usr/local/sbin/mkbackup
#!/bin/sh

if test $1; then
  cid=$1
else
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
  exit
fi

if test $2; then
  gb=$2
else
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
  exit
fi

if test $3; then
  ip=$3
else
  echo "ERROR: Usage: mkbackup cid GB ip  Terminating."
  exit
fi


if test -e /data/customers/${cid}-file; then
  echo "ERROR: /data/customers/${cid}-file exists"
  exit
else
  echo "touch /data/customers/${cid}-file"
  touch /data/customers/${cid}-file
  count=`echo $gb|awk '{print $1*1000}'`
  echo "dd if=/dev/zero of=/data/customers/${cid}-file bs=1024K count=$count"
  dd if=/dev/zero of=/data/customers/${cid}-file bs=1024K count=$count
  echo "/sbin/mkfs -t ext3 -F -j -q /data/customers/${cid}-file"
  /sbin/mkfs -t ext3 -F -j -q /data/customers/${cid}-file
fi

if test -e /data/customers/$cid; then
  echo "ERROR: /data/customers/$cid exists"
  exit
else
  echo "mkdir /data/customers/${cid}"
  mkdir /data/customers/${cid}
  echo "mount -o loop /data/customers/${cid}-file /data/customers/$cid"
  mount -o loop /data/customers/${cid}-file /data/customers/$cid
  df -h /data/customers/$cid

  echo "fsck -y /data/customers/${cid}-file" >> /etc/nfs_backup_mounts.sh
  echo "mount -o loop /data/customers/${cid}-file /data/customers/$cid" >> /etc/nfs_backup_mounts.sh
  echo "" >> /etc/nfs_backup_mounts.sh

  echo "/data/customers/$cid $ip/32(rw,no_root_squash,async,no_subtree_check)" >> /etc/exports
  /etc/init.d/nfs-kernel-server restart
  tail /var/log/messages
fi
chmod 0700 /usr/local/sbin/mkbackup
vi /etc/rc.local

add:

/etc/nfs_backup_mounts.sh

samba[edit]

apt-get install samba
vi /etc/samba/smb.conf
comment out any mounts, add
[data]
   read only = yes
   locking = no
   path = /data/iso
   guest ok = yes
/etc/init.d/smbd restart
mkdir /data/iso

Bring over some stuff from backup2

cd /data/iso
scp backup2:/d2/iso/3wfirmware.iso .
scp backup2:/d2/iso/MD5SUMS .
scp backup2:/d2/iso/bootimg.iso .
scp backup2:/d2/iso/systemrescuecd-x86-0.2.19.iso .
scp backup2:/d2/iso/win98bootcd.iso .
scp backup2:/d2/iso/acronis_bootdisk.iso .
scp backup2:/d2/iso/memtest86-3.2.iso .

Moving from one server to another[edit]

Here are the steps you would take to move settings and data from one server to a new backup server:

  • rsync over all /data/customers (we do this cause if we didn't use *-file it would copy over the files AND the data in the mountpoint)
rsync -av --progress --ignore-times *-file root@10.1.2.33:/data/customers/

after umounting all the customers, copy over the (empty) directories separately:

for f in `find .  -type d`; do rsync -av $f root@69.55.229.25:/data/customers; done
  • copy mount script
[root@backup3 /data/customers]# scp /etc/nfs_backup_mounts.sh root@69.55.229.25:/etc/nfs_backup_mounts.sh
  • copy rc.local
[root@backup3 /data/customers]# scp /etc/rc.local root@69.55.229.25:/etc/rc.local
  • copy /etc/exports
[root@backup3 /data/customers]# scp /etc/exports root@69.55.229.25:/etc/exports
  • edit /etc/hostname on both machines (set current to oldbackup3)
  • edit /etc/network/interfaces (swap IPs).
  • stop mounts from mounting on old and new servers so it doesnt start with reboot right away:
chmod 000 /etc/nfs_backup_mounts.sh
  • reboot both servers @ same time
  • check everything out
  • run /etc/nfs_backup_mounts.sh on new server
  • if switch port changed update mrtg to reflect correct port pub nic is on (on p20):
vi /usr/local/www/mgmt/mrtg/mrtg1.cfg

backup4[edit]

Summary[edit]

This machine is used for archiving data, is a backup server for colo customers, runs a samba server to make available iso's to the IPKVMs. Only FreeBSD virt customers directly accesses this server to perform their backups.

  • Location: castle, cab 3-7
  • OS: FreeNAS 9.3 (FreeBSD 9.3)
  • Networking: Priv IP: 10.1.2.9/24 AND 10.1.7.9/24, Pub IPs: 69.55.230.6/24
  • Hardware: JC-08014
           Intel S5000VSA Motherboard
           1 x Intel Xeon E5410  @ 2.33GHz CPU
           3ware 9690SA-8I RAID Card w BBU
           16GB RAM
           Dual power supply.
  • Drives: 7 TB (6 x 2TB) ZFS RAIDZ2 array running on JBOD
      1 128 GB SSD system drive and 6 drive SATA bays (3 columns of 2, drive 0 top left, drive 1 just below) all hot-swap.

Services provided[edit]

  • backup via rsync and nfs
  • samba
  • nfs
  • snmp?
  • bigbrother?

Usage[edit]

  • all data is stored under /data
  • iso images provided for customers wanting to mount an ISO as a CDROM via the IPKVM are provided via samba on this server. Images live under /data/iso  ??
  • this server serves as an archive for exported db data from bwdb and old flow files. ??
  • customers are nfs-moutned under /data/users (/mnt/zfs/users) as zfs ?

management scripts[edit]

  • mkbackups?

mkbackup <cid> GB <ip>

Cronjobs[edit]

0 0 * * * /usr/local/sbin/arecaraidchk  

RAID checks ?

35 4 * * * /usr/local/sbin/snapshot_archive

Rotate daily snapshots for infrastructure machine backups

00 15 * * * /usr/local/sbin/snapshot_rotate

Rotate daily snapshots for customer machine backups

Regular maintenance[edit]

Build[edit]

console[edit]

Summary[edit]

This box's only purpose is to serve as a means to connect to the digi serial multiplexer boxes at castle. Connect to it using the blue (cisco) ribbon cable with the beige RJ-45 to serial connector, 9600 8N1.

OBSOLETE

  • Location: castle, cab 3-8
  • OS: SunOS 5.8 (solaris)
  • Networking: Priv IP: 10.1.4.4
  • Hardware: Sun Netra


To connect to consoles, ssh in as user 'console' and use the tip command to connect to devices listed in /etc/remote

SSH WORK ~2021 ssh user@console.johncompanies.com

PW: 674*****

i.e.

tip switch-p1
tip jail1

Configuring digi/ports[edit]

/etc/remote[edit]

This is where the configuration/mapping for ports and custom names which we use along with the tip command to connect to various ports on the digi switches.

We have 2 digi's at castle we connect to:

#3-7 10.1.4.10
virt15:dv=/dev/dty/CO001s:br#38400:el=^C^S^Q^U^D:ie=%$:oe=^D:
virt13:dv=/dev/dty/CO002s:br#115200:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:

and

#3-6 10.1.4.11
jail4:dv=/dev/dty/CP001s:br#9600:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:
jail16:dv=/dev/dty/CP002s:br#9600:el=^C^S^Q^U^D:ie=%$:oe=^D:hf:

The only things you need to edit are the first part (i.e. jail4) and the speed (i.e. 9600). You can decipher which port on the digi each line corresponds to by the CP001s or CO001s (port 1 on digi1 and digi2), CP002s or CO002s (port 2 on digi1 and digi2)

drpadmin[edit]

The tool you use to configure a device to a digi box is drpadmin:

bash-2.03$ su
Password:
# drpadmin

Please select an option (a)dd (d)elete (s)how (r)eset (q)uit : s
0       10.1.4.10       32      CO      771     never   1027
1       10.1.4.11       32      CP      771     never   1027
2       65.116.11.2     8       el      771     never   1027

Please select an option (a)dd (d)elete (s)how (r)eset (q)uit :

Use those commands above to modify the devices available.

Switching IP/hostname[edit]

Edit:

/etc/defaultrouter
/etc/hosts
/etc/hostname.hme0
/etc/nodename
Maybe needed to run: # ifconfig hme0 10.1.4.4 up

devweb[edit]

We do web development on devweb.johncompanies.com

Currently this is a jail running on jail17 / 69.55.230.8

If the jail is restarted, you will need to manually restart the web service with:

httpsdctl restart

All website development work should be done here first. It works exactly like and is setup like our main site.


firewall2[edit]

Summary[edit]

This machine is the primary firewall for the entire network at i2b. firewall3 is a hot standby replacement for firewall2. Both firewall2 and firewall3 should not be connected at the same time since they use the same internal and external IP addresses.

  • Location: i2b, cab 6
  • OS: FreeBSD 6.4 x86
  • Networking: Priv IP: 10.1.2.2, Pub IPs: 66.181.18.3 (external), 69.55.229.1 & 69.55.231.1 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks. TODO: describe NIC location/orientation
  • Hardware: 2 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: 73 GB (2 x 73GB) RAID1 array running on an LSI MegaRAID SCSI 320 PCI RAID card.

Services Provided[edit]

  • firewall (ipfw)
  • bigbrother for customer machines

Firewall Rule Configuration[edit]

See Firewall Rule Configuration for more discussion on how to actually manipulate firewall rules.

Disaster Recovery[edit]

TODO: need backup f/w and instructions on how to move cables.

Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)

TODO

Here's the config on the live firewall:

kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"

xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.2"

fsck_y_enable="YES"
background_fsck="NO"

defaultrouter="66.181.18.2"
hostname="firewall2.johncompanies.com"
ifconfig_bge0="inet 66.181.18.3  netmask 255.255.255.224"
ifconfig_bge1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_bge1_alias0="inet 69.55.231.1 netmask 255.255.255.0"
ifconfig_bge1_alias1="inet 65.50.228.1  netmask 255.255.255.0"
ifconfig_bge1_alias2="inet 65.50.229.1  netmask 255.255.255.0"
ifconfig_bge1_alias3="inet 65.50.230.1  netmask 255.255.255.0"
ifconfig_bge1_alias4="inet 65.50.231.1  netmask 255.255.255.0"
ifconfig_bge1_alias5="inet 65.50.232.1  netmask 255.255.255.0"
ifconfig_bge1_alias6="inet 65.50.233.1  netmask 255.255.255.0"
ifconfig_bge1_alias7="inet 65.50.234.1  netmask 255.255.255.0"
ifconfig_bge1_alias8="inet 65.50.235.1  netmask 255.255.255.0"
ifconfig_fxp0="inet 10.1.2.2 netmask 255.255.255.0"
sshd_enable="YES"
usbd_enable="YES"


Cronjobs[edit]

30 3 * * * /usr/local/etc/rsync.backup Backup to backup3

0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5

Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).

59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count

Capture counts periodically

0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;

This script will create /etc/firewall.sh which contains all the firewall and pipe rules in place at the time the script was run.

*/5 * * * * /usr/local/sbin/lsiraidchk

Checking the health of the RAID array


DOS attacks[edit]

See Handling a DoS attack regarding how to handle a DOS attack.


build[edit]

partition map:
/ 58g
swap 4g
/var 512m
/tmp 512m
/usr 5.5g

4. edit /etc/make.conf 
echo "WITHOUT_X11=yes \
KERNCONF=firewall2 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf

5. add settings to /boot/loader.conf and /boot.config

echo "-Dh" >> /boot.config

echo 'console="comconsole,vidconsole" \
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf


6. turn off all ttyv's except 0 and 1 in /etc/ttys
also turn on ttyd0, change type to vt100:
vi /etc/ttys

ttyv2   "/usr/libexec/getty Pc"         cons25  off secure
ttyv3   "/usr/libexec/getty Pc"         cons25  off secure
ttyv4   "/usr/libexec/getty Pc"         cons25  off secure
ttyv5   "/usr/libexec/getty Pc"         cons25  off secure
ttyv6   "/usr/libexec/getty Pc"         cons25  off secure
ttyv7   "/usr/libexec/getty Pc"         cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0   "/usr/libexec/getty std.9600"   vt100   on  secure

kill -1 1

on console server:
vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console


7. populate hosts
echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts

8. put key in authorized_keys on backup3
cd
ssh-keygen -t dsa -b 1024 
(default location, leave password blank)

Punch a hole in firewall1 to allow traffic to backup servers @ castle:

ipfw add 99 allow ip from 66.181.18.0/27 to 69.55.230.10 22
ipfw add 95 allow ip from 66.181.18.0/27 to 69.55.230.11 22

cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys' 

confirm that you can ssh to backup3 and backup 2 without getting a login prompt

ssh backup3 hostname

ssh backup2 hostname

ssh backup1 hostname


10. edit root's path and login script:
vi /root/.cshrc

Change alias entries (add G):
alias la        ls -aG
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm       mb mount
alias mbu       mb umount

and alter the prompt, set the following:
set prompt = "`/bin/hostname -s` %/# "

11. install cvsup
cd /usr/ports/net/cvsup-without-gui 
make install clean; rehash; mail -s 'cvs installed' dave.boodman@vtext.com < /dev/null

12. get latest sources for this release:
cd /usr/src 
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
src-all" > sup

cvsup sup ; mail -s 'cvs sup done' dave.boodman@vtext.com < /dev/null

13. configure new kernel. 

cd /usr/src/sys/i386/conf 
scp backup2:/mnt/data4/build/freebsd/firewall2-6.4 ./firewall2

15. build, install kernel and world

cd /boot

mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel

make buildworld ; mail -s 'buildworld done' dave.boodman@vtext.com < /dev/null
(2450: 1:56min, supermicro: 59mins, 2950: 38mins)
make installworld 
(2450: 3min, supermicro: 1min, 2950: :34)
mergemaster -i

17. populate /etc/rc.conf with IPs and NFS settings
vi /etc/rc.conf

kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"

xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.2"

ifconfig_bce1="inet 10.1.2.2 netmask 255.255.255.0"
fsck_y_enable="YES"
background_fsck="NO"

defaultrouter="66.181.18.2"
hostname="firewall2.johncompanies.com"
ifconfig_bge0="inet 66.181.18.3  netmask 255.255.255.224"
ifconfig_bge1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_fxp0="inet 10.1.2.2 netmask 255.255.255.0"
sshd_enable="YES"
usbd_enable="YES"

20. reboot. Confirm new kernel is loaded

uname -a

21. update ports:
cd /usr/ports
echo "*default host=cvsup4.FreeBSD.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_6_4\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup

cvsup sup; mail -s 'cvs sup ports done' dave.boodman@vtext.com < /dev/null

22. Install raid mgmt tool

# linux base
cd /usr/ports/devel/libtool22
make install base

cd /usr/ports/emulators/linux_base-fc4
make install clean

#linux-megamgr-5.20
cd /usr/ports/sysutils/linux-megamgr
make install clean

# megarc-1.51
cd /usr/ports/sysutils/megarc
make install clean

Test:
rehash; megarc -ldInfo -a0 -l0

23. install rsync from ports
cd /usr/ports/net/rsync
make install clean

choose default options

25. install bb client
adduser
Username: bb
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username   : bb
Password   : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups     : bb
Home       : /home/bb
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes

cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
tar xvf bb-freebsd.tar

edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.1 firewall2.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts

vi /home/bb/bbc1.9e-btf/ext/openfiles 
MACHINE="firewall2,johncompanies,com"      # HAS TO BE IN A,B,C FORM

cd /usr/home/bb/bbc1.9e-btf/etc
./bbchkcfg.sh 
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..

vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
        $1 $TOPARGS > $BBTMP/TOP.$$
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$

./runbb.sh start
more BBOUT 
(look for errors)
exit

echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh

Punch a hole in the firewall to allow it to communicate with bb monitor:

ipfw add 00096 allow ip from 66.181.18.0/27 to 69.55.230.2


27. configure bb on mail:
vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
66.181.18.3 firewall2.johncompanies.com # ssh

su bb
cd
bbsrc/bb/runbb.sh restart ; exit

29. configure ntp
echo "server 10.1.2.1" > /etc/ntp.conf

/usr/sbin/ntpd -p /var/run/ntpd.pid
sleep 2; ntpq -p
(confirm it’s able to reach our time server)

echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
chmod 0700 /usr/local/etc/rc.d/ntp.sh

30. fwd and reverse lookups on ns1c
vr johncompanies.com
 (edit the PTR too)


33. setup backups
echo '#\!/bin/sh\
backupdir=/data/firewall2/current\
\
## ENTRY /etc ' > /usr/local/etc/backup.config

on backup3:
setup backup dirs:
ssh backup3 mkdir -p /data/firewall2/current

on backup3, add the system to 
vi /usr/local/sbin/snapshot_archive

scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup 
vi /usr/local/etc/rsync.backup 
backup1 > backup3

crontab -e
1 0 * * * /usr/local/etc/rsync.backup


34. mkdir /root/logs

35. edit sshd_config for security
vi /etc/ssh/sshd_config
ListenAddress 66.181.18.3
ListenAddress 10.1.2.1

kill -1 `cat /var/run/sshd.pid`

35. raid chk

cat > /usr/local/sbin/lsiraidchk
#!/usr/bin/perl

my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;

foreach (@out) {
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}

36. add crontab entries
crontab -e
30 3 * * * /usr/local/etc/rsync.backup
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl; 
*/5 * * * * /usr/local/sbin/lsiraidchk

#10 0 * * * rm /var/spool/clientmqueue/*

scp /etc/makefwrules.pl user@64.163.14.48:~
scp /etc/makepiperules.pl user@64.163.14.48:~
mv /home/user/makefwrules.pl /etc
mv /home/user/makepiperules.pl /etc
touch /etc/firewall.sh
mkdir /etc/oldrules/

other binaries
	
scp /usr/local/bin/rulemaker user@64.163.14.48:~
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~

Setup basic ruleset

ipfw add 00009 count udp from any to any
ipfw add 00010 allow tcp from any to any established
ipfw add 00012 deny tcp from any to any tcpflags syn tcpoptions !mss
ipfw add 00012 deny icmp from any to any icmptypes 4,5,9,10,12,13,14,15,16,17,18
ipfw add 00012 deny tcp from any to any tcpflags syn,fin
ipfw add 00012 deny tcp from any to any tcpflags fin,psh,rst,urg
ipfw add 00012 allow icmp from any to any
ipfw add 00014 deny tcp from any to any dst-port 135
ipfw add 00150 skipto 65535 ip from any to any via em1 in

IPKVM3:
00098 allow ip from { 69.55.230.6 or 69.55.230.7 } to 69.55.230.10 dst-port 139
00098 deny ip from any to 69.55.230.10 dst-port 139


firewall3[edit]

Summary[edit]

This machine is the backup firewall for the network at i2b.

  • Location: i2b, cab ?
  • OS: FreeBSD 9.1 amd64
  • Networking: Priv IP: 10.1.2.5, Pub IPs: 66.181.18.3 (external), 69.55.229.1 & 69.55.231.1 (internal). It has 3 network connections (2 onboard, 1 PCI) connecting to the external, internal and private networks.

The internal network NIC is the left one on the motherboard (69.55.229.1/24, ...).
The external network NIC is the right one on the motherboard (66.181.18.3/28).
The PCI ethernet card is connected to our private network (10.1.2.5/24).

  • Hardware: 2 SCSI SCA drive bays (2 columns of 3, drive 0 top left, drive 1 just below) all hot-swap. Dual power supply.
  • Drives: 160 GB (2 x 160GB) RAID1 array running on an LSI MegaRAID SCSI 320 PCI RAID card.

Services Provided[edit]

  • firewall (ipfw)
  • bigbrother

Firewall Rule Configuration[edit]

See Firewall Rule Configuration for more discussion on how to actually manipulate firewall rules.

Disaster Recovery[edit]

To put the backup firewall3 into service:

Move the internal cable (to our networks) from firewall2 to em1 which is the left most ethernet port (69.55.229.1).
Move the external cable (to outside world) from firewall2 to em0 which is the port to the right on the motherboard (66.181.18.3).
The PCI ethernet port (fxp0) should already be connected to private network (10.1.2.5).

Here's what you need to put in /etc/rc.conf to get a firewall going (as far as routes and IPs)

kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"

xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.5"

fsck_y_enable="YES"
background_fsck="NO"

defaultrouter="66.181.18.2"
hostname="firewall3.johncompanies.com"
ifconfig_em0="inet 66.181.18.3  netmask 255.255.255.224"

ifconfig_em1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_em1_alias0="inet 69.55.231.1 netmask 255.255.255.0"

# ifconfig_em1_alias1="inet 65.50.228.1  netmask 255.255.255.0"
# ifconfig_em1_alias2="inet 65.50.229.1  netmask 255.255.255.0"
# ifconfig_em1_alias3="inet 65.50.230.1  netmask 255.255.255.0"
# ifconfig_em1_alias4="inet 65.50.231.1  netmask 255.255.255.0"
# ifconfig_em1_alias5="inet 65.50.232.1  netmask 255.255.255.0"
# ifconfig_em1_alias6="inet 65.50.233.1  netmask 255.255.255.0"
# ifconfig_em1_alias7="inet 65.50.234.1  netmask 255.255.255.0"
# ifconfig_em1_alias8="inet 65.50.235.1  netmask 255.255.255.0"

ifconfig_fxp0="inet 10.1.2.5 netmask 255.255.255.0"

sshd_enable="YES"
usbd_enable="YES"

Cronjobs[edit]

30 3 * * * /usr/local/etc/rsync.backup Backup to backup3

0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5

Reset counters and remove pipe rules on the 1st of the month. Pay attention when setting up a rule as 3 4 5 (that's not a temporary traffic cap).

59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count

Capture counts periodically

0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl;

This script will create /etc/firewall.sh which contains all the firewall and pipe rules in place at the time the script was run.

*/5 * * * * /usr/local/sbin/lsiraidchk

Checking the health of the RAID array


DOS attacks[edit]

See Handling a DoS attack regarding how to handle a DOS attack.


build[edit]

partition map:
/ 58g
swap 4g
/var 512m
/tmp 512m
/usr 5.5g

4. edit /etc/make.conf 
echo "WITHOUT_X11=yes \
KERNCONF=firewall3 \
BOOT_COMCONSOLE_SPEED=115200" >> /etc/make.conf

5. add settings to /boot/loader.conf and /boot.config

echo "-Dh" >> /boot.config

echo 'console="comconsole,vidconsole" \
boot_multicons="YES" \
boot_serial="YES" \
comconsole_speed="115200"' >> /boot/loader.conf


6. turn off all ttyv's except 0 and 1 in /etc/ttys
also turn on ttyd0, change type to vt100:
vi /etc/ttys

ttyv2   "/usr/libexec/getty Pc"         cons25  off secure
ttyv3   "/usr/libexec/getty Pc"         cons25  off secure
ttyv4   "/usr/libexec/getty Pc"         cons25  off secure
ttyv5   "/usr/libexec/getty Pc"         cons25  off secure
ttyv6   "/usr/libexec/getty Pc"         cons25  off secure
ttyv7   "/usr/libexec/getty Pc"         cons25  off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0   "/usr/libexec/getty std.9600"   vt100   on  secure

kill -1 1

on console server:
vi /etc/remote
(rename port to jail8 depending on where and which digi plugged into)
test serial console


7. populate hosts
echo "69.55.230.10 backup2" >> /etc/hosts
echo "69.55.230.11 backup1" >> /etc/hosts
echo "10.1.2.3 backup3" >> /etc/hosts

8. put key in authorized_keys on backup3
cd
ssh-keygen -t dsa -b 1024 
(default location, leave password blank)

Punch a hole in firewall1 to allow traffic to backup servers @ castle:

ipfw add 99 allow ip from 66.181.18.0/27 to 69.55.230.10 22
ipfw add 95 allow ip from 66.181.18.0/27 to 69.55.230.11 22

cat /root/.ssh/id_dsa.pub | ssh backup3 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup2 'cat - >> /root/.ssh/authorized_keys' 
cat /root/.ssh/id_dsa.pub | ssh backup1 'cat - >> /root/.ssh/authorized_keys' 

confirm that you can ssh to backup3 and backup 2 without getting a login prompt

ssh backup3 hostname

ssh backup2 hostname

ssh backup1 hostname


10. edit root's path and login script:
vi /root/.cshrc

Change alias entries (add G):
alias la        ls -aG
alias lf        ls -FAG
alias ll        ls -lAG
alias ls        ls -AG
alias mbm       mb mount
alias mbu       mb umount

and alter the prompt, set the following:
set prompt = "`/bin/hostname -s` %/# "

11. install cvsup
cd /usr/ports/net/cvsup-without-gui 
make install clean; rehash; mail -s 'cvs installed' 8583619553@vtext.com < /dev/null

12. get latest sources for this release:
cd /usr/src 
echo "*default host=cvsup4.freebsd.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_9_1\
*default delete use-rel-suffix\
*default compress\
src-all" > sup

cvsup sup ; mail -s 'cvs sup done' 8583619553@vtext.com < /dev/null

13. configure new kernel. 

cd /usr/src/sys/amd64/conf 
scp backup2:/mnt/data4/build/freebsd/firewall3-9.1 ./firewall3

15. build, install kernel and world

cd /boot

mv kernel kernel.GENERIC
cd kernel.GENERIC
cd /usr/src
make buildkernel installkernel

make buildworld ; mail -s 'buildworld done' 8583619553@vtext.com < /dev/null
(supermicro: 2:15 mins, 2950: 38? mins)
make installworld 
(2450: 3min, supermicro: 1min, 2950: :34)
mergemaster -i

17. populate /etc/rc.conf with IPs and NFS settings
vi /etc/rc.conf

kern_securelevel_enable="NO"
portmap_enable="NO"
sendmail_enable="NO"
usbd_enable="YES"
gateway_enable="YES"

xntpd_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"

fsck_y_enable="YES"
background_fsck="NO"

hostname="firewall3.johncompanies.com"
#  external network
ifconfig_em0="inet 66.181.18.3  netmask 255.255.255.224"

#  internal network
ifconfig_em1="inet 69.55.229.1 netmask 255.255.255.0"
ifconfig_em1_alias0="inet 69.55.231.1  netmask 255.255.255.0"

ifconfig_em1_alias1="inet 65.50.228.1  netmask 255.255.255.0"
ifconfig_em1_alias2="inet 65.50.229.1  netmask 255.255.255.0"
ifconfig_em1_alias3="inet 65.50.230.1  netmask 255.255.255.0"
ifconfig_em1_alias4="inet 65.50.231.1  netmask 255.255.255.0"
ifconfig_em1_alias5="inet 65.50.232.1  netmask 255.255.255.0"
ifconfig_em1_alias6="inet 65.50.233.1  netmask 255.255.255.0"
ifconfig_em1_alias7="inet 65.50.234.1  netmask 255.255.255.0"
ifconfig_em1_alias8="inet 65.50.235.1  netmask 255.255.255.0"

defaultrouter="66.181.18.2"

#  private network
ifconfig_fxp0="inet 10.1.2.5 netmask 255.255.255.0"

inetd_enable="YES"
inetd_flags="-wW -a 10.1.2.5"

sshd_enable="YES"
usbd_enable="YES"
ntpd_enable="YES"
# powerd_enable="YES"


20. reboot. Confirm new kernel is loaded

uname -a

21. update ports:
cd /usr/ports

echo "*default host=cvsup4.FreeBSD.org\
*default base=/usr\
*default prefix=/usr\
*default release=cvs tag=RELENG_9_1\
*default delete use-rel-suffix\
*default compress\
ports-all tag=." > sup

cvsup sup; mail -s 'cvs sup ports done' 8583619553@vtext.com < /dev/null

22. Install raid mgmt tool

# linux base
cd /usr/ports/devel/libtool22
make install base

cd /usr/ports/emulators/linux_base-fc4
make install clean

scp backup2:/d4/build/3ware/tw_cli-freebsd-x86_64-9.5.0.1.tgz /usr/local/sbin
cd /usr/local/sbin 
tar xzvf tw_cli-freebsd-x86_64-9.5.0.1.tgz
rm tw_cli-freebsd-x86_64-9.5.0.1.tgz

23. install rsync from ports
cd /usr/ports/net/rsync
make install clean

choose default options

25. install bb client
adduser
Username: bb
Full name: bb
Uid (Leave empty for default): 1984
Login group [bb]:
Login group is bb. Invite bb into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/bb]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username   : bb
Password   : <random>
Full Name  : bb
Uid        : 1984
Class      :
Groups     : bb
Home       : /home/bb
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes

cd /usr/home/bb
scp backup2:/mnt/data4/build/bb/bb-freebsd.tar .
tar xvf bb-freebsd.tar

edit /home/bb/bbc1.9e-btf/etc/bb-hosts with something like:
echo "69.55.230.2 mail.johncompanies.com # BBPAGER BBNET BBDISPLAY smtp ssh \
10.1.2.5 firewall3.johncompanies.com # ssh" > /home/bb/bbc1.9e-btf/etc/bb-hosts

vi /home/bb/bbc1.9e-btf/ext/openfiles 
MACHINE="firewall3,johncompanies,com"      # HAS TO BE IN A,B,C FORM

cd /usr/home/bb/bbc1.9e-btf/etc
./bbchkcfg.sh 
(y to questions)
./bbchkhosts.sh
(ignore ssh errors)
cd ../..
chown -R bb .
su bb
cd
cd bbc1.9e-btf/src
make; make install
cd ..

vi /usr/home/bb/bbc1.9e-btf/bin/bb-cpu.sh
        $1 $TOPARGS > $BBTMP/TOP.$$
#        /usr/local/jail/bin/jtop > $BBTMP/TOP.$$

./runbb.sh start
more BBOUT 
(look for errors)
exit

echo 'su - bb -c "cd /home/bb/bbc1.9e-btf; ./runbb.sh start"' > /usr/local/etc/rc.d/bb.sh
chmod +x /usr/local/etc/rc.d/bb.sh

Punch a hole in the firewall to allow it to communicate with bb monitor:

ipfw add 00096 allow ip from 66.181.18.0/27 to 69.55.230.2


27. configure bb on mail:
vi /usr/home/bb/bbsrc/bb1.9e-btf/etc/bb-hosts
66.181.18.3 firewall3.johncompanies.com # ssh

su bb
cd
bbsrc/bb/runbb.sh restart ; exit

29. configure ntp
echo "server 10.1.2.1" > /etc/ntp.conf

/usr/sbin/ntpd -p /var/run/ntpd.pid
sleep 2; ntpq -p
(confirm it’s able to reach our time server)

echo '/usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift' > /usr/local/etc/rc.d/ntp.sh
chmod 0700 /usr/local/etc/rc.d/ntp.sh

30. fwd and reverse lookups on ns1c
vr johncompanies.com
 (edit the PTR too)


33. setup backups
echo '#\!/bin/sh\
backupdir=/data/firewall2/current\
\
## ENTRY /etc ' > /usr/local/etc/backup.config

on backup3:
setup backup dirs:
ssh backup3 mkdir -p /data/firewall2/current

on backup3, add the system to 
vi /usr/local/sbin/snapshot_archive

scp 69.55.230.2:/usr/local/etc/rsync.backup /usr/local/etc/rsync.backup 
vi /usr/local/etc/rsync.backup 
backup1 > backup3

crontab -e
1 0 * * * /usr/local/etc/rsync.backup


34. mkdir /root/logs

35. edit sshd_config for security
vi /etc/ssh/sshd_config
ListenAddress 66.181.18.3
ListenAddress 10.1.2.5

kill -1 `cat /var/run/sshd.pid`

35. raid chk

cat > /usr/local/sbin/lsiraidchk
#!/usr/bin/perl

my @out = split "\n", `megarc -ldInfo -a0 -Lall|grep Status:`;

foreach (@out) {
    if ($_ =~ /DEGRADED/) { $date = `date`; chomp $date; `echo "$date: RAID ARRAY DEGRADED" >> /var/log/messages`; }
#print $_;
}

36. add crontab entries
crontab -e
30 3 * * * /usr/local/etc/rsync.backup
0 0 1 * * /sbin/ipfw zero
0 0 1 * * /sbin/ipfw del 3 4 5
59 23 30 * * /sbin/ipfw show > /tmp/ipfw_count
3 0 30 * * /sbin/ipfw show > /tmp/ipfw_count
0 3 * * * /etc/makefwrules.pl; /etc/makepiperules.pl; 
*/5 * * * * /usr/local/sbin/lsiraidchk

#10 0 * * * rm /var/spool/clientmqueue/*

scp /etc/makefwrules.pl user@64.163.14.48:~
scp /etc/makepiperules.pl user@64.163.14.48:~
mv /home/user/makefwrules.pl /etc
mv /home/user/makepiperules.pl /etc
touch /etc/firewall.sh
mkdir /etc/oldrules/

other binaries
	
scp /usr/local/bin/rulemaker user@64.163.14.48:~
mv ~user/rulemaker /usr/local/sbin
scp ~user/Sendmail.pm user@64.163.14.48:~
scp ~user/doswatch.pl user@64.163.14.48:~

Setup basic ruleset

ipfw add 00009 count udp from any to any
ipfw add 00010 allow tcp from any to any established
ipfw add 00012 deny tcp from any to any tcpflags syn tcpoptions !mss
ipfw add 00012 deny icmp from any to any icmptypes 4,5,9,10,12,13,14,15,16,17,18
ipfw add 00012 deny tcp from any to any tcpflags syn,fin
ipfw add 00012 deny tcp from any to any tcpflags fin,psh,rst,urg
ipfw add 00012 allow icmp from any to any
ipfw add 00014 deny tcp from any to any dst-port 135
ipfw add 00150 skipto 65535 ip from any to any via em1 in

IPKVM3:
00098 allow ip from { 69.55.230.6 or 69.55.230.7 } to 69.55.230.10 dst-port 139
00098 deny ip from any to 69.55.230.10 dst-port 139

wiki[edit]

The wiki (mediawiki) runs on nat2 in a jail running off 69.55.229.8

The backup wiki lives on virt13 in CT 5 / 69.55.230.18

Setup jail[edit]

mkdir /mnt/data1/wiki-dir
cd /usr/src
make installworld DESTDIR=/mnt/data1/wiki-dir
cd etc
make distribution DESTDIR=/mnt/data1/wiki-dir

mount -t devfs devfs /mnt/data1/wiki-dir/dev
devfs -m /mnt/data1/wiki-dir/dev rule -s 3 applyset 

cd /mnt/data1/wiki-dir

ln -sf dev/null kernel

scp jail9:/usr/local/sbin/jkill /mnt/data1/wiki-dir/sbin

jail /mnt/data1/wiki-dir wiki.johncompanies.com 69.55.229.8 /bin/sh
csh

touch /etc/fstab
echo 'network_interfaces=""\
hostname="wiki.johncompanies.com"\
kern_securelevel_enable="NO"\
sendmail_enable="YES"\
sshd_enable="YES"' > /etc/rc.conf

echo "nameserver 69.55.229.3\
nameserver 69.55.225.225" >> /etc/resolv.conf 

vi /etc/crontab
 
(remove the adjkerntz lines )
 
vi /etc/periodic/security/100.chksetuid
 
replace: MP=`mount -t ufs | grep -v " nosuid" | awk '{ print $3 }' | sort`
 with: MP='/' (use single quotes) 

mkdir -p /usr/compat/linux/dev
 
adduser

Username: user
Full name: user
Uid (Leave empty for default):
Login group [user]:
Login group is user. Invite user into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/user]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]: y
Lock out the account after creation? [no]:
Username   : user
Password   : <random>
Full Name  : user
Uid        : 1001
Class      :
Groups     : user
Home       : /home/user
Home Mode  :
Shell      : /bin/sh
Locked     : no
OK? (yes/no): y
adduser: INFO: Successfully added (user) to the user database.
adduser: INFO: Password for (user) is: 901gmYjO
Add another user? (yes/no): n
Goodbye! 

vi /usr/home/user/.profile 
TERM=vt100;     export TERM
 
tzsetup
 
newaliases 
 
rm /sbin/halt /sbin/reboot
ln /sbin/jkill /sbin/halt
ln /sbin/jkill /sbin/reboot
 
vi /etc/syslog.conf
#*.err;kern.warning;auth.notice;mail.crit               /dev/console
*.err;kern.warning;auth.notice;mail.crit                /var/log/messages 

exit
exit
 
cd libexec
chflags noschg ld-elf32.so.1
chflags noschg ld-elf.so.1
mv ld-elf32.so.1 ld-elf32.so.1-orig
ln ld-elf.so.1 ld-elf32.so.1
chflags schg ld-elf.so.1
chflags schg ld-elf32.so.1
 
cp -r /usr/ports /mnt/data1/wiki-dir/usr 

cat > /usr/local/etc/rc.d/wiki.sh
mount -t devfs devfs /mnt/data1/wiki-dir/dev/
devfs -m /mnt/data1/wiki-dir/dev rule -s 3 applyset
jail /mnt/data1/wiki-dir wiki.johncompanies.com 69.55.229.8 /bin/sh /etc/rc

chmod 0700 /usr/local/etc/rc.d/wiki.sh

mediawiki setup[edit]


cd /usr/ports/net/rsync
make install clean

cd /usr/ports/distfiles/
fetch http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.4-m3.tar.gz
cd /usr/ports/databases/mysql55-server
make install clean

cd /usr/ports/distfiles/
fetch http://downloads.php.net/johannes/php-5.3.2.tar.bz2
cd /usr/ports/lang/php52
make install clean
(build apache module)

cd /usr/ports/lang/php5-extensions
make install clean

cd /usr/ports/www/apache22
make install clean

cd /usr/local/www/
fetch http://download.wikimedia.org/mediawiki/1.19/mediawiki-1.19.2.tar.gz
tar xzf mediawiki-1.19.2.tar.gz
mv mediawiki-1.19.2 wiki

vi /usr/local/etc/apache22/httpd.conf
DocumentRoot "/usr/local/www/"

Include etc/apache22/extra/vhost-wiki.conf
Listen 443

<IfModule mod_php5.c>
    <FilesMatch "\.ph(p3?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
    # To re-enable php in user directories comment the following lines
    # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
    # prevents .htaccess files from disabling it.
    <IfModule mod_userdir.c>
        <Directory /home/*/public_html>
            php_admin_value engine Off
        </Directory>
    </IfModule>
</IfModule>


cat > /usr/local/etc/apache22/extra/vhost-wiki.conf 
<VirtualHost *:443>
        ServerAdmin support@johncompanies.com

        DocumentRoot /usr/local/www/wiki
#        <Directory />
#                Options FollowSymLinks
#                AllowOverride None
#                Order deny,allow
#        </Directory>
        <Directory /usr/local/www/wiki>
                Options Indexes FollowSymLinks MultiViews
                Deny from all
                AllowOverride AuthConfig
                Order allow,deny
                DirectoryIndex index.php
                #Allow from 69.55.233.195
                #Allow from boody.dyndns.org
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/httpd-error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/httpd-access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

    SSLEngine on
    SSLCertificateFile /usr/local/etc/apache22/ssl/server.crt
    SSLCertificateKeyFile /usr/local/etc/apache22/ssl/server.key

</VirtualHost>

mkdir ssl
cd ssl

openssl req -days 1999 -new -x509 -nodes -out server.crt -keyout server.key
US
CA
San Diego
johncompanies.com
johncompanies.com
wiki.johncompanies.com
support@johncompanies.com

cat > /usr/local/www/wiki/.htaccess
AuthType Basic
AuthUserFile /usr/local/etc/apache22/wiki.passwd
AuthName wiki
require valid-user
satisfy any

cd /usr/local/etc/apache22
htpasswd -c wiki.passwd admin

https://69.55.229.8/index.php

use mysql (innodb)
wiki name: JCWiki
Support / (mail pass) / support@johncompanies.com

cat > /usr/local/www/wiki/LocalSettings.php

<?php
# This file was automatically generated by the MediaWiki 1.19.2
# installer. If you make manual changes, please keep track in case you
# need to recreate them later.
#
# See includes/DefaultSettings.php for all configurable settings
# and their default values, but don't forget to make changes in _this_
# file, not there.
#
# Further documentation for configuration settings may be found at:
# http://www.mediawiki.org/wiki/Manual:Configuration_settings

# Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
	exit;
}

## Uncomment this to disable output compression
# $wgDisableOutputCompression = true;

$wgSitename      = "JCWiki";

## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs please see:
## http://www.mediawiki.org/wiki/Manual:Short_URL
$wgScriptPath       = "";
$wgScriptExtension  = ".php";

## The protocol and server name to use in fully-qualified URLs
$wgServer           = "https://69.55.229.8";

## The relative URL path to the skins directory
$wgStylePath        = "$wgScriptPath/skins";

## The relative URL path to the logo.  Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
#$wgLogo             = "$wgStylePath/common/images/wiki.png";
$wgLogo             = "$wgStylePath/common/images/jclogo.gif";

## UPO means: this is also a user preference option

$wgEnableEmail      = true;
$wgEnableUserEmail  = true; # UPO

$wgEmergencyContact = "apache@69.55.229.8";
$wgPasswordSender   = "apache@69.55.229.8";

$wgEnotifUserTalk      = false; # UPO
$wgEnotifWatchlist     = false; # UPO
$wgEmailAuthentication = true;

## Database settings
$wgDBtype           = "mysql";
$wgDBserver         = "localhost";
$wgDBname           = "my_wiki";
$wgDBuser           = "root";
$wgDBpassword       = "";

# MySQL specific settings
$wgDBprefix         = "";

# MySQL table options to use during installation or update
$wgDBTableOptions   = "ENGINE=InnoDB, DEFAULT CHARSET=binary";

# Experimental charset support for MySQL 5.0.
$wgDBmysql5 = false;

## Shared memory settings
$wgMainCacheType    = CACHE_NONE;
$wgMemCachedServers = array();

## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads  = false;
#$wgUseImageMagick = true;
#$wgImageMagickConvertCommand = "/usr/bin/convert";

# InstantCommons allows wiki to use images from http://commons.wikimedia.org
$wgUseInstantCommons  = false;

## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## available UTF-8 locale
$wgShellLocale = "en_US.utf8";

## If you want to use image uploads under safe mode,
## create the directories images/archive, images/thumb and
## images/temp, and make them all writable. Then uncomment
## this, if it's not already uncommented:
#$wgHashedUploadDirectory = false;

## Set $wgCacheDirectory to a writable directory on the web server
## to make your wiki go slightly faster. The directory should not
## be publically accessible from the web.
#$wgCacheDirectory = "$IP/cache";

# Site language code, should be one of the list in ./languages/Names.php
$wgLanguageCode = "en";

$wgSecretKey = "abc699ef26890b49b4055430f8ebbd25e84cce21a7e53aeaec4d4313af4c9739";

# Site upgrade key. Must be set to a string (default provided) to turn on the
# web installer while LocalSettings.php is in place
$wgUpgradeKey = "3196710f4a7d7332";

## Default skin: you can change the default skin. Use the internal symbolic
## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
$wgDefaultSkin = "vector";

## For attaching licensing metadata to pages, and displaying an
## appropriate copyright notice / icon. GNU Free Documentation
## License and Creative Commons licenses are supported so far.
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl  = "";
$wgRightsText = "";
$wgRightsIcon = "";

# Path to the GNU diff3 utility. Used for conflict resolution.
$wgDiff3 = "/usr/bin/diff3";

# Query string length limit for ResourceLoader. You should only set this if
# your web server has a query string length limit (then set it to that limit),
# or if you have suhosin.get.max_value_length set in php.ini (then set it to
# that value)
$wgResourceLoaderMaxQueryLength = -1;



# End of automatically generated settings.
# Add more configuration options below.


copy/backup wiki[edit]

on main/primary wiki:

/usr/local/etc/rc.d/mysql-server stop
ssh 69.55.230.18 "/etc/init.d/mysql stop"
rsync -av /var/db/mysql/my_wiki/ 69.55.230.18:/var/lib/mysql/my_wiki/
rsync -av /var/db/mysql/ib* 69.55.230.18:/var/lib/mysql/
/usr/local/etc/rc.d/mysql-server start
ssh 69.55.230.18 "/etc/init.d/mysql start"