先说说数据包表头的基本组成:
请求首部/[响应首部] --- 源端口/目标端口 --- 源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 -Z
creteria --> 匹配条件
基本匹配:
-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"