已整理-iptables配置与应用案例
目录:
1、iptables介绍
2、iptables规则介绍
3、iptables企业应用案例
4、保存重载规则及CentOS 7如何开启iptables服务
5、iptables NAT功能
6、iptables扩展功能(recent/layer7/tcp_wrapper)
1、iptables介绍
作用:隔离, 工作于主机或网络的边缘, 对于进出本主机或网络的报文根据事先定义的检查规则做匹配检测;
对于能够被规则所匹配到的报文做出相应处理的组件;
主机防火墙和网络防火墙
iptables(规则管理工具,工作在用户空间程序) / netfilter(提供钩子hooks[5个钩子],工作在内核层)
iptables表功能:
1)、filter: 过滤, 防火墙;
2)、nat: 网络地址转换;
3)、mangle: 拆解报文,做出修改,封装报文;
4)、raw: 关闭nat表上启用的连接追踪机制, 前端负载均衡连接服务器上, 严禁启用连接追踪机制;
iptables链功能:
1)、PREROUTTING
2)、INPUT
3)、FORWARD
4)、OUTPUT
5)、POSTROUTTING
流入: PREROUTTING -> INPUT
流出: OUTPUT -> POSTROUTTING
转发: PREROUTTING -> FORWARD -> POSTROUTTING
各功能的分别实现:
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTTING(DNAT), OUTPUT, POSTROUTTING(SNAT)
mangle: PREROUTTING, INPUT, FORWARD, OUTPUT, POSTROUTTING
raw: PREROUTTING, OUTPUT
工作原理图:
路由发生的时刻:
报文进入本机后 -> 判断目标主机
报文发出之前 -> 判断经由哪个接口送往下一跳
iptables: 4表5链
添加规则时的考量点:
1)、要实现哪种功能: 判断添加在哪张表上;
2)、报文流经的路径: 判断添加在哪个链上;
链:链上规则的次序, 即为检查的次序: 因此隐含一定的法则
1)、同类规则,匹配范围小的放上面;
2)、不同类规则(访问不同应用), 匹配到报文频率较大的放上面;
3)、将那些可由一条规则描述的多个规则合并为1个;
4)、设置默认策略;
功能的优先级次序: raw -> mangle -> nat -> filter
2、iptables规则介绍
组成部份: 报文的匹配条件, 匹配到之后处理动作
匹配条件:根据协议报文特征指定
基本匹配条件
扩展匹配条件
处理动作:
内建处理机制
自定义处理机制
注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;
iptables: 是规则管理工具,实现:添加、修改、删除、显示等;
规则和链有计数器:
pkts: 由规则或链所匹配到的报文的个数;
bytes: 由规则或链匹配到的所有报文大小之和;
iptables命令:
Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET
-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, 删除指定链上的指定规则;有2种指定方式:1)、指定匹配条件;2)、指定规则编号;
-R: replace, 替换指定链上的指定规则;
查看:
-L:list,列出指定链上的所有规则;
-n: numberic,以数字格式显示地址和端口号;
-v: verbose, 显示说细信息:-vv
--line-number: 显示规则编号;
-x: exactly, 显示计数器结果的精确值;
匹配条件:
基本匹配:
[!] -s, --src, --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围
[!] -d, --dst, --destination IP|Netaddr: 检查报文中目标地址是否符合此此指定的地址范围
-p, --protocol {tcp|udp|icmp} 检查报文中的协议, 即IP首部中的protocols所标识的协议;
-i, --in-interface IFACE: 数据报言语的流入接口;仅能用于PREROUTING, INPUT及FORWARD链上;
-o, --out-interface IFACE: 数据报文的流出接口:仅能用于FORWARD,OUTPUT及POSTROUTTING链上;
扩展匹配: -m macth_name --spec_options, 例如:-m tcp --dport 22
隐式扩展: 对-p protocol 指明的协议进行的扩展, 可省略-m选项
-p tcp
--dport PORT[-PORT]: 目标端口, 可以是单个端口或连续多个端口;
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2 : 检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0,没有LIST1中指明的,不做检查;
SYN, ACK, FIN, RST, PSH, URG
--syn:
-p udp
--dport
--sport
-p icmp
--icmp-type, 可以用数字表示其类型, 0: echo-reply ; 8: echo-request;
显式扩展: 必须使用-m 选项指定使用的扩展(rpm -ql iptables |grep "\.so")
centos 6: man iptables
centos 7: man iptables-extensions
1)、multiport扩展: 以离散的方式定义多端口匹配,最多指定15个端口
[!] --source-ports, --sports port[,port|,port:port].... 指定多个源端端口
[!] --destination-ports, --sports port[,port|,port:port]....指定多个离散的目标端口
[!] --ports port[,ports|,port:port]....
2)、iprange扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用:
[!] --src-range from[-to]指明连续的源IP地址范围;
[!] --dst-range from[-to]指明连续的目的IP地址范围;
3)、string扩展
检查报文中出现的字符串:
--algo {bm|kmp} #指定算法
4)、time扩展
根据报文到达的时间与指定的时间范围进行匹配:
--datestart
--datestop
--timestart
--timestop
--monthdays
--weekdays
5)、connlimit扩展
根据每客户端IP(也可以是地址块)做并发连接数数量匹配;
--connlimit-above n 连接的数量大于n
--connlimit-upto n 连接的数量小于等于n
6)、limit扩展
基于收发报文的速率做检查:
令牌桶过滤器:
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
7)、state扩展
根据连接追踪机制,来检查连接间的状态:
调整连接追踪功能所能够容纳的最大连接数量:
cat /proc/sys/net/nf_conntrack_max #查看最大追踪连接数
cat /proc/net/nf_conntrack #已追踪到并记录到的连接
不同协议或连接类型追踪的时长:
/proc/sys/net/netfilter/
可追踪的状态有:
NEW: 新发出的请求,连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第1次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
RELATED:相关的连接,如FTP协议中的命令连接与数据连接之间的关系;
INVALIED: 无法识别的连接;
问题:
如何开放被动模式的ftp服务?
目标:
-j TARGET: jump 至指定的TARGET
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT: 端口重定向
LOG: 记录日志
MARK: 做防火墙标记
DNAT: 目标地址转换
SNAT: 源地址转换
MASQUERADE: 地址伪装
自定义链:由自定义链上的规则
重置iptables所有配置:
# iptables -F #清空所有链上面的规则
# iptables -X #清除所有自定义的空链
查看iptables表的配置规则:
# iptables -L -nv --line-number #查看所有表上面的规则, 默认是查看filter表
# iptables -t nat -L -nv --line-numbers #查看nat表上面的所有规则
修改iptables表链默认策略(在某个链上):
# iptables -t filter -P FORWARD DROP #修改filter表在FORWARD链上的默认策略为DROP, 默认为ACCEPT
创建新链并修改链名:
# iptables -t filter -N in_public #创建一个新的链
# iptables -t filter -E in_public out_public #修改链的名字
配置-允许-其它主机到本机22端口的访问请求(放行其它端口类似):
# iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #iptables设置state放通相关包和已经建立连接的包
# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.17.250 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A OUTPUT -s 10.10.17.250 -p tcp --sport 22 -j ACCEPT
# iptables -P INPUT DROP #INPUT默认策略由ACCEPT改为DROP
# iptables -L -nv --line-numbers #查看规则
配置-允许-其它主机到本机ping的功能:
# iptables -A INPUT -d 10.10.17.250 -p icmp -j ACCEPT #开启ping功能, 需要在INPUT上面开启
# iptables -A OUTPUT -s 10.10.17.250 -p icmp -j ACCEPT #同时也要在OUTPUT上面配置好
或者(--icmp-type, 可以用数字表示其类型, 0: echo-reply ; 8: echo-request):
# iptables -A OUTPUT -s 10.10.17.250 -p icmp --icmp-type 8 -j ACCEPT #开启本机ping外面的主机,不允许外面主机ping本机
# iptables -A INPUT -d 10.10.17.250 -p icmp --icmp-type 0 -j ACCEPT
配置-允许-其它主机到本机多端口的访问:
# iptables -A INPUT -d 10.10.17.250 -p tcp -m multiport --dports 22,80 -j ACCEPT #多端口添加
# iptables -A OUTPUT -s 10.10.17.250 -p tcp -m multiport --dports 22,80 -j ACCEPT
配置-允许-连续IP地址到本机服务端口的访问:
# iptables -I INPUT -d 10.10.17.250 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 10.10.67.40-50 -j ACCEPT #连续的IP地址和端口范围
配置-允许-某个时间段的请求访问本机:
# iptables -I INPUT -d 172.16.100.9 -P tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT #禁止14:00-16:00 来访问
配置-限制-每分钟请求的速率:
# iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m limit --limit-burst --limit 30/minute -j ACCEPT #每分钟不超过30个数据包的ping
配置-限制-请求本地主机服务的内容:
# iptables -I OUTPUT -m string --algo bm --string ‘sex’ -j REJECT #主机出去的数据包如果含有:sex字符串,就拒绝
配置-限制-单个客户端与本机连接数:
# iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT #源地址超过3个连接,拒绝
规则优化:
# iptables -t filter -I INPUT -d 10.10.17.250 -p tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT #直接放开22端口及相关的连接
# iptables -t filter -I OUTPUT -s 10.10.17.250 -p tcp --sport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
配置-允许-本机被动模式的ftp服务:
# ll /lib/modules/3.10.0-1127.el7.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko.xz
# modprobe nf_conntrack_ftp #装载ftp追踪时的专用的模块
# iptables -I INPUT -d 10.10.17.250 -p tcp -m multiport --dports 21,22,80 -m state --state NEW,ESTABLISHED -j ACCEPT #放行请求报文, 命令连接:NEW,ESTABLISHED, 数据连接: RELATED,ESTABLISHED
# iptables -I INPUT 2 -d 10.10.17.250 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT #数据连接: RELATED,ESTABLISHED
# iptables -A OUTPUT -s 10.10.17.250 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT #放行响应报文,本机出站数据连接: RELATED,ESTABLISHED
删除某条规则:
# iptables -D OUTPUT 2 #删除OUTPUT链条上第2条序号上的规则
4、保存重载规则及CentOS 7如何开启iptables服务
如何保存及重载规则:
# iptables-save > /opt/iptables_v1 #保存规则至指定文件
# iptables-restore < /opt/iptables_v1 #从指定文件重载规则
CentOS 6:
# service iptables save #相当于:iptables-save > /etc/sysconfig/iptables
# service iptables restart #相当于:iptables-restore < /etc/sysconfig/iptables
CentOS 7 引入了新的iptables 前端管理服务工具: firewalld,firewalld-cmd(命令行) 和 firewalld-config(图形化);
# systemctl stop firewalld
# systemctl disable firewalld
# yum -y install iptables-services #开始centos 7安装iptables-services 服务
# systemctl start iptables.service
# systemctl enable iptables.service
# service iptables save
# service iptables restart #执行完毕之后/etc/syscofig/iptables文件就有了
关于firewalld:
http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
5、iptables NAT功能
常用端口:
telnet: 23/tcp
samba: 137/udp , 138/udp, 139/tcp, 445/tcp
dns: 53/udp, 53/tcp
NAT:
SNAT: 只修改请求报文的源地址
DNAT: 只修改请求报文的目的地址
PNAT: 转口转发
NAT表:
PREROUTTING -> 在这个链上做DNAT
OUTPUT
POSTROUTTING -> 在这个链上面做SNAT
开启Linux转发功能:
# sysctl -w net.ipv4.ip_forward=1 #开启转发功能, 或者echo 1 > /proc/sys/net/ipv4/ip_forward
# sysctl -p
如果FORWARD链是默认策略拒绝的,需要开启允许:
# iptables -A FORWARD -d 192.168.10.2 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -s 192.168.10.2 -p tcp --sport 80 -j ACCEPT
# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT #以上可以优化成这2个规则
# iptables -A FORWARD -d 192.168.10.2 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
再配置地址转换:
# iptables -t nat -A POSTROUTTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j SNAT --to-source 172.16.100.9 #源地址转换SNAT, 上网 # iptables -t nat -A PREROUTTING -d 172.16.100.9 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2:80 #目标地址转换DNAT, 端口映射 # iptables -t nat -A PREROUTING -d 192.168.239.128 -p tcp --dport 8080 -j REDIRECT --to-ports 80 #端口转发8080->80 # iptables -t nat -A POSTROUTTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j MASQUERADE #地址伪装,常用于ADSL,源地址转换
6、iptables扩展功能(recent/layer7/tcp_wrapper)
recent 模块, layer 7 模块, 需要重新编译内核;
tcp_wrapper: tcp包装器
对基于tcp协议开发, 并提供服务的应用程序, 提供的一层访问控制工具;基于库调用实现其功能:
libwrap
判断服务是否能够由tcp_wrapper进行访问控制:
1)、动态编译: ldd命令;
2)、静态编译: strings命令查看应用程序文件,基结果中如果出现: hosts.allow,hosts.deny ;
在配置文件在为各服务分别定义访问控制规则实现访问控制:
/etc/hosts.allow -> 如果有匹配,放行,如果没有跳到hosts.deny
/etc/hosts.deny -> 如果有匹配, 放行
配置文件语法:
daemon_list: client_list [:option]
daemon_list:
应用程序的文件名称, 而非服务名;
应用程序文件名称列表, 彼此间使用逗号分隔:
例如:sshd,vsftpd
ALL 表示所有服务
client_list:
IP地址
主机名
网络地址:必须使用完整格式的掩码, 不使用前缀格式掩码, 所以类似于172.16.0.0/16 不合法;
简短格式的网络地址:例如:172.16. 表示 172.16.0.0/255.255.0.0
ALL: 所有主机
KNOWN:
UNKOWN:
PARANOID:
例如:vsftpd 不允许172.16.100.1访问
# cat /etc/hosts.deny
vsftpd: 172.16.100.1
# ldd `which sshd` #支持/etc/hosts.allow 和 /etc/hosts.deny 这个特性,只要程序服务里面包含libwrap.so库,就可以支持
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fa0c2ffb000)
EXCEPT: 除了
# cat /etc/hosts.allow
vsftpd: 172.16. EXCEPT 172.16.100.0/255.255.255.0
[:option]
deny 拒绝,主要用于/etc/hosts.allow 文件中
allow 允许,用于/etc/hosts.deny文件, 实现allow的功能
spawn 启动额外应用程序
vsftpd: ALL :spawn /bin/echo `date` login attempt from %c to %s,%d >> /var/log/vsftpd.deny.log
%c: client ip
%s: server ip
%d: daemon name