公司有4M网络出口网络,公司把公司网站也构架在内网上。由于某些员工不自觉,经常使用高流量的应用,经过调整效果很好,先应用记录如下:
公司网络拓扑架构
网络: 192.168.1.xxx
网关:192.168.1.2 DNS:取自运营商
无线:192.168.1.1(原始设置,通过LAN口和主交换机连接)
交换机:最基本的TPLink交换机
系统运行CentOS Linux 5.x系统,eth0连接内网,eth1/ppp0连接电信ADSL。通过免费DNS解析一个花生壳免费DNS. temptest.51vip.biz,具体ppp0和免费域名参见其它,资料太多了,遍地都是。
网络管理就是绑定 MAC/IP 使每个人都使用DHCP获取IP,且和人绑定,这样发现问题可以有案可查。
网络划分:
192.168.1.1 -- 127 无限制 127个
192.168.1.128--254 127个 UDP限制,只允许MSN/QQ/DNS 其他基于UDP的p2p应用不予开放
192.168.1.176-191 16个,TCP端口限制,高区TCP随机端口屏蔽防止p2p应用
192.168.1.192-229 38个, DHCP分配方案
/etc/rc.local 启动文件配置
#/etc/rc.local 添加
modprobe ip_nat_ftp
#10 hours
echo 36000 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
#屏蔽除QQ外 UDP ,防止基于UDP p2p 应用, IP>128的则屏蔽
iptables -i eth0 -A FORWARD -s 192.168.1.128/25 -p udp --sport 4001:55000 --dport ! 53 -j DROP
iptables -i eth0 -A FORWARD -s 192.168.1.128/25 -p udp --sport 1500:3999 --dport ! 53 -j DROP
#192.168.1.176-191 屏蔽 TCP 群发端口
iptables -i eth0 -A FORWARD -s 192.168.1.176/28 -p tcp --dport 8100:45000 -j DROP
#ban IP CallIE.exe
iptables -i eth0 -A FORWARD -s 192.168.1.176/28 -p tcp -d 119.167.216.0/24 -j DROP
iptables -i eth0 -A FORWARD -s 192.168.1.176/28 -p tcp -d 119.184.126.0/24 -j DROP
iptables -i eth0 -A FORWARD -s 192.168.1.176/28 -p tcp -d 123.125.114.0/23 -j DROP
#ban Xunlei
iptables -i eth0 -A FORWARD -s 192.168.1.128/25 -p udp --dport 53 -m string --algo bm --string 'sandai.net' -j DROP
iptables -i eth0 -A FORWARD -s 192.168.1.128/25 -d 219.134.132.0/24 -j DROP
#开启转发
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
我把相关的内容放在 /etc/dhcp_manager 目录下 /etc/dhcp_manager/log 是保存dhcpd.conf目录 chkMAC.sh dhcp_manager.sh refreshdns.sh dhcp_manager.awk dhcpdhead.txt ComputerList.txt 分别构成不同模块
dhcp_manager.sh dhcp_manager.awk dhcphead.txt ComputerList.txt 是DNS辅助工具
ComputerList.txt 是网络内的MAC地址数据库
文本文件,Tab制表符分割。第三列使用者不能重复,名称必须唯一。一共8列,第一行注释,不要写具体内容,凡已经知道的都保存在这里,一台设备分配一个地址。注意:如果一个笔记本既有有线网,也有无线网,请分配一个地址,且使用者不要重复。
IP Mac 电脑名称(唯一) 使用者(中文) 类型 Machine DeskTop/Laptop Cable/Wireless
192.168.1.50 00:00:E8:14:1B:AA mycompany1 Unknow 管理员 PC DeskTop Cable
192.168.1.11 6C:62:6D:21:27:D3 mycompany3 Unknow 管理员 PC DeskTop Cable
192.168.1.13 CC:08:E0:37:C9:C0 mycompany5 Unknow 管理员 PC DeskTop Cable
192.168.1.14 00:14:2A:7A:F3:AA mycompany6 Unknow 管理员 PC DeskTop Cable
192.168.1.15 00:14:2A:2D:B2:04 mycompany7 Unknow 管理员 PC DeskTop Cable
192.168.1.18 00:11:5B:E9:F4:2D mycompany10 Unknow 管理员 PC DeskTop Cable
192.168.1.19 00:40:63:E0:FC:14 mycompany11 Unknow 管理员 PC DeskTop Cable
192.168.1.20 00:40:63:FF:FF:41 mycompany12 Unknow 管理员 PC DeskTop Cable
dhcphead.txt 是dhcpd.conf文件的基本配置
dhcp_manager.awk dhcpmanager.sh 会根据dhcphead.txt文件生成dhcpd.conf配置文件, 如果要定义一些dhcpd.conf需要在此配置
dhcphead.txt
ddns-update-style interim;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
# default-lease-time 21600;
# max-lease-time 43200;
#
default-lease-time 1800;
max-lease-time 7200;
option time-offset -18000; # Eastern Standard Time
option routers 192.168.1.2;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.168.1.192 192.168.1.229;
option domain-name-servers 210.22.70.3,210.22.70.227;
dhcp_manager.awk
根据dhcpdhead.txt和computerlist.txt文件生成一个dhcpd.conf配置文件,包含mac地址IP地址绑定
#awk IP,MAC,uid
BEGIN {
FS="\t"
system("cat dhcpdhead.txt");
}
END {
print "\n\n}"
}
{
if ( NR > 1 ) {
print "\t\t\t host " $3 " \t{"
print "\t\t\t\t hardware ethernet " $2 ";"
print "\t\t\t\t fixed-address " $1 ";"
print "\t\t\t\t #" $3 " " $4 " " $5 " " $6 " " $7
print "\t\t\t }"
}
}
dhcp_manager.sh
dhcp_manager执行文件,会保存当前dhcpd.conf原始文件,并生成dhcpd.conf文件
#!/bin/bash
#
cd /etc/dhcp_manager
day=`date +%Y%m%d%H%M%S`
/etc/init.d/dhcpd stop
mv ../dhcpd.conf log/dhcpd.conf.$day
awk -f dhcp_manager.awk ComputerList.txt > ../dhcpd.conf
/etc/init.d/dhcpd start
refreshdns.sh
刷新dhcpd.conf DNS分配,该文件置于rc.local末尾,可以刷新DNS,防止运营商更改DNS后,无法解析
#!/bin/bash
dnsfile=/etc/resolv.conf
if [ -e $dnsfile ] ;then
if grep nameserver $dnsfile ;then
dns1=`cat $dnsfile |grep nameserver | cut -d' ' -f2 |tail -n1 | head -n1`
dns2=`cat $dnsfile |grep nameserver | cut -d' ' -f2 |tail -n2 | head -n1`
echo $dns1
echo $dns2
sed -e "s/\(^[ \t]\+option domain-name-servers[ \t]\)\+.\+/\1 $dns1,$dns2;/g" /etc/dhcpd.conf > /etc/dhcpd.conf2
cd /etc
/etc/init.d/dhcpd stop
mv -f dhcpd.conf2 dhcpd.conf
/etc/init.d/dhcpd start
fi
fi
chkMAC.sh
网络检查软件,该文件自动监控网络中的MAC地址,如果不是通过dhcpd.conf的规范地址,则会屏蔽其对于Internet的使用。每个5分钟检查一次,放在crontab中处理
#!/bin/bash
#!/bin/bash
export PATH=$PATH:/sbin:/usr/sbin
arplog=/var/log/arp.log
msglog=/var/log/messages
IPList=/etc/dhcp_manager/ComputerList.txt
curbanIP=/tmp/curBanfwdips.txt
curARPIP=/tmp/curARPIP.txt
lastIPTables=/tmp/lastiptables.txt
LANDev=eth0
resvBegin=1
resvEnd=127
dhcpBegin=192
dhcpEnd=229
IDWORD=chkmac
#Save arp log
arp -n -i eth0 |grep ether| awk '{print strftime("%F %H:%M %w")"\t"$1"\t"$3"\t"$2}' >> $arplog
iptstate -s | grep 192.168 | cut -d':' -f1 | cut -d' ' -f1 | sort | uniq -c | awk '{ print strftime("%F %H:%M %w")"\t"$2"\t"$1"\t state"}' >> $arplog
#remove IP in INPUT
iptables --line-numbers -L FORWARD -nv | grep MAC | awk '{if(match($9,"^!")) print $1"\t"substr($9,2)"\t"$12"\t"$2;else print $1"\t"$9"\t"$12"\t"$2 }' | tac > $curbanIP
arp -i $LANDev -n | grep ether | awk '{print $1"\t"$3}' > $curARPIP
num=`cat $curbanIP | wc -l`
if [ $num -gt 0 ] ;then
#>0
cat $curbanIP | while read idx IP MAC pkgs
do
if grep $MAC $curARPIP > /dev/null ;then
#exist
if [ $IP = anywhere ] || [ $IP = '0.0.0.0/0' ];then
#baned already
IPinArp=`grep $MAC $curARPIP | tail -n1 | cut -f1 | cut -d'.' -f4`
if [ $IPinArp -ge $dhcpBegin ] && [ $IPinArp -le $dhcpEnd ];then
iptables -D FORWARD $idx
echo `date '+%b %e %T'` $0 ": iptables -D FORWARD $idx $IP was obained by DHCP" >> $msglog
fi
else
IPinArp=`grep $MAC $curARPIP | head -n1 | cut -f1`
IPinList=`grep $MAC $IPList | head -n1 | cut -f1`
if [ $IPinArp = $IPinList ] ;then
iptables -D FORWARD $idx
echo `date '+%b %e %T'` $0 ": iptables -D FORWARD $idx $MAC $IP is OK" >> $msglog
fi
fi
else
#not in arp list
if grep $MAC $lastIPTables > /dev/null ;then
lastPkgs=`grep $MAC $lastIPTables|head -n1|cut -f4`
if [ $pkgs = $lastPkgs ] ;then
#no more forwareded pkgs
#removed
iptables -D FORWARD $idx
echo `date '+%b %e %T'` $0 ": iptables -D FORWARD $idx $MAC is no more forwarded pkgs" >> $msglog
fi
else
#removed
iptables -D FORWARD $idx
echo `date '+%b %e %T'` $0 ": iptables -D FORWARD $idx $MAC is not in arp-list" >> $msglog
fi
continue
fi
done
fi
num=`cat $curARPIP | wc -l`
if [ $num -gt 0 ];then
cat $curARPIP | while read IP MAC
do
if ! iptables -L FORWARD -nv|grep $MAC > /dev/null ;then
#New
if grep $MAC $IPList > /dev/null ; then
IPinList=`grep $MAC $IPList | head -n1 | cut -f1`
if [ $IP != $IPinList ] ;then
tmpStr=`date '+%F %T'`
tmpStmp=`date +%s`
iptables -i $LANDev -A FORWARD -m mac --mac-source $MAC -s ! $IPinList -j DROP -m comment --comment "tmstmp:$tmpStmp ,add at $tmpStr,baned by $IDWORD"
echo `date '+%b %e %T'` $0 ": $MAC $IP is illegal " >> $msglog
fi
else
#Not in Compulist.txt,check DHCP
subIP=`echo $IP|cut -d'.' -f4`
if [ $subIP -lt $dhcpBegin ] || [ $subIP -gt $dhcpEnd ];then
#Not in Computlist.txt and not in DHCP
tmpStr=`date '+%F %T'`
tmpStmp=`date +%s`
iptables -i $LANDev -A FORWARD -m mac --mac-source $MAC -j DROP -m comment --comment "tmstmp:$tmpStmp ,add at $tmpStr,baned by $IDWORD"
echo `date '+%b %e %T'` $0 ": $MAC $IP is out of DHCP " >> $msglog
fi
fi
fi
done
fi
iptables --line-numbers -L FORWARD -nv | grep MAC | awk '{if(match($9,"^!")) print $1"\t"substr($9,2)"\t"$12"\t"$2"\t"strftime("%F %T");else print $1"\t"$9"\t"$12"\t"$2"\t"strftime("%F %T") }' > $lastIPTables
rm -f $curbanIP
rm -f $curARPIP
日常运营
日常运营需要 arp iptables iptstate 等日常工具,一般ip占用资源书多的人,带宽占用多
iptstate -s | cut -d':' -f1 | sort | uniq -c
这条命令一般可以把占用多的人给列出来
FAQ:
为何不用 MAC/IP静态绑定?
答: 由于Centos 提供httpd samba 服务,所以私自使用IP者可以使用这些内网服务,但不能使用IP转发的Internet服务
我是Linux新手,需要掌握常用的那些Linux命令?
答:新手就是勤学勤练,多弄弄笔什么都好。建议弄个三台旧电脑,模拟一样环境。从我日常的需求要来看,主要需求如下:
iptables 设置路由器,查看路由器
iptstate 查看当前网络客户使用状态
arp 查看当前arp-ip映射,如果有arp风暴或者欺骗,一查就知道了,然后通过iptables 直接ban掉mac地址,确保网关安全
netstate 查看当前主机连接,某些攻击,这里一看就知道
grep cut uniq awk 等一些通于日常统计的简单命令
/var/log/message /var/log/secure 等常用日志文件,都要知道
先这点,以后补充,多学多用就是王道
更新日志
2012-06-25
更新chkMAC.sh 增加了 arp.log 记录,删除MAC地址是检查是否活跃,不活跃才删除,活跃继续保留。