防火墙的类型:
1、包过滤防火墙
根据数据包的源IP、目的IP、源端口、目的端口、协议等特征进行过滤 (四层防火墙)
2、应用代理防火墙
它工作在应用层,处理的效率比较慢,但比较安全
3、状态检测防火墙
Iptables
分两个组件: netfilter 和 iptables
netiflter是一些列的内核模块,它是对数据包和规则进行对比的组件
iptables 是面向用户的结构,提供接口让我们输入规则
涉及的软件包:
iptables
判断操作系统是否支持iptables
/lib/iptables/
/lib/modules/2.6.18-128.el5/kernel/net/netfilter/
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/
规则 定义什么样的数据包,什么样的连接才允许通过
链 一系列的规则就组合成链 链有五个: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
表 针对不同的处理需求,把链组成表,一个表含有多个链 ,
表分4个:
fileter(数据包过滤) INPUT、OUPUT、FORWARD
nat(地址转换) PREROUTING、OUTPUT、POSTROUTING
mangle(数据包修改) PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw PREROUTING、OUTPUT
PREROUTING 路由前处理
INPUT 数据包传到本地应用程序的
FORWARD 数据包是转发出去,不是传到本地应用程序(Router 路由器)
OUTPUT 数据包是有本地应用程序产生的,要发到外部去
POSTROUTING 数据包要发送到网卡之前
拦截的动作: ACCEPT \ REJECT \ DROP \ LOG \ SNAT \ DNAT \ MASQUERADE
------------ ------------
内核空间 用户空间
数据包 --》 8139too.ko(网卡驱动)
|
TCP协议堆
|
iptables.ko ---------------> local process
\--------> 转发出去别的地方
编写规则的命令
iptables
-L 列出某个表的规则
-n 把端口、IP地址用数字的形式显示
-A 追加一条规则到某个链,默认在最后一行插入规则
-I 插入一条规则到某个地方,默认是在第一行插入规则
-D 删除一条规则
-
清空某个表的规则
-X 删除自定义链
-Z 清空数据统计
-v 显示统计数据 ,一般结合 -L
-P 定义默认策略
-t [table_name] 指定哪个表,如果不带这个参数,就默认filter
使用例子:
1、显示规则
iptables -L <--默认是显示filter表的规则
iptables -t filter -L -n -v
iptables -t nat -L -n -v <---显示nat表的规则
2、禁止ping (禁止ping 出去,也禁止ping进来)
iptables -t filter -A INPUT -p icmp -j DROP
为了让本地(ping 127.0.0.1)能ping 通,添加以下规则
iptables -A INPUT -p icmp -i lo -j ACCEPT 《---发现还是不行,因为规则匹配是有顺序的,匹配了某条规则,就不会继续往下匹配,所以需要这样修改:
a、删除这条没有用处的规则:
最笨的方法:
iptables -t filter -D INPUT -p icmp -i lo -j ACCEPT
最好的办法:
iptables -L -n --line-number <---先确定你要删除的哪条规则的编号
iptables -D INPUT 3 <---删除第 3 条规则
b、把规则放到正确的位置
iptables -I INPUT -p icmp -i lo -j ACCEPT <---默认在规则表最前面插入新规则
或
iptables -I INPUT 2 -p icmp -i lo -j ACCEPT <--把规则放到第二行,原来的第二变第三
3、清空某个表的所有规则
iptables -F <---默认就是清空 filter表的规则
iptables -t nat -F
iptables -t mangle -F
如果想把iptables所有表的规则以及统计数据,以及所有自定义的链的数据都删除
iptables -F
iptables -X
iptables -Z
iptables -t nat-F
iptables -t nat-X
iptables -t nat-Z
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -Z
4、允许ping 127.0.0.1 和 允许 ping 10.1.1.0/24 ,其他服务都禁止
# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT
# iptables -A INPUT -j DROP
或者
# iptables -P INPUT DROP 《--定义默认策略,当在规则表里找不到匹配的规则就采取策略的动作
# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT
5、保存规则
service iptables save
将当前规则保存到 /etc/sysconfig/iptables
6、只运访问本机的SSH服务(只允许远程ssh登录到本机)
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT <---定义端口的参数 --dport
还有就是
定义源端口 --source-port --sport
定义目的端口 --destination-port --dport
7、定义连续端口
iptables -A INPUT -p tcp --dport 20:100 -j ACCEPT <---允许访问 20到100的端口
8、定义多端口 <---引入一个“模块”的概念
iptables -A INPUT -m multiport -p tcp --dports 22,80,110 -j ACCEPT
-m 指定模块
multiport 支持多端口的扩展模块
9、允许和内网的客户(10.1.1.0/24)进行传输数据(包括ping)
iptables -P INPUT DROP
iptables -A INPUT -p ALL -i eth0 -s 10.1.1.0/24 -j ACCEPT
10、决绝访问色情网站www.baidu.com
iptables -A OUTPUT -d www.baidu.com -j DROP
11、通过硬件地址进行过滤
-m mac --mac-source [!] address
iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p icmp -j REJECT
注意REJECT 和 DROP 区别
12、定义连续的IP地址
iptables -A INPUT -m iprange --src-range 10.1.1.140-10.1.1.254 -j DROP
13、记录日志,把远程登录到本机的信息都记录到/var/log/messages 并拒绝
iptables -A INPUT -p tcp --dport 22 -j LOG --log-level notice --log-prefix "Iptables : "
iptables -A INPUT -p tcp --dport 22 -j DROP
14、
只想我的电脑成为SSH 服务器端
# iptables -P INPUT DROP
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT
成为ssh服务器端的同时成为ssh客户端,让你能远程登录到别的电脑
# iptables -P INPUT DROP
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT
数据包的四种状态
NEW 想要建立连接的数据包,也就是第一个数据包
INVALID 无效的数据包,例如:损坏的数据报或者不完整的数据包
ESTABLISHED 数据包是完整有效的,已经建立连接的。通讯的两端已经有数据来往过的。
RELATED 与已经发送的数据包相关的数据包。
ssh 10.1.1.141 ---> NEW (建立连接的请求的数据包) ----OUTPUT---> 10.1.1.141
10.1.1.141 ---> ACK 回应 本机,这时候回应的数据包就属于 ESTABLISHED ,回应的数据包走的INPUT链的,根据规则,允许通过。 那么以后在这个建立的连接的基础上产生的数据包就属于RELATED,根据规则也允许通过。
iptables 引入数据包的状态的目的是为了提高iptables的处理效率,只要匹配一次,以后的数据包就可以不再与规则进行多次的匹配。
15、对外只开放web服务,其他一切不放行,不允许进来也不允许出去
# iptables -P OUTPUT DROP
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT <--tcpdump tcp port 80 只看到进来的,没有出去的
# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
16、开放允许查询外部网络的DNS主机
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -p udp --sport 53 -j ACCEPT <---第一查询的时候使用udp 查询
# iptables -A INPUT -p tcp --sport 53 -j ACCEPT <---如果第一次查询失败,就会使用tcp查询
tcp 53端口 肯定会用来作为主从之间的区域文件传输
主[53]--区域文件--》 从[> 1024]
17、开放工作在主动模式下的ftp服务
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
17、开放工作在被动模式下的ftp服务
ftp 两种模式:
主动模式:传输数据20端口 ,ftp服务器主动去连接客户端
被动模式:传输数据>1024端口,客户端主动去连接服务器
# modprobe ip_conntrack_ftp
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
假如ftp服务器监听的端口不只是21而是还有别的:
# modprobe ip_conntrack_ftp ports=21,2021
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 2021 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
18、综合应用:
本机需要开放的服务有: ssh(22) 、 web(80) 、 ftp(21 20) 、 DNS(53) 、pop3(110)、pop3s(995)、IMAP(143)、IMAPS(993)、smtp等服务。
其中web 、ftp、pop3、pop3s、IMAP、IMAPS 允许所有网络的人访问;
ssh 只允许本地局域网中的某个MAC地址访问
只允许本地局域网的用户发送邮件
只允许本地局域网的用户查询DNS
# modprobe ip_conntrack_ftp
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp -m multiport --destination-ports 20,21,80,110,143,993,995 -j ACCEPT
# iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p tcp -s 10.1.1.0/24 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 25 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -s 10.1.1.0/24 -j ACCEPT
作业:
1、通过脚本,把连续3次尝试ssh登录失败的IP放到Iptables进行DROP掉
2、把netstat -nt状态中属于SYN_RECV的IP放到防火墙进行DROP,规则保留3天,不能有重复的规则,3天后把对应的规则删除
syn.txt
service iptables save
==================================================================
禁止登录QQ
实现思路:把所有的QQ的登录服务器都屏蔽 qq.txt
iptables -A OUTPUT -d 219.133.51.251 -j DROP
。。。。。
。。。。。
==================================================================
SNAT
[client] eth0 (172.16.196.129) <----> (172.16.196.1) vmnet1 [Router] eth0 (192.168.20.168)
服务器配置(实现软路由那台机器,需要两张网卡)
1、打开路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
开机生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# sysctl -a | grep ip_forward
2、配置Iptables
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.20.168 《--把所有的协议数据都映射出去外部网络
内网客户端的配置:
1、配置网关
# route add default gw 172.16.196.1
2、配置DNS
# vim /etc/resolv.conf
nameserver 210.21.196.6
================================
host-only (内网) | 外网(互联网)
[vm1-slave] eth0 <---> eth0 [vm2-master] eth1 <------> eth0 [真实机]
172.16.196.129 172.16.196.128 10.1.1.21 10.1.1.20
服务器(vm2-master)的配置:
1、打开路由转发
2、配置Iptables
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.1.1.21
客户端的配置(vm1-slave):
1、配置网关
# route add default gw 172.16.196.128
2、配置DNS
# vim /etc/resolv.conf
nameserver 172.16.196.128
===============================================
DNAT
外网 内网
[vm1-slave] -----> eth0[vm2-master]eth1 <------>10.1.1.20 eth0 [真实机器Web]
172.16.196.129 172.16.196.128 Router DNAT 10.1.1.21
http://172.16.196.128/
Router的配置(vm2-master)
1、打开路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
开机生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# sysctl -a | grep ip_forward
2、配置Iptables ,实现目的地址映射 DNAT
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -d 172.16.196.128 -j DNAT --to 10.1.1.20
内网的Web服务器的配置:
1、配默认网关
# route add default gw 10.1.1.21
# route del -net 172.16.196.0 netmask 255.255.255.0 dev vmnet1 <---额外的步骤,由于虚拟机自动添加了一个路由条目
外网的[vm1-slave] 作为测试主机,需要访问 http://172.16.196.128/
1、配默认网关
# route add default gw 172.16.196.128
-----------------------------
外网 | 内网
[真实机] eth0 10.1.1.20 ---> eth0 [vm2-master] eth1 ---> eth0 [vm1-slave]WEB
10.1.1.21 192.168.1.1 192.168.1.2
环境模拟:
1、所有虚拟机器采用桥接网络
2、vm2-master两个网卡
vm2-master:
ifconfig eth0 10.1.1.21 netmask 255.255.255.0
ifconfig eth1 192.168.1.1 netmask 255.255.255.0
vm1-slave :
ifconfig eth0 192.168.1.2 netmask 255.255.255.0
开始配置:
配置vm2-master<----软路由,负责地址映射:
1、打开路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
开机生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# sysctl -a | grep ip_forward
2、配置Iptables ,实现目的地址映射 DNAT
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -d 10.1.1.21 -j DNAT --to 192.168.1.2
配置内网的web服务器vm1-slave:
1、配置默认网关
route add default gw 192.168.1.1
外网的测试客户机(真实机器)
测试: http://10.1.1.21
=======================================================================
作业:
1、通过脚本,把连续3次尝试ssh登录失败的IP放到Iptables进行DROP掉
2、把netstat -nt状态中属于SYN_RECV的IP放到防火墙进行DROP,规则保留3天,不能有重复的规则,3天后把对应的规则删除
syn.txt
Server(web,ftp)172.16.196.128 ----\
----> vmnet1 [Router 真实机] eth0 (10.1.1.20)
Client-172.16.196.129------------/
实现:
Server服务器提供ftp/web服务,其中ftp仅仅供内部网络的客户访问,web服务器可以让互联网的用户访问(DNAT)
所有的员工只允许访问互联网web服务,已经收发邮件
禁止所有员工使用QQ聊天工具
管理员可以远程登录 Router进行管理
安全要求:
防止CC攻击服务器的web服务,每个IP最多允许建立15个连接,超过就丢弃
connlimit
防止轻量级的DOS攻击SYN洪水攻击,每秒服务器最多处理100个连接
limit
配置步骤:
Router 真实机的配置:
0、打开路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
开机生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# sysctl -a | grep ip_forward
1、清空原来的配置
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
iptables -t nat -Z
iptables -t mangle -Z
iptables -t raw -Z
iptables -t filter -Z
iptables -t filter -X
iptables -t nat -X
iptables -t mangle -X
iptables -t raw -X
2、设定默认策略
[root@dns 10]# iptables -P INPUT DROP
[root@dns 10]# iptables -P FORWARD DROP
[root@dns 10]# iptables -P OUTPUT ACCEPT
[root@dns 10]# iptables -t nat -P PREROUTING ACCEPT
[root@dns 10]# iptables -t nat -P POSTROUTING ACCEPT
3、允许本地环回地址
iptables -A INPUT -i lo -j ACCEPT
4、设置状态跟踪,提高效率
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWORD -m state --state ESTABLISHED,RELATED -j ACCEPT
5、拦截QQ登录
#!/bin/bash
for ip in $(cat qq.txt | awk -F: '{print $1}')
do
iptables -t filter -A FORWARD -d $ip -j DROP
done
6、设置80端口转发,实现允许访问互联网的web服务
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
7、设置允许DNS查询
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
8、允许远程SSH到服务器
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
9、允许收发邮件
iptables -A FORWARD -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -p udp --dport 25 -j ACCEPT
iptables -A FORWARD -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -p udp --dport 110 -j ACCEPT
iptables -A FORWARD -p tcp --dport 143 -j ACCEPT
iptables -A FORWARD -p udp --dport 143 -j ACCEPT
iptables -A FORWARD -p tcp --dport 993 -j ACCEPT
iptables -A FORWARD -p udp --dport 993 -j ACCEPT
iptables -A FORWARD -p tcp --dport 995 -j ACCEPT
iptables -A FORWARD -p udp --dport 995 -j ACCEPT
10、SNAT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.1.1.20
11、DNAT
iptables -t nat -A PREROUTING -i eth0 -d 10.1.1.20 -p tcp --dport 80 -j DNAT --to 172.16.196.128
12、安全相关
每个IP只允许建立15个80服务的连接,拦截CC攻击
iptables -I FORWARD 3 -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 - j DROP
防止syn攻击
iptables -I INPUT -m limit --limit 100/s --limit-burst 100 -j REJECT
配置服务器Server的默认网关
route add default gw 172.16.196.1
配置客户机的默认网关
# route add default gw 172.16.196.1
# vim /etc/resolv.conf
nameserver 10.1.1.1
-----------------------------------------------
[root@dns 10]# iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT
ping ip -i 0.2 <---发现速度很快
[root@dns 10]# iptables -A INPUT -p icmp -j DROP
发现ping 速度变成1/s
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko
[root@dns 10]# chmod 744 /lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko
[root@dns 10]# depmod -a
[root@dns 10]# modprobe ipt_connlimit
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 2 -j REJECT
<-- 针对单个IP 最大并发连接2
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
<--- 针对24位子网掩码对应的网段的主机
10.1.1.141 ---> 并发连接超过16,那么 10.0.0.0/24 这个默认网络的客户都不能访问了
192.168.20.8 ---> 并发连接超过16,那么 192.168.20.0/24 这个默认网络的客户都不能访问了
ADSL ---> 一般拨号会重复在某几个网段
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE -o eth0
======================================================================
内核编译:
http://www.kernel.org
http://www.kernel.org/pub/linux/kernel/
版本号 linux-2.6.28.10 <--- 2 主版本号 , 6 次版本号
如果次版本号是奇数的,代表测试版,里面有很多代码还在测试阶段
如果是偶数就是稳定版
1、解压
tar -xvf linux-2.6.28.10.tar.bz2 -C /usr/src
2、进到解压目录,开始配置
cd /usr/src/linux-2.6.28.10
a、清空原来编译过文件 *.o,保证源码干净
make mrproper
b、对内核编译参数进行配置,定制内核模块、功能,产生.config文件
make config <---交互模式,一问一答的形式来对编译参数进行设定
make menuconfig <---文本菜单的形式 ****
make xconfig <--- 图形界面
运行报错,需要先安装
yum install pkgconfig avahi-qt3-devel -y
make oldconfig <---把当前源码目录下的编译配置文件(.config)备份,然后读取你当前正在使用的内核的编译参数保存为.config,如果新的内核里的一些新的功能,原来内核里面有配置,那么就会以交互模式一问一答来进行确定
[M] <---把该功能以模块(.ko)的形式进行编译,当你内核需要用到这个功能的时候,就可以动态的加载
[*] <--- 把该功能以build-in的形式编译到内核文件里
[] <---不使用该功能
c、make <---编译 --> 产生很多 *.ko模块文件 产生内核镜像vmlinuz
d、make modules_install <---把上一步编译好的模块文件复制到/lib/modules/kernel-version#/
e、make install <---把内核镜像复制到 /boot/下,创建initrd-kernel-version#.img,并复制到/boot,最后修改/boot/grub/grub.conf
注意: 在rhel 5.3以上最后一步会报错:
# vim /etc/sysconfig/mkinitrd/noraid
DMRAID=no
# chmod 755 !$
重新make install