开始配置规则之前,有必要提出三点建议:
1、规则的顺序很重要。比如一开始你就添加了一个阻止任何的规则,那么你下面的允许规则都不会起作用了。
2、你要记住编写的规则是存储在内存中,不会自动存储磁盘,因此你重启之后,规则就不会了,所以你需要手动执行初始化脚本来保存规则。
3、如果你是在远程来管理服务器,比如SSH,那么配置规则之前首先得添加允许ssh的规则,要不Iptables会把你阻止在外。
1、概念
iptables有2个表:filter和nat。前者用于过滤,后者是nat用的。
iptables还有4个链:INPUT、FORWARD、PREROUTING、POSTROUTING。
前两者对应于filter表,INPUT匹配目的IP是本机的数据包,FILTER匹配穿过本机的数据包。
PREROUTING位于NAT表,用于修改目的地址(DNAT);POSTROUTING用于修改源地址(SNAT)。
2、基本命令
命令的格式是:
iptables -t [表名] [操作命令] [操作的链名] [规则号码(可选)] [匹配条件(可选)] -j [匹配后的动作]
(1)操作命令
操作命令有:-A -I -D -R -P -F。
-A:追加到最后一条规则,如:iptables -t filter -A INPUT -j DROP。匹配所有本机数据包,丢弃。
-I:插入一条规则,如:iptables -t filter -A INPUT 3 -j DROP。在filter表中插入为第3条记录,作用同上。
-D:删除一条规则,如:iptables -D INPUT 3。在filter表中删除第3条规则。
-R:替换规则,用的不多,不学习了。
-P:设置某个链的默认动作,如:iptables -P INPUT DROP。如果没有匹配规则,则按此处理,丢弃所有包。
-F:清空规则,但仍保留默认规则!设置过-P后,一定小心使用-F!
-L:查询。
(2)匹配条件
-i <网络接口(入)>,如:-i eth0,匹配从eth0进来的所有数据。
-o <网络接口(出)>,如:-o eth0,匹配从eth0出去的所有数据。
-s <来源地址(主要为IP)>,如:-s 192.168.0.1,匹配来自192.168.0.1的数据包。
-d <目的地址(主要为IP)>,如:-d 192.168.0.2,匹配发往192.168.0.2的数据包。
-p <协议(tcp/udp/icmp)>,如:-p tcp;-p udp;-p icmp 8。最后一个8表示icmp类型即ping。
–sport <源端口>,如:–sport 1000,匹配源端口是1000的。
–dport <目的端口>,如:–dport 1000:3000,匹配目的端口是1000到3000的。
上述匹配条件可以组合使用,但是port必须配合p使用!
(3)处理动作
-j ACCEPT,允许数据包通过本链路(不再继续匹配)。
-j DROP,阻止通过本链(不再继续匹配)。
-j SNAT –to IP(IP池),源地址NAT转换,对应POSTROUTING链。如将内网192.168.0.0地址修改成1.1.1.1(地址 池):iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT 1.1.1.1(1.1.1.1-1.1.1.10地址池)
-j DNAT –to IP(IP池),目的地址NAT转换,对应PREROUTING链。类似SNAT,不再举例。
(4)附加模块
-m state,匹配状态,NEW(区别于TCP)、ESTABLISTHED(已连接)、RELEASED、INVALID(无法识别)。
-m mac –macsource MACADDRESS,匹配MAC地址。iptables -A FORWARD -m –mac-source xx:xx:xx:xx:xx:xx -j DROP。
-m limmit,用一定速率匹配,-m limit –limit 50/s,只是匹配,非限制。
-m multiport,匹配多个端口
3、简单的服务器防护
#!/bin/bash
#clean
/sbin/iptables -F
#allow lo
/sbin/iptables -A INPUT -i lo -j ACCEPT
#allow already connected
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#allow all output
/sbin/iptables -A OUTPUT -j ACCEPT
#white list ip
/sbin/iptables -A INPUT -s xx.xx.xx.xx -j ACCEPT
#ping/http/https/ssh
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#default drop
/sbin/iptables -A INPUT -j REJECT
/sbin/iptables -A FORWARD -j REJECT
屏蔽IP
#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
/sbin/iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
/sbin/iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
/sbin/iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
/sbin/iptables -I INPUT -s 123.45.6.0/24 -j DROP
查看、删除已经添加的规则
#查看
/sbin/iptables -L -n
#删除
#格