iptables [-t TABLE] COMMAND CHAIN(链) Rule(匹配条件和规则) -j TARGET
-t TABLE
nat,mangle,raw,filter,默认为filter
COMMAND
-F:flush,清空规则链
# iptables -t nat -F ==>清空nat表上所有链上的规则
-Z:计数器归零
-P:policy,设定默认策略对filter表来说,默认规则为ACCEPT或DROP
# iptables -t mangle -P FORWARD DROP ==>设置mangle表的FORWARD链默认策略为DROP
-N:new 自定链,只能被主链调用
# iptables -N httpd ==>在filter表中定义一条名为httpd的自定义链
-E:rename,重命名自定义连
# iptables -E httpd http ==>修改filter表中的自定义链httpd的名字为http
-X:delete删除一条自定义的空链,但需0引用
链中的规则:
-A:Append,添加规则(添加到规则的最后一条)
-I:Insert,插入一条新规则(默认插入到规则的第一条)
-D:Delete,删除规则
-R:Replace,替换规则
# iptables -D INPUT 2
查询:
-L:list
-n:以数字格式显示主机地址和服务,IP和端口不反解
-v:详细格式-vv,-vvv
--line-number:显示规则编号
-x:exactly,不要对计数器的计数结果做单位换算,而显示其精确数值
# iptables -L -nvx ==>查询filter表的规则
匹配条件:
通用匹配
-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网段(格式为172.16.0.0/16或172.16.0.0/255.255.0.0);可使用!取反;
--src, --source
-d 地址:指定报文目标IP地址匹配的范围;
--dst, --destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;
-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD
-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING
扩展匹配:调用netfilter额外模块实现特殊检查机制,(使用到相关功能,使用iptables -m 哪个模块)
隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
-p tcp [-m tcp]
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目标端口
--tcp-flags:要检查标志位列表(用逗号分隔) 必须为1的标志位列表(逗号分隔)
例如:--tcp-filgs syn,ack,rst,fin syn ==> 等于--syn
all none ==>全0
all all ==>全1
-p udp [-m udp]
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0:echo-reply,ping响应
8:echo-request,ping请求
在filter表中INPUT和OUTPUT链默认策略为DROP,允许往外ping,外面主机不能ping本地主机
# iptables -I OUTPUT -p icmp --icmp-type 8 -j ACCEPT
# iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
放开环回口的流量,就可以ping 127.0.0.1了
# iptables -I INPUT -i lo -j ACCEPT
# iptables -I OUTPUT -o lo -j ACCEPT
显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;
模块:iptables,netfilter各拥有一部分代码
(1)mutiport:多端口匹配,可用于匹配非连续或连续端口;最多指定15个端口
--source-ports,--sprots port[,port,port]
--destination-ports,--dports
--ports
在filter表中的INPUT和OUTPUT链放行22端口和80端口:
# iptables -I INPUT -d 172.16.2.1 -p tcp -m multiport --dports 22,80 -j ACCEPT
# iptables -I OUTPUT -s 172.16.2.1 -p tcp -m multiport --sports 22,80 -j ACCEPT
(2)iprange: 匹配指定范围内的地址;
匹配一段连续的地址而非整个网络时有用;
专用选项:
[!] --src-range IP[-IP]
[!] --dst-range
在filter表的INPUT和OUTPUT中允许172.16.2.1-172.16.2.100的地址范围访问本地的23端口
# iptables -A INPUT -d 172.16.2.1 -p tcp --dport 23 -m iprange --src-range 172.16.2.1-172.16.2.100 -j ACCEPT
# iptables -A OUTPUT -s 172.16.2.1 -p tcp --sport 23 -m iprange --dst-range 172.16.2.1-172.16.2.100 -j ACCEPT
(3)string: 字符串匹配,能够检测报文应用层中的字符串
字符匹配检查高效算法
kmp, bm
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;
在filter表中的OUTPUT链中有admin字符的就丢弃数据包
# iptables -I OUTPUT -m string --algo kmp --string "admin" -j DROP
(4)time: 基于时间做访问控制
专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day] Mon, Tue,Thu,Fri
在filter表的INPUT链上定义周二到周日的10:00-18:00拒绝到本机80端口的流量
# iptables -I INPUT -d 172.16.2.1 -p tcp --dport 80 -m time --timestart 10:00 --timestop 18:00 ! --weekdays Mon -j REJECT
(5)connlimit: 连接数限制,对每IP所能够发起并发连接数做限制
专用选项:
[!] --connlimit-above [n]:有n个连接
# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
(6)limit: 速率限制
专用选项:
--limit n[/second|/minute|/hour|/day] ==>按照固定的速率发通行证
--limit-burst n ==>空闲时用的令牌桶,如在空闲时一次发放n个令牌
限制ping包的数量,每分钟20个,空闲时一次响应5个,于实测有点差别
# iptables -R INPUT 1 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT ==>修改filter表INPUT链中的第一条规则,允许ping请求
# iptables -R OUTPUT 1 -p icmp --icmp-type 0 -j ACCEPT
(7)state: 状态检查,连接追踪,不管tcp或udp,并发请求很大不能启用
专用选项:
--state
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接(数据包触发ESTABLISHED状态的条件是Netfilter连接跟踪子系统在一个连接的两个方向上都己看到了数据包(如在一个数据己经经过交换的TCP连接中的确认数据包))
RELATED 有:关联关系的连接
INVALID:无法识别的连接(一个突然到达的TCP FIN数据包(即它不属于任何TCP会话)就将匹配INVALID状
/proc/sys/net/nf_conntrack_max ==>调整连接追踪功能所能容纳的连接的最大数据
/proc/net/nf_conntrack ==>当前追踪的所有连接
/proc/sys/net/netfilter目录 ==>不同协议或连接类型追踪时的属性
放行被动模式的ft
/lib/modules/2.6.32-504.el6.x86_64/kernel/net/netfilter/nf_conntrack ==>查看是否有这个模块
# rpm -ql iptables | less
# modprobe nf_conntrack_ftp ==>临时有效
# vim /etc/sysconfig/iptables-config ==>修改IPTABLES_MODULES="nf_conntrack_ftp"永久有效
# lsmod | less
# iptables -A INPUT -d 172.16.2.1 -p tcp --dport 21 -m state --state RELATED -j ACCEPT
# iptables -R OUTPUT 1 -s 172.16.2.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
NAT:Network Address Translation
# vim /etc/sysctl.confg ==>net.ipv4.ip_forward改为1开启IP转发
# sysctl -p ==>立即生效
初衷为了安全隐藏真实的IP地址,后来为了节约IP的一个方案
SNAT:POSTROUTING,OUTPUT
--to-source SIP ==>转换成哪个源地址,适用于固定IP
MASQUERADE ==>自动会挑一个合适的,用于动态拨号
# iptables -t nat -R POSTROUTING 1 -s 192.168.1.0/24 -p tcp --dport 80 -j SNAT --to-source 172.16.2.2 ==>C3访问C1时,源地址变为172.16.2.2;SNAT应用于Clinet->Server
DNAT:PREROUTING
--to-destination
# iptables -t nat -A PREROUTING -s 172.16.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.5 ==>访问C2的web服务时转发到C3上,DNAT应用于Clinet->Server
PNAT:端口地址转换
FULL NAT:全地址转换