iptables防火墙
2019-12-26 本文已影响0人
linux_豪哥
1.iptables防火墙介绍
Iptables其实不是真正的防火墙,只是一个工具。
我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架的名字叫netfilter
Netfilter框架存在于linux内核中实现数据包过滤、连接跟踪、地址转换等,来实现网络的安全。
Netfilter也是网络层的一个模块,可以在网络层的前后设置勾子函数,一旦有数据包流经勾子函数就会被拦截,每一个勾子函数都对应一个链,然后去比对表里的规则看是否通过或者更改。而这些表里的规则就是由iptables这个命令来配置的。
2.iptables防火墙四表五链
表的处理优先级:raw>mangle>nat>filter.
• filter表——过滤数据包
• Nat表——用于网络地址转换(IP、端口)
• Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
• Raw表——决定数据包是否被状态跟踪机制处理
image.png
3.iptables表和链的位置
进路由(PREROUTING)、进系统(INPUT) 、转发(FORWARD)、出系统(OUTPUT)、出路由(POSTROUTING)
3.1 双网卡
image.png image.png3.2 单网卡
image.png4.介绍iptables命令
4.1 结构
iptables -t 表 命令 链 规则 -j 动作
table 可以是 filter nat mangle 默认是 filter
4.2 常用命令
-P或 --policy 定义默认策略
-L或 --list 查看iptables规则列表
-A或 --append 在规则列表的最后增加1条规则
-I或 --insert 在指定的位置插入1条规则
-D或 --delete 从规则列表中删除1条规则
-R 或 --replace 替换规则列表中的某条规则
-F 或 --flush 删除表中所有规则
4.3 iptables数据包匹配选项
-i 或 --in-interface 指定数据包从哪个网络接口进入,如ppp0、eth0、eth1等。
-o 或 --out-interface 指定数据包从哪个网络接口出去,如ppp0、eth0、eth1等。
-p 或 --protocol 协议类型 指定数据包匹配的协议,如TCP、UDP、ICMP等
-s 或 --source 指定数据包匹配的源地址
-d 或 --destination 指定数据包匹配的目标地址
--sport 指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个端口号的范围
--dport 目标端口号,指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个端口号的范围
例子
拒接ICMP协议数据包
[root@sdh ~]# iptables -t filter -I INPUT -p icmp -j DROP
拒绝从eth1网卡进入ICMP协议数据包
[root@sdh ~]# iptables -t filter -I INPUT -p icmp -i eth1 -j DROP
4.4 扩展匹配选项
匹配选项中,还需要加-m引用模块的显示扩展
4.4.1状态类型
参数 -m state
基于状态检测的包过滤,指定检测那种状态
--state {NEW, ESTABLISHED, INVALID, RELATED}
说明 用来比对连接状态,连接状态共有四种:NEW, ESTABLISHED, INVALID, RELATED
INVALID 表示该封包的连接编号(Session ID)无法辨认或编号不正确
ESTABLISHED 表示该封包属于某个已经建立的连接
NEW 表示该封包想要起始一个连接(重设连接或将连接重导向)
RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA连接必定是源自某个FTP连接
范例 iptables –A INPUT -m state --state RELATED,ESTABLISHED
拒绝其他主机的新连接
[root@sdh ~]# iptables -t filter -I INPUT -p tcp -m state --state NEW -j DROP
4.4.2 ICMP类型
参数-m icmp --icmp-type
ping 命令使用icmp协议测试网络是否畅通
icmp有两种常用的数据包icmp-type,常用的类型为echo-reply和echo-request.
PC1 ping PC2,发出去的数据包是icmp协议的echo-request类型的数据包,PC2返回来的数据包是icmp协议的echo-reply类型的数据包。
例子
不允许其他主机ping本地(ping其他主机可以)
[root@sdh ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
icmp 数据包的类型也可以使用数字表示
类型8:echo-request
类型0:echo-reply
举例
[root@sdh ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j DROP
4.4.3 指定多端口号
参数 -m multiport
指定多端口号(只用--dport无法指定多个端口)
-m multiport
--sports 源端口
--dports 目标端口
--ports
示例
拒绝192.168.80.0/24访问192.168.10.0/24 的1-1024,3389端口
[root@sdh ~]# iptables -t filter -I INPUT -p tcp -s 192.168.80.0/24 -d 192.168.10.0/24 -m multiport --dports 1:1024,3389 -j DROP
拒绝访问本机的22端口(SSH没改端口情况下尽量不要用)
[root@sdh ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
4.4.4 指定IP段
参数 -m iprange
指定IP段
--src-range ip-ip
--dst-range ip-ip
示例
禁止192.168.80.1-100地址段访问
[root@sdh ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.80.1-192.168.80.100 -j DROP
4.4.5 连接限定
-m connlimit
--connlimit-above 限定最大连接个数
示例
限制每个ip的连接数为3
[root@sdh ~]# iptables -t filter -I INPUT -p tcp -m connlimit --connlimit-above 3 -j REJECT
4.4.6 限速
-m limit --limit
一个数据包默认设置最大1500字节
范例 iptables –A INPUT –m limit --limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对;每小时平均流量是否超过一次3个数据包(一小时3个数据包)
除了每小时平均一次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后:/second、/minute、/day
例子
限制每秒对本机发送数据包不能超过300个。300*1500=450 000=450k
[root@sdh ~]# iptables -t filter -I INPUT -p tcp -m limit --limit 300/s -j ACCEPT
[root@sdh ~]# iptables -t filter -A INPUT -p tcp -j DROP
4.4.7 瞬间流量控制
参数 --limit-burst
范例 iptables –A INPUT –m limit --limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。(通俗点讲 前5个包可以直接通过不限速,但前5个包通过之后如果有限速设置就要按限速的速率来传送数据包)
例子
只允许其他主机ping本机4个包
[root@sdh ~]# iptables -t filter -I INPUT -p icmp -m limit --limit-burst 4 -j ACCEPT
[root@sdh ~]# iptables -t filter -A INPUT -p icmp -j DROP
image.png
4.4.8 源mac地址限制
参数 –m mac --mac-source
说明 用来比对封包来源接口的硬件地址,这个参数不能用在OUTPUT和POSTROUTING规则链上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过ARP通讯协议查出目的地的MAC地址,所以iptables在进行封包比对时,并不知道封包会送到哪个网络接口去。
示例
拒绝某个计算机的MAC能够访问VMNet8这个网段
[root@sdh ~]# iptables -t filter -I FORWARD -d 192.168.80.0/24 -m mac --mac-source 00-0C-29-DB-32-6F -j DROP
4.5 处理动作
-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK。
filter 表能使用的主要动作
ACCEPT:将封包放行,进行此处理动作后,将不再匹配其他规则,直接跳往下一个规则链。
REJECT:拦阻该封包 ,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply或者是tcp-reset(这个封包会要求对方关闭连接),进行完成处理动作后,将不再匹配其他规则,直接中断过滤程序。
DROP:丢弃封包不予处理,进行完成处理动作后,将不再匹配其他规则,直接中断过滤程序。
LOG:将封包相关讯息记录在/var/log/messages中,详细位置请查阅/etc/rsyslog.conf配置文件,进行完成处理动作后,将会继续匹配其规则。可以去/etc/rsyslog.conf中更改记录文件,记得重启日志服务
4.5.1 REJECT
示例:
与DROP不同DROP是什么动静都没有,REJECT会回复给原主机 目标不可达
[root@sdh ~]# iptable -t filter -I INPUT -p icmp -j REJECT
4.5.2 LOG
只对数据包进行记录,不对数据包进行拒绝或者限制的作用,所以数据包的通过与不通过要看接下来的规则链,所以尽量把LOG动作的规则链放到开头。
示例:
给基于ICMP的封包进行LOG记录
[root@sdh ~]# iptables -t filter -I INPUT -p icmp -j LOG --log-prefix "iptables-icmp"
--log-prefix 给记录的信息加上一个标记
然后查看/var/log/messages里面会有封包的信息
5 保存还原防火墙设置
iptables防火墙重启会加载配置文件,
所以如果我们当前的规则没有保存到配置文件,就会清空。
iptables配置文件 /etc/sysconfig/iptables
将当前配置保存到配置文件 service iptables save
将当前配置规则追加到一个文件 iptables-save > iptables.conf1
还原iptables-save命令所备份的规则配置 iptables-restore < iptables.config1
6 介绍Iptables防火墙配置文件
iptables服务的配置文件是/etc/sysconfig/iptbales-config
vim /etc/sysconfig/iptables-config
# Load additional iptables modules (nat helpers)
# Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
# are loaded after the firewall rules are applied. Options for the helpers are
# stored in /etc/modprobe.conf.
IPTABLES_MODULES=""
# Unload modules on restart and stop
# Value: yes|no, default: yes
# This option has to be 'yes' to get to a sane state for a firewall
# restart or stop. Only set to 'no' if there are problems unloading netfilter
# modules.
IPTABLES_MODULES_UNLOAD="yes"
# Save current firewall rules on stop.
# Value: yes|no, default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped
# (e.g. on system shutdown).
IPTABLES_SAVE_ON_STOP="no"
# Save current firewall rules on restart.
# Value: yes|no, default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets
# restarted.
IPTABLES_SAVE_ON_RESTART="no"
# Save (and restore) rule and chain counter.
# Value: yes|no, default: no
# Save counters for rules and chains to /etc/sysconfig/iptables if
# 'service iptables save' is called or on stop or restart if SAVE_ON_STOP or
# SAVE_ON_RESTART is enabled.
IPTABLES_SAVE_COUNTER="no"
# Numeric status output
# Value: yes|no, default: yes
# Print IP addresses and port numbers in numeric format in the status output.
IPTABLES_STATUS_NUMERIC="yes"
# Verbose status output
# Value: yes|no, default: yes
# Print info about the number of packets and bytes plus the "input-" and
# "outputdevice" in the status output.
IPTABLES_STATUS_VERBOSE="no"
# Status output with numbered lines
# Value: yes|no, default: yes
# Print a counter/number for every rule in the status output.
IPTABLES_STATUS_LINENUMBERS="yes"
6.1 解释配置文件
IPTABLES_MODULES = “ip_conntrack_netbios_ns”
在防火墙被激活时,指定一组独立的空间额外加载iptables模块,系统启动,加载防火墙模块,会打印:加载其他iptables模块:ip_conntrack_netbios_ns [确定]
IPTABLES_MODULES_UNLOAD = “是”
在重新启动和停止的iptables模块时,是否卸载此模块。
IPTABLES_SAVE_ON_STOP = “不”
当防火墙停止时,保存当前防火墙规则到iptables文件,no :(默认值)不保存当前的规则到iptables文件。
IPTABLES_SAVE_ON_RESTART = “不”
当防火墙重启时:service iptables restart,保存当前防火墙规则到iptables文件,no :(默认值)不保存当前的规则到iptables文件。
IPTABLES_SAVE_COUNTER = “不”
保存并恢复所有链和规则中的数据包和字节计数器,是:保存计数器的值,没有:(默认值)不保存计数器值。
IPTABLES_STATUS_NUMERIC = “是”
输出的IP地址是数字的格式,而不是域名和主机名的形式,是:(默认值)在状态输出中只包括IP地址,没有:在状态输出中返回域名或主机名。
IPTABLES_STATUS_VERBOSE = “不”
输出iptables的状态时,是否包含输入输出设备,是:包含,不:(默认值)不包含。
IPTABLES_STATUS_LINENUMBERS = “是”
输出iptables的状态时,是否同时输出每条规则的匹配数,是:(默认值)输出,NO:不输出
查看iptables状态时 -v显示更多设置 -n以数字形式显示IP和端口
[root@sdh ~]# iptables -L -vn
7 保护服务器安全
7.1 常规网络安全设置
示例
Web服务器对Internet开放TCP 80端口
SSH端口只允许指定的网段访问
默认拒绝所有进入的流量
安装web服务(httpd或者nginx)
设置防火墙规则
[root@sdh ~]# iptables -t filter -P INPUT DROP
[root@sdh ~]# iptables –F
[root@sdh ~]# iptables -t filter -I INPUT -p -tcp --dport 80 -j ACCEPT
[root@sdh ~]# iptables -t filter -I INPUT -p -tcp --dport 22-s 192.168.10.123/32 -j ACCEPT
7.2 recent模块实现服务器网络安全
recent这个模块很有趣,善加利用可充分保证您服务器的安全
设定常用参数
--name 设定列表名称,默认DEFAULT
--rsource 源地址,此为默认
--rdest 目标地址
--seconds 指定时间内
--hitcount 命中次数
--set 将地址添加进列表,并更新信息,包含地址加入的时间戳
--rcheck 检查地址是否在列表,以第一个匹配开始计算时间
--update 和rcheck类似,以最后一个匹配计算时间
--remove 在列表里删除相应地址,后跟列表名称及地址,如果来源端数据已存在,则将其删除,若不存在,则不做任何处理;
示例1
SSH连接60秒内只允许连接2次
#用来设置多长时间 几次 拒绝
[root@sdh ~]# iptables -t filter -A INPUT -p tcp --dport 52113 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 60 --hitcount 2 -j DROP
#连接计数
[root@sdh ~]# iptables -t filter -A INPUT -p tcp --dport 52113 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
#如果把链的默认改成了DROP,所以要加上一条建立了会话的数据包 就允许进入
[root@sdh ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
示例2
限制TCP 80端口60秒内每个IP只能发起10个新连接,超过记录日记及丢失数据包,可防CC及伪造IP的syn洪水
[root@sdh ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix "DDOS"
[root@sdh ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
[root@sdh ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
#如果把链的默认改成了DROP,所以要加上一条建立了会话的数据包 就允许进入
[root@sdh ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
8 设置打开端口的钥匙
#记录日志,前缀SSHOPEN (-m length --length 指定数据包大小 )
[root@sdh ~]# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -j LOG --log-prefix "SSHOPEN"
#指定数据包1078 字节(包含IP头部20字节,ICMP头部8字节),将ping请求的包大小为1078字节的数据包的源地址记录到sshopen表
[root@sdh ~]# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 1078 -m recent --set --name sshopen --rsource -j ACCEPT
#检查sshopen表中60秒内的记录如果有源地址则允许访问TCP 的22端口
[root@sdh ~]# iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 60 --name sshopen --rsource -j ACCEPT
#发送ping包指定数据包1178个字节,将客户端地址从sshopen表中移除,客户端将不能使用tcp的22端口建立连接
[root@sdh ~]# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 1178 -m recent --remove --name sshopen -j ACCEPT
#已建立连接允许进入
[root@sdh ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
#记住将INPUT链默认改成DROP
[root@sdh ~]# iptables -P INPUT DROP
最终 会实现什么样情况呢
直接去连接我们的主机是连不上了
我们需要ping一下主机并且要指定数据包为1050(因为IP占20个字节,ICMP占8个字节)
这样我们在60秒内去连就可以连上主机
那如果我们想断开呢
根据我们上面的设置ping一下1150
image.png
这样我们就连不上啦
Linux下解锁
ping -s 1050 47.94.108.119
windows下解锁
ping -l 1050 47.94.108.119
9.保护子网的安全
9.1 访问内网的主机端口
适用于双网卡的主机,用来对子网ip的保护
把子网主机具体需要打开的端口打开
ptables -P FORWARD DROP
iptables -t filter -I FORWARD -p tcp -dport 3389 -d 192.168.10.110/32 -o eth2 -j ACCPET
现在能够向目标主机发送请求,但是目标主机无法回应。还要再加一条已建立会话允许通过。
iptables -t filter -I FORWARD -m state --state ESTABLISHED -j ACCEPT
9.2 配置NAT实现网络地址转换
image.png做地址的转换 让内部ip可以通过一个公网ip去上网
9.3 端口映射
将公网的ip端口映射到内网ip的端口
如果内网存在多主机打开同一个端口,就要在公网ip上设置其他的端口去映射
[root@sdh ~]# iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp --dport 3389 -j DNAT --to-destination 192.168.10.110:3389
[root@sdh ~]# iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp --dport 4000 -j DNAT --to-destination 192.168.10.222:3389
那如果是映射到web主机上的话,就映射80端口就可以啦
10.mangle表的应用案例
TTL 生存时间值 每经过一个路由就减1 windows默认是128 linux默认是64
如果不设置TTL的话,当输入一个不存在的ip,路由之间就会不断的来回发包,占用带宽。
当TTL为0是就会停止继续发包
tracert 可以跟踪一个地址看经过多少个路由,原理就是利用TTL。所以我们要利用mangle表来迷惑那些跟踪我们地址的人。