iptables
安全控制低到高策略大致为:
1)防火墙(又分为包过滤防火墙,代理防火墙)
包过滤防火墙又分为简单的包过滤防火墙,和基于状态检测的包过滤防火墙
2)tcp_wrappers(tcp包装器)它工作在OSI七层模型中的四层以上,但它只能够防护连接到这个库上的软件。
#所有连接到libwrap.so库的服务将被tcp_wrappers代为监听
#cd /etc/xinetd.d/切换到此目录下可进行查看被tcp_wrappers代为管理的服务
3)xinetd(超级守护进程,它本身管理了很多非独立守护进程)
#在/etc/xinetd.conf中定义了非独立守护进程的控制方式
#在/etc/xinetd.d/为了方便管理在它中来写服务配置文件
4)Pluggable Authentication Modules(对用户提供的用户密码做认证的)
5)Security Enhanced Linux(控制活动范围selinux)
6)Service Specific(某个服务特定的安全访问控制)规则)
7)Application Hardening(对应用程序的加固),它即可基于软件软件来实现,也可给基于硬件来实现
tcp/ip选择了五个点用来检查数据包,这5个点成为5个链,ipchain用来生成包过滤过规则的。
这5个链分别如下:
INPUT , OUTPUT , FORWARD , PREROUTING , POSTING
iptables的规则格式:
iptables [-t table ] COMMAND chains [NUM] [match condition] [-j ]
具体如下
iptables [-t table] -[AD] chain rule-specification [options]
iptables [-t table] -I chain [rulenum] rule-specification [options]
iptables [-t table] -R chain rulenum rule-specification [options]
iptables [-t table] -D chain rulenum [options]
iptables [-t table] -[LFZ] [chain] [options]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target [options]
iptables [-t table] -E old-chain-name new-chain-name
其中“-t”用来指定转换类型
table表有:
【filter(定义包过滤的)包含的链:INPUT , OUTPUT , FORWARD
【nat (那天转换)包含的链:PREROUTING , POSTROUTING , OUTPUT
【mangle含所有的链
链中规则操作命令主要对链中规则进行管理的,具体命令如下:
【-A 在链尾部追加一个新规则
【-I [N] 插入一条新规则,也可指定插入第几条
【-R N 替换木条规则
【-D [N] 删除第几条规则
对链做管理:
【-F 清空规则
【-P 改默认策略
【-N 用户自定义一条新链
【-X 用来删除用户自定义的空链
【-E 重命名用户定义的某条链
【-Z 清空计数器的
链查看:
【-L 查看某条链中的所有规则,“-L
”
的子命令如下:
(-n 用ip地址格式来显示源地址目标地址
(-v显示详细信息
(-vv显示更的详细
(-x不做单位换算直接显示其精确值得
(--line-number显示行号
例
[root@station10 ~]# iptables -L --line-number -vxn
Chain INPUT (policy ACCEPT 377808 packets, 121144840 bytes)
n
u
m
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 505 packets, 41676 bytes)
num pkts bytes target prot opt in out source destination
【-S 打印某条链中的规则
匹配条件分为:
{通用匹配(作为选项出现的)
【-p 匹配协议的支持tcp ,udp ,icmp这三种四层协议但icmp是三四层之间的协议
【-s 用来匹配源地址的
【-d 用来匹配目标地址的
【-i 制定通过那个网卡接口进来的
【-o 指定通过那个网卡出去的
{扩展匹配又分为:
****隐含扩展
【tcp的扩展(--dprot 目标端口
(--sport 源端口
(--tcp-flags标志位
(--syn相当于建立一个新连接
##例:--tcp-flags [ ! ] mask comp格式
mask 表示要检查那几各位
comp指定某个位的值为{0|1}
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST
其中SYN表示发起一个连接请
ACK表示回应请求的
FIN表示结束
RST表示重置
###########################################################
【udp扩展 (--sport
(--dport
【icmp扩展 (--icmp-type有三种:(8 echo-request是发起ping的
( 0 echo-reply 拒绝回应
(3 destination unreachable
****显式扩展
【-m 可指定后面的扩展如下:(-m state --state
(-m multiport --port
(-m limit --limit对速率扩展的
(-m string --string包含字符串的
(-m mac --mac-source
处理动作“-j”具体如下:
【DROP丢弃
【REJECT明确拒绝(考试中用)
【ACCEPT接受
【SNAT源地址转换
【DNAT目标地址转换
【LOG昨日志的
【REDIRECT端口重定向
【MASQUERADE端口伪装,只要用SNAT时都可用到
###########################################################
基于filter表主要是用来过滤的我们可以这样来做
例1:
假设凡是到本机上来访问wed服务客户机都被拒绝以这样做:
(若本机IP:192.168.0.105,在此机子上的准备工作:
[root@station19 ~]# yum -y install httpd.i386
[root@station19 ~]# chkconfig httpd on
(添加为开机自启动)
[root@station19 ~]# service httpd start
(启动httpd服务)
[root@station19 ~]# netstat �Ctnlp
(查看80端口以开放)
tcp 0 0 :::80 :::* LISTEN 29843/httpd
为了测试演示是否成功我们vim /var/www/html/index.html
[root@station19 ~]# vim /var/www/html/index.html
This is 192.168.0.105...
[root@station19 ~]# elinks 127.0.0.1
(本机访问成功)
[root@station6 ~]# elinks 192.168.0.105:80
(本机做规则前其它机子访问也成功)
[root@station19 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.0.105 -p tcp --dport 80 -i eth0 -j DROP
(本机设置规则)
[root@station19 ~]# iptables -L --line-number �Cn
(查看)
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 192.168.0.105 tcp dpt:80
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@station6 ~]# elinks 192.168.0.105:80
(
其他机子再次测试已经不能访问到服务了)
如果我们让出去的也被绝绝该怎么做呢?
很简单,我们应该再写一条出去的过滤规则就行了,如下
[root@station19 ~]# iptables -t filter -A OUTPUT -s 192.168.0.105 -d 0.0.0.0/0.0.0.0 -p tcp --sport 80 -j DROP
[root@station19 ~]# iptables -L --line-number -n
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 192.168.0.105 tcp dpt:80
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 192.168.0.105 0.0.0.0/0 tcp spt:80
用这两条链INPUT和OUTPUT时一定要注意来源“-s”和目标“-d”
例2:
如果我们想让192.168.0.105不能ping其他主机该怎么做呢?
[root@station19 ~]# ping 192.168.106
(做规则前ping其它主机成功)
PING 192.168.106 (192.168.0.106) 56(84) bytes of data.
64 bytes from 192.168.0.106: icmp_seq=1 ttl=64 time=3.45 ms
[root@station19 ~]# iptables -t filter -A OUTPUT -s 192.168.0.105 -p icmp --icmp-type 8 -j DROP
[root@station19 ~]# iptables -L --line-number �Cn
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 192.168.0.105 tcp dpt:80
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 192.168.0.105 0.0.0.0/0 tcp spt:80
2 DROP icmp -- 192.168.0.105 0.0.0.0/0 icmp type 8
查看已经看到OUTPUT中出现了第二条规则
[root@station19 ~]# ping 192.168.0.106
(看到本机ping其他主机已ping不通了)
PING 192.168.0.106 (192.168.0.106) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
[root@station6 ~]# ping 192.168.0.105
(但是其它客户机仍能ping通192.168.0.105如下)
PING 192.168.0.105 (192.168.0.105) 56(84) bytes of data.
64 bytes from 192.168.0.105: icmp_seq=1 ttl=64 time=1.80 ms
c64 bytes from 192.168.0.105: icmp_seq=2 ttl=64 time=0.444 ms
如果这时我们也不想让其它客户机ping通192.168.0.105该怎么办呢?思考一下:
[root@station19 ~]# iptables -t filter -A INPUT -d 192.168.0.105 -p icmp --icmp-type 8 -j DROP
[root@station19 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere server5.example.com tcp dpt:http
DROP icmp -- anywhere server5.example.com icmp echo-request
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- server5.example.com anywhere tcp spt:http
DROP icmp -- server5.example.com anywhere icmp echo-request
[root@station6 ~]# ping 192.168.0.105
(看到其它客户机也不能ping了)
PING 192.168.0.105 (192.168.0.105) 56(84) bytes of data
--- 192.168.0.105 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2855ms
特别注意“--icmp-type 8”永远是发起ping的,“--icmp-type 0”是回应ping的,“--icmp-type 3”表示目标不可达。
[root@station19 ~]# iptables �CF
(用来清空所有规则)
[root@station19 ~]# iptables �CL
(看到已经全部清空了)
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