CentOS防火墙的设置与优化
时间:2014-09-11 19:51 来源:linux.it.net.cn 作者:it
一、设置主机防火墙。
开放: 服务器的:web服务、vsftpd 文件服务、ssh远程连接服务、ping 请求。
1、开放sshd服务
开放流入本地主机,22端口的数据报文。
[root@stu13 ~]# iptables -A INPUT --destination 192.168.60.99 -p tcp --dport 22 -j ACCEPT
开放从本地主机22端口流出的数据报文
[root@stu13 ~]# iptables -A OUTPUT --source 192.168.60.99 -p tcp --sport 22 -j ACCEPT
修改默认策略为:DROP。 目的禁止所有报文通过本机的TCP/IP协议栈,再开放指定端口的服务。
[root@stu13 ~]# iptables -P INPUT DROP
[root@stu13 ~]# iptables -P OUTPUT DROP
如:
[root@stu13 ~]# iptables -L -n -v
Chain INPUT (policy DROP 554 packets, 53329 bytes) ----> 已经阻止到数据包了
pkts bytes target prot opt in out source destination
1162 60532 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:22
匹配到数据包
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
681 96248 ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 tcp spt:22
2、开放本机提供的web服务:
开放访问本机的80,443服务。
开放流入本地主机,80端口的数据报文
[root@stu13 ~]# iptables -A INPUT --dst 192.168.60.99 -p tcp --dport 80 -j ACCEP
开放从本地主机80端口流出的数据报文
[root@stu13 ~]# iptables -A OUTPUT --src 192.168.60.99 -p tcp --sport 80 -j ACCEPT
开放流入本地主机,443端口的数据报文
[root@stu13 ~]# iptables -A INPUT --dst 192.168.60.99 -p tcp --dport 443 -j ACCEPT
开放从本地主机443端口流出的数据报文
[root@stu13 ~]# iptables -A OUTPUT --src 192.168.60.99 -p tcp --sport 443 -j ACCEPT
3、本机可以接受ping
开放应用层协议为icmp数据报文流入本机
1
[root@stu13 ~]# iptables -A INPUT -p icmp -j ACCEPT
开放应用层协议为icmp数据报文流出本机
1
[root@stu13 ~]# iptables -A OUTPUT -p icmp -j ACCEPT
4、开放被动模式FTP服务
开放命令连接的21端口
装载模块:这是连接追踪ftp服务器的数据连接的模块。
[root@stu13 httpd-2.4.9]# modprobe nf_conntrack_ftp
查看是否装载成功
[root@stu13 ~]# lsmod | grep "nf_conntrack_ftp"
nf_conntrack_ftp 10475 0
nf_conntrack 65428 3 nf_conntrack_ftp,nf_conntrack_ipv4,xt_
开放应用层协议为tcp,目标端口为21的数据报文流入本机
[root@stu13 ~]# iptables -A INPUT --dst 192.168.60.99 -p tcp --dport 21 -m state --state NEW -j ACCEPT
使用iptables的状态追踪功能,追踪ftp服务器的数据传输端口,意思是说:只要是找开的数据传输连接传输的数据报文与某个已经建立连接有关连,就允许开数据包通过。
[root@stu13 ~]# iptables -A INPUT --dst 192.168.60.99 -m state --state ESTABLISHED,RELATED -j ACCEPT
数据流出
[root@stu13 ~]# iptables -A OUTPUT --src 192.168.60.99 -m state --state RELATED,ESTABLISHED -j ACCEPT
二、测试:主机防火墙开放的服务是否成功:
、PING 测试:本机PING其它主机
[root@stu13 ~]# ping -c 1 192.168.60.1
PING 192.168.60.1 (192.168.60.1) 56(84) bytes of data.
64 bytes from 192.168.60.1: icmp_seq=1 ttl=64 time=1.81 ms
--- 192.168.60.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 1.812/1.812/1.812/0.000 ms
在windows下ping 192.168.60.99主机
D:\>ping 192.168.60.99
正在 Ping 192.168.60.99 具有 32 字节的数据:
来自 192.168.60.99 的回复: 字节=32 时间=2ms TTL=64
来自 192.168.60.99 的回复: 字节=32 时间<1ms TTL=64
192.168.60.99 的 Ping 统计信息:
数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 2ms,平均 = 1ms
2、测试80服务
[root@nfs ~]# curl -eI http://192.168.60.99/index.html
<h1>This Server is OK...</h1>
3、在Windows 下测试:文件服务器。
D:\>ftp 192.168.60.99
连接到 192.168.60.99。
220 (vsFTPd 2.2.2)
用户(192.168.60.99:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp> get pub/inittab
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for pub/inittab (884 bytes).
226 Transfer complete.
ftp: 收到 884 字节,用时 0.00秒 884000.00千字节/秒。
ftp>
4、测试连接到ssh服务
[root@nfs ~]# ssh 192.168.60.99
Last login: Mon Aug 18 17:51:20 2014
三、分析优化防火墙
设置开放特定服务后的filter表的规则如下:
[root@stu13 ~]# iptables --line-numbers -L -n -v
Chain INPUT (policy DROP 1911 packets, 223K bytes)
num pkts bytes target prot opt in out source destination
1 7470 441K ACCEPT cp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:22
2 51 4545 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:80
3 1 60 ACCEPT cp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:443
4 4 288 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
5 12 624 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:21 state NEW
6 174 8122 ACCEPT all -- * * 0.0.0.0/0 192.168.60.99 state RELATED,ESTABLISHED
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 8 packets, 480 bytes)
num pkts bytes target prot opt in out source destination
1 5761 701K ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 tcp spt:22
2 40 4522 ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 tcp spt:80
3 1 40 ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 tcp spt:443
4 4 288 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
5 328 22614 ACCEPT all -- * * 192.168.60.99 0.0.0.0/0 state RELATED,ESTABLISHED
1、优化策略:将多条规则合并成一条。
(1)、使用umltiport扩展模块合并端口模块:
[root@stu13 httpd-2.4.9]# ll /lib/xtables-1.4.7/ | grep "multiport"
-rwxr-xr-x. 1 root root 10772 Feb 22 2013 libxt_multiport.so
[root@stu13 httpd-2.4.9]# iptables -I INPUT --dst 192.168.60.99 -p tcp -m multiport --dports 80,443,22 -j ACCEPT
[root@stu13 httpd-2.4.9]# iptables -D INPUT 2
[root@stu13 httpd-2.4.9]# iptables -D INPUT 2
[root@stu13 httpd-2.4.9]# iptables -D INPUT 2
[root@stu13 httpd-2.4.9]# iptables -I OUTPUT --src 192.168.60.99 -p tcp -m multiport --sports 80,443,22 -j ACCEPT
[root@stu13 httpd-2.4.9]# iptables -D OUTPUT 2
[root@stu13 httpd-2.4.9]# iptables -D OUTPUT 2
[root@stu13 httpd-2.4.9]# iptables -D OUTPUT 2
(2)、查看合并端口后filter过滤表
[root@stu13 ~]# iptables --line-numbers -L -n -v
Chain INPUT (policy DROP 20 packets, 2060 bytes)
num pkts bytes target prot opt in out source destination
1 813 49587 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 multiport dports 80,443,22
2 4 288 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 13 676 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:21 state NEW
4 196 9102 ACCEPT all -- * * 0.0.0.0/0 192.168.60.99 state RELATED,ESTABLISHED
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 165 21277 ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 multiport sports 80,443,22
2 4 288 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 355 24153 ACCEPT all -- * * 192.168.60.99 0.0.0.0/0 state RELATED,ESTABLISHED
2、使用iptables/netfiltes提供的状态追踪功能优化防火墙;
iptables/netfiter提供有一个状态追踪功能,只要第一次连接都是NEW状态。下一次连接只要在状态追踪表的计数器的时间没到之前,该客户端重新建立的连接,iptables/netfilter 也认为该连接是ESTABLISHED状态的。
通常情况下,处于ESTABLISHED状态的连接要比处于NEW状态的连接要多得多,那么意味着:ESTABLISHED状态的连接传输的数据报文通常要比NEW状态的连接传输的数据报文要多得多。数据报文经过某链时,数据报文与链中的定义的规则一一做匹配,顺序是从上到下依次做匹配操作。如果数据报文的某些特征,如:源IP地址、目标IP地址、源端口、目标端口、连接的状态、TCP的标志位等,与链中定义的规则匹配到了,就执行【-j】后面的 action(如:DROP|ACCEPT等)。如果数据报文与它经过的链中的规则从上到下一一做匹配,都没有匹配到的话,就执行iptables中定义的默认规policy。因为,定义防火墙规则的时候,首先拒绝所有(默认策略都为:DROP),开放某些服务的数据报文通过.处于ESTABLISHED状态的连接传输的数据报文通常是安全的,应该允许它通过,而数据报文通过的链的要做规则检查的规则又有很多,而处于ESTABLISHED状态的连接,要传输的数据报文很多,那么怎么样要它快速通过iptables/netfilter的防火墙的规则检查呢?
1
2
(1)、根据防火墙做数据报文的匹配规则,应该让处于ESTABLISHED状态的连接传输的数据报文快速 通过变卦的规则检查,意思是说:防火墙根据连接追踪功能一发现该数据报文是ESTABLISHED 状态的连接发送的,立马发行。做法:把允许处于ESTABLISHED连接的数据报文通过的策略放 在链的所有规则的最前面。
(2)、状态检测,是连接追踪模块实现的。连接追踪模块在内核内存中维护一张追踪表,记录每个连 接的状态,以及连接处于ESTABLISHED的状态的超时时间和可以追踪多少个连接以及目前正追 踪的连接数等等。注意:要根据实际应用开启或关闭连接追踪功能。
连接追踪模块可以追踪的连接数量
[root@stu13 httpd-2.4.9]# cat /proc/sys/net/nf_conntrack_max
31928
连接处于ESTABLISHED状态的超时时长
[root@stu13 /]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
432000 约等于5天。
当前追踪的所有连接:
[root@stu13 httpd-2.4.9]# cat /proc/sys/net/netfilter/nf_conntrack_count
3
注意:
如果,我们启用了iptables/netfilterr 的连接追踪功能的话,当前追踪的所有连接数已经达到连接追踪模块可以追踪的连接数量的上限了,且连接追踪到的连接处于ESTABLISHED状态的连接,还没到失效时间。后续新的连接只能等待,iptables/netfilter的连接追踪表有连接的超时时间到。才可以通过我们的防火墙。而防火墙定义的ESTABLISHED状态的走超时时长为5天,而我们的TCP连接在TCP的各种状态的超时时长,都是很短的。所以。会导致大量的后续新的连接被拒绝。也就是出现连接服务器超时的情况发生。所以,根据实际应用调整这些参数很关键。或比较繁忙的服务器就不应该开启iptables/netflter的连接追踪功能。
iptables/netfilter的连接追踪功能是通过下述扩展模块实现的。
[root@stu13 httpd-2.4.9]# ll /lib/xtables-1.4.7/ | grep "state"
-rwxr-xr-x. 1 root root 5860 Feb 22 2013 libxt_state.so
提供,允许发往特定端口处于ESTABLISHED状态连接的数据报文通过TCP/IP协议栈,且把该规则放在链的所有规则的最前面。
INPUT表
[root@stu13 httpd-2.4.9]# iptables -I INPUT 1 --dst 192.168.60.99 -p tcp -m multiport --dports 80,443,22 -m state --state ESTABLISHED,NEW -j ACCEPT
[root@stu13 httpd-2.4.9]# iptables -D INPUT 2
OUTPUT表:允许处于ESTABLISHED状态连接的数据报文从本机出去。且把该规则放在链的所有规则的最前面。
[root@stu13 httpd-2.4.9]# iptables -I OUTPUT 1 --src 192.168.60.99 -p tcp -m multiport --sports 80,443,22 -m state --state ESTABLISHE -j ACCEPT
[root@stu13 ~]# iptables -D OUTPUT 2
使用状态检测功能优化后的:
[root@stu13 ~]# iptables --line-numbers -L -n -v
Chain INPUT (policy DROP 138 packets, 12760 bytes)
num pkts bytes target prot opt in out source destination
1 760 49519 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 multiport dports 80,443,22 state NEW,ESTABLISHED
2 14 1128 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 18 936 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:21 state NEW
4 299 13853 ACCEPT all -- * * 0.0.0.0/0 192.168.60.99 state RELATED,ESTABLISHED
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1194 153K ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 multiport sports 80,443,22 state ESTABLISHED
2 14 1128 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 465 30940 ACCEPT all -- * * 192.168.60.99 0.0.0.0/0 state RELATED,ESTABLISHED
分析:
因为,只要是ESTABLISHED状态的连接的数据报文,是不会有问题的。不需要检测端口了。这样提高了iptable/netfiler检测数据报文的速度。只要是ESTABLISHED状态的连接的数据报文都允许通过。
所以,对上述的INPUT表的第一条规则进行拆分,如下
1
[root@stu13 httpd-2.4.9]# iptables -I INPUT 1 --dst 192.168.60.99 -p tcp -m state --state ESTABLISHED -j ACCEPT
并把发往指定端口的数据报文,进行NEW状态的数据报文检测组成一条规则
[root@stu13 httpd-2.4.9]# iptables -I INPUT 2 --dst 192.168.60.99 -p tcp -m multiport --dports 80,443,21,22 -m state --state NEW -j ACCEPT
修改第三条规则
[root@stu13 httpd-2.4.9]# iptables -R INPUT 3 --dst 192.168.60.99 -m state --state RELATED -j ACCEPT
删除
[root@stu13 httpd-2.4.9]# iptables -D INPUT 3
[root@stu13 httpd-2.4.9]# iptables -D INPUT 4
修改后INPUT表变成
[root@stu13 ~]# iptables --line-numbers -L -n -v
Chain INPUT (policy DROP 129 packets, 11581 bytes)
num pkts bytes target prot opt in out source destination
1 4793 374K ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 state ESTABLISHED
2 35 1820 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 multiport dports 80,443,21,22 state NEW
3 7 364 ACCEPT all -- * * 0.0.0.0/0 192.168.60.99 state RELATED
4 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
。。。。。。
分析OUTPU表
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 3466 482K ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 multiport sports 80,443,22 state ESTABLISHED
2 22 1608 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 547 36931 ACCEPT all -- * * 192.168.60.99 0.0.0.0/0 state RELATED,ESTABLISHED
分析:跟上述一样,允许处于ESTABLISHED状态的连接的数据报文通过TCP/IP协议栈。修改OUTPUT表的第1条与第3条规则
修改第一条规则
[root@stu13 httpd-2.4.9]# iptables -R OUTPUT 1 --src 192.168.60.99 -p tcp -m state --state ESTABLISHED -j ACCEPT
修改第三条规则
[root@stu13 httpd-2.4.9]# iptables -R OUTPUT 3 --src 192.168.60.99 -m state --state RELATED -j ACCEPT
修改后的OOUPUT表的规则如下:
[root@stu13 ~]# iptables --line-numbers -L -n -v
。。。。。
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 794 148K ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 state ESTABLISHED
2 22 1608 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.60.99 0.0.0.0/0 state RELATED
经过使用端口合并和iptables/netfilter的状态追踪功能优化规则表之后:
[root@stu13 ~]# iptables --line-numbers -L -n -v
Chain INPUT (policy DROP 540 packets, 53525 bytes)
num pkts bytes target prot opt in out source destination
1 225 10816 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 state ESTABLISHED
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 multiport dports 80,443,21,22 state NEW
3 0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.60.99 state RELATED
4 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 194 27924 ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 state ESTABLISHED
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- * * 192.168.60.99 0.0.0.0/0 state RELATED
3、使用自定义链分成分成等级iptables规则:
如果,防火墙规则很多的话,这样写就显示得很乱,不明了。造成后续添加规则就在很多不便。因为,每种服务的访问量都不一样。简单的合并多个端口的做法并是不很理想。
最好为开放的每个服务都使用一条自定义链。这样,以后我们要为某服务添加或删除规则只要找到该服务对应的自定义链,就可以操作了,很方便。如下:
(1)、为http 80服务自定义一条链
[root@stu13 ~]# iptables -t filter -N http_in
[root@stu13 ~]# iptables -A http_in -d 192.168.60.99 -p tcp --dport 80 -m state --state NEW -j ACCEPT
INPUT链调用该链
[root@stu13 ~]# iptables -I INPUT 2 -d 192.168.60.99 -p tcp --dport 80 -j http_in
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
1
[root@stu13 httpd-2.4.9]# iptables -A http_in -j RETURN
(2)、为https 443 服务自定义一条链
[root@stu13 ~]# iptables -t filter -N https_in
[root@stu13 ~]# iptables -A https_in -d 192.168.60.99 -p tcp --dport 443 -m state --state NEW -j ACCEPT
调用自定义链
[root@stu13 httpd-2.4.9]# iptables -I INPUT 3 -d 192.168.60.99 -p tcp --dport 443 -j https_in
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
[root@stu13 httpd-2.4.9]# iptables -A https_in -j RETURN
(3)、为ssh服务自定义一条链
[root@stu13 ~]# iptables -t filter -N ssh_in
[root@stu13 ~]# iptables -A ssh_in -d 192.168.60.99 -p tcp --dport 22 -m state --state NEW -j ACCEPT
调用该链
[root@stu13 httpd-2.4.9]# iptables -I INPUT 4 -d 192.168.60.99 -p tcp --dport 22 -j ssh_in
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
[root@stu13 httpd-2.4.9]# iptables -A ssh_in -j RETURN
(4)、为vsftp文件服务自定义一条链
[root@stu13 ~]# iptables -t filter -N vsftp_in
[root@stu13 ~]# iptables -A vsftp_in -d 192.168.60.99 -p tcp --dport 21 -m state --state NEW -j ACCEPT
调用该链
[root@stu13 httpd-2.4.9]# iptables -I INPUT 5 -d 192.168.60.99 -p tcp --dport 21 -j vsftp_in
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
[root@stu13 httpd-2.4.9]# iptables -A vsftp_in -j RETURN
(5)、删除INPUT链的第6条规则(端口合并那条链)
1
[root@stu13 httpd-2.4.9]# iptables -D INPUT 6
使用自定义链后,规则表如下:
[root@stu13 ~]# iptables --line-numbers -L -n -v
Chain INPUT (policy DROP 928 packets, 83409 bytes)
num pkts bytes target prot opt in out source destination
1 7351 435K ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 state ESTABLISHED
2 6 312 http_in tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:80
3 0 0 https_in tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:443
4 2 104 ssh_in tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:22
5 2 104 vsftp_in tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:21
6 8 416 ACCEPT all -- * * 0.0.0.0/0 192.168.60.99 state RELATED
7 8 672 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 2 packets, 120 bytes)
num pkts bytes target prot opt in out source destination
1 5842 751K ACCEPT tcp -- * * 192.168.60.99 0.0.0.0/0 state ESTABLISHED
2 0 0 ACCEPT all -- * * 192.168.60.99 0.0.0.0/0 state RELATED
3 8 672 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain http_in (1 references)
num pkts bytes target prot opt in out source destination
1 6 312 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:80 state NEW
2 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain https_in (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:443 state NEW
2 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain ssh_in (1 references)
num pkts bytes target prot opt in out source destination
1 2 104 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:22 state NEW
2 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain vsftp_in (1 references)
num pkts bytes target prot opt in out source destination
1 2 104 ACCEPT tcp -- * * 0.0.0.0/0 192.168.60.99 tcp dpt:21 state NEW
2 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
说明:
在INPUT链,根据实际应用情况,服务的访问繁忙程序调整,http_in、https_in、ssh_in、vsftp_in的先后顺序,来优化iptables/netfilter
的效率。
有了自定义链后,数据报文的检查流程如下图:
四、测试优化后的防火墙策略是否成功:
1、测试 http 80 服务
1
2
[root@nfs ~]# curl http://192.168.60.99/index.html
<h1>This Server is OK...</h1>
2、测试 ssh 服务
[root@nfs ~]# ssh 192.168.60.99
Last login: Mon Aug 18 20:21:25 2014 from 192.168.60.88
3、测试vsftp 服务
D:\>ftp 192.168.60.99
连接到 192.168.60.99。
220 (vsFTPd 2.2.2)
用户(192.168.60.99:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp> get pub/inittab
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for pub/inittab (884 bytes).
226 Transfer complete.
ftp: 收到 884 字节,用时 0.07秒 12.63千字节/秒。
ftp>
4、测试ping
(1)、ping本主机
D:\>ping 192.168.60.99
正在 Ping 192.168.60.99 具有 32 字节的数据:
来自 192.168.60.99 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.60.99 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.60.99 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.60.99 的回复: 字节=32 时间<1ms TTL=64
192.168.60.99 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 1ms,平均 = 0ms
(2)、本主机ping别的主机
1
[root@stu13 ~]# ping -c 1 192.168.60.88
PING 192.168.60.88 (192.168.60.88) 56(84) bytes of data.
64 bytes from 192.168.60.88: icmp_seq=1 ttl=64 time=0.590 ms
--- 192.168.60.88 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 0.590/0.590/0.590/0.000 ms
(3)、回环地址
1
[root@stu13 ~]# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.375 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.375/0.375/0.375/0.000 ms
(责任编辑:IT)
一、设置主机防火墙。 开放: 服务器的:web服务、vsftpd 文件服务、ssh远程连接服务、ping 请求。 1、开放sshd服务 开放流入本地主机,22端口的数据报文。
开放从本地主机22端口流出的数据报文
修改默认策略为:DROP。 目的禁止所有报文通过本机的TCP/IP协议栈,再开放指定端口的服务。
如:
2、开放本机提供的web服务: 开放访问本机的80,443服务。 开放流入本地主机,80端口的数据报文
开放从本地主机80端口流出的数据报文
开放流入本地主机,443端口的数据报文
开放从本地主机443端口流出的数据报文
3、本机可以接受ping 开放应用层协议为icmp数据报文流入本机
开放应用层协议为icmp数据报文流出本机
4、开放被动模式FTP服务 开放命令连接的21端口 装载模块:这是连接追踪ftp服务器的数据连接的模块。
查看是否装载成功
开放应用层协议为tcp,目标端口为21的数据报文流入本机
使用iptables的状态追踪功能,追踪ftp服务器的数据传输端口,意思是说:只要是找开的数据传输连接传输的数据报文与某个已经建立连接有关连,就允许开数据包通过。
数据流出
二、测试:主机防火墙开放的服务是否成功: 、PING 测试:本机PING其它主机
在windows下ping 192.168.60.99主机
2、测试80服务
3、在Windows 下测试:文件服务器。
4、测试连接到ssh服务
三、分析优化防火墙 设置开放特定服务后的filter表的规则如下:
1、优化策略:将多条规则合并成一条。 (1)、使用umltiport扩展模块合并端口模块:
(2)、查看合并端口后filter过滤表
2、使用iptables/netfiltes提供的状态追踪功能优化防火墙; iptables/netfiter提供有一个状态追踪功能,只要第一次连接都是NEW状态。下一次连接只要在状态追踪表的计数器的时间没到之前,该客户端重新建立的连接,iptables/netfilter 也认为该连接是ESTABLISHED状态的。
通常情况下,处于ESTABLISHED状态的连接要比处于NEW状态的连接要多得多,那么意味着:ESTABLISHED状态的连接传输的数据报文通常要比NEW状态的连接传输的数据报文要多得多。数据报文经过某链时,数据报文与链中的定义的规则一一做匹配,顺序是从上到下依次做匹配操作。如果数据报文的某些特征,如:源IP地址、目标IP地址、源端口、目标端口、连接的状态、TCP的标志位等,与链中定义的规则匹配到了,就执行【-j】后面的 action(如:DROP|ACCEPT等)。如果数据报文与它经过的链中的规则从上到下一一做匹配,都没有匹配到的话,就执行iptables中定义的默认规policy。因为,定义防火墙规则的时候,首先拒绝所有(默认策略都为:DROP),开放某些服务的数据报文通过.处于ESTABLISHED状态的连接传输的数据报文通常是安全的,应该允许它通过,而数据报文通过的链的要做规则检查的规则又有很多,而处于ESTABLISHED状态的连接,要传输的数据报文很多,那么怎么样要它快速通过iptables/netfilter的防火墙的规则检查呢?
连接追踪模块可以追踪的连接数量
连接处于ESTABLISHED状态的超时时长
当前追踪的所有连接:
注意: 如果,我们启用了iptables/netfilterr 的连接追踪功能的话,当前追踪的所有连接数已经达到连接追踪模块可以追踪的连接数量的上限了,且连接追踪到的连接处于ESTABLISHED状态的连接,还没到失效时间。后续新的连接只能等待,iptables/netfilter的连接追踪表有连接的超时时间到。才可以通过我们的防火墙。而防火墙定义的ESTABLISHED状态的走超时时长为5天,而我们的TCP连接在TCP的各种状态的超时时长,都是很短的。所以。会导致大量的后续新的连接被拒绝。也就是出现连接服务器超时的情况发生。所以,根据实际应用调整这些参数很关键。或比较繁忙的服务器就不应该开启iptables/netflter的连接追踪功能。
iptables/netfilter的连接追踪功能是通过下述扩展模块实现的。
提供,允许发往特定端口处于ESTABLISHED状态连接的数据报文通过TCP/IP协议栈,且把该规则放在链的所有规则的最前面。 INPUT表
OUTPUT表:允许处于ESTABLISHED状态连接的数据报文从本机出去。且把该规则放在链的所有规则的最前面。
使用状态检测功能优化后的:
分析: 因为,只要是ESTABLISHED状态的连接的数据报文,是不会有问题的。不需要检测端口了。这样提高了iptable/netfiler检测数据报文的速度。只要是ESTABLISHED状态的连接的数据报文都允许通过。 所以,对上述的INPUT表的第一条规则进行拆分,如下
并把发往指定端口的数据报文,进行NEW状态的数据报文检测组成一条规则
修改第三条规则
删除
修改后INPUT表变成
分析OUTPU表
分析:跟上述一样,允许处于ESTABLISHED状态的连接的数据报文通过TCP/IP协议栈。修改OUTPUT表的第1条与第3条规则 修改第一条规则
修改后的OOUPUT表的规则如下:
经过使用端口合并和iptables/netfilter的状态追踪功能优化规则表之后:
3、使用自定义链分成分成等级iptables规则: 如果,防火墙规则很多的话,这样写就显示得很乱,不明了。造成后续添加规则就在很多不便。因为,每种服务的访问量都不一样。简单的合并多个端口的做法并是不很理想。 最好为开放的每个服务都使用一条自定义链。这样,以后我们要为某服务添加或删除规则只要找到该服务对应的自定义链,就可以操作了,很方便。如下: (1)、为http 80服务自定义一条链
INPUT链调用该链
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
(2)、为https 443 服务自定义一条链
调用自定义链
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
(3)、为ssh服务自定义一条链
调用该链
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
(4)、为vsftp文件服务自定义一条链
调用该链
如果,使用自定义规则检测数据报文没有匹配到则返回主链INPUT
(5)、删除INPUT链的第6条规则(端口合并那条链)
使用自定义链后,规则表如下:
说明: 在INPUT链,根据实际应用情况,服务的访问繁忙程序调整,http_in、https_in、ssh_in、vsftp_in的先后顺序,来优化iptables/netfilter 的效率。 有了自定义链后,数据报文的检查流程如下图:
四、测试优化后的防火墙策略是否成功: 1、测试 http 80 服务
2、测试 ssh 服务
3、测试vsftp 服务
4、测试ping (1)、ping本主机
(2)、本主机ping别的主机
(责任编辑:IT) |