防火墙的概念
Firewall:工作于主机或网络边缘,对于进出本主机或网络的报文根据事先定义的规则作匹配检测,对于更改被规则匹配到的报文做出相应处理的组件
网络层防火墙(包过滤防火墙):
优点:对用户来说透明,处理速度快且易于防护
缺点:一旦黑客突破防火墙,就可以请以伪造数据包源地址、目的地址和IP端口号
代理服务型防火墙(Proxy Service)
优点:在应用层对数据进行检查,比较安全
缺点:会增加防火墙的负载
现实生产中使用的防火墙都是二者合体,先检查网络数据,通过后再送到应用层检查
主机防火墙:服务范围为当前主机
网络防火墙:服务范围为防火墙的局域网
软件防火墙:应用软件处理逻辑运行与通用硬件平台之上的防火墙
硬件防火墙:硬件和软件结合
Iptables基本认识:
Netfilter组件称为内核空间,被集成在Linux内核中。是一种内核中用于扩展各种网络服务的结构化底层框架。
Netfilter在内核中选取五个位置放置了五个hook function(钩子函数)并且向用户开放,用户可通过iptables工具向其写规则。
input 、output 、forward 、prerouting、postrouting
Iptables也称用户空间,是一个工作在用户层用来写规则的工具,写好的规则被送往netfilter,这些规则告诉内核中的nrtfilter组件如何去处理信息包。
netfilter/iptables的最大优点是它可以配置有状态的防火墙,这是ipfwadm和ipchains等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为ESTABLISHED、INVALID、NEW和RELATED。
状态ESTABLISHED指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。INVALID状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态NEW意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后,RELATED表示该信息包正在启动新连接,以及它与已建立的连接相关联。
Iptables优点:
netfilter/iptables的一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。可以定制自己的规则来满足特定需求,从而只允许想要的网络流量进入系统。
另外,netfilter/iptables是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
Iptables组成:
Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作target(目标),也可以跳向同一个表内的用户定义的链。
四表(table)
filter:过滤规则表(过滤)
nat:地址转换规则表(用于修改源IP或目标IP,也可以改端口)
mangle:修改数据标记位规则表(拆解报文,做出修改,并重新封装)
raw:跟踪数据表规则表(关闭nat表上启用的连接追踪机制)
实际还有security表
五链(chain)
INPUT:通过路由表后目的地为本机(处理入站数据包)
OUTPUT:由本机产生,向外转发(处理出站数据包)
FORWARD:通过路由表后,目的地不为本机(处理转发数据包)
PREROUTING:数据包进入路由表之前 (路由前处理数据包)
POSTROUTING:发送到网卡接口之前 (路由后处理数据包)
表和链的对应关系
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT] OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
(1) 同类规则(访问同一应用),匹配范围小的放上面
(2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面
(3) 将那些可由一条规则描述的多个规则合并成一个
(4) 设置默认策略
iptables命令:
规则格式:iptables [-t 表名] <-A|-I|-D|-R>链名 [规则编号] [-i|-o网卡名称][-p协议类型][-s源IP地址|源子网][-sport源端口号][-d目标IP地址|目标子网][-dport目标端口号] -j<动作>
链管理:
-N:new, 自定义一条新的规则链;每个自定义链都有引用计数,引用计数不为零就无法删除
[root@localhost ~]#systemctl stop firewalld.service[root@localhost ~]#iptables -vnL[root@localhost ~]#iptables -N IN_web_rules 新建一条名为IN_web_rules的链[root@localhost ~]#iptables -vnLChain IN_web_rules (0 references)pkts bytes target prot opt in out source destination
-X:delete,删除自定义的规则链(空链)
非自定义的、有规则的、有引用的无法删除
[root@localhost ~]#iptables -X IN_web_rules 删除名为IN_web_rules的链[root@localhost ~]#iptables -vnL
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
[root@localhost ~]#iptables -vnLChain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination [root@localhost ~]#iptables -P FORWARD DROP 修改默认规则链规则 ACCEPT(接受)改为DROP(丢弃)[root@localhost ~]#iptables -nLChain FORWARD (policy DROP)target prot opt source destination
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
[root@localhost ~]#iptables -N IN_web[root@localhost ~]#iptables -vnLChain IN_web (0 references)pkts bytes target prot opt in out source destination [root@localhost ~]#iptables -E IN_web IN_web_rules 重命名自定义链[root@localhost ~]#iptables -vnLChain IN_web_rules (0 references)pkts bytes target prot opt in out source destination
规则管理:
-A:append,追加
-I:insert, 插入,要指明位置,省略时表示第一条
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
[root@localhost ~]#iptables -D FORWARD 1 删除FORWARD第一条规则
-R:replace,替换指定链上的指定规则
-F:flush,清空指定的规则链
[root@localhost ~]#iptables -F 清空所有链[root@localhost ~]#iptables -F IN_public 清空IN_public链
-Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
[root@localhost ~]#systemctl start firewalld.service[root@localhost ~]#iptables -vnLChain INPUT_ZONES (1 references) 55 6097 IN_public all -- ens33 * 0.0.0.0/0 0.0.0.0/0 [goto] [root@localhost ~]#iptables -Z INPUT_ZONES 清空INPUT_ZONES的计数器Chain INPUT_ZONES (1 references)0 0 IN_public all -- ens33 * 0.0.0.0/0 0.0.0.0/0 [goto] [root@localhost ~]#iptables -Z 清空所有计数器[root@localhost ~]#iptables -vnLChain IN_public (2 references)pkts bytes target prot opt in out source destination 3 486 IN_public_log all -- * * 0.0.0.0/0 0.0.0.0/0 134 16720 IN_public_deny all -- * * 0.0.0.0/0 0.0.0.0/0 134 16720 IN_public_allow all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
[root@localhost ~]#iptables -Z IN_public 2 清空IN_public的第二条规则Chain IN_public (2 references)pkts bytes target prot opt in out source destination 43 4348 IN_public_log all -- * * 0.0.0.0/0 0.0.0.0/0 1 229 IN_public_deny all -- * * 0.0.0.0/0 0.0.0.0/0 174 20582 IN_public_allow all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
查看:
-L:list, 列出指定鏈上的所有规则
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息
-vv, -vvv随着v增加,显示的信息就愈加详细
-x:exactly,显示计数器结果的精确值
–line-numbers:显示规则的序号
[root@localhost ~]#iptables -vnL FORWARD 查看FORWARD链的信息[root@localhost ~]#iptables -vnL FORWARD --line-numbers 查看FORWARD链的信息并显示链上的规则编号Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED2 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 [root@localhost ~]#iptables -vnL FORWARD --line-numbers 显示FORWARD的序号Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 2 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachabl
匹配条件:
基本匹配:无需加载任何模块,由iptables/netfilter自行提供;
-s, –source address[/mask][,…]:检查报文中的源IP地址是否符合此处指定的地址或范围
-d, –destination address[/mask][,…]:检查报文中的目标IP地址是否符合此处指定的地址或范围
所有地址:0.0.0.0/0
-i, –in-interface name:数据报文流入的接口;只能用于数据报文流入的环节,只能用于PREROUTING,INPUT和FORWARD
-o, –out-interface name:数据报文流出的接口;只能用于数据报文流出的环节,只能用于FORWARD、OUTPUT和POSTROUTING
扩展匹配:对某一种功能的扩展,经由扩展模块引入的匹配机制
隐式扩展:对某一种协议扩展,无需手动加载扩展模块
-p:做协议匹配
protocol: tcp、udp、udplite、icmp、icmpv6、esp、ah、sctp、mh or “all”
TCP隐含指明了-m tcp
–sport port[:port]:匹配报文的源端口;可以是端口范围
–dport port[:port]:指定目的地端口,目标端口,可以是端口范围;
–tcp-flags mask comp
mask is the flags which we should examine, written as a comma-separated list(掩码是我们应该检查的标志,用逗号分隔的列表编写。),例如 SYN、ACK、FIN、RST
comp is a comma-separated list of flags which must be set(COMP是一个逗号分隔的旗帜列表,必须设置。),例如SYN
例如:“–tcp-flags SYN、ACK、FIN、RST SYN”表示,要检查的标志位为SYN、ACK、FIN、RST四个,其中SYN必须为1,余下的必须为0
–syn:用于匹配第一次握手,只允许新链接,相当于 –tcp-flags SYN、ACK、FIN、RST、SYN
[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -p tcp -j ACCEPT
udp 隐含指明了-m udp
–sport port[:port]:匹配报文的源端口;可以是端口范围
–dport port[:port]:匹配报文的目标端口;可以是端口范围
[root@localhost ~]#iptables -I INPUT -d 172.16.250.149 -p udp --dport 137:138 -j ACCEPT[root@localhost ~]#iptables -I OUTPUT -s 172.16.250.149 -p udp --sport 137:138 -j ACCEPT
icmp 隐含指明了-m icmp
–icmp-type {type[/code]|typename}
echo-request:8(ping出去请求回应)
echo-reply:0(给予回应)
[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -p icmp --icmp-type 8 -j ACCEPT[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p icmp --icmp-type 0 -j ACCEPT
显式扩展:额外附加的更多的匹配规则,必须使用-m选项指明要调用的扩展模块的扩展机制
1、-m multiport 以离散或连续的方式定义多端口匹配条件,此模块匹配一组源端口或目标端口。最多可指定15个端口
–sports 22,80,443…:指定多个源端口
–dports 22,80,443…:指定多个目标端口
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p tcp -m multiport --dports 22,80,139,445 -j ACCEPT[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -p tcp -m multiport --sports 22,80,139,445 -j ACCEPT
2、-m iprange 以连续地址块的方式来指明多IP地址匹配条件
–src-range from[-to]
–dst-range from[-to]
[root@localhost ~]#iptables -I INPUT 3 -d 172.16.250.149 -p tcp --dport 23 -m iprange --src-range 172.16.250.149-172.16.250.152 -j ACCEPT[root@localhost ~]#iptables -I OUTPUT 3 -s 172.16.250.149 -p tcp --sport 23 -m iprange --dst-range 172.16.250.149-172.16.250.152 -j ACCEPT
3、-m time 根据收到的报文时间/日期与指定的时间/日期格式进行匹配
–timestart hh:mm[:ss]起始时间
–timestop hh:mm[:ss] 结束时间
–weekdays day[,day…]匹配一周中的哪些天
–monthdays day[,day…]匹配一月中的哪些天
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]起始日期时间
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]结束日期事时间
–kerneltz:使用内核配置的时区而非默认的UTC
例如:基于时间限定,9点到18点禁止访问23端口
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -m time --timestart 09:00:00 --timestop 18:00:00 -j ACCEPT
基于时间限定,周一到周五9点到18点禁止访问23端口
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
4、-m string 对报文中的应用层数据做字符串匹配检测
–algo {bm|kmp}指定算法
–string pattern给定要检查的字符串模式
–hex-string pattern给定要检查的十六进制格式字符串模式
–from offset
–to offset
例如:禁止访问包含特定字符“hello”的页面
[root@localhost ~]#vim /var/www/html/test.html
[root@localhost ~]#iptables -I OUTPUT -s 172.16.250.149 -m string --algo kmp --string "hello" -j REJECT[root@localhost ~]#iptables -vnL --line-numbersChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 172.16.250.149 0.0.0.0/0 STRING match "hello" ALGO name kmp TO 65535 reject-with icmp-port-unreachable
5、-m connlimit 根据每个客户端主机做并发连接数限制,即每个客户端最多可同时发起的链接数量
–connlimit-upto 限定并发连接数上限
–connlimit-above n 限定并发连接数下限
例如:允许23端口大于2个并发连接
[root@localhost ~]#iptables -A INPUT -s 0/0 -d 172.16.250.149 -p tcp --dport 23 -m connlimit --connlimit-above 3 -j ACCEPT
允许23端口同一客户端小于3个并发连接
[root@localhost ~]#iptables -A INPUT -s 0/0 -d 172.16.250.149 -p tcp --dport 23 -m connlimit ! --connlimit-above 3 -j ACCEPT
6、-m limit 基于令牌桶算法对报文的速率做匹配
–limit rate[/second|/minute|/hour|/day]
–limit-burst number突发速率限定
限制本机某tcp服务接收新请求的速率:–syn, -m limit
例如:限制每分钟20个ping请求,前三个不受限制
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -p icmp --icmp-type 0 -j ACCEPT
7、-m state 状态监测扩展
–state
NEW: 新连接请求
ESTABLISHED:已建立的连接
INVALID:无法识别的连接
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接
UNTRACKED:未追踪的连接
state扩展:
内核模块装载:
nf_conntrack
nf_conntrack_ipv4
手动装载:
nf_conntrack_ftp
查看可追踪最大连接数:
cat /proc/net/nf_conntrack
调整可记录的连接数量最大值:
/proc/sys/net/nf_conntrack_max
修改方式:
sysctl -w nrt.nf_conntrack_max=300000
echo 300000>/proc/sys/net/nf_conntrack_max
conntrack(连接跟踪)所能跟踪的连接数量最大值取决于/proc/sys/net/nf_conntrack_max的设定
已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除,当模板满载时,后续的新连接可能会超时解决办法如下:
加大nf_conntrack_max的值,或降低nf_conntrack条目的超时时长,不同协议的超时时长的定义在/proc/sys/net/netfilter目录下
例如:允许被启动的FTP服务访问
[root@localhost ~]#modprobe nf_conntrack_ftp 加载nf_conntrack_ftp模块[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p tcp --dport 21 -m state --state NEW -j ACCEPT[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -m state --state ESTABLISHED -j ACCEPT
处理动作:
-j ACCEPT接受
DROP丢弃
ERJECT拒绝
ANAT源地址转换
DNAT目标地址转换
REDIRECT端口重定向
LOG记录访问记录
LOG
–log-level
–log-prefix
默认日志保存于/var/log/messages
保存和载入规则:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE 可跟时间
[root@localhost ~]#iptables-save > /etc/sysconfig/iptables-config-20160309-v1
重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE 重载后会清空原有规则
-n, –noflush:不清除原有规则
-t, –test:仅分析生成规则集,但不提交
[root@localhost ~]#iptables-restore < /etc/sysconfig/iptables-config-20160309-v1
CentOS 6:
保存规则:
service iptables save
保存规则于/etc/sysconfig/iptables文件,覆盖保存
重载规则:
service iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
配置文件:/etc/sysconfig/iptables-config
CentOS 7:
(1) 自定义Unit File,进行iptables-restore
(2) firewalld服务;
(3) 自定义脚本
规则优化的思路:
使用自定义链管理特定应用的相关规则,模块化管理规则
(1) 优先放行双方向状态为ESTABLISHED的报文
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面
(3) 服务于同一类别的功能的规则,匹配条件较严格的放在前面
(4) 设置默认策略:白名单机制
(a) iptables -P,不建议
(b) 建议在规则的最后定义规则做为默认策略
iptables操作实例:
允许来自172.16.0.0网络访问本机地址的TCP服务
[root@localhost ~]#systemctl stop firewalld.service [root@localhost ~]#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.250.149 -p tcp -j ACCEPT
在INPUT加一条规则,来自172.16.0.0网络的任何主机源地址访问172.16.250.149目标地址的TCP协议,都允许
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -s 172.16.0.0/16 -p tcp -j ACCEPT
允许本机访问172.16.0.0网络的任何主机的TCP协议
[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -p tcp -j ACCEPT[root@localhost ~]#iptables -P INPUT DROP[root@localhost ~]#iptables -P FORWARD DROP[root@localhost ~]#iptables -P OUTPUT DROP
允许本机访问172.16.0.0网络的任何主机的所有协议
[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -j ACCEPT
允许任何人ping本机
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p icmp -j ACCEPT (ping的报文可以进来)[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -p icmp -j ACCEPT(ping的报文可以出去)
用另一台主机ping本机
[root@localhost ~]#ping 172.16.250.149PING 172.16.250.149 (172.16.250.149) 56(84) bytes of data.64 bytes from 172.16.250.149: icmp_seq=1 ttl=64 time=5.41 ms
然后进行抓包
[root@localhost ~]#tcpdump -i ens33 -nn icmptcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes23:19:33.521746 IP 172.16.252.245 > 172.16.250.149: ICMP echo request, id 4370, seq 1, length 64
本机SSH服务能被172.16.0.0网络内主机访问,并添加为INPUT和OUTPUT第一条规则
[root@localhost ~]#iptables -I INPUT -s 172.16.0.0/16 -d 172.16.250.149 -p tcp --dport 22 -j ACCEPT[root@localhost ~]#iptables -I OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
生产中实例:
实例一、关闭所有的 INPUT FORWARD OUTPUT
下面是命令实现:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
再用命令 iptables -L -n 查看 是否设置好, 应看到全部 DROP
这样的设置好了,我们只是临时的, 重启服务器还是会恢复原来没有设置的状态
此时使用 service iptables save 进行保存
firewall rules 防火墙的规则保存在 /etc/sysconfig/iptables
实例二、只打开22端口
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
再查看 iptables -L -n 是否添加上去
最后别忘记了保存 对防火墙的设置
通过命令:service iptables save 进行保存
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
实例3、禁止某个IP访问
1台Linux服务器,2台windows8 操作系统进行访问
Linux服务器ip 192.168.1.99
win8_1 ip: 192.168.1.2
win8_2 ip: 192.168.1.8
现在要禁止 192.168.1.2 win8_1 访问, win8_2 正常访问,
iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP
正常访问的 192.168.1.8 win8_2是可以正常访问的
实例4、如何删除规则
首先我们要知道 这条规则的编号,每条规则都有一个编号
通过 iptables -L -n –line-number 可以显示规则和相对应的编号
num target prot opt source destination
1 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
2 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
3 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
多了 num 这一列, 这样我们就可以看到刚才的规则对应的是编号2。进行删除
iptables -D INPUT 2
删除INPUT链编号为2的规则。
再 iptables -L -n 查看一下已经被清除了。
实例5、过滤无效的数据包
假设有人进入了服务器,或者有病毒木马程序,它可以通过22,80端口像服务器外传送数据。
它的这种方式就和我们正常访问22,80端口区别。它发向外发的数据不是我们通过访问网页请求而回应的数据包。
下面我们要禁止这些没有通过请求回应的数据包,统统把它们堵住掉。
iptables 提供了一个参数 是检查状态的,下面我们来配置下 22 和 80 端口,防止无效的数据包。
iptables -A OUTPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
可以看到和我们以前使用的:
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
多了一个状态判断。
同样80端口也一样,现在删掉原来的2条规则,
iptables -L -n –line-number 这个是查看规则而且带上编号。我们看到编号就可以删除对应的规则了。
iptables -D OUTPUT 1 这里的1表示第一条规则。
当你删除了前面的规则, 编号也会随之改变。
我们删除了前面2个规则,22端口还可以正常使用,说明没问题了
service iptables save 进行保存。
Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
其实就是把刚才设置的规则写入到 /etc/sysconfig/iptables 文件中。
实例6、DNS端口53设置
下面我们来看看如何设置iptables来打开DNS端口,DNS端口对应的是53
大家看到我现在的情况了吧,只开放22和80端口,我现在看看能不能解析域名。
host www.google.com 输入这个命令后,一直等待,说明DNS不通出现下面提示 :
;; connection timed out; no servers could be reached
ping 一下域名也是不通
[root@localhost ~ping www.google.com
ping: unknown host www.google.com
我这里的原因就是 iptables 限制了53端口。
有些服务器,特别是Web服务器减慢,DNS其实也有关系的,无法发送包到DNS服务器导致的。
下面演示下如何使用 iptables 来设置DNS 53这个端口,如果你不知道域名服务端口号,你可以用命令 : grep domain /etc/services
[root@localhost ~grep domain /etc/services
domain 53/tcp # name-domain server
domain 53/udp
domaintime 9909/tcp # domaintime
domaintime 9909/udp # domaintime
我们一般使用 udp 协议。
iptables -A OUTPUT -p udp –dport 53 -j ACCEPT
这是我们 ping 一个域名,数据就是从本机出去,所以我们先设置 OUTPUT,我们按照ping这个流程来设置。
然后 DNS 服务器收到我们发出去的包,就回应一个回来
iptables -A INPUT -p udp –sport 53 -j ACCEPT
同时还要设置
iptables -A INPUT -p udp –dport 53 -j ACCEPT
iptables -A OUTPUT -p udp –sport 53 -j ACCEPT
下面开始测试, 可以用 iptables -L -n 查看设置情况,确定没有问题就可以测试了
[root@localhost ~iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp spt:53
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:53
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp spt:22 state ESTABLISHED
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp spt:80 state ESTABLISHED
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp spt:53
可以测试一下是否 DNS 可以通过iptables 了。
原创文章,作者:Linux.rookie,如若转载,请注明出处:http://www.178linux.com/78147