Iptables
iptables
- iptables是一个规则管理工具,工作于用户空间,四表五链
- iptables添加规则送到内核的netfilter中
- netfilter:kernel framework 内核框架
功能
- fileter:过滤,防火墙
- raw:关闭nat表上启用的连接追踪机制
- mangle:拆解报文,做出修改,封装报文
- nat:network address translation,网络地址转换
链(内置)
- 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:OUTPUT,PREROUTING
路由发生的时刻
- 报文进入本机后:判断目标主机
- 报文发出之前:判断经由哪个接口送往下一跳
添加规则的考量点
- 要实现哪种功能:判断添加在哪张表上
- 报文流经的路径:判断添加在哪个链上
- 连上规则的次序,即为检查的次序
- 同类规则(控制同一应用),匹配范围小的放上面
- 不同类规则(访问不同应用),匹配到报文频率较大的放上面
- 合并可以由一条规则描述的多个规则合并为一个
- 设置默认策略
- 功能的优先级次序:raw --> mangle —>nat –> filter
规则
- 组成部分:报文的匹配条件,匹配到之后的处理动作
- 匹配条件:根据协议报文特征指定匹配条件
- 处理动作:内建处理机制,自定义处理机制
- 注意点:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效
- pkts:由规则或链所匹配到的报文的个数
- bytes:由规则或链匹配到的所有报文大小之和
iptables命令
常用命令
-
iptables -P INPUT DROP
:设置INPUT链默认策略为DORP其他链 -
~:显示详细信息
-
iptables -A INPUT -p tcp -d 192.168.175.7 --dport 22 -j ACCEPT
放行目标ip为192.168.175.7 协议为tcp 22端口的入站流量 -
iptables -A INPUT -d 192.168.175.7 -p icmp -j ACCEPT
放行目标ip为192.168.175.7的icmp协议流量 -
iptables -t filter -A OUTPUT -p tcp -s 192.168.175.7 -j ACCEPT
放行源ip为192.168.175.7的出站流量 -
iptables -A INPUT -p icmp -d 192.168.175.7 --icmp-type 0 -j ACCEPT
放行icmp 的echo reply 入站流量 -
iptables -L -n --line-num
:查看链上的规则不反解并显示规则编号 -
iptables -D INPUT 1
:删除INPUT链上的第一条规则 -
iptables -R INPUT 2 -d 192.168.175.7 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
-
iptables -R INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
-
iptables -A INPUT –p icmp -m limit –limit 10/second -j ACCEPT
-
-t table:
filter,nat,mangle,raw(省略时为filter)
-
链管理
-F:flush,清空规则链,省略链表示清空指定表上的所有的链(不指定链则默认为filter)
-N:new,创建自定义规则链
-X:drop,删除用户自定义的空的规则链
-Z:zero,置零规则计数器
-P:policy,为指定链设置默认策略,对filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT;
-E:rename,重命名自定义链,引用计数不为0的自定义链无法改名,也无法删除
- L:显示规则
-
规则管理:
-A:append,将新规则追加于指定链的尾部
-I:insert,将新规则插入指定链的指定位置
-D:delete,删除指定链上的指定规则,有两种指定方式(1)指定匹配条件(2)指定规则的编号
-R:replace,替换指定链上的指定规则
-
查看
-L:list,列出指定链上所有规则
-n:numberic
,以数字格式显示地址和端口号,不反解
-v:verbose
,显示详细信息
--line-numbers
:显示规则编号
-x:exactly
:显示计数器计数结果的精确值 -
目标
-j TARGET:jump至指定的TARGET
ACCEPT:接受
REJECT:拒绝
DROP:丢弃
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志
MARK:做防火墙标记
SNAT:源地址转化
DNAT:目标地址转换
MASQUERADE:地址伪装
….
自定义链:由自定义链上的规则进行匹配检查
-
基本匹配:
[!] -s,--src,--source IP | Netaddr
:检查报文中的源IP地址是否符合此处指明的地址范围[!] -d,--dst,--destination IP | Netaddr
: 检查报文中源IP地址是否符合此处指定的地址范围[!] -p,--protocol {tcp|udp|icmp}
:检查报文中的协议,即IP首部中的protocols所标识的协议[!] -i,--in-interface INTERFACE
:数据报文的流入接口,仅能用于PREROUTING,INPUT及FORWARD链上[!] -o,--out-interface INTERFACE
:数据报文的流出接口,仅能用于FORWARD,OUTPUT及POSTROUTING上
扩展匹配
-
隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项
-p tcp
1. --dport PORT [-PORT]:目标端口匹配,可以是单个端口或连续多个端口
2. --sport PORT [-PORT]
3. --tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1而余下的必须为0:没有在LIST1中指明的,不做检查
4. **示例:--tcp-flags SYN,ACK,FIN,RST SYN 表示SYN标志位必须为1,ACK,FIN,RST必须为0 相当于--syn**
-p udp
-
--dport
-
--sport
-p icmp
-
–icmp-type:可用数字类型
-
0:echo-reply
-
8:request
iptables -I OUTPUT -s 192.168.175.7 -p tcp --sport 22 -j ACCEPT
iptables -I INPUT -d 192.168.175.7 -p tcp --dport 22 -j ACCEPT
显示扩展(man iptables-extensions):
必须使用-m选项指定使用的扩展(rpm -ql iptables | grep “\.so” ) -m match_name –spec_options
1、multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]...
指明多个源端口 iptables -I OUTPUT -s 192.168.175.7 -p tcp -m multiport --sports 22:23,80 -j ACCEPT
[!] --destination-ports,--dports port[,port|,port:port]...
指明多个目标端口 iptables -I INPUT -d 192.168.175.7 -p tcp -m multiport --dports 22:23,80 -j ACCEPT
[!] --ports port[,port|,port:port]...
2、iprange扩展:指明连续的ip地址范围(但一般不能扩展为整个网络)
[!] --src-range from[-to]
:指明连续的源ip地址范围
iptables -A INPUT -d 192.168.175.7 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.175.1-192.168.175.100 -j ACCEPT
[!] --dst-range from[-to]:指明连续的目标地址范围
3、string扩展
检查报文中出现的字符串:
--algo {bm|kmp}
[!] --string pattern
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG
iptables -I OUTPUT -m string –algo bm –string ‘movie’ -j REJECT
iptables -p udp --dport 53 -m string --algo bm --from 40 --to 57 --hex-string '|03|www|09|netfilter|03|org|00|'
4 time扩展:根据报文到达的时间与指定的时间范围进行匹配
iptables -I INPUT -d 192.168.175.7 -p tcp –dport 80 -m time --timestart 00:00 --timestop 23:59 -j REJECT
--timestart
--timestop
--datestart
--datastop
--monthdays
--weekday
s
5 connlimit扩展:根据每客户端IP(也可以是地址块)做并发连接访问数量限制
--connlimit-above n
:连接的数量大于n
Match if the number of existing connections is above n
--connlimit-upto n
:连接的数量小于等于n
--connlimit-mask prefix_length
:指明前缀长度
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 22 -d 192.168.175.7 -m connlimit --connlimit-above 2 -j REJECT
6 limit扩展:基于收发
iptables -I INPUT -d 192.168.175.7 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
7 state扩展:根据连接追踪机制检查连接间的状态
调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_conntrack_max
已经追踪到并记录下的连接:/proc/net/nf_conntrack
调整不同协议或连接类型追踪的时长
/proc/sys/net/netfilter/
可追踪的连接状态:
1.NEW:新发出的请求,连接追踪模板中不存在此连接相关的信息条目,因此将其识别为第一次发来的请求
2.ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
3.RELATED:相关的连接,如FTP协议中的命令连接与数据连接之间的关系
4.INVALIED:无法识别的连接
iptables -I INPUT -d 192.168.175.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 192.168.175.7 -p tcp --sport 22 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -d 192.168.175.7 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.175.7 -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 : 之前已经建立连接的就直接放行,提高效率,只需要检查第一条规则就行
如何开放被动模式的FTP服务:
(1)装载ftp追踪时的专用的模块
modeprobe nf_conntrack_ftp
(2)放行请求报文
命令连接:NEW,ESTABLISHED iptables -A INPUT -d 192.168.175.7 -p tcp --dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT
数据连接:RELATED,ESTABLISHED iptables -A INPUT -d 192.168.175.7 -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT
(3)放行响应报文
ESTABLISHED iptables -A OUTPUT -s 192.168.175.7 -p tcp -m state --state ESTABLISHED -j ACCEPT
保存及重载规则
-
保存规则至指定文件:iptables-save > /PATH/TO/SOMEFILE
centos 6 service iptables save 相当于iptables-save > /etc/sysconfig/iptables
-
从指定文件重载规则:iptables-restore < /PATH/TO/SOMEFILE
**centos 6上 service iptables restart相当于iptables-restore < /etc/sysconfig/iptables **
-
centos 7:引入了新的iptables前端管理服务工具:firewalld
- firewalld-cmd
- firewalld-config
- systemctl disable firewalld
- systemctl stop firewalld
NAT:Network Address Translation ,最初的目的是为了安全性,隐藏本地地址,是在网络层和传输层实现
proxy:代理,主要在应用层实现
SNAT
只修改请求报文的源地址 实现位置:POSTROUTING
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j SNAT --to-source ExtIP
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j MASQUERADE
示例:
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j SNAT --to-source 172.16.100.9
#在内网192.168.20.0/24访问其他地址时做源地址转换(除了192.168.20.0/24网段),转换成172.16.100.9去访问
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j MASQUERADE
#地址伪装,用在外网地址经常变动的情况(比如拨号网络)
DNAT
只修改请求报文的目标地址 实现位置:PREROUTING
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterServerIP[:PORT]
iptables -t nat -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2:80
#外网主机访问本地代理主机172.168.100.9的80端口时做DNAT转发到内网主机192.168.20.2的80端口,如果是同一端口,后面的80可以省略
iptables -t nat -A PREROUTING -d 172.16.100.9 -p tcp --dport 22 -j DNAT --to-destination 192.168.20.2
#将22端口转发到内网主机,即便本机有22端口的服务也会转发,因为报文不会到INPUT链,直接经过PREROUTING链转发了
iptables -t nat -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j DANT --to-destination 192.168.20.2:8080
#端口映射
tcp_wrapper
tcp包装器
- tcp_wrapper是对基于tcp协议开发并提供服务的应用程序,提供的一层访问控制工具
- tcp_wrapper基于库调用实现其功能(libwrap)
判断服务是否能够由tcp_warpper进行访问控制,可以使用如下方法查看:
- 动态编译:ldd命令 如ldd `which sshd`,服务会动态加载在/etc/hosts.allow hosts.deny中的配置
- 静态编译:strings命令查看应用程序文件,其结果中出现hosts.allow, hosts.deny
在配置文件中为各服务分别定义访问控制规则实现访问控制:
- /etc/hosts.allow
- /etc/hosts.deny
配置文件语法:
- daemod_list: client_list [:options]
- 应用程序的文件名称,而非服务名
- daemon_list:应用程序文件名称列表,彼此间使用逗号分隔,例如:sshd,vsftpd ALL表示使用所有服务
- client_list:ip地址、主机名、网络地址:必须使用完整格式的掩码(255.255.255.0),不能使用前缀格式,所以类似于172.16.0.0/16不合法、ALL表示所有主机、剪短格式的网络地址:例如 172.16. 表示172.16.0.0/255.255.0.0
- 先检查hosts.allow再检查hosts.deny配置文件,如果allow放行了就直接运行
示例:
#vsftpd服务不允许访问
cat /etc/hosts.allow
vsftpd: 172.16.100.1
cat /etc/hosts.deny
vsftpd: ALL
[:options]
# EXCEPT
cat /etc/hosts.allow
vsftpd: 172.16. EXCEPY 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1
# deny:主要用于hosts.allow文件中
# allow:允许,用于实现allow功能
# spawn:启动额外应用程序
cat /etc/hosts.deny
vsftpd: ALL :spawn /bin/ech `date` login attempt from %c to %s,%d >> /var/log/vsftpd.deny.log #%c表示client ip &s 表示server ip
#daemon name