iptables
iptables
Firewall:防火墙,隔离工具:工作 于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应处理
主机防火墙
网络防火墙
功能:
filter:过滤,防火墙:
nat:network address translation,网络地址转换;
mang1e:拆解报文,做出修改,封装报文;
raw:关闭nat表上启用的连接追踪机制:
链(内置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
流入:PREROUTING-->INPUT
流出:OUTPUT-->POSTROUTING
转发:PREROUTING-->FORWARD-->POSTROUTING
各功能的分别实现
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING(DNAT),OUTPUT,POSTROUTING(SNAT)
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw:PREROUTING,OUTPUT
路由发生的时刻
报文进入本机后
判断目标主机
报文发出之前:
判断由哪个接口送往下一跳
iptables:四表五链
添加规则时的考量点:
(1)要实现哪种功能:判断添加在哪张表上:
(2)报文流经的路径:判断添加在哪个链上:
链:链上规则的次序,即为检查的次序:因此隐含一定的法则
(1)同类规则(访问同一应用),匹配范围小的放上面:
(2)不同类规则(访问不同应用),匹配到报文频率较大的放上面;
(3)将那些可由一条规则描述的多个规则合并为一个:
(4)设置默认策略:
功能的优先级次序:raw >> managle >> nat >> filter
规则
组成部分:报文的匹配条件,匹配到之后处理动作
匹配条件:根据协议报文特征指定
基本匹配条件
扩展匹配条件
处理动作
内建处理机制
自定义处理机制
注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;
iptables:规则管理工具
添加、修改、删除、显示等;
规则和链有计数器:
pkgs:由规则或链所匹配到的报文的个数;
bytes:由规则或链匹配到的所有报文大小之和;
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET
iptables 表名 子命令 指定子命令在哪链上 匹配规则进的标准 -j 一但匹配作什么处理
-t table
filter nat mangle raw
链管理
-F flush 清空规则链 若省略链,表示清空指定表上的所有
-N new 创建新的自定义规则链,不能重名
-X drop 删除用户自定义的空的规则链
-Z zero 清零,重置规则计数器
-P policy 为指定链设置默认策略,对filter表中的链而言,默认策略通常有ACCEPT,DROP REJECT
-E rename 重命名自定义链,引用计数不为0的自定义链,无法改名,也无法删除
规则管理
-A append 将新规则追加于指定链的尾部
-I insert 将新规则插入至指定链的指定位置
-D delete 删除指定链上的指定的规则
有两种指定方式
1、指定匹配条件
2、指定规则编号
-R replace 替换指定链上的指定规则
查看
-L list 列出指定链上的所有规则
-n numberic 以数字格式显示地址和端口号
-v verbose 显示详细信息
-vv -vvv
--line-numbers 显示规则编号
-x: exactly 显示计数器结果的结果精确值,不进行单位换算
匹配条件
基本匹配
[!] -s --src --source ip|NETADDR 加!可取反 检查报文中源IP地址是否符合此处指定的地址范围
[!] -d --dst --destination ip|NETADDR 加!可取反 检查报文中目标IP地址是否符合此处指定的地址范围
-p --protocol {tcp|udp|icmp} 检查报文中的协议,即ip首部中的protocols所标识的协议
-i --in-interface IFACE 数据报文的流入接口,仅能用于PREROUTING,INPUT及FORWARD链上
-o --out-interface IFACE 数据报文的流出接口 仅能用于FORWARD,OUTPUT及POSTROUTING链上
扩展匹配 -m macth_name --spec_options
-m tcp --dport 22
隐式扩展 对 -p protocol指明的协议进行的扩展,可省略-m选项
-p tcp
--dport PORT[-PORT] 目标端口,可以是单个端口或连接多个端口
--sport PORT[-PORT]
iptables -I INPUT -d 192.168.200.102 -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT -s 192.168.200.102 -p tcp --sport 22 -j ACCEPT
--tcp-fags LIST1 LIST2 检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0:没有LIST1中指明的,不作检查
SYN ACK FIN RST PSH URG
--tcp-flags SYN,ACK,FIN,RST SYN
--syn
-p udp
--dport
--sport
-p icmp
--icmp-type
可用数字表示其类型
0 echo-reply 响应ping
8 echo-request 请求ping
让自己ping别人
iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.200.102 -p icmp --icmp-type 0 -j ACCEPT
让别人ping自己
iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -d 192.168.200.102 -p icmp --icmp-type 8 -j ACCEPT
显式扩展 必须使用-m选项指定使用的扩展
目标
-j TARGET jump至指定的TARGET
ACCEPT 接收
DROP 丢弃
REJECT 拒绝
RETURN 返回调用链
REDIRECT 端口重定向
LOG 记录日志
MARK 做防火墙标记
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址伪装
...
自定义链 由自定义链上的规则进行匹配检查
iptables -t filter -A INPUT -d 192.168.200.102 -p tcp -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.200.102 -p tcp -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t filter -A INPUT -d 192.168.200.102 -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.200.102 -p icmp -j ACCEPT
iptables -nL --line-number
iptables -D INPUT 2
iptables -L -n --line-numbers
iptables -A INPUT -d 192.168.200.102 -i ens32 -j ACCEPT
iptables -A OUTPUT -s 192.168.200.102 -o ens32 -j ACCEPT
rpm -ql iptables |grep '[[:lower:]]+.so$'
Centos 6 man iptables
Centos 7 man iptables-extensions
1、multiport扩展 多端口匹配
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]... 指明多个源端口
[!] --destination-ports,--dports port[,port|,port:port]... 指明多个离散的目标端口
[!] --ports port[,port|,port:port]... 如果源端口或目标端口等于给定端口之一,则匹配
iptables -I INPUT -s 192.168.200.0/24 -d 192.168.200.102 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -d 192.168.200.0/24 -s 192.168.200.102 -p tcp -m multiport --sports 22,80 -j ACCEPT
2、iprange扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用
[!] --src-range from[-to] 指明连续的源IP地址范围
[!] --dst-range from[-to] 指明连续的目标IP地址范围
iptables -I INPUT -d 192.168.200.102 -p tcp -m multiport --dports 22,23,80 -m iprange --src-range 192.168.200.1-192.168.200.200 -j ACCEPT
iptables -I OUTPUT -s 192.168.200.102 -p tcp -m multiport --dports 22,23,80 -m iprange --src-range 192.168.200.1-192.168.200.200 -j ACCEPT
3、string扩展
检查报文中出现的字符串
--algo {bm|kmp}
bm = Boyer-Moore
kmp = Knuth-Pratt-Morris
iptables -I OUTPUT -m string --algo bm --string 'mp4' -j REJECT
4、time扩展
根据报文到达的时间与指定的时间范围进行匹配
--datestart
--datestop
--timestart
--timestop
--monthdays
--weekdays
iptables -I INPUT -d 192.168.200.102 -p tcp --dport 80 -m time --timestart 00:00 --timestop 23:59 -j REJECT
注意:时间是UTC
5、connlimit扩展 并发连接数量
根据每客户端IP(也可以是地址块)做并发连接数数量匹配:
-connlimit-above n:连接的数量大于n 默认策略是ACCEPT用这个
-connlimit-upto n: 连接的数量小于等于n 默认策略是DROP用这个
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
6、limit扩展
基于收发报文的速率做检查
令牌桶过滤器
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
iptables -A INPUT -d 192.168.200.102 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -j ACCEPT
7、state扩展
根据连接追踪机制检查连接的状态
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
已经追踪到并记录下的连接(连接模板)
cat /proc/net/nf_conntrack
可追踪的连接状态
NEW:新发出的的请求 连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态
RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系:
INVALIED:无法识别的连接,都不是NEW,ESTABLISHED,RELATED状态
iptables -I INPUT -d 192.168.200.102 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 192.168.200.102 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -m state --state ESTABSHED -j ACCEPT
iptables -A OUTPUT -s 192.168.200.102 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -d 192.168.200.102 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
问题:如何开放被动模式的FTP服务
1、装载FTP追踪时的专用的模块
/lib/modules/3.10.0-862.el7.x86_64/kernel/net/netfilter
modinfo nf_conntrack_ftp.ko.xz
手动装载模块
modprobe nf_conntrack_ftp
lsmod|grep ftp
2、放行请求报文
命令连接 NEW,ESTABLISHED
数据连接 RELATED,ESTABLISHED
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp -m state --state REALTED,ESTABLISHED -j ACCEPT
3、放行响应报文
ESTABLISHED
iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
如何保存重载规则
保存规则至指定文件
iptables-save > /PATH/TO/SOMEFILE
从指定文件重载规则
iptables-restore < /PATH/TO/SOMEFILE
Centos6
servier iptables save == iptables-save > /etc/sysconfig/iptables
servier iptables restart == iptables-restore < /etc/sysconfig/iptables
Centos7
引入了新的iptables前端管理服务工具 firewalld
firewalld-cmd
firewalld-config
若在centos7使用iptables,先禁用firewalld
systemctl disable firewalld.service
开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
net.ipv4.ip_forward
iptablse forward链写规则
iptables -A FORWARD -d 192.168.200.103 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.200.103 -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 192.168.200.103 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -R FORWARD 2 -d 192.168.200.103 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
nat:Network Address Translation 安全性,网络层+传输层
proxy:代理,应用层
nat
snat 只修改请求报文的源地址
dnat 只修改请求报文的目标地址
nat表
PREROUTING:DNAT
OUTPUT
POSTROUTING:SNAT
源地址转换
iptables -t nat -A POSTROUTING -s LocalNet ! -d LocalNet -j SNAT --to-source ExternalIP
iptables -t nat -A POSTROUTING -s LocalNet ! -d LocalNet -j MASQUERADE
iptables -t nat 路由后 -s client/24 ! -d client/24 -j SNAT --to-source 确定转发的网卡的IP地址
iptables -t nat -A 路由后 -s client/24 ! -d clients/24 -j MASQUERADE
webserver
ifconfig ens32 192.168.200.103/24 up
systemctl start httpd
tail -1 /var/log/httpd/access_log
#route add -net 192.168.1.0/24 gw 192.168.200.102
#route del -net 192.168.1.0/24
#tcpdump -i ens32 host 192.168.200.103收到报文回不去
snat
ifconfig ens32 192.168.200.102/24 up
ifconfig ens33 192.168.1.254/24 up
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 192.168.200.102
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
client
ifconfig ens32 192.168.1.2/24 up
route add default gw 192.168.1.254
curl http://192.168.200.103/
目标地址转换
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT -to-destination InterServerIP[:PORT]
iptables -t nat -A 路由前 -d VIP -p tcp|udp --dport -PORT -j DNAT -to-destination 内网IP[:PORT]
webserver
ifconfig ens32 192.168.1.2/24 up
tailf /var/log/httpd/access_log
dnat
ifconfig ens32 192.168.200.102/24 up
ifconfig ens33 192.168.1.254/24 up
iptables -t nat -A PREROUTING -d 192.168.200.102 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080
client
ifconfig ens32 192.168.200.103
curl http://192.168.200.102/
创建一个自定义链
iptables -N clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP 去掉广播PING
iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP 丢弃非法(伪装)的包
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 192.168.1.1 -j RETURN 返回主链继续匹配
iptables -A INPUT -d 192.168.1.1 -j clean_in 访问目标地址为192.168.1.1的指定一个规则链clean_in ,若没有匹配项,返回(跳出clean_in)继续匹配
iptables -A INPUT -i lo -j ACCEPT 从Lo进来允许
iptables -A OUTPUT -o lo -j ACCEPT 从Lo出去允许
iptabels -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP 用不到的服务禁掉
iptabels -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT 对ICMP做速率限制每秒不超过10个
利用iptables的RECENT模块来抵御DOS攻击:22建立一个列表,保存有所有访问过指定的服务的客户端的IP
iptables -I INPUT -p tcp --dport 22 -m conmlimit --conmlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach:"
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模块将单P的并发设置为3:会误杀使用NAT上网的用户,可以根据实际情况增大该值:
2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
1.第二句是记录访间tcp 22端口的新连接,记录名称为SHH
-set 记录数据位的来源IP,如乘IP已经存在将更新已盛存在的条日
2.第三句是抛5st记录中的[P,300s内发起超过3次连接则推绝此IP的
-update是指每次建立连接都更新列表:
·seconds必须与…rcheck成者update间时使用一hitcount必美与…rcheck或着-update同时使用
3.iptables的记录:/proc/net/xt.recent/SSH
也可以使用下面的这句记录日志
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"