iptables: 包过滤型防火墙
Firewall: 防火墙,隔离工具:工作与主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件;主机防火墙
网络防火墙
ipfw
ipchains
iptables/netfilter
framework: netfilter
hooks function
rule utils: iptables
功能:
filtter : 过滤,防火墙;
nat : network address translation, 网络地址转换;
mangle : 拆解报文,做出修改,封装报文
raw : 关闭nat表上启用的连接追踪机制;
链(内置)
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUNTING流入: 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) 将那些可由一条规则描述的多个规则合并为一个;
设置默认策略;
功能的优先级次序: raw --> mangle --> nat --> filter
规则:
组成部分:报文的匹配条件,匹配到之后处理动作。
匹配条件: 根据协议报文特征指定
基本匹配条件
扩展匹配条件
处理动作:
内建处理机制
自定义处理机制
注意:报文不会经过自定义 链,只能在内置链上通过规则进行引用后生效;
iptables : 规则管理工具
添加、修改、删除、显示等;
规则和链有计数器:
pkts:由规则或链所匹配到的报文的个数;
bytes : 由规则或链匹配到的所有报文大小之和;
iptables命令
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-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
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TAEGWT
-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, 显示计数器计数结果的精确值
示例:
iptables -t filter -N IN_public
iptables -L -n
iptables -t filter -E IN_public OUT_public
iptables -L -n
#重启防火墙
systemctl restart firevalld.service
iptables -L -n
#修改默认策略
iptables -t filter -P FORWARD DROP
iptables -L -n
#恢复默认策略
iptables -t filter -P FORWARD ACCEPT
iptables -L -n
#查看规则编号
iptables -n -L --line-numbers
# 根据规则编号2删除规则
iptables -D FORWARD 2
# 查看详细信息
iptables -n -L -v #或使用-vv -vvv
#清除链上的所有规则
iptables -X
匹配条件:
基本匹配:
[i] -s,--src, --source IP|Neraddr : 检查报文中源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链上;
示例:
iptables -F
iptables -X
iptables -t filter -A INPUT -d 172.18.251.117 -p tcp -j ACCEPT
iptables -L -n
iptables -t filter -A OUTPUT -s 172.18.251.117 -p tcp -j ACCEPT
iptables -L -n -v
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -n -L -v && sleep 5 && iptables -F
# 添加icmp规则
iptables -A iNPUT -d 172.18.251.117 -p icmp -j ACCEPT
iptables -n -L
ping 172.18.251.117
iptables -A OUTPUT -s 172.18.251.117 -p icmp -j ACCEPT
ping 172.18.251.117
# 删除规则
iptables -n -L --line-numbers
iptables -D INPUT 2
iptables -D OUTPUT 2
iptalbes -n -L --line-numbers
#根据接口添加规则
iptables -A iNPUT -d 172.18.251.117 -i ens37 -j ACCEPT
ping 172.18.251.117
iptables -A OUTPUT -s 172.18.251.117 -o ens37 -j ACCEPT
ping 172.18.251.117
扩展匹配:-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
--tcp-flags SYN,ACK,FIN,RST SYN
--syn:
-p udp
--dport
--sport
-p icmp
--icmp-type
可用数字表示其类型:
0: echo-reply
8: echo-request
示例:
iptables -I INPUT -d 172.18.251.117 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -s 172.18.251.117 -p tcp --sport 22 -j ACCEPT
iptables -n -L --line-numbers
systemctl start httpd.service
systemctl status httpd.service
# web端访问:172.18.251.117
iptables -D input 2
# web端访问:172.18.251.117 访问不成功
# 根据icmp-type类型设定规则
iptables -A OUTPUT -s 172.18.251.117 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.18.251.117 -p icmp --icmp-type 0 -j ACCEPT
iptables -n -L -v --line-numbers
ping 172.18.251.116
显示扩展:必须使用-m选项指定使用的扩展;
目标:
-j TARGET: jump至指定的TARGET
ACCEPT: 接受
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT: 端口重定向
LOG: 记录日志
MARK: 做防火墙标记
DNAT:目标地址转换
SNAT::源地址转换
MASQUERADE : 地址伪装
....
自定义链: 由自定义链上的规则进行匹配检查
iptables:
显式扩展:必须显式指明使用的扩展模块(rpm -ql iptables)
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 172.18.0.0/16 -d 172.18.251.117 -p tcp -m multiport --dports=22,80 -j ACCEPT
iptables -I OUTPUT -d 172.18.0.0/16 -s 172.18.251.117 -p tcp -m multiport --sports=22,80 -j ACCEPT
iptables -vnL --line-numbers
iptables -D INPUT 2
iptables -D OUTPUT 2
# web端访问172.18.251.117可以正常访问
2、iprange 扩展
指明连续的(但一般是不能扩展为整个网络)ip 地址范围时使用:
[!] --src-range from[-to]: 指明连续的源IP地址范围;
[!] --dst-range from[-to]: 指明连续的目标IP地址范围;
iptables -I iNPUT -d 172.18.251.117 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.18.250.50-172.18.250.120 -j ACCEPT
iptables I OUTPUT -s 172.18.251.117 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.18.250.50-172.18.250.120 -j ACCEPT
iptables -D iNPUT 2
iptables -D OUTPUT 2
# web端访问172.18.251.117
3、string扩展
检查报文中出现的字符串
--algo{bm|kmp}
bm=Boy
kmp=knuth-Pratt-Morris
[!] --string pattern
示例:
echo "this is usa page" > test.html
iptables -I OUTPUT -m string --algo bm string 'usa' -j REJECT
#web端访问test.html 页面
4、time扩展
根据报文到达的时间与指定的时间范围进行匹配;
--datestart
--datestop
--timestart
--timestop
--monthdays
--weekdays
示例:
iptables -I INPUT -d 172.18.251.117 -p tcp --dport 80 -m time --timestart 9:00 --timestop 23:00 -j ACCEPT
5、connlimit 扩展
根据每客户端IP(也可以是地址块) 做并发连接数数量匹配;
--connlimit-above n: 连接的数量大于n
--connlimit-upto n: 连接的数量小于等于n
示例
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 172.18.251.117 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 3/minute -j ACCEPT
iptables -A OUTPUT -s 172.18.251.117 -p icmp --icmp-type 0 -j ACCEPT
ping 172.18.251.117
7、state扩展
根据连接追踪机制检查连接的状态:
调整连接追踪功能所能够容纳连接的最大连接数量:
/proc/sys/net/nf_conntrack_max
已经追踪到并记录下的连接:
/proc/net/nf_conntrack
不同协议或连接类型追踪的时长:
/proc/sys/net/netfilter/
可追踪的连接状态:
NEW: 新发出的请求,连接追踪模板中不存在此里阿杰相关的信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED: NEW状态之后,连接追踪模块中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系;
INVALIED: 无法识别的连接;
--state STATE1,STATE2,...
示例:
iptables -vnL --line-numbers
iptables -I iNPUT -d 172.18.
251.117 -p tcp --dport 22 -m state --state NEW,ESTABLELISHED -j ACCEPT
iptables -A OUTPUT -s 172.18.251.117 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -d 172.18.251.117 -p tcp --dport 80 -m state --state NEW,ESTABLELISHED -j ACCEPT
iptables -A OUTPUT -s 172.18.251.117 -p tcp --sport 80 -m state ESTABLELISHED -j ACCEPT
iptables -A INPUT -d 172.18.251.117 -p icmp --icmp-type 8 -m state --state NEW,ESTABLELISHED -j ACCEPT
iptables -A OUTPUT -s 172.18.251.117 -p icmp --icmp-type 0 -m state --state ESTABLELISHED -j ACCEPT
#对以上规则作优化
iptables -I iNPUT -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
iptables -I OUPUT -m state --state ESTABLISHED -j ACCEPT
问题: 如何开放被动模式的ftp服务?
(1)装载ftp追踪时的专用的模块:
# modprobe nf_conntrak_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 RELATED,ESTABLISHED -j ACCEPT
>(3) 放行响应报文
# ESTABLISHED
iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
示例:
lsmod | grep ftp
modprobe nf_conntrak_ftp
yum install vsftpd
cp /etc/issue /var/ftp/pub
ls -l /var/ftp/pub/
systemctl start vsftpd.service
ss -tnl
systemctl status vsftpd.service
iptables-save > /root/iptables `date +%F`
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -vnL --line-numbers
iptables -F
iptables-restore < /root/iptables2017-05-01
iptables -vnL
lsmod | grep ftp
iptables -I iNPUT -d 172.18.251.117 -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT
iptables -I INPUT -d 172.18.251.117 -p tcp -m state --state RELATED,ESTABLELISHED -j ACCEPT
iptables -vnL --line-numbers
#web端访问ftp://172.18.251.117/pub
如何保存和重载规则:
保存规则至指定文件
iptables-save > /PATH/TO/SOMEFILE
从指定文件重载规则:
iptables -restore < /PATH/FROM/SOMEFILE
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
关于firewalld:
firewalld文章
示例:
网络防火墙: 放行 telnet,ftp ,web服务
#192.168.16.113 内部服务器端
echo " hellow world" > /var/httpd/html/index.html
systemctl start httpd
systemctl status httpd
yum install vsftpd
cp /etc/fstab /var/ftp/pub
systemctl start vsftpd
#网络防火墙端
lsmod | grep ftp
modprobe nf_conntrack_ftp
iptables -vnL
iptables -A FORWARD -m state --state ESTAVLISHED,RELATED -j ACCEPT
iptables -A FORWARD -d 192.168.16.113 -p tcp -m multiport --dport 21,22,80 -m state --state NEW -j ACCEPT
iptables -vnL
#172.18.251.117外部主机端
curl 192.168.16.113
lftp 192.168.16.113
#注意:
telnet :23/tcp
samba: 137/udp,138/dup,139/tcp/445/tcp
dns: INPUT :53/dup, OUTPUT :53/udp
#核心转发:
/pro/sys/net/ipv4/ip_forward
/etc/sysct.conf
net.ipv4.ip_forward = 1
iptables:
nat : Network Address Translation , 安全性,网络层+传输层
proxy : 代理,应用层
nat:
SNAT : 只修改请求报文的源地址;
DNAT : 只修改请求报文的目标地址;
nat 表:
PREROUTING : DNAT
OUTPUT
POSTROUTING : SNAT
源地址转换:
iptables -t nat -A POSTROUTING -s LocalNet ! -d LocalNet -j SANT --to-source ExtIP
iptables -t nat -A POSTROUTING -s LocalNet ! -d LocalNet -j MASQUERADE
目录地址转换:
iptables -t nat -A PREROUTING -d ExtIP -p tcp| udp --dport PORT -j DNAT --to-destination InterServerIP
示例:
# 内部主机192.168.164.122 需要访问外部web主机172.18.250.233
iptables -t nat -A POSTROUTING -s 192.168.164.0/24 ! -d 192.168.164.0/24 -j SNAT --to source 172.18.250.222
#外部主机192.168.164.122 访问外部地址 192.168.164.144 发生地址转换
iptables -t nat -A PREROUTING -d 192.168.164.144 -p tcp --dport 80 -j DNAT --to-destination 172.18.252.209