Iptables(一):Linux防火墙基础与iptables命令

Iptables(一):Linux防火墙基础与iptables命令

简介:

  防火墙(Firewall);工作于主机或网络边缘,对于进出的报文根据定义的规则作检查,进而对被规则匹配到的报文作为相应处理的套件;

  主机防火墙:工作在一个主机的边缘;

  网络防火墙:工作在网络边缘;

  按照实现方法可分为软件防火墙和硬件防火墙,纯硬件防火墙是很少的,大部分防火墙设备都是由设备中依靠软件搭配实现的;

  按照工作位置可分为网络层防火墙和应用层网关;

Linux防火墙:iptables/netfilter;

iptables:规则生成器;运行于用户空间的应用软件,用于编写生成规则,并自动发往netfilter,立即生效;

netfilter:网络过滤器;在linux内核中的软件框架,用于管理网络数据包,接收并生效规则;

iptables/netfilter的表、链结构:

输入图片说明

  netfilter在内核空间定义了5个钩子函数(hook function,即5链),控制数据包的走向,进入x本机用户控件交由本机应用处理,或经由本机转发,5链分别为:

  1、PREROUTING:路由前

  2、INPUT:到达本机内部的报文必经之路

  3、OUTPUT:由本机发出的报文的必经之路

  4、FORWARD:由本机转发的报文必经之路

  5、POSTROUTING:路由后

iptables可定义4种规则(即4表),分别实现的功能:

  filter:包过滤,定义是否允许通过防火墙

  nat:地址转换,启用connection_track;

    SNAT:源地址转换

    DNAT:目标地址转换

    PNAT:端口转换

  mangle:对数据包进行修改

  raw:目标是关闭nat表上启用的连接追踪功能;

  4表的优先级:raw > mangle > nat > filter

4表和5链的对应关系:

  filter:INPUT,FORWARD,OUTPUT

  nat:PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT

  mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

  raw:PREROUTING,OUTPUT

数据报文流程:

跟本机内部进程通信:

  进入:--> PREROUTING --> INPUT -->

  出去:--> OUTPUT --> POSTROUTING -->

由本机转发:

  请求:--> PREROUTING --> FORWARD --> POSTROUTING

  响应:--> PREROUTING --> FORWARD --> POSTROUIING

数据报文的流向:

  规则中如果限定源地址,目标地址,源端口,目标端口,等与流向相关的设定;源IP和目标IP由流向决定;

iptables命令:
/etc/rc.d/init.d/iptables   \\:启动脚本:
/etc/sysconfig/iptables   \\:规则文件;

保存启用中的规则与规则文件中:

1、# iptables-save > /etc/sysconfig/iptables
2、# service iptables save

生效规则文件中的规则:

执行的操作:清空现有规则,读取并生效规则文件中的规则;

1、# iptables-restore < /etc/sysconfig/iptables
2、# service iptables restart

开机自动启动:读取并生效规则文件中的规则;

chkconfig iptables on

基本语法:

# iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET

命令结构简介:

-t TABLE:指定表,表为filter、nat、mangle、raw,默认为filter;
    -j处理目标:
	    内置目标:
		    ACCEPT:允许
			REJECT:拒绝,并通知对方;不建议使用;
			DENY:拒绝,委婉式拒绝
			DROP:丢弃

			SNAT:源地址转换
			DNAT:目标地址转换

		自定义的链:

	COMMAND:
		链:
			-F:Flush,清空规则链
			-N:New,自建一条链
			-X:delete,删除一条自定义的空链
			-E:rEname,重命名自定义链
			-Z:Zero,计数器归零
			-P:Policy,设置默认策略;对filter表来讲,默认规则为ACCEPT或DROP;

		链中的规则管理:
			-A:Append,在链的尾部附加一条规则;
			-I:Insert,插入一条新规则
			-D:Delete,删除规则
			-R:Replace,替换规则

		-L:List,查询;
			子选项:
				-n:Numeric,数字格式显示主机地址和端口;
				--line-numbers:显示规则编号
                -x:eXactly,不要对计数器的计数结果做单位换算,而显示其精确值
				-v:详细格式,-vv,-vvv

pkts    bytes    target    prot    opt  in    out        source    destination
包数    字节数    目标      协议   流入的接口   流出的接口   源地址    目标地址

CRETIRIA,匹配条件: 通用匹配:

-s ADDRESS:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;同--src,--source;
-d ADDRESS:指定报文目标IP地址匹配的范围;同--dst,--destination
-p PROTOCOL:指定匹配报文的协议类型,一般有三种tcp,udp和icmp;
-i INTERFACE:数据报文流入的接口;PREROUTING,INPUT,FORWARD
-o INTERFACE:数据报文流出的接口;OUTPUT,FORWARD,POSTROUITING

扩展匹配: 隐式扩展:

当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
    -p tcp [-m tcp]:
    子选项:
        --sport PORT[-PORT]:指定源端口
	    --dport PORT[-PORT]:指定目标端口
	    --tcp-flags:要检查标志位列表(用逗号分隔),必须为1的标志位列表(逗号分隔)
	    all none
	例如:
	--tcp-flags syn,ack,rst,fin syn,相当于--syn

	-p udp [-m udp]:
	子选项:
		--sport 
		--dport

	-p icmp [-m icmp]:
	子选项:
		--icmp-type
			0:echo-reply,ping响应
			8:echo-request,ping请求

扩展匹配之隐式匹配示例:

  通常防火墙默认策略应为丢弃,以白名单的方式放行被允许的链接;

  注意:通常运维工作中大部分情况都是通过ssh客户端远程连接服务器进行管理,所以在设置默认连接为丢弃之前要先设置放行ssh(默认为22/tcp端口)服务;同样在删除ssh相关的设置或清空设置前要先将默认策略修改为允许;

服务器IP:192.168.1.7

1、允许服务器所在网络的所有主机访问服务器的ssh服务,并将默认策略修改为DROP;

[root@node3 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.7 -p tcp --dport 22 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
[root@node3 ~]# iptables -P INPUT DROP
[root@node3 ~]# iptables -P OUTPUT DROP

2、允许本机ping外部主机;

[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p icmp --icmp-type 0 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -p icmp --icmp-type 8 -j ACCEPT

3、仅允许192.168.1.6主机ping通服务器的eth1接口;

[root@node3 ~]# iptables -A INPUT -i eth1 -s 192.168.1.6 -d 192.168.1.7 -p icmp --icmp-type 8 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -o eth1 -s 192.168.1.7 -d 192.168.1.6 -p icmp --icmp-type 0 -j ACCEPT

4、允许本机通过外部dns服务器解析域名,添加为第二条规则;

[root@node3 ~]# iptables -I INPUT 2 -d 192.168.1.7 -p udp --sport 53 -j ACCEPT
[root@node3 ~]# iptables -I OUTPUT 2 -s 192.168.1.7 -p udp --dport 53 -j ACCEPT

5、查看当前配置,并保存当前配置;

[root@node3 ~]# iptables -L -n -v
Chain INPUT (policy DROP 119 packets, 11100 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1640  120K ACCEPT     tcp  --  *      *       192.168.1.0/24       192.168.1.7         tcp dpt:22 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.1.7         udp spt:53 
    4   336 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.1.7         icmp type 0 
    0     0 ACCEPT     icmp --  eth1   *       192.168.1.6          192.168.1.7         icmp type 8 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1129  131K ACCEPT     tcp  --  *      *       192.168.1.7          192.168.1.0/24      tcp spt:22 
    0     0 ACCEPT     udp  --  *      *       192.168.1.7          0.0.0.0/0           udp dpt:53 
    4   336 ACCEPT     icmp --  *      *       192.168.1.7          0.0.0.0/0           icmp type 8 
    0     0 ACCEPT     icmp --  *      eth1    192.168.1.7          192.168.1.6         icmp type 0

[root@node3 ~]# service iptables save
iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]
[root@node3 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Wed Jan 13 23:53:15 2016
*filter
:INPUT DROP [2456:219373]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [100:7280]
-A INPUT -s 192.168.1.0/24 -d 192.168.1.7/32 -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -d 192.168.1.7/32 -p udp -m udp --sport 53 -j ACCEPT 
-A INPUT -d 192.168.1.7/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 
-A INPUT -s 192.168.1.6/32 -d 192.168.1.7/32 -i eth1 -p icmp -m icmp --icmp-type 8 -j ACCEPT 
-A OUTPUT -s 192.168.1.7/32 -d 192.168.1.0/24 -p tcp -m tcp --sport 22 -j ACCEPT 
-A OUTPUT -s 192.168.1.7/32 -p udp -m udp --dport 53 -j ACCEPT 
-A OUTPUT -s 192.168.1.7/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT 
-A OUTPUT -s 192.168.1.7/32 -d 192.168.1.6/32 -o eth1 -p icmp -m icmp --icmp-type 0 -j ACCEPT 
COMMIT

6、清空当前配置,注意清空前默认策略设置为放行;

[root@node3 ~]# iptables -P INPUT ACCEPT
[root@node3 ~]# iptables -P OUTPUT ACCEPT
[root@node3 ~]# iptables –F
[root@node3 ~]# iptables -Z	

显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;

-m 扩展模块名称:

multiport:多端口匹配;可用于匹配非连续或连续端口,最多指定15个端口;

专用选项:离散,连续:
[!] --source-ports,--sports port[,port,port:port]
[!] --destination-ports,--dports port[,port,port:port]
--ports:指定源端口和目标端口;

示例:允许服务器所在网络所有主机访问主机的ssh和web服务;

[root@node3 ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.7 -p tcp -m multiport --dport 22,80 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -d 192.168.1.0/24 -p tcp -m multiport --sport 22,80 -j ACCEPT

iprange:匹配指定范围内的地址;匹配一段连续的地址而非整个网络时有用;

专用选项:
[!] --src-ragne IP[-IP]
[!] --dst-range IP[-IP]

示例:允许服务器ssh服务开放给192.168.1.1-192.168.1.100访问;

[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 22 -m iprange --src-range 192.168.1.1-192.168.1.100 -j ACCEPT
[root@node3 ~]# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 22 -m iprange --dst-range 192.168.1.1-192.168.1.100 -j ACCEPT

string:字符串匹配,能够检测报文应用层中的字符串;字符匹配检查高效算法:kmp,bm;

专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;

示例:禁止包含有“sex”的报文进入服务器;

[root@node3 ~]# iptables -I INPUT -m string --algo kmp --string "sex" -j DROP

time:基于时间做访问控制

专用选项:
--datestart
--datestop
    YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]...
    Mon, Tue,

示例:禁止工作时间(工作日的09:00-17:00)访问服务器的web资源;

[root@node3 ~]# iptables -I INPUT -d 192.168.1.7 -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT

connlimit:连接数限制,对每IP所能够发起并发连接数做限制;

专用选项:
[!] --connlimit-above [n]

示例:允许服务器ssh服务最大2个连接;

[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP

limit:速率限制

专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n

示例:限制ping往本机的请求包数量为每分钟20个,最大通过包数为5个;

[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

state:状态检查

专用选项:
--state 

连接追踪中的状态:

  NEW:新建立一个会话

  ESTABLISHED:已建立的连接

  RELATED:有关联关系的连接

  INVALID:无法识别的连接

注意:

整连接追踪功能所能容纳的连接的最大数目:

/proc/sys/net/nf_conntrack_max

当前追踪的所有连接:

/proc/net/nf_conntrack

不同协议或连接类型追踪时的属性:

/proc/sys/net/netfilter目录:

法则:

  1、对于进入的状态为ESTABLISHED都应该放行;

  2、对于出去的状态为ESTABLISHED都应该放行;

  3、严格检查进入的状态为NEW的连接;

  4、所有状态为INVALIED都应该拒绝;

示例:特殊应用:放行被动模式下的FTP服务:

  1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/

[root@node3 ~]# modprobe nf_conntrack_ftp
[root@node3 ~]# modprobe nf_nat_ftp
[root@node3 ~]# modprobe nf_conntrack

  2、放行请求报文:

  1)放行NEW状态对21端口请求的报文;

[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 21 -m state --state NEW -j ACCEPT

  2) 放行ESTABLISHED以及RELATED状态的报文

[root@node3 ~]# iptables -A INPUT -d 192.168.1.7 -p tcp --dport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT

  3、旅行响应报文:放行ESTABLISHED以及RELATED状态的报文

[root@node3 ~]# iptables -A OUTPUT -s 192.168.1.7 -p tcp --sport 21 -m state --state RELATED,ESTABLISHED -j ACCEPT

转载于:https://my.oschina.net/masachencer/blog/636295

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值