Iptables基本语法格式:
Iptables[-t table] command chain [critiria] –j action;
1. 1. -t 指定表名,表名就是功能名,iptables共有四种功能:raw、mangle、nat、filter。默认是filter
2. command:对链中规则进行管理:
-A:append,追加一条规则
-I:insert,插入一天规则,一般跟参数n,n代表插入到第几条
-R:replace,替换,-R CRITIRIA(CRITIRIA要替换的那条规则)
-D:delete,删除,-D CRITIRIA(CRITIRIA要删除的那条规则)
Command:对链进行管理:
-N:new,新建一条自定义链
-X:删除一条自定义链
-E:重命名一条自定义链
-F:flash,清空一条自定义链,如果不指定链,则清空整个表中的所有链
-P:policy,设定链的默认策略
-Z:zero,置零,每条规则都有两个计数器,一个是被本规则匹配到的所有数据包的个数,另一个是被本规则匹配到的所有数据包的大小之和
Command:查看规则:
-L:list,查看
-v:查看详细
-x:显示规则计数器的精确值
-n:显示数字地址而不是名称地址
在redhat上iptables被做成了一个服务器脚本。
查看该脚本:
Iptables虽然是服务脚本,但不是服务,iptables只是让自己写的一批规则同时生效。Iptables-config是/etc/rc.d/init.d/下的iptables脚本的额外配置文件,该配置文件的位置如下:
Iptables的规则保存位置如下:
/etc/sysconfig/iptables
使用iptables起的规则,一旦关机了,再启动,规则就没了,因为规则本身并不在内核中。因此自己写的规则一定要保存下来,保存在iptables-config中。
保存规则的方法:$serviceiptables (status|start|stop|save)
查看防火墙状态:
[root@redhat4 ~]# service iptables status
防火墙已停
要iptables必须找到/etc/sysconfig/iptables这个文件,如果没有该文件,就自己touch一个出来。
启动iptables:
[root@redhat4 ~]# touch /etc/sysconfig/iptables #新建一个iptables规则文件
[root@redhat4 ~]# service iptables start
应用 iptables 防火墙规则: [ 确定 ]
查看链:
[root@redhat4 ~]# iptables -L -n
Chain INPUT (policy ACCEPT) #policy是默认策略的意思
target prot optsource destination #
Chain FORWARD (policy ACCEPT)
target prot optsource destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
匹配条件:
1. 通用匹配:核心功能。
-s:指定源地址
-d:指定目标地址
-p:指定协议(icmp、TCP、UDP)
-i:in_interface,指定数据包的流入接口(网卡)
-o:out_interface,指定数据包出去的接口(网卡)
2. 扩展匹配:
2.1 隐式扩展
-p TCP(指定端口协议为TCP)
--sportPORT[-PORT2](指定一片源端口)
--dportPORT[-PORT2](指定一片目标端口)
--tcp-flags:检查TCP标志位,共六个:URG、ACK、SYN、PSH、RST、FIN(ALL,表示所有标志位;NONE,表示没有标志位)
-p udp(指定端口协议为UDP)
--sportPORT[-PORT2](指定一片源端口)
--dportPORT[-PORT2](指定一片目标端口)
-p icmp
--icmp-type:ping请求的报文type是8,ping响应的报文标志是0
2.2 显式扩展
Netfilter扩展模块引入的扩展,用于扩展匹配条件,通常需要指定专用选项来定义。显示扩展的模块放在/lib/iptables目录下。
2.3 处理方法
-j ACCEPT
DROP
REJECT
REDIRECT
DNAT
SNAT
MASQUERADE #地址伪装
LOG #记录日志
RETURN #如果是自定义链,当数据包到达主链时,主链调用自定义链,对数据包进行检查,如果数据包通过了自定义链的检查,则RETURN,从自定义链回到主链。
例1:
设置来自172.16.0.0/16的ping请求都无效
[root@redhat4 ~]# iptables -t filter -A INPUT-s 172.16.0.0/16 -p icmp --icmp-type 8 -j DROP
#-t:filter指定要设置filter功能
#-A:INPUT 指定把规则挂在INPUT链上
#-s :指定源IP
#-p:指定协议为icmp
#--icmp-type 8:指定icmp协议中type为8的数据包
#-j DROP:设置数据包为DROP,也就是无法通过
查看规则:
[root@redhat4 ~]# iptables -t filter -L –n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 172.16.0.0/16 0.0.0.0/0 icmp type 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
查看规则编号:
[root@redhat4 ~]# iptables -t filter -L -n--line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP icmp -- 172.16.0.0/16 0.0.0.0/0 icmp type 8
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
删除该规则:
[root@redhat4 ~]# iptables -t filter -D INPUT1
#1:要删除的规则编号
#-D INPUT:规则所在的链,以及对该链的操作
#-t filter:规则所在的表(功能)
例2:
除了172.16.0.0/16以外的主机不能访问172.16.100.1主机的80端口,也即不能使用172.16.100.1主机的web服务。
[root@redhat4 ~]# iptables -A INPUT -s !172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 80 -j DROP
#! 172.16.100.1:除了172.16.100.1以外的IP
#-d:目标主机的IP
#-p:采用的协议
#--dport:指定端口号
[root@redhat4 ~]# iptables -t filter -F INPUT
#强制删除filter表的INPUT链上的所有规则
例3:
设置任何主机都能通过ssh访问172.16.100.1主机
[root@redhat4 ~]# iptables -t filter -A INPUT-s 0.0.0.0/0 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
#-s 0.0.0.0/0:任何主机
# -j ACCEPT:接受