基于CentOS Linux的简易网关策略

公司有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地址是检查是否活跃,不活跃才删除,活跃继续保留。

 

 

         

 

 

 

 

 

 

你可能感兴趣的:(centos,linux,网络,tcp,internet,manager)