iptables

post thumb
Iptables
作者 Louis 发表于 2018年6月26日

摘要:

  • 防火墙的概念
  • iptables的基本认识
  • iptables的组成
  • iptables的基本语法
  • iptables之forward的概念
  • iptables之地址转换法则
  • SNAT源地址转换的具体实现
  • DNAT目标地址转换的具体实现

安全技术

  • 入侵检测与管理系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,有针对性的指导措施和安全决策依据。一般采用旁路部署方式;
  • 入侵防御系统(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式;
  • 防火墙( FireWall ):隔离工具,工作在网络或主机边缘,对进出网络或主机的报文,根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配的报文做出相应处理的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。

防火墙的分类

  • 主机防火墙:服务范围为当前主机 网络防火墙:服务范围为防火墙一侧的局域网
  • 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,Checkpoint,NetScreen
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
  • 网络层防火墙:OSI下面第三层 应用层防火墙/代理服务器:代理网关,OSI七层

网络层防火墙

  • 包过滤防火墙

  • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过.

  • 优点:对用户来说透明,处理速度快且易于维护

  • 缺点:无法检查应用层数据,如病毒等

1530085773391

应用层防火墙

应用层防火墙/代理服务型防火墙(Proxy Service)

  • 将所有跨越防火墙的网络通信链路分为两段
  • 内外网用户的访问都是通过代理服务器上的“链接”来实现
  • 优点:在应用层对数据进行检查,比较安全
  • 缺点:增加防火墙的负载

1530085779595

iptables的基本认识

Netfilter组件

  • 内核空间,集成在linux内核中
  • 扩展各种网络服务的结构化底层框架
  • 内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。
$cat config-3.10.0-693.el7.x86_64 |grep -i iptables
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP6_NF_IPTABLES=m
# iptables trigger is under Netfilter config (LED target)
  • 由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上

  • 三种报文流向:

流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING

iptables的组成

iptables由四个表和五个链以及一些规则组成

  • 四个表table:filter、nat、mangle、raw
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
	http 80     mangle 10
	https 443   mangle 10
Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
优先级由高到低的顺序为:raw-->mangle-->nat-->filter
  • 五个内置链chain
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

Netfilter表与chain对应联系

1530087711520

iptables 命令

  • DESCRIPTION

Iptables and ip6tables are used to set up, maintain, and inspect the tables of IPv4 and IPv6 packet filter rules in the Linux kernel. Several different tables may be defined. Each table contains a number of built-in chains and may also contain user-defined chains.

Each chain is a list of rules which can match a set of packets. Each rule specifies what to do with a packet that matches. This is called a ‘target’, which maybe a jump to a user-defined chain in the same table.

  • 选项
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]
  • 系统默认的防火墙规则关闭
systemctl stop firewalld
systemctl disable firewalld
service iptables stop
chkconfig iptables off
  • 自己编写防火墙规则。
$ iptables -t filter -A INPUT -s 192.168.1.11 -j REJECT
$ iptables -t filter -A INPUT -s 192.168.1.0/24 -j REJECT
$ iptables -t filter -I INPUT 2 -s 192.168.1.18 -j REJECT
$ iptables -vnL --line-numbers
$ iptables -D  INPUT 1
  1. 链管理:
-N:new, 自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
	ACCEPT:接受
	DROP:丢弃
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
  1. 查看:
-L:list, 列出指定鏈上的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息
-vv 更详细
-x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers:显示规则的序号
常用组合:
--vnL
--vvnxL --line-numbers
-S selected,以iptables-save 命令格式显示链上规则
  1. 规则管理:
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
chain: PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

基本用法和扩展用法

  1. 基本匹配条件:无需加载模块,由iptables/netfilter自行提供
  • [!] -s, --source address[/mask][,...]:源IP地址或范围
$ iptables -A INPUT -s 192.168.1.8 -p tcp --dport 139 -j REJECT
  • [!] -d, --destination address[/mask][,...]:目标IP地址或范围
$ iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
  • [!] -p, --protocol protocol:指定协议,可使用数字如0(all) protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or “all“ 参看:/etc/protocols
$ iptables -A INPUT -s 192.168.1.8 -p tcp --dport 445 -j REJECT
  • [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING 链
~]# iptables -A OUTPUT -o lo -j ACCEPT
  • [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于 FORWARD、OUTPUT 、 POSTROUTING 链
  1. 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
  • 查看帮助 man iptables-extensions
  • (1)隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展

机制,不需要手动加载扩展模块

  • tcp协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为范围
[!] --tcp-flags mask comp
  • 显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块

[-m matchname [per-match-options]]

$ iptables -A INPUT -p tcp --syn -j REJECT    #拒绝首次tcp链接,已经链接的不拒绝
$ iptables -A INPUT -p icmp --icmp-type 8 -j REJECT  #禁ping
$ rpm -ql iptables | grep multiport  #多端口
/usr/lib64/xtables/libxt_multiport.so
$ iptables -A INPUT -p tcp -m  multiport --dport 21,80,139,445 -j REJECT
$ iptables -A INPUT -s IP -j ACCEPT
$ iptables -A OUTPUT -s IP -j ACCEPT
$ iptables -A INPUT -j REJECT
$ iptables -A OUTPUT -j REJECT
$ iptables -A INPUT -p tcp -m  multiport --dport 22,80,139,445 -j ACCEPT
$ iptables -A OUTPUT -p tcp -m  multiport --sport 22,80,139,445 -j ACCEPT

tips:利用telnet测试是否filter成功

  1. 自定义链

增加自定义链

iptables -N WEB
iptables -A WEB -P tcp -m multiport --dports 80,443 -j ACCEPT
iptables -I INPUT -s 192.168.1.0/24 -j WEB

删除自定义链

iptables -D INPUT 1
iptables -D WEB 1
iptables -X WEB
  1. string扩展

对报文中的应用层数据做字符串模式匹配检测

--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
[!] --string pattern:要检测的字符串模式
[!] --hex-string pattern:要检测字符串模式,16进制格式

例如:只要匹配到google的,全部拒绝。

iptables -A OUTPUT -m string --algo bm --string "google" -j REJECT  
  1. time扩展

根据将报文到达的时间与指定的时间范围进行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 时间
--timestop hh:mm[:ss]
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几
--kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC

例如:

iptables -A INPUT -s 172.20.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
  1. state扩展 根据”连接追踪机制“去检查连接的状态,较耗资源,用的也相对多,例如nat技术。
  • conntrack机制:追踪本机上的请求和响应之间的关系
  • 状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪 

例如:

iptables -I INPUT 1 -s 192.168.1.0/24 -m state --state NEW -j REJECT
iptables -I INPPUT 1  -m state --state ESTABLISHED -j ACCEPT

iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时

(1) 加大 nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2)  降低 nf_conntrack timeout 时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

iptables策略总结

任何不允许的访问,应该在请求到达时给予拒绝 规则在链接上的次序即为其检查时的生效次序

  • 基于上述,规则优化
  1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接
  2. 谨慎放行入站的新请求
  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
  4. 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
  5. 不同类的规则(访问不同应用),匹配范围大的放在前面
  6. 应该将那些可由一条规则能够描述的多个规则合并为一条
  7. 设置默认策略,建议白名单(只放行特定连接) a. iptables -P,不建议 b. 建议在规则的最后定义规则做为默认策略

iptables具体应用试验

  • 试验拓扑图如下:

内网用户:192.168.1.0/24

router:192.168.1.0/24 ; 10.0.0.254/8,注意:这里假想10.0.0.0/8为所有的外网用户,且用linux主机充当。

外网:10.0.0.0/8 ; 外网web:10.0.0.8/8 ; 外网的client:10.0.0.17/8

nat_test

实现内网安全

只需在防火墙上的router上添加几条规则即可。

要求:有客户端想访问192.168.1.18:80的web资源,并且内网用户能访问外网

$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
$ systcl -p
$ iptables -A FORWARD -j REJECT
$ iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -I FORWARD 2 -s 192.168.1.0/24 -d 0.0.0.0/0  -m state --state NEW -j ACCEPT
$ iptables -I FORWARD 2 -d 192.168.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT

NAT

  • NAT: network address translation

PREROUTING,INPUT,OUTPUT,POSTROUTING 请求报文:修改源/目标IP,由定义如何修改 响应报文:修改源/目标IP,根据跟踪机制自动实现

  • SNAT:source NAT POSTROUTING, INPUT

让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装 请求报文:修改源IP

  • DNAT:destination NAT PREROUTING , OUTPUT

把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP 请求报文:修改目标IP

  • PNAT: port nat,端口和IP都进行修改

SNAT

  • SNAT:固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
iptables -t nat -A POSTROUTING -s LocalNET -j SNAT --t-soutce ExtIP

示例,依旧利用上述网络拓扑试验图,在router上设置,:

$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
$ sysctl -p
$ iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 10.0.0.254
  • MASQUERADE:动态IP,如拨号网络
--to-ports port[-port]
--random
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE

示例:

iptables -t nat -A POSTROUTING -s  192.168.1.0/24  ! -d 192.168.1.0/24  -j MASQUERADE

DNAT

  • DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
  • 示例,依旧是上面的网络拓扑试验图router上进行设置:
$ iptables -t nat -A PREROUTING -s 0/0 -d 10.0.0.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.18:80
$ iptables -vnL -t nat
  • 端口转发
$ iptables -t nat -A PREROUTING -d 192.168.1.18 -p tcp --dport 80 -j REDIRECT --to-port 8080
上一篇
Samba

文章推荐