第一章 外网防火墙部署企业应用
1.1 生产中iptables的实际应用
①iptables是基于内核的防火墙,功能非常强大,基于数据包的过滤!特别是可以在一台非常低的硬件配置下跑的非常好。iptables主要工作在OSI七层的2.3.4层。七层的控制可以使用squid代理+iptables。
②iptabes:生产中根据具体情况,一般,内网关闭,外网打开。大并发的情况不能开iptables,影响性能,iptables是要消耗CPU的,所以大并发的情况下,我们使用硬件防火墙的各方面做的很仔细。selinux:生产中也是关闭的。可以做ids的入侵检测。
③实际生产中尽可能不给服务器配置外网IP。可以通过代理转发。nagios就不需要外网。
④并发不是很大的情况下,再外网的IP环境,开防火墙。
⑤第一次直接默认规则生成配置文件,以后就在配置文件中进行修改(编辑添加删除)。
⑥封掉IP:根据IP地址和网络连接数进行封杀。(定时封掉,判断,存在就不再进行二次封杀)
⑦企业常用案例功能小结:
1)linux主机防火墙,单机作为防火墙(表filter)。
2)局域网共享上网(表nat postrouting)。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 10.0.0.52
3)外部地址映射为内部地址和端口(表nat prerouting)
iptables -t nat -A PREROUTING -d 10.0.0.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.8:9000
1.2 生产中标准防火墙配置案例
第一种模式默认随便进出:企业上网、网管路由转发。 第二种模式条件限制:主机防火墙模式(默认不能进入) [[email protected]-M ~]# iptables -F [[email protected]-M ~]# iptables -X [[email protected]-M ~]# iptables -Z #######自己人通过 [[email protected]-M ~]# iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT #######允许本机 [[email protected]-M ~]# iptables -A INPUT -i lo -j ACCEPT [[email protected]-M ~]# iptables -A OUTPUT -o lo -j ACCEPT #######允许合法的进入 iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT #######开启对外提供的服务 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #######允许icmp类型协议通过(ping) iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT #######允许关联的状态包通过 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #######其它机器扫描测试 nmap 10.0.0.7 -p 1-65535 ##刚配置的时候永久的修改配置文件,根据要在文件中修改了。 ##保存文件/etc/init.d/iptables save (注意命令行的操作,只是暂时生效的,需要进行保存才能永久重启后永久生效。) ##生成的配置文件/etc/sysconfig/iptables
1.3 防火墙iptables生产案例脚本参考
##############脚本参考1#################### #!/bin/bash #this is a server firewall created by oldboy 17:03 2006-7-26 # e_mail:31333741@qq.com # qqinfo:49000448 # function: a server firewall # version:1.1 ################################################ # oldboy trainning info. # QQ 1986787350 70271111 # site:http://www.etiantian.org # blog:http://oldboy.blog.51cto.com # oldboy trainning QQ group: 208160987 45039636 ################################################ #define variable PATH IPT=/sbin/iptables #Remove any existing rules $IPT -F $IPT -X $IPT -Z #setting default firewall policy $IPT --policy OUTPUT ACCEPT $IPT --policy FORWARD DROP $IPT -P INPUT DROP #setting for loopback interface$IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Source Address Spoofing and Other Bad Addresses$IPT -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP $IPT -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP $IPT -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP $IPT -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP # prevent all Stealth Scans and TCP State Flags $IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # All of the bits are cleared $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP #SYN and RST are both set $IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP # SYN and FIN are both set $IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # FIN and RST are both set $IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP # FIN is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP # PSH is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP # URG is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP #setting access rules #one,ip access rules,allow all the ips of $IPT -A INPUT -s 10.0.10.0/24 -p all -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT #下面的是重复的,作为知识点保留 #second,port access rules #nagios $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 5666 -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 5666 -j ACCEPT #db $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 3307 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 3307 -j ACCEPT #ssh difference from other servers here.>> $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -p tcp --dport 22 -j ACCEPT #http $IPT -A INPUT -p tcp --dport 80 -j ACCEPT #snmp $IPT -A INPUT -s 10.0.0.0/24 -p UDP --dport 161 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p UDP --dport 161 -j ACCEPT #rsync $IPT -A INPUT -s 10.0.0.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp -m tcp --dport 873 -j ACCEPT #icmp #$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT #others RELATED $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ##############脚本参考2#################### #!/bin/bash #this is a server firewall created by oldboy 17:03 2006-7-26 #updated by oldboy on 10:30 2009-6-23 #http://blog.etiantian.org #qq:49000448 #define variable PATH IPT=/sbin/iptables #Remove any existing rules $IPT -F $IPT -X $IPT -Z #setting default firewall policy $IPT --policy OUTPUT ACCEPT $IPT --policy FORWARD DROP $IPT -P INPUT DROP #setting for loopback interface $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Source Address Spoofing and Other Bad Addresses #$IPT -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP #$IPT -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP #$IPT -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP #$IPT -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP # prevent all Stealth Scans and TCP State Flags $IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # All of the bits are cleared $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP #SYN and RST are both set $IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP # SYN and FIN are both set $IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # FIN and RST are both set $IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP # FIN is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP # PSH is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP # URG is the only bit set, without the expected accompanying ACK $IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP #setting access rules #one,ip access rules,allow all the ips of $IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT ################################################################ #second,port access rules #nagios $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 5666 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p tcp --dport 5666 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p tcp --dport 5666 -j ACCEPT #db $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3307 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3308 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 1521 -j ACCEPT #ssh difference from other servers here.>> $IPT -A INPUT -s 202.81.17.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 52113 -j ACCEPT #$IPT -A INPUT -p tcp --dport 22 -j ACCEPT #ftp #$IPT -A INPUT -p tcp --dport 21 -j ACCEPT #http $IPT -A INPUT -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT #snmp $IPT -A INPUT -s 192.168.1.0/24 -p UDP --dport 161 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p UDP --dport 161 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p UDP --dport 161 -j ACCEPT #rsync $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p tcp -m tcp --dport 873 -j ACCEPT #nfs 2049,portmap 111 $IPT -A INPUT -s 192.168.1.0/24 -p udp -m multiport --dport 111,892,2049 -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dport 111,892,2049 -j ACCEPT #icmp #$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p icmp -m icmp --icmp-type any -j ACCEPT $IPT -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT #others RELATED $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
1.4 防火墙iptables实际生产应用配置
①设定默认规则
在iptables规则中没有匹配到规则则使用默认规则进行处理
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
②配置SSH规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT 如果你把OUTPUT 设置成DROP,就需要加上这个规则,否则SSH还是不能登录,因为SSH服务只能进不能出。
③只允许192.168.0.3的机器进行SSH连接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
④允许loopback回环通信
IPTABLES -A INPUT -i lo -p all -j ACCEPT
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
⑤目的地址转换,映射内部地址
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10
⑥源地址转换,隐藏内部地址
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
⑦地址伪装,动态ip的NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
masquerade和snat的主要区别在于,snat是把源地址转换为固定的IP地址或者是地址池,而masquerade在adsl等方式拨号上网时候非常有用,因为是拨号上网所以网卡的外网IP经常变化,这样在进行地址转换的时候就要在每次都要修改转换策略里面的ip,使用masquerade就很好的解决了这个问题,他会自己去探测外网卡获得的ip地址然后自动进行地址转换,这样就算外网获得的ip经常变化也不用人工干预了。
⑧开启转发功能
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 只允许已建连接及相关链接对内转发
ptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 允许对外转发
⑨过滤某个MAC
iptables -A FORWARD -m mac --mac -source MAC地址 -j DROP
报文经过路由后,数据包中原有的MAC信息会被替换,所以在路由后的iptables中使用mac匹配没有意义。
⑩数据包整流
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
(11)多端口匹配,以一次匹配多个端口
用iptables -A INPUT -p tcp -m muliport --dport s 21,22,25,80,110 -j ACCEPT
(12)丢弃非法连接
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables-A FORWARD -m state --state INVALID -j DROP
(13)存储于恢复iptables规则
iptables-save > somefile
iptables-restore < somefile
企业iptables面试题:自定义链处理syn攻击
iptables -N syn-flood
iptables -A INPUT -i eth0 -syn -j syn-flood
iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN
iptables -A syn-flood -j DROP
###参考文本文档《01.配置防火墙命令及详细步骤》
第二章 外网防火墙的部署原理
2.1 iptables基本处理行为
不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.
1.iptables默认用的就是filter表。
2.其中的INPUT DROP要大写。
target for rule (may load target extension)
基本的处理行为:ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)
比较:DROP好于REJECT
③注意生产中增添机柜的的时候情况-A是在指定链的结尾,最后一条,-I是在指定链的第一条。所以我们在封杀IP的时候,我们使用-I来进行封杀,放在后面的话可能封杀不掉(前面已经接受结束匹配)。
④封端口iptables -A INPUT -p tcp --dport 9001 -j DROP 的样式。封IP指定-s IP地址。
⑤如果是使用参数-I input 2 那么就会插入到规则第二条的位置。
iptables -I INPUT 2 -p tcp --dport 8080 -j DROP
##禁止除自己外链接自己 iptables -t filter -A INPUT -i eth0 ! -s 10.0.0.104 -j DROP ###禁ping iptables -t filter -I INPUT -p icmp --icmp-type 8 -i eth0 ! -s 10.0.0.0/24 -j DROP ##封掉端口 iptables -A INPUT -p tcp --dport 3306 -j DROP ##匹配指定协议外的所有协议 iptables -A INPUT -p ! tcp ##匹配主机源IP iptables -A INPUT -s 10.0.0.14 iptables -A INPUT -s ! 10.0.0.14 ###匹配网段 iptables -A INPUT -s 10.0.0.0/24 iptables -A INPUT -s ! 10.0.0.0/24 ###注意封单一的端口, 匹配单一端口 iptables -A INPUT -p tcp --sport 53 iptables -A INPUT -p udp --dport 53 ###匹配指定端口之外的端口 iptables -A INPUT -p tcp --dport ! 22 iptables -I INPUT -p tcp ! --dport 22 -s 10.0.0.123 -j DROP ###注意端口段的写法就是用冒号来隔开。 iptables -I INPUT -p tcp --dport 52000:53000 -j DROP ###匹配端口范围: iptables -A INPUT -p tcp --sport 22:80 iptables -I INPUT -p tcp --dport 21,22,23,24 -j ACCEPT===》错误语法 iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT iptables -I INPUT -p tcp --dport 18:80 -j DROP ###匹配ICMP类型 iptables -A INPUT -p icmp --icmp-type 8 例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT 匹配指定的网络接口 iptables -A INPUT -i eth0 iptables -A FORWARD -o eth0 记忆方法: --in-interface -i [!] input name[+] network interface name ([+] for wildcard) --out-interface -o [!] output name[+] network interface name ([+] for wildcard) 匹配网络状态 -m state --state NEW:已经或将启动新的连接 ESTABLISHED:已建立的连接 RELATED:正在启动新连接 INVALID:非法或无法识别的 FTP服务是特殊的,需要配状态连接。 ####允许关联的状态包通过(web服务不要使用FTP服务) #others RELATED ftp协议 #允许关联的状态包 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ###包的速率进行控制 -m limit --limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时 --limit-burst [n]:在同一时间内允许通过的请求"n"为数字,不指定默认为5 fg:本机地址:172.16.14.1,允许172.16.0.0/16网络ping本机,但限制每分钟请求不能超过20,每次并发不能超过6个 iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT iptables -A OUTPUT -s 172.16.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
2.2 iptables的部署原理
①容器===》链====》表-=====》规则。表:tables,链:chains,规则:Policy。(所有的链名要大写)
第一个表:最重要的默认的表:filter表,是主机自身功能的表,对主机的进入流出进行控制,是防火墙默认的表,是真正负责防火墙功能的。iptables -L n 查看的是默认的filter表,如果要看别的表,再加上参数-n nat。
负责过滤数据包,包括的规则链有,input(负责过滤进入的数据包),output(负责出的数据包)和forward(负责流经主机的数据包--转发);对filter的控制是我们实现防火墙功能的重要的手段。特别是对于input链的控制。
INPUT:input匹配目的IP是本机的数据包,forward匹配流经本机的数据包,prerouting用来修改目的地址用来做DNAT,postrouting用来修改源地址用来做SNAT。
第二个表:nat表,nat则负责到网络地址转换,一般用于局域网共享上网(路由器)或者特殊的端口转换服务(内网IP外网IP转换寻找 ),和主机本身没有什么关系。
主要作用:
1)企业路由(zebra)或者网关(iptables),共享上网(POSTROUTING链)。包括的规则链有,prerouting,postrouting和output;
2)做内网IP地址的一对一的映射(dmz),硬件防火墙IP映射到内部服务器。
PREROUTING链:作数据包到达防火墙时候进行路由判断之前的操作。用是改变数据包的目的地址,目的端口。根据规则重写收件人的地址。作用就是把公网的IP映射到内网的服务器上,内网的端口映射。
POSTROUTING链:作用是数据离开防火墙的时候进行路由判断之后执行的规则。出网的时候改变内网的源地址成共网地址。作用是改变数据包的源地址、源端口。(生产应用:局域网的共享上网)
第三个表:(暂时可以了解即可)mangle表则主要应用在修改数据包内容上,用来做流量整形的,默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
②iptables是采用数据包的过滤机制进行工作的,所以会对数据包的包头数据进行分析。并且根据预先设定的规则进行匹配(一行一行从上到下匹配,都匹配不上就是用默认的规则),然后进行过滤,
1、防火墙是层层过滤的,实际上是按照配置规则的顺序从上到下的顺序,从前到后的顺序。
2、如果匹配上规则,即明确表明是组织还是通过,数据包就不再向下匹配心的规则了。
3、如果所有的规则没有明确说明是阻止还是通过,也就是没有匹配规则,那么就会向下进行匹配。
4、防火墙默认规则是所有的规则执行完才会执行的。
注意:理解的误区,匹配上了拒绝的规则也是匹配,只要匹配上了就不能向下走了。
2.3 iptables的基本操作命令
-V 查看版本
-A 向规则链中添加一条规则,默认被添加到末尾
-T指定要操作的表,默认是filter
-D从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R进行规则替换
-I插入一条规则,默认被插入到首部
-F清空所选的链,重启后恢复
-N新建用户自定义的规则链
-X删除用户自定义的规则链
-p用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号
-s指定源地址IP地址
-d指定目的地址
-i进入接口
-o流出接口
-j采取的动作,accept,drop,snat,dnat,masquerade
--sport源端口
-h帮助信息
--dport目的端口,端口必须和协议一起来配合使用
注意:所有链名必须大写,表明必须小写,动作必须大写,匹配必须小写
iptable基本操作
iptables -L 列出iptables规则
iptables -F 清除iptables所有的内置规则(flush)
iptables -X 清除iptables自定义规则
iptables -t filter -A INPUT -i eth0 ! -s 10.0.0.104 -j DROP 除自己外,任何都不能访问。
第三章 外网iptables防火墙的部署配置
3.1 清除所有规则之后的防火墙状态
我们来配置一个filter表的防火墙.
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什么规则都没有.
3.2 清除原有规则.
iptables -F 清除预设表filter中的所有规则链的规则 -F
iptables -X 清除预设表filter中使用者自定链中的规则 -Z
iptables -Z 把曾经的链的计数器清零 -Z
清楚之后的防火墙状态:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
注意:命令行的操作,这些配置就像用命令配置IP一样,重起就会失去作用。
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables save
service iptables restart
写到/etc/sysconfig/iptables文件,重启防火墙,防火墙永久起作用。
3.3 设定预设规则
iptables -p INPUT DROP
iptables -p OUTPUT ACCEPT
iptables -p FORWARD DROP
上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包
而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在这个规则里的包,那就是进行通过处理.
可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.
这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加.
生产中:如只做WEB服务器.还是推荐三个链都是DROP.
注:如果你是远程SSH(CRT)登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.这时候只能去本机操作或者远程管理卡操作。
(4)添加规则.
首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链
为了能采用远程SSH登陆,我们要开启22端口.iptables -A INPUT -p tcp --dport 22 -j ACCEPT。
(注:如果你把OUTPUT 设置成DROP的就要写上这一步:iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT,好多人都是望了写这一部规则导致,始终无法SSH.
其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)
.
如果做了WEB服务器,开启80端口iptables -A INPUT -p tcp --dport 80 -j ACCEPT
如果做了邮件服务器,开启25,110端口.iptables -A INPUT -p tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp --dport 25 -j ACCEPT
如果做了FTP服务器,开启21端口iptables -A INPUT -p tcp --dport 21 -j ACCEPT
如果做了DNS服务器,开启53端口iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
允许icmp包通过,也就是允许ping:iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
允许loopback!(不然会导致DNS无法正常关闭等问题)IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP) IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.减少不安全的端口连接
iptables -A OUTPUT -p tcp --sport 31337 -j DROP
iptables -A OUTPUT -p tcp --dport 31337 -j DROP
##有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.
当然出入更安全的考虑你也可以把OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加,允许SSH登陆一样.照着写就行了.
下面写一下更加细致的规则,就是限制到某台机器
如:我们只允许192.168.0.3的机器进行SSH连接iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.24表示子网掩码数.
但要记得把 /etc/sysconfig/iptables 里的这一行删了.-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.
或采用命令方式:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.
/etc/rc.d/init.d/iptables save
这样写 !192.168.0.3 表示除了192.168.0.3的ip地址
其他的规则连接也一样这么设置.
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个:iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制.
3.4 配置一个NAT表防火墙
1,查看本机关于NAT的设置情况
[[email protected] rc.d]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.0.0/24 anywhere to:211.101.46.235
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).
当然你如果还没有配置NAT的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的
如果你想清除,命令是
[[email protected] ~]# iptables -F -t nat
[[email protected] ~]# iptables -X -t nat
[[email protected] ~]# iptables -Z -t nat
2,添加规则:添加基本的NAT地址转换添加规则,我们只添加DROP链.因为默认链全是ACCEPT.
防止外网用内网IP欺骗
[[email protected] sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[[email protected] sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[[email protected] sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)
例:
禁止与211.101.46.253的所有连接iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
禁用FTP(21)端口iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
这样写范围太大了,我们可以更精确的定义.
iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.
按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了.
最后:
drop非法连接
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables-A FORWARD -m state --state INVALID -j DROP
允许所有已经建立的和相关的连接
iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/etc/rc.d/init.d/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
第四章 内网服务器NAT共享上网配置
4.1 iptables防火墙配置NAT网关步骤
##本集群架构在外网服务器lvs-02负载均衡服务器配置内网网关,作为后台内网服务器的上网路由。
####################外网服务器lvs-01设置#########################
①在外网的的lvs-02服务器外网网卡eth0上面配置:
IP:10.0.0.52
NETMASK:255.255.255.0
GETWAY:10.0.0.254
DNS:8.8.8.8
②在外网的服务器lvs-02上增加内网网卡eth1配置:
IP=192.168.10.52
③设置网络配置文件使lvs-02服务其能够正常连接外网,eth0和eth1设置为开机自启动。
④启动防火墙iptables,添加规则:
清空规则之后添加
iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 10.0.0.52
注意保存!查看确认,然后重启防火墙。再次进行查看确认。。
⑤设置系统内核参数
echo 1 >>/proc/sys/net/ipv4/ip_forward
sysctl -p
注意参数值:net.ipv4.ip_forward = 1
⑥重启网卡服务。
####################内网服务器(后台)mysql-01#####################
①在内网服务器mysql-01服务器上设置网卡信息:
IP:192.168.10.53
NETMASK:255.255.255.0
GETWAY:192.168.10.52
DNS:8.8.8.8
②重启网卡,进行网络连接。
需要注意的是,内网的物理网卡,以及网卡配置文件一定要确认正确。
4.2 NAT共享上网设置实践操作
[[email protected]02 ~]# iptables -F [[email protected]-02 ~]# iptables -X [[email protected]-02 ~]# iptables -Z [[email protected]-02 ~]# /etc/init.d/iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ] [[email protected]-02 ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected]-02 ~]# iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT [[email protected]-02 ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 10.0.0.52 [[email protected]-02 ~]# /etc/init.d/iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ] [[email protected]-02 ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.0.0.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected]-02 ~]# /etc/init.d/iptables reload iptables: Trying to reload firewall rules: [ OK ]
第五章 外网防火墙的部署NAT共享上网总结
5.1 外网服务器iptables共享NAT设置
准备,设置iptables的路由转发的服务器需要有固定的外网IP地址,(内网IP为IP段内其他服务器配置的网关)
①清除所有iptables配置的规则,-Z/-F/-X。
② 只做路由共享上网NAT转发服务设置转发表开启。
(因为我们还需要此服务器做其他服务的实现功能,所以选择全部打开)
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
③增加路由网关转发规则
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 10.0.0.52
192.168.10.0/24为我们允许链接,进行转为的内网IP段,10.0.0.52为本机的内网IP地址。
##其他命令参考(指定网卡类型-o 流出口):iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 192.168.10.52
④保存iptables设置重启防火墙生效。
/etc/init.d/iptables save
/etc/init.d/iptables reload或者/etc/init.d/iptables restart。
5.2 内网服务器设置
####注意内网后台服务器NAT简单配置步骤:
本集群架构均为新安装的空白虚拟机,需要操作的步骤如下:
①基本修改:修改主机名称,需要在文件/etc/sysconfig/network中修改hostname以永久生效。
②网卡文件修改:删除网卡配置文件中的UUID选项、MAC地址选项,ONBOOT设置开机启动。配置好设定的内网地址。
③如果是配置了外网网卡的虚拟机,注意在VM控制板,增加新的虚拟物理网卡。
④注意配置的IP地址为设定的内网IP地址。
⑤NETMASK:为共享上网的路由端的掩码。
⑥网关地址为iptables防火墙设置所在的服务器的IP地址(路由转发所在服务器)。
⑦DNS:设置为8.8.8.8.
⑧设置完毕之后reboot重新启动服务器。
⑨内网的虚拟机不需要设置iptables和selinux(选择关闭即可)。
5.3 增删改差记录(待补充)
《本节结束》
注:本人水平有限,如有需改进之处,望不吝指导建议,谢谢!
①②③④⑤⑥⑦⑧⑨⑩
参考文章:
linux运维老男孩培训老师博客
http://oldboy.blog.51cto.com/all/2561410