目标:设置iptables,提高安全性 service iptables save 内核的netfilter/iptables 进入 出去------->进行路由判断----->FORWARD------------------> | | | | | | INPUT OUTPUT | | |_____本地程序___| INPUT filter {FORWARD 作FW功能,保护本机或者隔离两个网络 OUTPUTeg: A 192.168.0.253 拒绝192.168.0.0/24访问A的22端口iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j DROPiptables -t filter -L INPUT command match targetiptables -t table_name -A CHAIN_NAME -s ip/net DROP -P INPUT -d ip/net ACCEPT -F OUTPUT -p tcp/udp/icmp -L FORWARD --sport 22 / 22: -D PREROUTING --dport 22:100 -I POSTROUTING -i eth0 -o eth0 DROP/ACCEPT/REJECT/LOG/MASQUERADE/REDIRECT/SNAT/DNAT | | | | | | | |丢弃 /接受 / 丢弃+恢复/r日志/伪装 /端口重定向 /源NAT/目标NAT先来看防火墙功能 --- filter表 INPUT 对目标地址是本机的数据包的检查点 OUTPUT 对由本地像外发的数据包的检查点 FORWARD 对经过本机转发到其它的网络的检查点(要求本机做为路由器功能打开ip_forward选项)1 、现在有一台服务器,仅提供如下服务各服务器端口号: ICMP TELNET --tcp/udp23 SSH --tcp 22 DNS ---- udp/tcp 53 SAMBA ---- 137/138/139/445 NFS ---- 2049 ??? FTP ---- 21 20? 分主被动模式SMTP---tcp/udp25 邮件的发POP3---tcp/udp 110 邮件的收DNS---tcp/udp53DHCP---tcp/udp67.68HTTP---tcp/udp80HTTPS---tcp/udp 443ORACLE--1521WEBLOGIC--7777MYSQL--tcp/udp 3306RPC--tcp/udp111 SQUID---3128 表:1.filter:用于过滤的时候2.nat: 用于做 地址转换 NAT:Network Address Translator3.mangle: 给数据包打标记 链: 1.INPUT: 位于 filter 表,匹配目的 IP 是本机的数据包2.FORWARD: 位于 filter 表,匹配穿过本机的数据包3.OUTPUT: 位于 filter 表,匹配来源IP 是本机的数据包4.PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)5.POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)语法:iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配到以后的动作]iptables 中的指令,均需区分大小写。 在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设是作用在 filter 这个表。 1.iptables -A APPEND,追加一条规则例:iptables -t filter -A INPUT -j DROP 在 filter 表的 INPUT 链里追加一条规则(作为最后一条规则)匹配所有访问本机 IP 的数据包,匹配到的丢弃2.iptables -I <链名> [规则号码] INSERT,插入一条规则 例: iptables -I INPUT -j DROP 在 filter 表的 INPUT 链里插入一条规则(插入成第 1 条) iptables -I INPUT 3 -j DROP 在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)注意: 1、-t filter 可不写,不写则自动默认是 filter 表 2、-I 链名 [规则号码],如果不写规则号码,则默认是 1 3、确保规则号码 ≤ (已有规则数 + 1),否则报错3.iptables -D <链名> <规则号码 | 具体规则内容> DELETE,删除一条规则例:iptables -D INPUT 3(按号码匹配) 删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么) iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配) 删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则注意: 1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条 2、按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错 3、按内容匹配删除时,确保规则存在,否则报错4.iptables -R <链名> <规则号码> <具体规则内容> REPLACE,替换一条规则例:iptables -R INPUT 3 -j ACCEPT 将原来编号为 3 的规则内容替换为“-j ACCEPT”5.iptables -P <链名> <动作> POLICY,设置某个链的默认规则例:iptables -P INPUT DROP 设置 filter 表 INPUT 链的默认规则是 DROP注意:当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理。 动作前面不能加 –j,这也是唯一一种匹配动作前面不加 –j 的情况6.iptables -F [链名] FLUSH,清除规则 例:iptables -F INPUT 清空 filter 表 INPUT 链中的所有规则 iptables -t nat -F PREROUTING 清空 nat 表 PREROUTING 链中的所有规则注意: 1、-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则 2、-P 设置了 DROP 后,使用 -F 一定要小心!!! 3、如果不写链名,默认清空某表里所有链里的所有规则7.iptables -L [链名] LIST,列出规则 --line-number 列出规则号v:显示详细信息,包括每条规则的匹配包数量和匹配字节数x:在 v 的基础上,禁止自动单位换算(K、M)n:只显示 IP 地址和端口号码,不显示域名和服务名称例:iptables -L 粗略列出 filter 表所有链及所有规则 iptables -t nat -vnL 用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号 iptables -t nat -vxnL PREROUTING 用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解8.iptables -X 清除预设表 filter 中,使用者自订链中的规则 9.流入、流出接口(-i、-o) iptables -A INPUT -i lo -j ACCEPT 匹配是否从网络接口 lo进来,本地接受-o eth0 匹配数据流出的网络接口10.来源、目的地址(-s、-d)例:-s 192.168.0.1 匹配来自 192.168.0.1 的数据包-s 192.168.1.0/24 匹配来自 192.168.1.0/24 网络的数据包-s 192.168.0.0/16 匹配来自 192.168.0.0/16 网络的数据包-d 202.106.0.20 匹配去往 202.106.0.20 的数据包-d 202.106.0.0/16 匹配去往 202.106.0.0/16 网络的数据包-d www.abc.com 匹配去往域名 www.abc.com 的数据包11.协议类型 (-p) 可以是 TCP、UDP、ICMP 等,也可为空例:-p tcp -p udp -p icmp --icmp-type 类型(request-请求,reply-回应)iptables -A INPUT -s 192.168.1.3 -p icmp --icmp-type echo-reply -j ACCEPT 表示来源地址1.3ping不通目的地址,但目的地址能ping通1.3 12.来源、目的端口(--sport、--dport)--sport <匹配源端口> 可以是个别端口,可以是端口范围例:--sport 1000 匹配源端口是 1000 的数据包--sport 1000:3000 匹配源端口是 1000-3000 的数据包(含1000、3000)--sport :3000 匹配源端口是 3000 以下的数据包(含 3000)--sport 1000: 匹配源端口是 1000 以上的数据包(含 1000)--dport <匹配目的端口> 可以是个别端口,可以是端口范围例:--dport 80 匹配目的端口是 80 的数据包--dport 6000:8000 匹配目的端口是 6000-8000 的数据包(含6000、8000)--dport :3000 匹配目的端口是 3000 以下的数据包(含 3000)--dport 1000: 匹配目的端口是 1000 以上的数据包(含 1000)注意:--sport 和 --dport 必须配合 -p 参数使用 匹配应用举例1、端口匹配 -p udp --dport 53 匹配网络中目的端口是 53 的 UDP 协议数据包2、地址匹配 -s 10.1.0.0/24 -d 172.17.0.0/16 匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包3、端口和地址联合匹配 -s 192.168.0.1 -d www.abc.com -p tcp --dport 80匹配来自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 协议数据包注意:1、--sport、--dport 必须联合 -p 使用,必须指明协议类型是什么2、条件写的越多,匹配越细致,匹配范围越小13.-j ACCEPT通过,允许数据包通过本链而不拦截它例:iptables -A INPUT -j ACCEPT 允许所有访问本机 IP 的数据包通过14.-j DROP 丢弃,阻止数据包通过本链而丢弃它]# iptables -P INPUT DROP]# ping 127.0.0.1]# iptables -t filter -A INPUT -i lo -j ACCEPT]# iptables -t filter -A INPUT -p icmp -s 192.168.0.0/24 -j ACCEPT]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT ]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT 允许本机访问192。168。0。0/24的主机22端口,回来的数据包]# iptables -t filter -A INPUT -p tcp --sport 22 -s 192.168.0.0/24 -i eth0 -j ACCEPT[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 53 -j ACCEPT[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 80 -j ACCEPT[root@localhost /]# [root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 443 -j ACCEPT[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 25 -j ACCEPT[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 110 -j ACCEPT[root@localhost /]# iptables -t filter -A INPUT -p udp --dport 137:138 -s 192.168.0.0/24 -j ACCEPT [root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 139 -j ACCEPT[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 445 -j ACCEPT[root@localhost /]# 总结以上重点: 1、默认策略为DROP,会更加 安全 itpables -t filter -P INPUT DROP 此时,最好iptables -t filter -A INPUT -i lo -j ACCEPT 千万不要iptables -t filter -F INPUT (并不会还原默认策略) 2、基本的iptables语句语法得会,并且能够了解内核是如何对数据包进行检查的。 一些常见的服务,基本IP/NET/PORT来做访问控制,应该没有任何问题!!!! 3、一定要会分析数据包的走向。SIP DIP SPORT DPORT 这样,写规则 才能正确并且精确!!! 4、记得保存规则,以避免重启服务规则还原[root@localhost /]# iptables -L --line-numbers[root@localhost /]# iptables -L INPUT -nv --line-numbers [root@localhost /]# /etc/init.d/iptables save将当前规则保存到 /etc/sysconfig/iptables: [确定][root@localhost /]# NFS如何配置允许192.168.0.0/24?(INPUT的默认策略为DROP的情况下) NFS使用了哪些端口? rpcinfo -p 确定111,2049是必用,并且固定的,但是还有一些端口不固定,因而需要配置nfs,定义端口!!! ]# vim /etc/sysconfig/nfs[root@localhost /]# grep 500 /etc/sysconfig/nfsRQUOTAD_PORT=5001LOCKD_TCPPORT=5002LOCKD_UDPPORT=5002MOUNTD_PORT=5005]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 5005 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 5005 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 5001 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 5001 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 5002 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 5002 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 2049 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 2049 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 111 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p udp --dport 111 -j ACCEPTFTP如何配置允许192.168.0.0/24?(INPUT的默认策略为DROP的情况下)FTP的工作模式有2种主动模式(port)被动模式(passive)加载模块,识别FTP的数据连接为相应状态[root@localhost /]# modprobe ip_nat_ftp允许FTP的连接[root@localhost /]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 21 -j ACCEPT允许FTP的数据传输,通过状态来匹配,匹配为ESTABLISHED和RELATED状态[root@localhost /]# iptables -t filter -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT对应ICMP的不可达消息 也是RELATED状态[root@www ~]# iptables -t filter -A INPUT -p icmp -m state --state RELATED -j DROPICMP如何配置为只允许192.168.0.253ping通192.168.0.0/24,反之则不允许(INPUT的默认策略为DROP的情况下)[root@localhost /]# iptables -t filter -A INPUT -p icmp -m state --state ESTABLISHED -s 192.168.0.0/24 -j ACCEPT----------高级匹配和高级扩展以及应用-----icmp 无端口 网络层tcp22回环接口就是自己和自己的通信 lo是虚假想象出来的udp?-n 不显示详细信息 -v 显示详细信息iptables -L-nv rpcinfo -p 显示NFS的端口 111 2049必用 tcp/ip 协议 卷一 卷2 卷3UDP 用端口不方便要用状态源端口是大于1024的随即端口 1 192.168.1.0/24不可以访问192.168.2.253的22端口23端口53端口 分析来源和目标:snet:192.168.1.0/24 dip:192.168.1.253sport: >1024 dport:23,22,53在1.253上的INPUT链写规则 :[root@ netfilter]# iptables -t filter -A INPUT -p tcp -s 192.168.1.0/24 -d 192.168.1.253 --dport 22:23 -j DROP[root@ netfilter]# iptables -t filter -A INPUT -p udp -s 192.168.1.0/24 -d 192.168.1.253 --dport 22:23 -j DROP[root@ netfilter]# iptables -t filter -A INPUT -p tcp -s 192.168.1.0/24 -d 192.168.1.253 --dport 53 -j DROP[root@ netfilter]# iptables -t filter -A INPUT -p udp -s 192.168.1.0/24 -d 192.168.1.253 --dport 53 -j DROP [root@ netfilter]# iptables -t filter -L INPUT -n [root@ netfilter]# iptables -t filter -L INPUT -n --line-number[root@ netfilter]# iptables -t filter -D INPUT 3 [root@ netfilter]# iptables -t filter -L INPUT -n --line-number -vChain INPUT (policy ACCEPT 184M packets, 14G bytes)num pkts bytes target prot opt in out source destination 1 24 2432 DROP tcp -- * * 192.168.1.0/24 192.168.1.253 tcp dpts:22:23 2 0 0 DROP udp -- * * 192.168.1.0/24 192.168.1.253 udp dpts:22:23 [root@ netfilter]# iptables -t filter -P INPUT DROP [root@ netfilter]# iptables -t filter -A INPUT -i lo -j ACCEPT[root@ netfilter]# ping localhostPING localhost.localdomain (127.0.0.1) 56(84) bytes of data.64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.136 ms--------------作业:A ------ BA、B都启动22端口A、B的默认策略都设置为DROP掉A 可以ssh到BB 不可以ssh到A`-------------sysctl -a net.ipv4.netfilter.ip_conntrack_max = 65536vim /etc/grub.confkernel /boot/vmlinuz-2.6.18-238.el5 ro root=LABEL=/1 ip_conntrack.hashsize=524288------- iptables ++++++++扩展匹配++++++++++这就需要用到 netfilter 的功能扩展模块,所有的扩展模块都存放在 /lib/modules/2.6.X/kernel/net/ipv4/netfilter/ 下。可以自行编译额外的 netfilter 功能模块到这里,在使用新加入的模块之前,需要先加载模块:insmod 模块(可以填绝对路径),也可以使用 iptables 的 --modprobe= 参数来指定 。!! 内核模块都是根据特定的内核环境编译出来的,所以不同的内核编译出来的内核模块一般是不通用的。!! netfilter 的动态衔接库文件位于 /lib/iptables/ 下使用方法:需要先使用 -m 选项来指定要使用的扩展匹配功能(模块),之后再指明参数!! TCP 连接,三次握手(建立链接),四次挥手(断开链接)?? 模块与动态衔接库的区别modinfo ip_nat_ftp.ko 查看模块的详细信息大写的就是拓展目标,小写扩展匹配1. -m connlimit 匹配并发连接数(一个用户打开多线程操作)用于限制每个IP并发的TCP最大连接数 [!] --connlimit-above n 匹配并发连接数大于 n 个 iptables -m connlimit -h 查看用法例:只允许不超过三个用户连接到本机的21端口(ftp服务),如果超过了 3 个,则 REJECT 每个访问23端口的并发连接数iptables -t filter -A INPUT -p tcp --dport 21 -m connlimit --connlimit-above 3 -j REJECTiptables -t filter -A INPUT -p tcp --syn--dport 23 -m connlimit --connlimit-above 3 -j REJECT或者iptables -t filter -A INPUT -p tcp --syn--dport 23 -m connlimit !--connlimit-above 3 ACCEPT限制子网掩码不常用iptables -t filter -A INPUT -p tcp --syn--dport 23 -m connlimit --connlimit-above 3 --connlimit-mask 24 --j REJECT 每IP访问23端口的并发连接数上限超过2个就REJECT[root@www netfilter]# iptables -t filter -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT[root@www netfilter]# iptables -t filter -A INPUT -p tcp --syn --dport 23 -m connlimit -h[root@www netfilter]# iptables -m connlimit -h 每IP访问80端口的并发连接数上限超过3个就REJECT[root@ ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP[root@ ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m connlimit ! --connlimit-above 3 -j ACCEPT[root@ ~]# iptables -L INPUT -n Chain INPUT (policy ACCEPT)target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 #conn/32 > 3 # limit the nr of parallel http requests to 16 per class C sized# network (24 bit netmask)iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT2. -m icmp 匹配 ICMP --icmp-type [!] typename 可以使用 iptables -p icmp -h 来查看 typename,这些 typename 都对应着协议的编号,其中两个重要的是, 0 表示 echo-reply (icmp 回复),8 表示 echo-request (icmp 请求)注意:使用时,需要先指明网络协议为 icmp两种基本的ICMP类型:echo-requestecho-replyping (icmp) 工作流程图 A ping B B pingA数据包的走向图A -- icmp (echo-request) --> BA <-- icmp (echo-reply) -- BA <--icmp (echo-request)-BA----icmp (echo-reply)------>B可以直接拒绝 icmp 协议,但这样不论 ping 别人还是别人 ping 本机,都是不可以的(被DROP了)。iptables -t filter -A INPUT -p icmp -j DROP例:为了达到别人不能 ping 本机,而本机可以 ping 别人的目的,可以按顺序加入下规则 iptables -t filter -A INPUT -p icmp -s 192.168.0.0/24 -m icmp --icmp-type echo-reply -j ACCEPT iptables -t filter -A INPUT -p icmp -j DROP注意:可以直接以 0 代替 echo-reply ,8 代替 echo-request[root@ ~]# iptables -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT[root@ ~]# iptables -I INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT[root@ ~]# iptables -I INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT3. -m iprange 匹配 IP 的范围 [!]--src-range ip1-ipn源范围 [!]--dst-range ip1-ipn目标范围例:不允许 192.168.0.1 到 192.168.0.100 的主机 ping 本机 iptables -t filter -A INPUT -p icmp -m iprange --src-range 192.168.0.1-192.168.0.100 -j DROP]# iptables -P INPUT ACCEPT]# iptables -F]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m iprange --src-range 192.168.0.1-192.168.0.100 -j DROP允许192.168.1.1-192.168.1.100主机上网]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.1-192.168.1.100 -j ACCEPT]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.101-192.168.1.252 -j DROP范围的匹配,指某一段的ipiptables -A INTPUT -m iprange --src-range 192.168.0.1-192.168.0.100 -j ACCEPT 一段地址进行访问允许 4. -m length 匹配IP数据包的大小 分片 分段按长度注意:这里是数据包的大小,包括了IP包头信息和包内数据信息 num1:num2 包的大小为 num1 到 num2 之间 num1: 包的大小为 num1 以上,包括 num1 :num2 包的大小为 num2 以下,包括 num2 关于 ping 的包中的数据大小和包头大小[root@station24 ~]# ping 192.168.0.253PING 192.168.0.253 (192.168.0.253) 56(84) bytes of data.64 bytes from 192.168.0.253: icmp_seq=1 ttl=64 time=0.566 ms64 bytes from 192.168.0.253: icmp_seq=2 ttl=64 time=0.167 ms64回的包的大小注意,回执信息第一行中的 56(84) ,这表示回执的包大小是84个字节,其中54个字节是数据部分,剩下的28字节是 header 信息,其中20个字节是IP的 header 源ip目标IP,剩下的8个是ICMP的 header。使用 ping 的 -s 选项来指定发送的 icmp 包中的数据的大小 ping -s sum IP ping -s 100 192.168.0.253这里用 -s sum 选项来指定发送的包中的数据的大小为 sum ,因此包的大小会是 sum + 28 bytes例:只接受数据包大小在 200 bytes 以内的 icmp 数据包(ping )iptables -t filter -A INPUT -p icmp -m length --length :200 -j ACCEPT]# iptables -t filter -A INPUT -p icmp -m length --length 100:200 -j ACCEPT]# iptables -t filter -A INPUT -p icmp -j DROP]# iptables -t filter -I INPUT -s 192.168.1.0/24 -p icmp -m length --length 80:100 -j DROP这里列出所有的 header 大小信息:TCP header 20 bytesUDP header 8 bytesIP header 20 bytesicmp header 8 bytes因为 MTU 为 1500 bytes(假设这里的路径MTU为 1500),那么发送一个 6000 bytes 的包就必须分片,这里要分为 4 片,分别是packet_01 40 + 1460 = 1500 bytespacket_02 40 + 1460 = 1500 bytespacket_03 40 + 1460 = 1500 bytespacket_04 40 + 620 = 1500 bytes这里使用的是 TCP 协议,所以 TCP header + IP header = 40 bytes5. -m limit 匹配每段时间内接受包的个数 限制速度使用令牌桶过滤算法,就是说,每段时间内允许传输一定数量的包,超过则阻止,如果传输的包较少,则把多余的允许值放入令牌桶,那么如果另一段时间,请求超过规定的数目后,就会从令牌桶中抽出以前保存的允许值,交给这些多出的请求。 --limit rate rate的形式可以是 num/minute,表示每分钟只接受num个包,也可设定时间段为 second 、hour 、day,默认是 3/hour,这里一个包的最大大小受MTU大小所限制。 --limit-burst number 爆发流量,设定令牌桶中初始的允许包的数目为 number,默认是 5。例:每分钟只接受10个icmp包,超过的(即使说不匹配这条规则的)则按默认规则来处理。iptables -t filter -A INPUT -p icmp -m -icmp --icmp-type echo-request -m limit --limit 10/minute -j ACCEPT 这里通过限制本机服务的回包数,即在 OUTPUT 上限制包流量,来限制对方的对本服务的访问速度]# iptables -F OUTPUT]# iptables -t filter -A OUTPUT -p tcp --sport 80 -m limit --limit 20/second -j ACCEPT]# iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP----------]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 10/minute --limit-burst 10 -j ACCEPT]# iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP例:设定客户端访问http服务的带宽为30KBiptables -t filter -A OUTPUT -d 192.168.0.0/24 -p tcp --sport 80 -m limit --limit 20/minute -j ACCEPTiptables -t filter -A OUTPUT -d 192.168.0.0/24 -p tcp --sport 80 -j DROP # 如果不匹配上面的那一条,则这一条就是 httpd 的默认规则]# watch iptables -L INPUT -nv ]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type echo-request -m limit --limit 10/minute --limit-burst 10 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type echo-request -j DROP----------wget 下载 速率30k/s--------]# iptables -t filter -A OUTPUT -p tcp --sport 80 -m limit --limit 20/second -j ACCEPT]# iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP可以限制数据包有多少通过 两个一起写:1.iptables -A INPUT -m limit --limit 10/m -p icmp -j ACCEPT 10指每分钟10个包2.iptables -A INPUT -p icmp -j DROP 不符合的丢弃下载速度:iptables -A INPUT -m limit --limit 20/s -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP 不符合上条规则的丢弃测试:dd if=/dev/zero of=file 在/var/www/html/下写文件启动APACHEwget 192.168.0.28/file也可这么写:iptables -A OUTPUT -d 192.168.0.28 -p tcp --sport 80 -m limit --limit 20/s -j ACCEPT iptables -A OUTPUT -d 192.168.0.28 -p tcp --sport 80 -j DROP !! lo 接口的 MTU(16436),因为是本地回环,所以要远远大于其他物理网卡接口的 MTU 大小(1500bytes),所以使用 iptables 的 -m limit 限制流量时,若本机访问自己的服务,则情况会有所不同!! 使用 ethtool 来调整网卡的参数,比如修改网卡支持的贷款(10M 或 100M 或 1000M,以及全工双全工的设置等等)wget http://192.168.0.253/file8b=12KB100/830KB/S=30000b/s包大小大约是1500b所以20/s 每秒20个包6. -m mac 匹配网卡 MAC 地址 基于MAC地址的访问 只能用于INPUT和PREROUTING链使用 --mac-source [!] address格式:-m mac --mac-source mac_addr MAC 地址的写法是 XX:XX:XX:XX:XX:XX ,6个16进制数,总大小 48bit]# iptables -A INPUT -p icmp -m mac --mac-source 00:B0:C4:01:27:D1 -j DROP.ping 发个数据包 然后用arp -n可查看mac地址iptables -A INTPUT -m mac --mac-source 00:23:54:6A:18:CE -j DROP 不写协议表示都默认,写多个只有写多个iptables语句7. -m mark 匹配 mangle 表所标记的包 标记mask 相当于合格证 安装数据包的标记匹配,按照数据包的标记匹配mangle表:给数据包打标记,一般在路由前打标记转发功能只能在nat表PREROUTING中打标记 --mark value打标记:iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.1-192.168.0.100 -j MARK --set-mark 1 MARK打标记,名字为1。(1到无穷大的整数只是打标记,需要应用到其他的链里)iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.200 -j MARK --set-mark 2iptables -t filter -A FORWARD -m mark --mark 1 -j DROPiptables -t filter -A FORWARD -m mark --mark 2 -j ACCEPT]# iptables -t filter -I INPUT -m mark --mark 1 -j DROP]# iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.1.1-192.168.1.50 -j MARK --set-mark 1iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.253 -j MARK --set-mark 2iptables -t filter -A FORWARD -m mark --mark 1 -p tcp --dport 80 -j ACCEPTiptables -t filter -A FORWARD -m mark --mark 2 -p tcp --dport 80 -j DROP]# iptables -t mangle -A FORWARD -m iprange --src-range 192.168.1.1-192.168.1.100 -j MARK --set-mark 1 ]# iptables -t mangle -A FORWARD -m iprange --src-range 192.168.1.101-192.168.1.200 -j MARK --set-mark 2]# iptables -t filter -A FORWARD -m mark --mark 1 -j ACCEPT]# iptables -t filter -A FORWARD -m mark --mark 2 -j DROP-m mark --mark-j MARK --set-mark[root@www iptables]# iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.1-192.168.0.100 -j MARK --set-mark 1[root@www iptables]# iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.253 -j MARK --set-mark 2[root@www iptables]# iptables -t filter -A FORWARD -m mark --mark 1 -j DROP[root@www iptables]# iptables -t filter -A FORWARD -m mark --mark 2 -j ACCEPTiptables -A INPUT -m mark --mark 1 -p tcp --dport 80 -j ACCEPT 表示标记1到端口80的都接收,默认在filter表8. -m multiport 匹配多个端口 --destination-port port1,port2,...,portN 指定多个目的端口 --source-port port1,port2,...,portN 指定多个源端口例:DROP掉到本机端口 22、23 和 80 的包iptables -t filter -A INPUT -p tcp -m multiport --destination-ports 22,23,80 -j DROP]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp -m multiport --destination-ports 22,25,110,80 -j ACCEPT]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --destination-ports 22,25,110,80,53,21 -j DROP9. -m owner 匹配数据包的创建者(用户、进程、用户组...)只能用于OUTPUT链 并且不是所有包都是有所有者的 比如ping包 --uid-owner 指明发出该包的用户的UID --gid-owner 指明发出该包的用户组的GID --pid-owner 指明发出该包的进程的PID]# iptables -t filter -A OUTPUT -m owner --uid-owner pg -j DROPsu - pg 访问其它主机的80,22等,都不允许,因为产生的访问包所有者被匹配为pg身份一般仅能用在 OUTPUT,限制本地发出的包 ,但有些协议不支持就是说不是所有包都有 所有者 的(icmp,它没有创建者) 注意:甚至可以限制 root ( uid = 0 )。]# iptables -t filter -A OUTPUT -p tcp --dport 21 -m owner --uid-owner 0 -j DROP例:凡是uid为500的用户发出的数据包,都DROP掉,即不允许他与外界通信iptables -t filter -A OUTPUT -m owner --uid-owner 500 -j DROP]# iptables -t filter -A OUTPUT -p tcp --dport 21 -m owner --uid-owner 1011 -j DROP不想让普通帐号访问web服务器,也可是组写法:iptables -A OUTPUT -m owner --uid-owner `id -u hello` -j DROP 如果用户为hello就丢弃,不让其访问(id -u hello 打印帐号UID)访问其他主机的 80 2210. -m state 匹配IP包的状态,用于对数据包的状态进行追踪需要安装模块 ip_conntrack所有包的状态被保存在文件: /proc/net/ip_conntrack状态 NEW 表明这个包要开启一个新的连接,或者和另外一个包相关连(不管什么协议都一样,对 UDP 协议来说是第一个包,对 icmp 协议是 icmp-request 包)状态 ESTABLISHED 表示一个连接已经建立了状态 RELATED 表示这个包开启了一个新的连接,但与前一个开启的连接相关联(比如 被动方式连接的 FTP 、icmp 的报错)状态 INVALID 表示这个包不能被识别,它不是 NEW 状态,但这个包不和任何一个已经建立的连接相关联,这种包是十分可疑的,一般要 DROP以 TCP 的3次握手建立连接为例: | -- syn seq=num1 --> | NEWESTABLISHED | <-- ack=num1 seq=num1+1 -- | | -- seq=num1+2 ack=num1+1 --> | ESTABLISHED | ... | 之后两端传输的数据包就都是 ESTABLISHED 状态了!! 数据传输的模式:主动模式(端口模式) 和 被动模式,主动模式的 FTP 是数据端口是 20 ,而被动模式的则是1024以上的随机端口例:通过状态来限制 icmp 包iptables -t filter -A INPUT -s 192.168.0.0/24 -p icmp -m state --state NEW -j ACCEPT例:通过包的状态来控制ftp服务因为ftp是默认被动连接的,所以需要通过包的状态来设置ftp的过滤规则 modprobe ip_nat_ftp # 需要安装这个模块,可以基于状态去控制 FTP 服务]# insmod /lib/modules/2.6.18-128.el5xen/kernel/net/ipv4/netfilter/ip_nat_ftp.ko 使本地主机可以通过 lo 接口来访问本地的服务 iptables -I INPUT -i lo -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 21 -s 192.168.0.0/24 -j ACCEPT # 允许访问 21 端口 iptables -t filter -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -s 192.168.0.0/24 -j ACCEPT # 允许 ftp 随机开启的数据端口第一次发出来的是NEW包,服务器给你回应的包就为建立包ESTABLISHEDiptables -A INPUT -m --state NEW -j DROP 意思是:例如:0.254和0.28两个IP,这个命令就是0.254能ping通0.28,但0.28不能ping通0.254 ,0.28发出一个新包会被丢弃,是进入,所以要看INPUT链,0.254是出去,所以要看OUTPUT链。iptables -A OUTPUT -m state --state NEW -j DROP 0.254向外发出的数据包都被丢弃.即不允许访问别人iptables -A OUTPUT -m state --state ESTBALISHED -j ACCEPT第三个状态RELATED 通常和 ESTBALISHED连用,用逗号隔开第四个状态INVALID 通常和NEW连用写法:iptables -A OUTPUT -m state --state ESTBALISHED,RELATED -j ACCEPTINVALID状态 iptables -t filter -A INPUT -m state --state INVALID -j DROP 1、如果从来没发送过ICMP-REQUEST,而收到了一个ICMP-REPLY,这种属于INVALID状态2、如果从来没有TCP连接过,而收到了一个FIN的标记的数据包iptables -t filter -A INPUT -p icmp -m state --state NEW -j ACCEPT11. -m tcp 匹配 TCP header 的标记 --tcp-flags [!] mask comp 匹配标志位tcp header 共20字节,其中包括一个字节的标记段一个字节是 8 bit,这个标记段的每个 bit 位都代表一个标记,比如 SYN 和 ACK它所匹配的其他标志位: RST 标记 如果服务端没有开启Client要访问的端口,则返回一个 RST 标记的包给 Client FIN 标记 断开链接时使用 PSH 标记 URG 标记 紧急标记位,服务端当机时,会尽力发送一个带有URG标记的给Client,以通知。SYN: tcp 3次握手同步位标记 syn洪水攻击 占用系统的资源导致正常的用户无法完成数据的传输ACK:确认标记位 3次握手 4次挥手 中间发送数据都用到PSH:信息快速到达接受放收到这个标记 直接交给应用程序 交互的服务应用较多 推位RST: 重置标记位 访问没有开启的端口的时候 服务器发送ACK 和PST标记重置一下FIN:仅在非法扫描和4此挥手用URG:紧急标记位以后会举例,针对于syn的洪水攻击来写规则 你好 你好 好 3次握手例:iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN它同时检查 SYN ACK FIN RST 四种标记,并且 SYN 标记置 1 ,其它的标记位(ACK FIN RST)为 0 。只有SYN位设置 其他标记位没有被设置的就匹配iptables -t filter -A INPUT -p tcp -m tcp SYN,RST,ACK,FIN SYN --dport 80 -j DROP注意:-m tcp 是被默认加载的,可以不写 -m tcp -p tcp --tcp-flags]# iptables -t filter -A INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN --dport 80 -j DROP-m tcp --tcp-flags SYN,ACK,FIN,PSH SYN -p tcp --syn 保存 iptables 规则 ]# /etc/init.d/iptables save将当前规则保存到 /etc/sysconfig/iptables: [确定]规则会被保存在 /etc/sysconfig/iptables ,这样下次开机时,这个文件中的规则会被自动地加载。[root@ html]# tcpdump -i eth0 -vn src host 192.168.1.2 and dst port 22 and dst host 192.168.1.253 抓包测试12. -m string 匹配包中数据所包含的字符串 需要 kernel >= 2.6.14 --string str 包中的数据是否包含 str 数据 z对中文字符是无效的]# iptables -t filter -A INPUT -s 192.168.0.0/24 -p tcp --dport 21 -m string --algo bm --string "pg" -j DROP 通过字符串匹配,实现不允许以FTP方式以pg身份连接192.168.0.253# iptables -t filter -I INPUT -s 192.168.1.8 -p tcp --dport 21 -m string --algo bm --string "USER" -j DROP# tcpdump -i lo -vn host localhost and port 21 -XROP//抓包测试13. -m tos 由于匹配 IP 头部信息中的 8 bits 的服务类型标志位 (Type of Service field)在 IP首部(20字节)中有一个自己的位置用来描述数据包的TOS值 [!] --tos value根据 tos 对服务进行分类,一共5种类型 Minimize-Delay 最小延时服务 16 典型的服务 telnet ssh 交互式服务 Maximize-Throughput 最大吞吐量服务 8 吞吐量是指单位时间内传输的数据量,这个标志位一般用于高速的数据传输,比如 scp ftp http下载wget Maximize-Reliability 最大可靠性 4 要求数据最为可靠地(不丢包,数据不出现错误)传送过来 Minimize-Cost 最小消费服务 2 使用有限的带宽 Normal-Service 一般服务 0 比如 icmp 包查看更多的帮助 iptables -m tos -h8位的 Type of Service field 前三位为使用 中间4位 保留 xxx xxxx x 未用 TOS 0 1000 0 16 D 0X10 0100 0 8 T 0010 0 4 R 0001 0 2 C 0000 0 0 N例:设定 ssh 服务的功能,只允许scp,不允许ssh]#iptables -t filter -A INPUT -p tcp --dport 22 -m tos --tos 16 -j DROP在IP首部(20字节)中有1个字节的位置用来描述数据包的TOS值 TYPE OF SERVICE 服务类型 # iptables -t filter -A INPUT -p tcp -m tos --tos 16 -j DROP 14. -m ttl 匹配IP包的存活时间,一个IP包一旦创建,则 ttl 被赋值为128(跳),每经过一个路由器,则减 1(默认减1,也可能有其他的减值)描述记过几个路由器 --ttl-eq numttl 值是 IP header 中的部分。描述记过几个路由器系统现在的(内存中)的 ttl 值保存在 /proc/sys/net/ipv4/ip_default_ttl 。可以使用如下的方法,来定义系统默认的 ttl 值,修改 /etc/sysctl.conf ,添加如下内容 net.ipv4.ip_default_ttl = new_value注意:也就是把 net/ipv4/ip_default_ttl 路径中的 / 换成 . 得到的……例:不转发 ttl 为 64 的数据包,一般 linux 的包的 ttl 为 64,而 Windows 的为 128iptables -t filter -A FORWARD -m ttl --ttl-eq 64 -j DROPiptables -t filter -A INPUT -p icmp -m ttl --ttl-eq -j DROP ]# iptables -A INPUT -p icmp -m ttl --ttl-eq 64 -j DROP--------]# iptables -t filter -A FORWARD -m ttl --ttl-eq 128 -j DROP在 ping 对方时,设定 icmp 包的 ttl 值ping -t ttl_value IP ping 192.168.0.253 -t 66 用ttl值ping]# iptables -t filter -A INPUT -p icmp -m ttl --ttl-eq 64 -j DROP]# echo "net.ipv4.ip_default_ttl = 128" >> /etc/sysctl.conf 15. -m udp 匹配 UDP 协议比较典型的UDP服务,syslog ,监听的端口为 51416 -m time编译time模块]# cp /var/ftp/pg/iptables_dir/ipt_time.ko /lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/]# insmod /lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/ipt_time.ko ]# iptables -t filter -A INPUT -p icmp -m time --timestart 15:23 --timestop 18:00 --days Wed -j DROP//禁止pingiptables -t filter -A INPUT -p tcp -m time --time start 15:23 --timestop 18:00 --days w ed -j DROP //15:23dao 18:00点禁止访问/lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/ko内核功能模块so共享模块=======目标扩展=========是除 ACCEPT DROP REJECT 之外的处理操作]# cd /lib/modules/2.6.18-194.el5/kernel/net/ipv4/netfilter/ 模块所在处-jTARGET扩展总结: ACCEPT丢弃 DROP 拒绝 REJECT --reject-with拒绝并且回复信息 MARK --set-mark 标记 LOG 日志 MASQUERADE伪装 MIRROR 反弹数据包,就是将发向本机的数据包中的源地址和目的地址对换,然后发出1. REJECT 扩展拒绝REJECT 相当于 丢失+和恢复信息REJECT --reject-with icmp_error_message这些 icmp_error_message 不是随便设定的,因为要通过 icmp 回传,这些出错信息都是已经定义好的,出现什么错误就要回传什么 icmp 报错包。!! icmp 包除了 1 和 8,其他的都是用于错误信息的回应,比如无法访问对应httpd服务,对方就会返回一个 icmp 包,通知相应的错误。 iptables -t filter -A INPUT -p tcp -j REJECT --reject-with icmp-proto-unreachable网络不可达 icmp-host-unreachable 主机不可达 icmp-proto-unreachable 协议不可达 iptables -t filter -A INPUT -p tcp -j REJECT -h 可以查看]# iptables -t filter -A INPUT -p icmp -j REJECT --reject-with icmp-proto-unreachableREJECT --reject-with xxxxxx[root@ html]# iptables -t filter -A INPUT -p icmp -j REJECT -h[root@ html]# iptables -t filter -A INPUT -p icmp -j REJECT --reject-with icmp-net-unreachable[root@ html]# iptables -t filter -A INPUT -p tcp --dport 80 -j REJECT --reject-with icmp-net-unreachable# iptables -t filter -I INPUT -p tcp --dport 80 -j REJECT --reject-with tcp-reset[root@ html]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 10.10.10.112 -j DNAT --to 192.168.1.2:80 [root@ html]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 10.10.10.112 -j DNAT --to 192.168.1.2:8080NAT网络地址转换相关的处理动作:IP地址端口地址DNAT/SNAT/MASQUERADE/REDIRECT做完 NAT 转发数据包之后,unNAT 会对回传的对应数据包作反向处理(处理操作与之前NAT作的相反)2. SNAT/MASQUERADE源地址转换,一般用于位于内部网络(私有网络)的主机去连接外部网络的主机,常见的是实现共享上网 C1 C2 C3 --> (192.168.0.1)GW(10.10.10.112) --> internet ... CN192.168.0.0/24例:简单的SNATiptable -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 1.1.1.1 # --to-source 可以简写为 --to如果网关的公网地址是动态分配的,就不能使用 --to 了,必须使用地址伪装 MASQUERADEiptable -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADEiptables -t nat -A POSTROUTING -j SNAT --to 192.168.2.1 能ping通主机但主机ping不回来,原因是:0.254去ping0.3的时候经POSTROUTING把IP转为2.1了,0.3接收到数据包但不在同一网段,所以无法ping通]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.10.10.112]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 10.10.10.112]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE ]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE 3. DNATDNAT 的一个重要作用是发布位于内网的服务器 C1 C2 C3 <-- GW <-- internet192.168.0.253 1.1.1.1例子:简单的DNATiptables -t nat -A PREROUTING -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to-destination 192.168.0.253:80 # --to-destination 可以简写位 --to注意:DNAT在转换目的地址的同时,也可以指定转换到新的地址的指定端口注意:同时需要开启IP转发。例:本地主机 C2 通过域名 www.test.com 访问位于内网的C1的www服务C0C1(0.88) --> (0.253)GW(1.253 www.test.com) --> internetC2(0.77)iptables -t nat -A OUTPUT -s 192.168.0.0/24 -d xxx.xxx.1.253 --dport 80 -j DNAT --to 192.168.0.88:80在 OUTPUT 上作地址转换4. REDIRECT端口重定向,只能重定向为自己的端口例:在GW处架设 squid 来代理内网主机上网,这里要把内网 Client 发到网关的访问80端口的包,重定向到网关的3128端口,就是由 squid 监听的端口iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128]# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 31285. LOG表示记录日志对端口访问记录日志,用于入侵检测和取证 --log-level 日志级别 日志级别可以去查看 syslog.conf ,不需要指定日志的对象,这里是 kernel --log-prefix " 日志前缀 " 为日志记录添加上前缀,便于查看,注意这个日志前缀两端最好要加上空格,便于与其他日志信息隔开。 --log-tcp-sequence 记录 tcp 序号的选项,还有很多的记录日志的选项,可以去看帮助。注意:-j LOG 只是用来记录匹配上的包的日志,并不对该包进行处理,所以要在记录日志的包的下面在加上匹配该包的规则。例:对访问80端口的包记录日志iptables -t filter -A INPUT -p tcp --syn--dport 80 -j LOG --log-tcp-options --log-ip-options --log-prefix "IPTABLES"iptables -t filter -A INPUT -p tcp -j DROP # 后面应该紧跟着处理规则,因为上面那条只是用来记录日志的 记录的日志会默认保存在 /var/log/messages 中 nmap -sF 192.168.0.253 扫描开放的端口日志记录规则下面应该立即加上一条对数据包的ACCEPT或者DROP规则的处理]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j LOG --log-prefix "22PORT " --log-tcp-options --log-ip-options --log-uid]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j ACCEPT----------iptables -t filter -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID PACK" --log-tcp-options --log-ip-options --log-uidiptables -t filter -A INPUT -m state --state INVALID -j DROP!! iptables 中每个 check_point 处理的次序是:mangle nat filter;也可以这样理解,在不同的表中有相同的链时,总是先处理 mangle 表的,之后是 nat 表的,最后才是 filter 表的。]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j LOG --log-prefix "IPTABLES " --log-tcp-options --log-ip-options --log-uid ]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j DROP]# grep IPTABLES /var/log/messages6. mangle 只能在 mangle 表中使用,且标记只能用数字,一般能在 PREROUTING 和 OUTPUT 中使用先 mangle 再 routing 再 output -j MARK --set-mark MARK_NUMBER在匹配时要使用 -m mark --mark MARK_NUMBER例:在检查点 PREROUTING 为不同网段的包打上标记,然后在检查点 FORWARD 处理打上标记的包iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.1-192.168.0.100 -j MARK --set-mark 1iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.0.101-192.168.0.200 -j MARK --set-mark 2iptables -t filter -A FORWARD -m mark --mark 1 -j DROPiptables -t filter -A FORWARD -m mark --mark 2 -j ACCEPT使用 sevice iptables save 保存iptables过滤规则7层过滤 就是在应用层进行过滤注意:出现错误 Unknown error 4294967295 ,很有可能是因为添加的规则没有加到正确的链上,比如将只能在 OUTPUT 上加的规则加到了 INPUT 上。对于iptables 的 Bugs,可以去 iptables 的 bug 报告网站去查看。作业 A -- BA B 都启动 22 端口A B 的默认策略都设置为 DROPA 可以 ssh 到 B,而 B 不可以 ssh 到 A作业流量监控,经由网关的的机器的流量需要在 网关 的 FORWARD 上写作业开启 iptables 的情况下配置服务作业 :1写一个规则集保护本机,HOST FW主要针对于INPUT链做检查对于OUTPUT相对宽松 不对外做服务,只访问外部服务2 写一个规则 集保护内网,GETWAY FW内网办公网络 GW 外网内部服务器(202.1.1.0/24 公网地址)--(202.1.1.11)GW(202.1.2.11) 首先,内网有两个网段A(192。168。1。0)和B(192。168。2。0),A需要能够SNAT上网,B需要SQUID上网(不可上QQ,TAOBAO,KAIXIN网,不可下载.exe .rm .rmvb .mp3 .mp4) 其次,内网对可以访问内部的服务器群,有HTTP,FTP,CIFS(Samba)。同时外网也可以访问这些服务器 再次,要对洪水攻击进行防范 (tcp syn洪水,ICMP洪水)137\138\139\445modprobe connlimitiptables -t filter -P INPUT DROPiptables -t filter -A INPUT -i lo -j ACCEPTiptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPTiptables -t filter -A INPUT -p tcp --sport 22 -j ACCEPTiptables -t filter -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROPiptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT[root@ html]# iptables -t filter -A INPUT -p tcp -m multiport --dports 137,138,139,445 -i eth0 -j ACCEPT[root@ html]# iptables -t filter -A INPUT -p udp -m multiport --dports 137,138,139,445 -i eth0 -j ACCEPT 内网卡接口layer7 l7-iptablessquidarptablesiptables==================1 解压成与当前IPTABLES同版本的源码[root@ src]# tar jxvf iptables-1.4.0.tar.bz2 mv iptables-1.4.0 /usr/src/iptables[root@ src]# ls iptables -lddrwxr-xr-x 6 root root 4096 2007-12-22 iptables[root@ src]# pwd/usr/src--------------------2、生成与当前内核同版本的内核源码useradd mockbuildrpm -ivh --nomd5 kernel-2.6.18.src.rpm[root@ SOURCES]# cd /usr/src/redhat/SPECS/[root@ SPECS]# lskernel-2.6.spec[root@ SPECS]# rpmbuild -bp --target=$(uname -m) kernel-2.6.spec 生成如下内核源代码:[root@ html]# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/[root@ linux-2.6.18.i686]# ln -s /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/ /usr/src/linux=----------------3 下载包含那些需要的iptables模块的补丁文件。解压,执行如下命令:[root@ patch-o-matic-ng-20080214]# ./runme --download[root@ patch-o-matic-ng-20080214]# ./runme connlimit[root@ patch-o-matic-ng-20080214]# cd /usr/src/linux[root@ linux]# make oldconfig Connections/IP limit match support (IP_NF_MATCH_CONNLIMIT) [N/m/?] (NEW) m# configuration written to .config#[root@ linux]# make modules_preparescripts/kconfig/conf -s arch/i386/Kconfig CHK include/linux/version.h UPD include/linux/version.h CHK include/linux/utsrelease.h UPD include/linux/utsrelease.h SYMLINK include/asm -> include/asm-i386 CC arch/i386/kernel/asm-offsets.s GEN include/asm-i386/asm-offsets.h HOSTCC scripts/genksyms/genksyms.o SHIPPED scripts/genksyms/lex.c SHIPPED scripts/genksyms/parse.h SHIPPED scripts/genksyms/keywords.c HOSTCC scripts/genksyms/lex.o SHIPPED scripts/genksyms/parse.c HOSTCC scripts/genksyms/parse.o HOSTLD scripts/genksyms/genksyms CC scripts/mod/empty.o HOSTCC scripts/mod/mk_elfconfig MKELF scripts/mod/elfconfig.h HOSTCC scripts/mod/file2alias.o HOSTCC scripts/mod/modpost.o HOSTCC scripts/mod/sumversion.o HOSTLD scripts/mod/modpost HOSTCC scripts/kallsyms HOSTCC scripts/pnmtologo HOSTCC scripts/conmakehash[root@ netfilter]# cd /usr/src/linux/net/ipv4/netfilter/[root@ netfilter]# mv Makefile Makefile.orig[root@ netfilter]# vim Makefile[root@ netfilter]# cat Makefileobj-m := ipt_connlimit.oKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default: $(MAKE) -C $(KDIR) M=$(PWD) modules[root@ netfilter]# cd /usr/src/linux[root@ linux]# make M=net/ipv4/netfilter屏幕输出如下 : WARNING: Symbol version dump /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/Module.symvers is missing; modules will have no dependencies and modversions. LD net/ipv4/netfilter/built-in.o CC [M] net/ipv4/netfilter/ipt_connlimit.o Building modules, stage 2. MODPOST CC net/ipv4/netfilter/ipt_connlimit.mod.o LD [M] net/ipv4/netfilter/ipt_connlimit.ko[root@ linux]# cp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/[root@ linux]# insmod /lib/modules/2.6.18-128.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko [root@ linux]# iptables -m connlimit -h[root@ iptables]# pwd/usr/src/iptables[root@ iptables]# make [root@ iptables]# ls extensions/libipt_time.so extensions/libipt_time.so[root@ iptables]# cp extensions/libipt_time.so /lib/iptables/[root@ linux]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 12:15 --timestop 15:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT[root@ linux]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP例:iptables -A FORWARD -s 192.168.1.39 -j DROP 阻止来源地址为 192.168.1.39 的数据包通过本机各服务器的iptables安全设置:NFS:portmap 111 nfs 2049 端口号为2049vim /etc/sysconfig/nfsMOUNTD_PORT="4002"STATD_PORT="4003"LOCKD_TCPPORT="4004"LOCKD_UDPPORT="4004"RQUOTAD_PORT="4005"[root@tea net]# rpcinfo -p[root@pg ~]# iptables -t filter -A INPUT -p tcp --dport 111 -j ACCEPT[root@pg ~]# iptables -t filter -A INPUT -p udp --dport 111 -j ACCEPT[root@pg ~]# iptables -t filter -A INPUT -p tcp --dport 2049 -j ACCEPT[root@pg ~]# iptables -t filter -A INPUT -p udp --dport 2049 -j ACCEPT[root@pg ~]# iptables -t filter -A INPUT -p tcp --dport 4002:4005 -j ACCEPT[root@pg ~]# iptables -t filter -A INPUT -p udp --dport 4002:4005 -j ACCEPTsamba:nmbd 137/udp 138/udpsmbd 139/tcp 445/tcpiptables -t filter -A INPUT -p udp --dport 137:139 -j ACCEPTiptables -t filter -A INPUT -p tcp --dport 139 -j ACCEPTiptables -t filter -A INPUT -p tcp --dport 445 -j ACCEPTFTP:modprobe ip_nat_ftpiptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPTiptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT要求:外部网络可以访问内部网络的WEB和DNS 内部网络可以访问外部的DNS,FTP,SSH,SMTP,HTTP/HTTPS,ICMP 内部网络或从本机发起的会话包被IPTABLES进行状态跟踪. 本机接受内部网络和外部网络的ICMP请求. 防火墙配置默认日志记录和丢弃规则,使任何其它数据包以及端口扫描或者没有明确允许的连接被记录并丢弃 防火墙本机只开SSH服务补充:-j后可跟:1.ACCEPT 2.DROP 3.REJECT 4.LOG 5.子链 (自定义的)例:iptables -N uplooking 创建一个子链,-N指创建一个新的 iptables -A uplooking -s 192.168.0.0/24 -j DROP 设置这样的一个规则应用它不生效,需要结合下面的规则一起使用 1.iptables -A INPUT -p tcp --dport 23 -j uplooking 整个的意思是创建这个规则使这个网段访问23端口时将被丢弃 删除子链:iptabes -X uplooking 提示无法删除有连接的链 iptables -D INTPUT 1 iptables -F uplooking 删除这里定义的规则 iptables -X uplooking 即可删除了主机自己访问自己用到nat表OUTPUT NAT:地址转换 SNAT(改变数据包于源IP)共享上网 开启转换功能:vi /etc/sysctl.conf ip_forward=0改为1 ( 在路由里操作这步) 让文件生效:sysctl -p POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)测试:环境:web服务器 ip 地址 1.2.3.5/24(外网服务器) 路由:可以是个路由器,也可是两个网卡的linux系统192.168.0.254 1.2.3.4/24(公有ip) 客户端:192.168.0.2 指定网关 192.168.0.254 在路由里 添加规则:iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.2.3.4(web服务器地址) 用ADSL拨号就改为伪装MASQUERADE -->内网访问外网的时候用 客户端去访问web服务器,进入路由通过规则转换ip去web服务器找资源,返回给客户端 返回的时候是自动返回数据包路由:是源到目的的过程。私有IP:A类:10.0.0.0~10.255.255.255 B类:172.16.0.0~172.31.255.255 C类:192.168.0.0~192.168.255.2551.内网访问自己内部的网络只要搭建DNS就可以 网关会自己做判断是往内网和外网发送数据包如果是 目标地址是外网,通向外网的网关直接指向外网的IP 如果目标地址是内网,内网网关指向内网的IP,两个网关直接通讯在外网用户访问内网的时候用到iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j SNAT --to 192.168.0.253(内网的网关)192.168.0.12 |-------------------| \ | | \ | 0.253 | / | | / | |192.168.0.13 |------------------- DNAT(改变数据包目的IP)外网通过iptables访问内网PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)环境:web服务器 ip 地址 192.168.0.28(内网服务器)指定网关192p.168.0.254 路由:可以是个路由器,也可是两个网卡(即网关)的linux系统192.168.0.254 1.2.3.4/24(公有ip) 客户端:1.2.3.5(公有ip)访问1.2.3.4就可访问 ip地址 为192.168.0.28的web服务器路由设置:iptables -t nat -A PRETROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to 192.168.0.28源地址转换 (主要用于共享上网,POSTROUTING)-j SNAT --to ip-j MASQUERADE目标地址转换(主要用于做内网的服务器的发布,PREROUTING,OUTPUT)-j DNAT --to ip:port-j REDIRECT 3128 以透明代理为例子DNAT[root@www ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to-destination 192.168.0.188:80[root@www ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to 192.168.0.188:80 iptables -t nat -A OUTPUT -p tcp --dport 80 -d 1.1.1.1 -j DNAT --to 192.168.0.188:8000iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128REDIRECTMASQUERADE实例1、配置一个个人防火墙 目的是保护自己 --- filter表中配置---INPUT,OUTPUT 1、不允许其它主机主动访问本机 2、ping允许 3、本机访问其它主机是可行的iptables -t filter -P INPUT DROPiptables -t filter -A INPUT -i lo -j ACCEPTiptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -t filter -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID PACK " --log-ip-options --log-tcp-options --log-uidiptables -t filter -A INPUT -m state --state INVALID -j DROPiptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROPiptables -t filter -A INPUT -j LOG --log-prefix "KEYI PACK " --log-level info --log-ip-options --log-tcp-options --log-uid实例2、配置一个服务器防火墙 服务器对外提供80端口的服务,并且允许远程维护 ---filter表iptables -t filter -P INPUT DROPiptables -t filter -A INPUT -i lo -j ACCEPTiptables -t filter -A INPUT -p udp --sport 53 -j ACCEPTiptables -t filter -A INPUT -p tcp --sport 53 -j ACCEPTiptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPTiptables -t filter -A INPUT -p tcp --dport 2021 -j ACCEPTiptables -A INPUT -p tcp -m state --state NEW.ESTABLISHED,RELATED -m multiport --dport 53,80,25,110,143,995,993,69,139,445 -j ACCEPTiptables -A INPUT -p udp -m state --state NEW.ESTABLISHED,RELATED -m multiport --dport 53,80,25,110,143,995,993,69,139,445 -j ACCEPT1、要配置不允许root登录20212、可能受到攻击 由于站点源代漏洞导致的攻击--SQL注入攻击等等 由于系统软件漏洞导致的攻击 由于tcp的可靠性引起的安全问题---SYN半连接洪水攻击iptables -t filter -A INPUT -p tcp --syn --dport 80 -m limit --limit 20/sec -j ACCEPTiptables -t filter -A INPUT -p tcp --syn --dport 80 -j DROP 由于服务器一般是允许其它主机PING---引起ICMP洪水攻击iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT iptables -t filter -A INPUT -p icmp -m icmp --icmp-type echo-request -j DROP实例3、配置一个网关防火墙1、内网用户通过透明代理上网iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128iptables -t nat -A POSTROUTING -p udp --dport 53 -j SNAT --to 外_ip 内网用户需要配置好IP,DNS,网关指向 内_ip2、内网用户可以访问内网的FTP(通过IP访问),WEB(通过域名访问)3、外网可以访问内网的WEB(通过域名),并且可以VPN连接到网关上 4、关于内网用户的下载问题结合有限速功能路由iptables -t filter -I FORWARD -p tcp --syn -s 内网_net --dport 80 -m connlimit --connlimit-above 5 -j REJECT iptables -t filter -I FORWARD -p tcp --syn -s 内网_net --dport 21 -m connlimit --connlimit-above 5 -j REJECTiptables -t filter -A FORWARD -s 内网_net -j ACCEPTecho 1 > /proc/sys/net/ipv4/ip_forward实例4、关于内网WEB服务通过DNAT发布,内网通过域名访问WEB的问题 192.168.0.0/24 内网 1.1.1.0/24外网 192.168.0.11 client eth0 Gataway eth1 0.188:80 server 0.253-----1.1.1.1 ----- 1.1.1.2iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to 1.1.1.1iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to 192.168.0.188:80------------iptables -t nat -A OUTPUT -d 1.1.1.1 --dport 80 -p tcp -j DNAT --to 192.168.0.188:80------------G: iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -d 192.168.0.188 --dport 80 -o eth0 -j SNAT --to 192.168.0.253iptables 体系结构 DNAT SNAT 目标地址转换 源地址转换 ------- ------ -- ----- ------- | / \ / 路由判断 \ / \ / \ |->|M PREPOUTING N ---> M ROUTING TABLE N ---> M FORWARD F---> M POSTROUTING N———|---> | \ / \ / \ / \ / | ------- -------- ----- ------- | | /\ | | | \/ -------------/ ---- ---- / / \ / OUTPUT \ DNAT M INPUT F OUTPUT M->N->F也可以作目标地址转换 \ / \ / ---- ---- | /\ | | \/ | -------- / \ Local process \ / -------- 一般LINUX防火墙(iptalbes)的运用无非是用nat 表(PREROUTING、OUTPUT、POSTROUTING)和filter表(FORWARD、INPUT、OUTPUT)。我们只有知道了数据的流向才能正确的配置防火墙。现用一个相对比较直观的图形解释数据的走向。(此处只作最基本的iptables数据流走向说明。) 上图是你的家,蓝色的圈是你家院子,有两扇大门①⑥进出,你家有两个房间,分别为eth0和 eth1房间,每个房间有两个门可以进出②③④⑤。旁边是张三和李四的家,张三家和李四家之间的往返必须要过你家院子。现假设,eth0网卡IP为:192.168.5.1链接内网,eth1网卡IP为:218.100.100.111链接互连网。再假设,“张三家”为一个局域网,“李四家”为互连网。进我家院子用PREROUTING,出我家院子用FORWARD,进我家门用INPUT,出我家门用 OUTPUT。(当我们的操作是征对服务器本身而言的话,如SSH操作,此时肯定会用到PREROUTING、INPUT和OUTPUT,当数据只是通过服务器去访问别的机器时会用到PREROUTING和FORWARD。)又假设,默认这六个门都是关的。生成如下代码。*nat:PREROUTING DROP [0:0]:OUTPUT DROP [0:0]:POSTROUTING DROP [0:0]-F-Z-X### 以后要新增语句请在此处增加。-L –vCOMMIT*filter:INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT DROP [0:0]-F-Z-X### 以后要新增语句请在此处增加。-L –vCOMMIT1、 局域网用户通过服务器共享上网(即从张三家到李四家)1)首先进①号门,再从⑥号门走出。-A PREROUTING –p tcp --dport 80 –j ACCEPT #允许TCP 80端口通过服务器-A FORWARD –p tcp --dport 80 –j ACCEPT #允许TCP80 端口转发-A FORWARD –p tcp --sport 80 –j ACCEPT #允许接收对方为TCP80端口反回的信息2)其次,由于我们上网打的是域名,为此有一个公网DNS服务器为我们服务,那当然也要允许内网机器与DNS服务器的数据转发。DNS用UDP 53或者 TCP 53端口。两者用其一个就行。-A PREROUTING –p udp --dport 53 –j ACCEPT-A FORWARD –p udp --dport 53 –j ACCEPT-A FORWARD –p udp --sport 53 –j ACCEPT3)再次,由于局域网的地址在公网上是不被允许的,所以在出公网前应该把其地址转为服务器地址进行伪装。-A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.1112、 允许局域网和公网可以访问服务器的SSH假设SSH采用默认端口TCP 22 。此要求相当于要进我的家的TCP 22号门,为此我们首先要进我家院子,然后再进我家门,最后走出我家门这样的过程。此操作是征对服务器本身的操作。-A PREROUTING –p tcp --dport 22 –j ACCEPT-A INPUT –p tcp --dport 22 –j ACCEPT-A OUTPUT –p tcp --sport 22 –j ACCEPT3、 允许内网机器可以登录MSN和QQ。(MSN 和QQ默认是不允许登录的)QQ一般来说可以从TCP 80、8000、443及UDP 8000、4000登录,而MSN可以从TCP 1863、443登录。我们登录MSN和QQ的过程就象上网一样,也是去访问远程服务器的指定端口,故而我们只用数据转发即可。-A PREROUTING –p tcp --dport 1863 –j ACCEPT-A PREROUTING –p tcp --dport 443 –j ACCEPT-A PREROUTING –p tcp --dport 8000 –j ACCEPT-A PREROUTING –p udp --dport 8000 –j ACCEPT-A PREROUTING –p udp --dport 4000 –j ACCEPT-A FORWARD –p tcp --dport 1863 –j ACCEPT-A FORWARD –p tcp --sport 1863 –j ACCEPT-A FORWARD –p tcp --dport 443 –j ACCEPT-A FORWARD –p tcp --sport 443 –j ACCEPT-A FORWARD –p tcp --dport 8000 –j ACCEPT-A FORWARD –p tcp --sport 8000 –j ACCEPT-A FORWARD –p udp --dport 8000 –j ACCEPT-A FORWARD –p udp --sport 8000 –j ACCEPT-A FORWARD –p udp --dport 4000 –j ACCEPT-A FORWARD –p udp --sport 4000 –j ACCEPT4、 让内网机器可以收发邮件。接收邮件是访问远程服务器的TCP 110端口,发送邮件是访问TCP25端口。用数据转发即可。-A PREROUTING –p tcp --dport 110 –j ACCEPT-A PREROUTING –p tcp --dport 25 –j ACCEPT-A FORWARD –p tcp --dport 110 –j ACCEPT-A FORWARD –p tcp --sport 110 –j ACCEPT-A FORWARD –p tcp --dport 25 –j ACCEPT-A FORWARD –p tcp --sport 25 –j ACCEPT5、 内部机器对外发布WEB。要把内网机器192.168.5.179的WEB对外发布的话,相当于是从外网访问内网。与第1步操作的局域网共享上网相同,只是访问的方向改变了。不是从内网访问外网,而是从外网访问内网。当公网访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。当内网机器访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 –dport 80 –j DNAT –to-destination 192.168.5.179:80以上两句必须写在 –A PREROUTING –p tcp --dport 80 –j ACCEPT 前面。)TCP 80端口的转发在第1步就已做过,此处就不用重复制作了。另外在-A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 之后加上一句:-A POSTROUTING –p tcp --dport 80 –j ACCEPT为什么要加这句话呢,我的理解是这样的,公网访问 http://218.100.100.111时:(假设公网上用户的IP为199.199.199.199,端口12345为随机的产生的。)数据源 : ip:199.199.199.199 sport:12345数据目标: ip:218.100.100.111 dport 80此时,通过-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 告诉199.199.199.199,您要访问的真正地址应该是192.168.5.179:80,然后我们通过-A POSTROUTING –p tcp --dport 80 –j ACCEPT 目标地址218.100.100.111:80伪装成 192.168.5.179:80 。数据源 : ip:199.199.199.199 sport:12345数据目标: ip:192.168.5.179 dport 80当192.168.5.179返回数据时:数据源 : ip:192.168.5.179 sport:80数据目标: ip:199.199.199.199 dport 12345数据经过 -A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111 后,数据源 : ip:218.100.100.111 sport:80数据目标: ip:199.199.199.199 dport 123456、 完整的iptables配置*nat:PREROUTING DROP [0:0]:OUTPUT DROP [0:0]:POSTROUTING DROP [0:0]-F-Z-X-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80-A PREROUTING –i eth1 –p tcp –d 218.100.100.111 --dport 80 –j DNAT –to-destination 192.168.5.179:80-A PREROUTING –p tcp --dport 80 –j ACCEPT-A PREROUTING –p udp --dport 53 –j ACCEPT-A PREROUTING –p tcp --dport 22 –j ACCEPT-A PREROUTING –p tcp --dport 1863 –j ACCEPT-A PREROUTING –p tcp --dport 443 –j ACCEPT-A PREROUTING –p tcp --dport 8000 –j ACCEPT-A PREROUTING –p udp --dport 8000 –j ACCEPT-A PREROUTING –p udp --dport 4000 –j ACCEPT-A PREROUTING –p tcp --dport 110 –j ACCEPT-A PREROUTING –p tcp --dport 25 –j ACCEPT-A POSTROUTING –s 192.168.5.0/24 –j SNAT –to 218.100.100.111-A POSTROUTING –p tcp --dport 80 –j ACCEPT-L –vCOMMIT*filter:INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT DROP [0:0]-F-Z-X-A INPUT –p tcp --dport 22 –j ACCEPT-A OUTPUT –p tcp --sport 22 –j ACCEPT-A FORWARD –p tcp --dport 80 –j ACCEPT-A FORWARD –p tcp --sport 80 –j ACCEPT-A FORWARD –p udp --dport 53 –j描述:M为mangle表 N为nat表 F为filter表 --dport 基本上访问的是自己的端口 PREPOUTING:位于 nat 表,用于修改目的地址(DNAT) ROUTING TABLE:路由表 FORWARD:filter表中的转发链 POSTROUTING:位于 nat 表,用于修改源地址 (SNAT) INPUT:filter表中的输入链 OUTOUT:filter表中的输出链 Local process:本地进程 Mangle表中包含其他两个表的链,有5个1.进入的访问先检查M里的PREPOUTING再检查N里的,没有匹配的规则就进入routing table,若没有匹配的IP就转发个M里的POSTROUTING再检查N里的,直接转发出去2.进入的访问先检查M里的PREPOUTING再检查N里的,没有匹配的规则就进入routing table,有匹配的IP,检查M里的INPUT链再检查F里的,查看规则3.OUT从M->N->F那里出发练习题:保护自己个人----filter表中配置 ---INPUT,OUTPUT1.不允许其他主机主动访问本机2.ping不允许3.本机访问其他主机是可行的yum install iptraf 网络流量的查看工具 ping -i 0.000001 192.168.0.253 icmp洪水攻击防止icmp洪水攻击 iptables -A INPUT -p icmp -m --icmp-type echo-requset -m limit --limit 1/second -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type echo-requset -j ACCEPT半连接池占满解决系统资源1.连接池放大2.缩小超时时间3.限制SYN标记的包 iptables -A INPUT -p tcp --syn --dport 80 -m limit --limit 20/sec -j ACCEPT iptables -A INPUT -p tcp --syn --dport 80 -j DROP由于系统软件漏洞导致的攻击由于站点源代码漏洞导致的攻击---SQL注入攻击3次握手完成时间一般为1妙 主要看宽带大小1秒=1000毫秒配置一个网关防火墙1.内网用户通过透明代理上网2.内网 用户可以问内网的FTP(通过IP访问),WEB(通过域名访问3.外网可以访问内网的WEB设置缺省策略为INPUT 拒绝全部,但:允许你对你自己的ip地址(192和127)进行任何访问.只允许某1 人telnet 你,即某台主机允许某人每分钟ping你10次.允许您主动访问任何人.test1 用户可以使用的自己的ip地址作测试用途,但不能访问其他的任何ip其它用户可以访问任意地址对于我的电脑,不论怎样改变ip地址,都不能使用你的pop3服务器.但可以使用其他服务.对所有访问您23端口的动作进行日志习题答案:#!/bin/bashfor i in filter nat mangledo iptables -t $i -Fiptables -t $i -Xiptables -t $i -Z for循环清除所有表的规则done#iptables -F 清除所有规则 这三个这对filter表进行操作#iptables -X 清除自定义链#iptables -Z 清零iptables -P INPUT DROP 缺省的都是最后执行的iptables -A INPUT -s 192.168.0.28 -j ACCEPTiptables -A INPUT -s 127.0.0.1 -j ACCEPTiptables -A INPUT -s 192.168.0.128 -p tcp --dport 23 -j ACCEPT iptables -A INPUT -s 192.168.0.128 -p icmp -m limit --limit 10/m -j ACCEPTiptables -A INPUT -m state --state ESTBALISHED,RELATED -j ACCEPT 我发出的包是NEW包,回应后要给的是建立包状态所以只要写这条即可。iptables -A OUTPUT -m owner --uid-owner`id -u test1` -j DROPiptables -A INPUT -p tcp --dport ! 110 -m mac --mac-source 12:34:56:78:90:AF -j ACCEPT iptables -A INPUT -p tcp --dport 23 -j LOG写完后用service iptables save 保存把iptables服务在第五级别开启,系统启动后就会开启/etc/sysconfig/iptables文件里的规则一些列子:iptables -t fiter -A INPUT -s 192.168.1.3 -p icmp --imcp-type echo-reply -j ACCEPTiptables -t fiter -A INPUT -s 192.168.1.3 -p icmp --icmp-type echo-reply -j ACCEPTiptables -t filter -A INPUT -s 192.168.1.3 -p icmp --icmp-type echo-reply -j ACCEPTiptables -t filter -A INPUT -s 192.168.1.19 -p tcp --sport 80 -j ACCEPTiptables -A INPUT -s 192.168.1.0/24 -p icmp -j ACCEPTtcp_wrapper:简单的安全配置文件:/etc/hosts.allow/etc/hosts.deny支持tcpwrapper的服务:vsftp sendmail portmap ssh xinetd查看命令是否支持tcpwrapper:ldd /usr/sbin/vsftpd |grep libwrap <-----含有libwrap.so.o库则表示支持tcpwrapper配置文件的格式:服务名称:IP或主机名或域名 [EXCEPT] <------多个服务用逗号分隔vsftpd:10.1.1.0/255.255.255.0 <----10.1.1.0/24网段vsftpd:10.1.1 <----10.1.1.0/24网段vsftpd:station160.cluster.com <-----主机名vsftpd:.cluster.com <-----该域下的所有主机vsftpd:ALL <-----全部telnetd:10.1.1.:spawn echo `date %c %d >> /var/log/telnetd.log <-----只要10网段的访问我,则该记录日志。服务名称可以在服务的配置文件中获取,如telnet可查看/etc/xinet.d/krb5-telnet (%c:显示IP地址。%d:显示服务的名字。spawn后跟要执行的命令)系统判断的优先级:-->hosts.allow -->hosts.deny---> 先判断hosts.allow,如果有匹配则可以通过访问,如果没有匹配则检查hosts.deny,有匹配则拒绝,如果还是没有匹配,则通过访问。这两个文件要同时使用。sync ??RELATED关联状态FTPDATA 传输icmp的不可达消息PING不给回应网络不可达 iptanles 没有开启的UDP端口NEW状态新的包第一次发的包ESTABLISHED 连接态 回应的包RELATED (FTP)衍生态关联状态INVALID 无效iptables -A INPUT -p-m state --state RELATED,ESTABLISHED -j ACCEPT //PING不给回应网络不可达iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROPiptables -A FORWARD -d 192.168.0.254 -m limit --limit 10/s -j ACCEPT 设置每秒最多转发10个包iptables -A FORWARD -d 192.168.0.254 -j DROP 上边命令后一定要跟这一句,也就是说,上边超过10个包以后抛弃由这个命令来执行iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT//--syn 第一次建立连接iptables -A INPUT -p tcp -m multiport --dports 22,25,80,110,143 -j ACCEPT服务端:iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT--reject-with tcp-resetnc -l 9999客户端telnet serverIP 9999test 《---手工输入FIN 4次挥手完成的包 []#nmap -s(扫描)P(ping)[]# nmap -sF(FTP) 192.168.0.253扫描打开的端口iptables -t filter -A INPUT -m state --state INVALID - j DROPnopub 不依靠控制台nopub ./var/ftp/iptables.sh &inmod 加载模块dmeg