先说说数据包表头的基本组成:
请求首部/[响应首部] --- 源端口/目标端口 --- 源IP/目标IP --- 源MAC/目标MAC
iptables 是利用封包过滤的机制, 他会分析封包的表头数据。根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃.
iptables 里面有多个表格 (table) ,每个表格都定义出自己的默认政策与规则,且每个表格的用途都不相同。
Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。另外我们还可以自定义额外的链
filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table !
INPUT:主要与想要进入我们 Linux 本机的封包有关; OUTPUT:主要与我们 Linux 本机所要送出的封包有关; FORWARD: 他可以『转递封包』到后端的计算机中,与 nat table 相关性较高。nat (地址转换):这个表格主要在进行来源与目的 IP 或 port 的转换,主要于Linux 主机后的局域网络内计算机较有相关。
PREROUTING:在进行路由判断之前所要进行的规则(DNAT --> 目标地址转换)。 POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)--> 源地址转换 OUTPUT:与发送出去的封包有关mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关,把数据包首部拆开,修改修改再包装 主要包含 PREOUTING, INPUT,OUTPUT,FORWARD,POSTROUTING,较少使用。
raw : 主要包含PREOUTING , OUTPUT
优先级: 高--> 低 raw-->mangle-->net -->filter分类:
包过滤开型防火墙 --> 效率高,根据tcp首部或ip首部数据进行判断 (1)简单包过滤 tcp,ip (2)带状态检测的包过滤 NEW 新连接 只有SYN=1 ESTABLISHED 数据传送 INVALID 非法的状态 RELATED 数据连接和命令连接相关连的数据传输 应用层网关防火墙 --> 效率低,主要根据数据包传输的实际数据进行判断命令用法及相关参数:
# iptable [-t TABLE] COMMAND CHAIN [creteria] -j ACTION ^ ^ ^ ^ ^ 表 命令 链 匹配条件 动作-t [raw|mangle|nat|filter] ,默认filter
链大写,表小写 -j : 跳转COMMAND:
规则管理类: -A --> append (添加) # iptables -A INPUT -s 192.168.0.2/24 -d 172.16.45.1 -j ACCEPT -I # --> insert (插入) # iptables -I OUTPUT 2 -d 172.16.45.1 -p tcp --dport 80 -j ACCERT -D # --> delet (删除) # iptables -D INPUT 3 -R # --> 替换(编辑) # iptables -R OUTPUT -p tcp --dport 80 -j DROP 链接管理类: -F --> flush(清空链) # iptables -F -N --> new,(新建链)通过跳转实现 # iptables -N clear_in -X --> delete(只能删除自定义的空链) -E --> rename(重命名)默认策略:
-P --> policy # iptables -P OUTPUT DROP 计数器: -Z --> zero(清空计数器) 每条规则(包括默认策略)都有两个计数器; 被此规则匹配到的所有数据包的个数 被此规则匹配到的数据包的大小 查看类: -L --> list -n --> numeric 不进行 IP 与 HOSTNAME 的反查 -v --> verbose(详细信息) -vv -vvv # iptables -L -n -vv -x --> exactly(精确值) --line-numbers (行号)清除本机防火墙 (filter) 的所有规则,但不会清除默认策略
# iptables -F # iptables -X # iptables -Zcreteria --> 匹配条件
基本匹配: -s --> SOURCE: IP, NETWORK -d --> (目标地址) -p --> 协议{tcp|udp|icmp} -i INTEFACE -->数据从哪个接口进来 只能用于INPUT ,FORWARD ,PREROUTING # iptables -A INPUT -i lo -j ACCEPT -o OUTFACE -->流出接口 只能用于 OUPUT ,FORWARD , POSTROUTING扩展匹配:(调用iptables 的模块,以便扩展iptables的匹配功能 -m)
-m 隐含扩展: --> -m可省略 -p tcp --sport PORT --> 20:80 表示20到80端口 --dport PORT # iptables -A INPUT -p tcp --dport 22 -j ACCEPT --tcp-flags ACK,SYN,RST,FIN SYN,ACK 第一个列表是要检查的标志位 ,出现在第二个列表中的标志位要为1,没出现的要为0 --tcp-flags 等同于 --syn 默认为SYN ,ACK,RST,FIN SYN # iptables -A INPUT ! --syn -p tcp -m state NEW -j DROP -p udp --sport PORT --dport PORT -p icmp --icmp-type -->主要用于ping命令 8: echo-request --> ping 请求 # iptables -A INPUT -p icmp -d 255.255.255.255 -j DROP 0: echo-reply --> ping 响应 显式扩展 -->必须要指定-m -m state --> 状态检测 --state NEW,[NEW,ESTABLISHE,INVAI,RELATED] # iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT -m multiport -->多端口合并 --source-ports [!] port[,port[,port:port...]]--destination-ports [!] port[,port[,port:port...]]
--ports [!] port[,port[,port:port...]]
eg: # iptables -R INPUT 2 -d 192.168.0.2 -p tcp -m state --state NEW -m multiport --destination-ports 22,53,80 -j ACCEPT -m iprange --> 指定ip范围 [!]--src-range ip-ip[!]--dst-range ip-ip
eg:# iptables -A INPUT -m iprange --src-range 172.16.100.190-172.16.100.210 -d 172.16.45.1 -p --dport 23 -m state --state NEW -j ACCEPT
-m -connlimit 限定来自同一ip的最大连接数 [!] --connlimit-above n--connlimit-mask bits
# iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT --> 超过2个就拒绝,否则就使用默认规则(ACEEPT)# iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT -->不超过2个就接受,否则就使用默认规则(DROP)
# limit the nr of parallel http requests to 16 per class C sized network (24 bit netmask)
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT -m limit -->限定匹配到的数据包的个数 --limit rate --> # eg: 3/hour 5/minite --limit-burst number 峰值速率(并非使用所有空的令牌) eg: # iptables -A INPUT -d 172.16.45.1 -p tcp --dport 80 -m state --state NEW -m limit --limit 1/second --limit-burst 3 -j ACCEPT 对web服务限制 每秒发起的新请求为1个,最多可以同时发起3个, 可以把keepAlive关闭测试效果 # iptables -A FORWARD -d 192.168.100.2 -p icmp --icmp-type 8 -m limit --limit 3/second --limit-burst 3 -m state --state NEW -j ACCEPT -m string --algo bm|kmp (bm=Boyer-Moore,kmp=Knuth-Pratt-m -->编码方式) --string "STRING" 指定页面中包含“string” # iptables -A OUTPUT -d 172.16.45.1 -p tcp --dport 80 -m string --algo bm --string "magedu" -j REJECT -m time --timestart value ----timestop value --days listofdays
-j 处理法则
ACCEPT --> 接受 DROP --> 拒绝(悄悄丢弃,不响应) REJECT --> 拒绝(此路不通--踩两脚,再吐两口) 过滤非正常的请求: # ipatbles -A INPUT ! --syn -p tcp -m state --state NEW -j DROP # iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # iptables -A INPUT -p icmp -d 255.255.255.255 -j DROP # iptables -A IPNUT -p icmp -d 192.168.0.255 -j DROP地址转换
-j SNAT --to-source 192.168.100.1 用于外网地址是固定的ip # iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.100.1 -j MASQUERADE (地址伪装) 主要用于ADSL连接方式上网的方式,比SNAT会消耗更多的资源 -j DNAT --to-destination 192.168.100.2[:PORT] # iptables -t nat -A PRETROUTING -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2 # iptables -t nat -A PRETROUTING -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:8080 -j LOG 日志记录 --log-prefix "DNAT for web:" -->/var/log/messages # iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -j LOG --log-prefix "DNAT for web" # iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -j DROP # iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --dport 80 -m limit --limit 3/minite --limit-burst 3 -j LOG --log-prefix "DNAT For Web"