Iptables使用

iptables的组成

iptables不是真正的防火墙,可以理解为一个客户端代理,用户通过iptables这个代理,将用户安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架是netfilter

netfilter才是防火墙的安全框架,netfilter位于内核空间。

iptables是一个命令行工具,来操作真正的框架,准确的来说iptables并没有一个守护进程,所以不能算是真正意思的服务,应该算是内核提供的功能

链(内置):
    PREROUTING:路由前
    INPUT:到达本机内部的报文必经之路
    FORWARD:由本机转发的报文必经之路
    OUTPUT:由本机发出的报文的必经之路
    POSTROUTING:路由后


表(规则的功能):
    filter: 过滤,定义是否允许通过防火墙
    nat: 地址转换,启用connection_track
    mangle: 拆解报文,作出修改,封装报文
    raw: 目标是关闭nat表上启用的连接追踪功能;

各功能的分别实现:
    filter: INPUT, FORWARD, OUTPUT
    nat: PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT
    mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
    raw: PREROUTING, OUTPUT

数据报文流程:
    (1) 跟本机内部进程通信:
        进入:PREROUTING --> INPUT
        出去:OUTPUT  --> POSTROUTING

    (2) 由本机转发:
        PREROUTING  --> FORWARD  -->  POSTROUTING


    (3) 数据报文的流向:
        源IP和目标IP由流向决定;
        

    注意:报文不会经过自定义链,只能在内置链上通过规则引用自定义链生效

iptables的基本用法

语法:iptables [-t TABLE] COMMAND CHAIN  CRETIRIA -j TARGET

-t TABLE: 
    nat, mangle, raw, filter
    默认为filter

COMMAND:
    修改链:
        -F:flush, 清空规则链;
        -N:new, 建自定义的一条链
        -X: delete, 删除一条自定义的空链
        -Z:zero,计数器归零
        -P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;
            语法:iptables [-t table] -P chain target
            示例:iptables -P INPUT DROP   #设置INPUT链默认为DROP
        -E:重命名自定义链

    链中的规则:
        -A:将新规则追加与指定链的尾部
        -I:将新规则插入至指定链的指定位置
            语法:iptables [-t table] -I chain [rulenum] rule-specification
        -D:删除指定链上的指定规则
            语法:iptables [-t table] -D chain rulenum
            示例:iptables -D INPUT 2 #删除第二条规则
        -R:替换指定链上的指定规则
            语法:iptables [-t table] -R chain rulenum rule-specification

    查询:
        -L:列出指定链上的所有规则
            -n: 数字格式显示主机地址和端口;
            -v: 详细格式,-vv, -vvv
            --line-numbers: 显示规则编号
            示列:
                ~]# iptables -L -n -v
                pkts bytes  target     prot   opt in        out         source               destination
                包数 字节数   目标      协议  流入的接口    流出的接口      源地址               目标地址
            -x: exactly,不要对计数器的计数结果做单位换算,而显示其精确值
CHAIN:
    INPUT
    FORWARD
    OUTPUT
    PREROUTING
    POSTROUTING

CRETIRIA:
    匹配条件,下方详细解释

TARGET:
    DROP 丢弃
    REJECT 拒绝
    ACCEPT  接受
    RETURN   返回调用链
    REDIRECT 端口重定向
    LOG 记录日志
    MARK 做防火墙标记
    DNAT  目标地址转换
    SNAT 源地址转换
    MASQUERADE  地址伪装
    ……
    自定义的链

保存iptables规则

保存规则至指定文件
    iptables-save > /PATH/TO/SOMEFILE 
    
从指定文件重载规则
    iptables-restore < /PATH/TO/SOMEFILE
    
Centos6:
    service iptables save
        相当于 iptables-save >/etc/sysconfig/iptables
    
    service iptables restart
        相当于iptables-restore < /etc/sysconfig/iptables
        
关于firewalld:
    http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html

iptables的匹配条件

iptables [-t TABLE] -A 链名 匹配条件 -j TARGET

匹配条件:

1.通用匹配

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

2.扩展匹配

隐式扩展

当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项

-p tcp:
    --sport PORT[-PORT]: 指定源端口
    --dport PORT[-PORT]: 指定目标端口
        --tcp-flags

-p udp:
    --sport 
    --dport

-p icmp:
    --icmp-type 0  #不允许别人ping自己
    --icmp-type 8  #允许ping别人

显式扩展

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

multiport-多端口匹配

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

专用选项:
    --source-ports, --sports port[,port,port:port]
    --destination-ports, --dports
    --ports

例子:
~]# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT

iprange-匹配指定范围内的地址

匹配一段连续的地址而非整个网络时有用;

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

例子:
~]# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

string-字符串匹配,能够检测报文应用层中的字符串

字符匹配检查高效算法
    kmp, bm

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

例子:
~]# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP

time-基于时间做访问控制

专用选项:
    --datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
    --datestop 

    --timestart hh:mm[:ss]
    --timestop hh:mm[:ss]

    --weekdays day[,day]
        Mon, Tue,

例子:
~]# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT

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

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

例子:
~]# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP

limit-速率限制

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

例子:
~]# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

state-状态检查

专用选项:
    --state 
	
调整连接追踪功能所能容纳的连接的最大数目:
    /proc/sys/net/nf_conntrack_max

当前追踪的所有连接
    /proc/net/nf_conntrack

不同协议或连接类型追踪时的属性:
    /proc/sys/net/netfilter目录:

对于state模块而言,两台机器建立链接,其中的报文可以分为5种状态
连接追踪中的状态:
    NEW: 新建立一个会话
    ESTABLISHED:已建立的连接,再次建立通信
    RELATED: 有关联关系的连接
    INVALID: 无法识别的连接

例子:
~]# iptables -I INPUT -d 172.16.100.9 -p tcp --dport 22 -m state NEW,ESTABLISHED -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp --dport 22 -m state ESTABLISHED -j ACCEPT

练习1

放行被动模式下的FTP服务:

ftp的数据进程,依赖于命令进程的报文,所以数据传输需要放开RELATED报文状态

1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
    模块:nf_conntrack_ftp
	
装载模块:modprobe nf_conntrack_ftp
	
2、放行请求报文:
(1) 放行NEW状态对21端口请求的报文;
(2) 放行ESTABLISHED以及RELATED状态的报文

~]# iptable -A INPUT -d localIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptable -A INPUT -d localIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

3、放行响应报文:
(1) 放行ESTABLISHED(以及RELATED状态)的报文
~]# iptable -A OUTPUT -s localIP -p tcp -m state --state ESTABLISHED  -j ACCEPT

练习2

用iptables模拟网络防火墙

内网机:192.168.20.2
网关:
    192.168.20.1
    172.100.10.9(外网)
外网机:172.100.12

把网关模拟网络防火墙
~]# iptables -P FORWARD DROP
~]# iptables -F
~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A FORWARD -d 192.168.20.2 --dport 22,80 -m state --state NEW -j ACCEPT

iptables的NAT功能

nat:

SNAT:只修改请求报文的源地址

DNAT:只修改请求报文的目标地址

nat表:

PREROUTING:DNAT

OUTPUT

POSTROUTING:SNAT

如果想要NAT功能正常,需要开启linux主机的核心转发功能

echo 1 > /proc/sys/net/ipv4/ip_forward

SNAT相关操作

配置SNAT,可以隐藏网内主机的IP地址,可以共享公网IP访问互联网

~]# iptables -t nar -A POSTROUTING -s LocalNet -j SNAT --to-source 公网IP

如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作

~]# iptables -t nar -A POSTROUTING -s LocalNet -o eth0 -j MASQUERADE

说明:LocalNet是内网IP段,ExtIP是网关的外网IP(固定IP)

DNAT相关操作

配置DNAT,可以通过公网IP访问局域网内的服务

~]# iptables -t nar -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-dsetination LocalNet[:PORT]
注释:如果测试不可以,在内网服务器加SNAT规则

本机端口映射

~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT 00TO-PORTS 8080

iptables的自定义链

创建自定义链并引用

~]# iptables -t filter -N IN_WEB
~]# iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

修改自定义链名字

~]# iptables -E IN_WEB WEB

删除自定义链

~]# iptables -X WEB
posted @ 2022-04-15 20:49  彬彬l  阅读(240)  评论(0)    收藏  举报