iptables

 

iptables_第1张图片


防火墙的类型:



    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
















你可能感兴趣的:(职场,学习,iptables,休闲)