包过滤防火墙工作在TCP/IP的网络层
一,iptables有4张表filter,nat,mangle,raw表,每个表下面有不同规则链
- filter表: 包含[INPUT,FORWARD,OUTPUT]链
- nat表: 包含[PREROUTING,POSTROUTING,OUTPUT]链
- mangle['mæŋg(ə)l]曼格表: 包含[PREROUTEING,POSTROUTING,INPUT,OUTPUT,FORWARD]链
- raw[rɔː]表: 包含[PREROUTING,OUTPUT]链
二,默认有 5种链
- INPUT:处理入站数据包
- OUTPUT:处理出站数据包
- FORWARD:处理转发数据包
- PREROUTING:在进行路由选择前处理数据包
- POSTROUTING:在进行选择前处理数据包
- SNAT和DNAT是iptables中使用NAT规则相关的的两个重要概念.如上图所示,如果内网主机访问外网而经过路由时,源IP会发生改变,这种变更行为就是SNAT;反之当外网的数据经过路由发往内网主机时,数据包中的目的IP(路由器上的公网IP)将修改为内网IP,这种变更行为就是DNAT.与 SNAT和DNAT所对应的两个链分别是POSTROUTING和PREROUTING.
规则表顺序 raw-mangle-nat-filter
- 入站->prerouting-input
- 转发->prerouting-forward-postrouting
- 出站->output-postrouting
三,iptables基本语法
- 1,iptables 【-t 指定表名】 命令选项 【链名】 【条件匹配】 【-j目标动作和跳】
ACCEPT 允许
REJECT 拒绝
DROP 丢弃
-A 指定链名末尾添加一条规则
-D 删除指定链中某一条规则,按序号或内容(例如-D 链名 序号)删除
-R 修改,替换,按序号或内容(例如-R 链名 序号)
-L 列出链
-N 新建用户自定义规则链
-F 清空链
-X 删除自定义规则链
-Z 将表中数据包计数器和流量计数器归零
-P 设置指定链的默认策略
-n 以数字显示
-v 查看规则详细列表
-V 查看iptables版本
-h 查看帮助
四,管理iptables规则
- 1,在filter表的INPUT链中的末尾添加一条防火墙规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
iptables -L INPUT --line-numbers #查看序号
iptables -R INPUT -p icmp -j DROP #所有icmp更改为丢弃
iptables -R INPUT 2 -s 192.168.0.0/16 -j ACCEPT
iptables -R INPUT 6 -s 202.104.136.212 -p tcp --dport 19725 -j ACCEPT
- 3,插入规则(不加-t选项,默认是-t filter表)
I #大写的i (默认插在第一条)
iptaless -I INPUT -p tcp -j ACCEPT
iptables -I INPUT 6 -s 202.104.136.212 -p all -j ACCEPT #第6条位置
# 插入规则和添加规则的区别:
插入规则是加在策略的最前面,添加规则是加在策略的最后面.
iptables -A INPUT -p all -j ACCEPT
iptables -t filter -A INPUT -s 192.168.0.0/16 -p all -j ACCEPT
#只允许指定ip连接指定端口、访问指定网站,默认插在第一条
iptables -I INPUT 6 -p tcp --dport 80 -j DROP
iptables -I INPUT 6 -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT 6 -s 211.123.16.123/32 -p tcp --dport 80 -j ACCEPT
iptables -L INPUT --line-numbers
iptables -vnL --line-number
iptables -vnL -t nat # -t 指定表
iptables -F #flush 清除所有的已定规则
iptables -X #delete 删除所有用户“自定义”的链(tables)
iptables -Z #zero 将所有的chain的计数与流量统计都归零
iptables -Z -t nat;iptables -F -t nat;iptables -X -t nat;iptables -Z;iptables -F; iptables -X
iptables -D INPUT 2 #删除链中的第二条规则
iptables -F #默认是清空filter中的规则
iptables -t mangle -F #清空指定链中的规则
iptables -t filter -P FORWARD DROP
iptables -P INPUT ACCEPT
iptables -p icmp -h
iptables -t filter -h
iptables -A FORWARD -h
iptables -t raw -N TCP_PACKES #新增自定义链
iptables -t raw -L #查看新增的自定义链
iptables -t raw -X #删除所有自定义链
#注意:添加自定义链同时也要添加相应的跳转策略 如:iptale -I INPUT ....... -j 自定义链名
iptables -t filter -N TCP_PACKES
iptables -A FORWARD -s 192.168.0.0/16 -j TCP_PACKES
iptables -A FORWARD -d 192.168.0.0/16 -j TCP_PACKES
iptables -A TCP_PACKES -p icmp -j DROP
五,通用条件匹配
协议匹配(允许使用的协议名包含在/etc/protocl文件中)
iptables -I INPUT -p icmp -j REJECT
- 2,除了icmp包转发的所有数据包 (!感叹号的意思)
iptables -A FORWARD -p ! icmp -j ACCEPT
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.2.0/24 -j ACCEPT
- 4,丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
iptables -A INPUT -i eth1 -s 17.16.0.0/16 -j DROP
iptables -A INPUT -s 10.20.30.0/24 -j DROP
iptables -A FORWARD -s 10.20.30.0/24 -j DROP
#首先查看规则序号
iptables -vnL -t INPUT --line-numbers
iptables -vnL -t FORWARD --line-numbers
iptables -vnL -t nat --line-numbers
#新建任务计划2小时后删除封堵规则
at now +2 hours
at>iptables -D INPUT 1
at>iptables -D FORWARD 1
at> #ctrl+d组合键结束
六,隐含条件匹配
端口匹配(--sport源端口,--dport目标端口)
- 1,仅允许202.13.0.0/16网段的地址使用22端口登录系统
iptables -A INPUT -s 202.13.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 2,允许本机开放从TCP端口20~1024提供的应用服务
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A INPUT -p tcp --sport 20:1024 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/16 -p tcp --sport 53 -j ACCEPT
用于检查数据包的TCP标记位--tcp-flags,需要以"-p tcp"匹配为前提.在iptables命令中使用"--tcp-flags检查范围")
作用:过滤试图打开新的链接
拒绝从外网接口(eth1直接访问防火墙的本机数据包,但是允许响应防火墙TCP请求的数据包进入.)
iptables -P INPUT DROP
iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
iptables -I INPUT -i eth1 -p tcp -p tcp --tcp-flags ! --syn -j ACCEPT
--syn的用法为兼容iptables的形式,此处等同于--tcp-flags SYN,RST,ACK SYN
七,ICMP类型匹配
- 1,禁止其它主机ping防火墙主机,但是允许从防火墙上ping其它主机(允许接收ICMP回应数据包)
# 请求
iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP #Echo-Request代码为8
#回显
iptables -A INPUT -p icmp --icmp-type Echo-Replay -j ACCEPT #Echo-Replay代码为0)
#不可达
iptables -A INPUT -p icmp --icmp-type destination-unreadchable -j ACCEPT #destination-unreadchable代码为3
八,显示(Explicit)条件匹配
'''
lsmod | grep xt_* 查看防火墙模块
1,MAC地址匹配(--mac-source MAC)
禁止转发来自MAC地址为00:0c:29:27:55:3f的主机数据包。
'''
iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3f -j DROP
#允许防火墙本机对外开放TCP端口20,21,25,110以用被动模式的FTP端口1250~1280
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT #调用多端口关键字-m multiport
--src-range IP 源地址范围
--dst-range IP 目标地址范围
#禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
'''
检查数据包连接状态(state),常见的数据状态包括
NEW(与任何连接无关的),
ESTABLISHED(响应请求或者已建立的连接)
RELATED(与连接有相关性的,如ftp数据连接)
禁止转发与正常连接无关的非--syn请求数据包(如网络中可能存在的一些非法攻击数据包)
'''
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
#拒绝访问防火墙的新数据包,但允许响应连接与有连接相关的数据包。
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state ESTABLISHED -j ACCEPT
#在服务器中设置防火墙策略,只开放本的WEB服务(80端口),FTP服务(20,21,20450-20480),放行外部主机发往服务器的其它端口的应答数据包,将其它入站数据包均丢弃处理。
iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20450-20180 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
九,数据包控制
#对于尝试登录防火墙主机的访问数据,记录日志信息,并禁止其访问.
iptables -I INPUT -p tcp --dport 22 -j DROP
iptables -I INPUT -p tcp --dport 22 -j LOG
#将记录日志的频率限制为平均三次/分钟,允许的峰值为8次.
iptables -R INPUT 1 -p tcp --dport 22 -m limit 3/minute --limit-burst 8 -j LOG
十,导出和导入防火墙规则
iptables-save > /etc/sysconfig/iptables #导入防火墙规则
services iptables restart
chkconfig --level 35 iptables on
iptables-retore < /etc/sysconfig/iptables #从已保存的文件(导入)恢复防火墙规则
十一,加载模块
depmod -a #检查所有模块依赖关系
modprode ip_tables #等加载模块
#路由转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
十二,SNAT设置(共享上网,让所有内网地址都通过公网IP进行上网,SNAT修改源地址)
#vim /etc/sysctl.conf
net.ip4.ip_forward = 1
sysctl -p 开启路由转发
- 2,为局域网访问Internet数据包采用SNAT策略,将源地址更改为服务器的公网IP(公网ip固定IP)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
- 3,设置MASQUERADE策略,使192.168.1.0/24网段能够通过网关的PPP0连接共享上网(公网为动态地址)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.0.156 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE
十三,DNAT设置
- 1,开户路由转发
- 2,在网关上添加DNAT映射,对于访问网关80端口的数据包,将目标地址更改为网站服务器的内网地址。
iptables -t nat -A PREROUTING -i eth0 -d 3.3.3.3 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
# 访问3000端口转发到公网111.111.111.111:19275
-A PREROUTING -p tcp -m tcp --dport 30000 -j DNAT --to-destination 111.111.111.111:19725
-A POSTROUTING -p tcp -m tcp --dport 19725 -j SNAT --to-source 2.2.2.2
十五,映射
#此条规则将请求IP为10.0.0.1的数据包转发到后端172.16.93.1主机上
iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT --to-destination 172.16.93.1
#此条规则将请求IP为10.0.0.1并且端口为80的数据包转发到后端的172.16.93.1主机上,通过定义不同的端口,就可以实现PNAT,将同一个IP不同的端口请求转发到后端不同的主机
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 172.16.93.1
#此条规则在上条规则的基础上,发往后端的数据包的目标端口改为8080,在后端主机的web服务器上使用8080端口接收访问, 这样能更好的保护后端主机.
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 172.16.93.1:8080
#配置环境为A实例和B实例,A实例的公网地址为[$Public_IP1],内网地址为[$IP1],B实例公网地址为[$Public_IP2],内网地址为[$IP2],且2个实例都属于同一个VPC网络。将A实例的30001端口请求转发到B实例的80端口。
#执行以下命令,入方向流量通过A实例的内网地址转发到B实例,30001是没有被使用的端口.
#说明:如果是经典网络,可以使用公网IP(如百度14.215.177.38)转发。
iptables -t nat -A PREROUTING -p tcp -d 192.168.10 --dport 30001 -j DNAT --to 14.215.177.38:80
#执行以下命令,在出方向将报文中源IP修改为A实例的IP。
iptables -t nat -A POSTROUTING -d 14.215.177.38 -j SNAT --to-source 192.168.1.10
#以上iptables规则配置完成后,还需要开启A实例的ip_forward功能。
#临时配置
echo 1 > /proc/sys/net/ipv4/ip_forward
#永久配置
'''
编辑/etc/sysctl.conf文件,将net.ipv4.ip_forward的值修改为1,保存并退出,然后执行sysctl -p命令使配置生效。
'''
#端口映射规则
-A PREROUTING -i eth2 -p tcp -m tcp --dport 8080 -j DNAT --to 192.168.1.250:8080
-A PREROUTING -i eth2 -p udp -m udp --dport 8080 -j DNAT --to 192.168.1.250:8080
-A PREROUTING -i eth2 -p tcp -m tcp --dport 8081 -j DNAT --to 192.168.1.250:8081
-A PREROUTING -i eth2 -p udp -m udp --dport 8081 -j DNAT --to 192.168.1.250:8081
-A PREROUTING -i eth2 -p tcp -m tcp --dport 8083 -j DNAT --to 192.168.1.250:8083
例子
#内网主机: A eth0: 192.168.2.209
#外网主机: B eth0: 192.168.2.208 外网地址:47.101.128.169
iptables -t nat -I POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source 192.168.2.208
iptables -t nat -I POSTROUTING -p udp -s 192.168.1.0/24 --dport 2225 -j SNAT --to-source 192.168.2.208
iptables -t nat -I POSTROUTING -p udp -s 192.168.1.0/24 --dport 35000:36000 -j SNAT --to-source 192.168.2.20
- ubuntu server 默认没有关闭和开启iptables的
#操作前一定要先允许自己访问.
http://blog.csdn.net/qazcxh/article/details/46315025
https://yq.aliyun.com/articles/44619
#按INPUT,OUTPUT,FORWARD三个类查看访问规则 :
iptables -S #可以查看这些rules是如何建立的
iptables -t nat -S
iptables -P INPUT ACCEPT/DROP
iptables -P OUTPUT ACCEPT/DROP
iptables -P FORWARD ACCEPT/DROP
'''
#默认配置
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:syn-flood - [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.60.0/24 -j ACCEPT
#访问允许本机DNS出去
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A INPUT -j DROP
COMMIT
'''
#保存文件
iptables-restore < /etc/iptables.rules
iptables-restore > /etc/iptables.rules