Linux--iptables基础篇
前一阵子,服务器搞网络安全,这对于小白来说真的是恶心坏了,没办法只能恶补iptables知识,坚决不做睁眼瞎,整理之后发现真的是博大精深,python也不能停,暂时整理出基础篇!深入篇会持续整理。。。
1 iptables基础篇
1.1 iptables基础
- 规则(rules):网络管理员预定义的条件。
- 链(chains): 是数据包传播的路径。
- 表(tables):内置3个表filter表,nat表,mangle表分别用于实现包过滤网络地址转换和包重构的功能。
- filter表是系统默认的,INPUT表(内核流入用户空间的数据包),FORWORD(从发用户空间流出的数据包,转发管卡),OUTPUT(进入/离开本机的外网接口),filter表只能对包进行授受和丢弃的操作。
- nat表(网络地址转换),PREROUTING(修改即将到来的数据包),OUTPUT(修改在路由之前本地生成的数据包),POSTROUTING(修改即将出去的数据包)。
- mangle表,修改报文原数据,PREROUTING,OUTPUT,FORWORD,POSTROUTING,INPUT。
1.2 顺序读取规则
iptables是按照顺序读取规则,所以后续优化会涉及到。
1.3 命令格式
iptables [-t 表名] <-A|I|D|R> 链名 [规则编号] [-i|o 网卡名称] [-p 协议类型] [-s 源ip|源子网] [–sport 源端口号] [-d 目的IP|目标子网] [–dport 目标端口号] [-j 动作]
若不指定表名,默认使用filter表
所有的链名必须大写,表名必须小写,动作必须大写,中间的条件匹配必须小写
1.3.1 参数:
-A 增加 -I 插入 -D 删除 -R 替换
1.3.2 动作选项
ACCEPT 接收数据包
DROP 丢弃数据包
REDIRECT 将数据包重新转向到本机或另一台主机的某一个端口,通常功能实现透明代理或对外开放内网的某些服务
SNAT 源地址转换
DNAT 目的地址转换
MASQUERADE IP伪装
LOG 日志功能
1.4 帮助及环境准备
[root@FRONTDB ~]# iptables –h
[root@FRONTDB ~]# man iptables
iptables -L -n 查看当前规则
iptables -F #清空所有的防火墙规则
iptables -X #删除用户自定义的空链
iptables -Z #清空计数
2 简单应用
[root@FRONTDB ~]# netstat -lntup| grep ssh
tcp 0 0 :::22 :::* LISTEN 2737/ssh
[root@FRONTDB ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 2737 root 3u IPv6 9183 TCP *:ssh (LISTEN)
sshd 17199 root 3u IPv6 521111 TCP FRONTDB:ssh->192.168.0.201:n2nremote (ESTABLISHED)
sshd 17201 oracle 3u IPv6 521111 TCP FRONTDB:ssh->192.168.0.201:n2nremote (ESTABLISHED)
[root@FRONTDB ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
2.1 尝试禁止用户访问1521端口
[root@FRONTDB ~]# lsof -i :1521
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
tnslsnr 2660 oracle 8u IPv4 8998 TCP FRONTDB:ncube-lm (LISTEN)
2.2 删除规则
[root@FRONTDB ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
[root@FRONTDB ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@FRONTDB ~]# iptables -t filter -D INPUT 1
[root@FRONTDB ~]# iptables -L –n
2.3 -A和-I的区别
-I insert会把规则添加到第一行 ,一般用于禁止IP,匹配到禁止IP后后面的规则不再匹配
-A append会把规则添加到最后一行
[root@FRONTDB ~]# iptables -t filter -A INPUT -p tcp --dport 81 -j DROP
[root@FRONTDB ~]# iptables -t filter -A INPUT -p tcp --dport 82 -j DROP
[root@FRONTDB ~]# iptables -t filter -A INPUT -p tcp --dport 83 -j DROP
[root@FRONTDB ~]# iptables -t filter -I INPUT -p tcp --dport 84 -j DROP
[root@FRONTDB ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:84
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:82
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:83
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@FRONTDB ~]# iptables -t filter -I INPUT 2 -p tcp --dport 85 -j DROP
[root@FRONTDB ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:84
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:85
3 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:81
4 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:82
5 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:83
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
2.4 禁止192.168.0.20访问
[root@FRONTDB ~]# iptables -t filter -A INPUT -i eth0 -s 192.168.0.20/32 -j DROP
也可以禁止网段访问
2.5 禁止非自己的访问
[root@FRONTDB ~]# iptables -t filter -A INPUT -i eth0 ! -s 192.168.0.21/32 -j DROP
此时CRT掉了,20也ping不同,只能去本机上iptables –F了。。。
2.6 禁端口范围
[root@FRONTDB ~]# iptables -I INPUT -p tcp --dport 20:23 -j DROP
此时CRT又连不上。。。
[root@FRONTDB ~]# iptables -I INPUT -p tcp -m multiport --dport 121,22,123,204 -j DROP
此时-m multiport必须写,否则报错
2.7 匹配icmp类型
[root@FRONTDB ~]# iptables -t filter -I INPUT -p icmp --icmp-type 8 -i eth0 -s 192.168.0.20/32 -j DROP (也是禁ping)
等价于:
[root@FRONTDB ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type any -j DROP
2.8 匹配网络状态
NEW;已经或者将启动新的连接
ESTABLISHED:已经建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别
FTP服务是特殊的,需要匹配连接状态
允许关联的状态包通过(web服务不要使用ftp服务)
[root@FRONTDB ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@FRONTDB ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-m limit
本机21,允许20网络ping本机,但限制每分钟请求不能超过20,每次并发不能超过3个
[root@FRONTDB ~]# iptables -A INPUT -s 192.168.0.20/32 -d 192.168.0.21/32 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT