一,概念
1,容器:包含或者说属于的关系
2,Netfilter/iptables是表的容器,iptables包含的各个表:filter(如不指定参数,默认为filter) / NAT / MANGLE / RAW(少用)
3,ptables的表又是链的容器
链:INPUT / OUTPUT / FORWARD / PREROUTING / POSTROUTING
4,链是规则的容器
5,规则:一条条过滤的语句
二,iptables表(tables)和链(chains)的对应关系
表(tables) | 链(chains) | ||||
INPUT | FORWARD | OUTPUT | PREROUTING | POSTROUTING | |
FILTER | YES | YES | YES | NO | NO |
NAT | NO | NO | YES | YES | YES |
MANGLE | YES | YES | YES | YES | YES |
三,filter表
强调:主要和主机自身有关,真正负责主机防火墙功能(过滤流入流出主机的数据包),filter表是iptables默认使用的表。企业工作场景:主机防火墙。
定义了三个链(Chains),强调:对于filter表的控制是我们实现本机防火墙功能的重要手段,特别是对INPUT链的控制:
INPUT:负责过滤所有目标地址是本机地址的数据包。通俗的讲,就是过滤进入主机的数据包。
FORWARD:负责转发经主机的数据包。起转发的作用,和NAT关系很大;LVS NAT模式;net.ipv4.ip_forward=0
OUTPUT:处理所有源地址是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包。
四,NAT表:
负责网络地址转换,即来源与目的IP地址和port的转换。应用:和主机本身无关,应用:局域网共享上网 或 特殊的端口转换服务(端口映射,访问外网IP指定端口就能访问内网某IP指定的端口)
NAT 功能一般企业工作场景:
1)用于做企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)
2)做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING)
3)web单个端口的映射,nat功能相当于网络的acl控制。和网络交换机acl类似
OUTPUT:和主机发出去的数据包有关。改变主机发出去数据包的目标地址。
PREROUTING:在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等;例如:把公网IP:124.42.60.113映射到局域网的10.0.0.19服务器上,如果是web服务,可以把80转为局域网的服务器上9000端口;
POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址、源端口等,例如:我们现在的笔记本和虚拟机都是10.0.0.0/24,就是出网的时候被我们企业路由器把源地址改成了公网地址了。生产应用:局域网共享上网
五,mangle:略~
六,iptables的工作流程
iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则来进行匹配,来决定是否可以进入主机。
数据包的流向是从左向右的(如果匹配DROP或Accept后,则不再往下走了;反之,往下一条规则进行判断):
小结:
1、防火墙是层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的
2、如果匹配上规则,则明确表明是阻止还是通过,数据包就不再往下匹配新的规则了
3、如果规则中没有明确表明是阻止还是通过,则就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过
4、防火墙默认规则是对应链的所有的规则执行完才会执行的
七,iptables表和链工作的流程图
八,参数命令讲解
1,防火墙开启
/etc/init.d/iptables start
防火墙状态
/etc/init.d/iptables status
iptables -L -n
lsmod | egrep "nat|filter|ipt" #查看内核是否载入nat , filter , ipt模块
#内核载入模块
modprobe ip_tables
modprobe iptables_filter
modprobe iptables_nat
modprobe ip_conntrack
modprobe ip_conntrack_fpt
modprobe ip_nat_ftp
modprobe ipt_state
2,清除规则
-F :清楚所有规则,不会处理默认的规则
-X :删除用户自定义的链(不讲)
-Z :链的计数器清零
3,禁止规则
#禁止ssh端口
(1)找出当前机器SSH端口
netstat -lntup | grep ssh
(2)禁止当前SSH端口,这里是22
语法:
iptables -t [table] -[AD] chain rule-specification [options]
具体命令:
iptables -A INPUT -p tcp --dport 22 -j DROP # -A 附加到最后 ; -I 放到最前; -D 清除
iptables -t fileter -A INPUT -p tcp --dport 22 -j DROP # -A 附加到最后 ; -I 放到最前; -D 清除
注意:
a、iptables默认用的就是filter表,因此上面2条命令等价
b、其中的INPUT DROP 要大写
c、 --jump -j target
target for rule (may load target extension)
基本的处理行为:ACCEPT(接受) 、 DROP(丢弃) 、 REJECT(拒绝)
比较:DROP好于REJECT
d、命令行执行的规则,仅仅在内存里临时生效
(3) iptables -L -n --line-numbers # 显示规则的行号,方便后面快捷删除规则,例如: iptables -D INPUT 1
4,禁止源地址
禁止10.0.0.0网段连入
iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP # 禁止10.0.0.0/24 网段 通过eth0 入口,链接到本机 # -i 进入的接口
iptables -A INPUT -i eth0 -s 10.0.0.7 -j DROP # 禁止10.0.0.7 通过eth0 入口,链接到本机
iptables -A INPUT -i eth0 ! -s 10.0.0.7 -j DROP # 除10.0.0.7可以链接到本机外,禁止 其他IP 通过eth0 入口,链接到本机
5,禁PING
iptables -I INPUT -p icmp --icmp-type 8 -i eth0 -j DROP
6,封端口范围
iptables -A INPUT -p tcp --sport 22:80
iptables -I INPUT -p tcp -m multiport ---dprot 31,22,23,24 -j DROP
7,匹配网络状态
-m state --state
NEW:已经或将启动新的链接
ESTABLISHED:已建立的链接
RELATED:正在启动新链接
INVALID:非法或无法识别的
FTP服务是特殊的,需要配状态链接
#允许关联的状态包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
8,包的速率进行控制
-m limit --limit
九,生产环境实战 主机防火墙,总原则:默认不能进
1,清除旧的规则
iptables -F # 删除所有规则
iptables -X # 删除自定义链
iptables -Z # 计数器清零
2,让自己人能通过
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT
3,允许本机回环接口进和出
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
4,设置默认的防火墙禁止和允许的规则(重要,配置后需要重启iptables,就像电影院,默认不允许随便进,但允许出)
设置默认DROP掉FORWARD,INPUT链,允许OUTPUT链
iptables --policy INPUT DROP # -P 等价于 --policy
iptables -P OUTPUT ACCEPT
iptables --policy FORWARD DROP
5,允许IDC LAN / WAN和办公网IP的访问,及对外合作机构的合法的进入:
iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT
iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT
iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT
6,允许业务服务端口对外访问(允许http服务无条件通过)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
7,允许PING主机(如果不允许就不执行)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#如果对内开,对外不开
iptables -A INPUT -p icmp -s 192.168.11.0/24 -m icmp --icmp-type any -j ACCEPT
8,允许关联的状态包通过(WEB服务不要使用FTP服务)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
9,扫描开发的端口
nmap IP地址 -p 1-65535
10,自定义链处理syn攻击
iptables -N syn-flood
iptables -A INPUT -i eth0 -syn -j syn-flood
iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN
iptables -A syn-flood -j REJECT
十,保存规则到文件,永久有效
/etc/init.d/iptables save # 保存规则到 /etc/sysconfig/iptables,在此文件中进行规则修改调整等(不用命令行,命令行重启防火墙将失效)
十一,从192.168.18.20的16888端口,通过18.20的NAT 转发到另外一台机10.221.162.26的6891端口:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 16888 -j DNAT --to-destination 10.221.162.26:6891
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 10.221.162.26 -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.18.20