iptables初探

iptables


  • 简述

  • 基础知识

  • 命令使用


简述

iptables是什么?netfilter又是什么?

iptables是位于用户控件的一个防火墙规则控制管理工具。netfilter是位于内核中的真正的防火墙,由五个钩子函数(hooks)而组成。

iptables的作用是什么?

用来添加,删除,管理netfilter规则。

netfilter的作用是什么?

起到过滤封包,转换与映射IP地址和端口,拆分和修改封包内容,追踪封包等功能,这些构成了四个功能表。

基础知识

组成部分

iptables:规则控制管理工具。
netfilter:位于内核空间的过滤器,实际上生效的部分。
    四表:大致根据功能可以分为四个,也就是在内部维护了四个表。
    五链:netfilter一共会在五个地方设置hooks,钩子函数,也就是说在五个地方会有关卡来过滤,依据不同的表,需要用到的链也是不同的。

五链(five hooks)

PREROUTING:进入路由前。
POSTROUTING:出路由前。
INPUT:进度内存空间前。
OUTPUT:出内存空间前。
FORWARD:转发链。

根据进入到出去的顺序为:
    PREROUTING -> INPUT -> OUTOUT -> POSTROUTING      进入本机用户空间处理。
    PREROUTING ->      FORWARD    -> POSTROUTING      进入本机后直接转发处理。

hooks

四表

根据优先级从低到高为:
    filter:过滤。
                INPUT OUTPUT FORWARD  
    nat:网络地址转换。
                PREROUTING POSTROUTING OUTPUT 
    mangle:报文拆分已经重装,修改报文内容。
                INPUT OUTPUT PREROUTING POSTROUTING FOEWARD
    raw:关闭NAT上启动的连接追踪机制。
                PREROUTING OUTPUT

协议类型

tcp:传输控制协议,可建立的是可靠的连接。
udp:用户数据包协议,建立的为不可靠的连接。
icmp:网络控制报文协议,iptables中主要用来控制ping报文。

常用的端口

ftp: tcp/20,21
ssh: tcp/22
telnet: tcp/23
smtp:tcp/25
http: tcp/80,8080
dns: tcp,udp/53
portmapper: tcp,udp/111
samba: udp/137,138  tcp/139,445,901
https: tcp/443
nfs: tcp,udp/2049  
mysql: tcp/3306
php-fpm: tcp/9000

命令使用

格式:

iptables [-t tables] -A|I|R [chain [num]] -[par] [value] -p [protocol [value]] -m [option [value]] -j [active [value]]

保存与重载:

Cnetos6:
iptables-save > /PATH/TO/FILE
iptables-restore < /PATH/TP/FILE

Centos7:引入了新的iptables管理工具,firewall。
firewalld-cmd
firewalld-config            *具体的使用方法可自行查阅官方文档。

常用参数:

iptables [-t table] {-A|-D} chain rule-specification                -A:添加
iptables [-t table] -I chain [rulenum] rule-specification           -I:插入
iptables [-t table] -R chain rulenum rule-specification             -R:替换
iptables [-t table] -D chain rulenum                                    -D:删除
iptables [-t table] -S [chain [rulenum]]                                -S:保存
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]       -F:清空规则 -L:列出规则 -Z:清零所有计数器
iptables [-t table] -N chain                                            -N:创建一个新的用户自定义链         
iptables [-t table] -X [chain]                                      -X:删除用户自定义链
iptables [-t table] -P chain target                                 -P:为一个链设定默认的策略,ACCEPT DROP REJECT
iptables [-t table] -E old-chain-name new-chain-name                    -E:重命名一个自定义链

通用匹配(-par [value])

-i [intface]    :指定作用的网卡。
-s [source-ip]:指定源地址。
-d [destination-ip]:指定目标地址。 
-f:匹配包分片后的除了第一个包外的其他包。

隐式扩展参数(-p protocol parm):

-tcp --dport|sport port
     --tcp-flags LIST1 LIST2  表示在list1的标记列表中,list所指定的值为1即被标识的包。
        例: -p tcp --tcp-flags ACK,SYN,FIN ACK  :匹配ACK被设置,但是SYN和FIN没有被标识的包。

udp --dport|sport port
        例: -p udp --dport 80  :标识匹配目标地址的80端口,所对应的如果为sport就为源地址的80端口。

icmp --icmp-type 0|8
    0:响应报文  8:请求报文
        例: -p icmp --icmp-type 0 :匹配icmp响应报文,详细的icmp code对照表会在最后附加。

显示扩展参数(-m parm):

mutilport --dports|sports|ports  port1,port2...
            例: -m mutilport --dports 22,80 :匹配目标地址端口22和80,可以指定一起指定多个端口,对应的sports源地址端口。

iprange [!] --src-range|--dst-range  ipsfrom-toip 
            例: -m iprange --dst-range 192.168.1.1-192.168.1.10 :匹配目标地址为192.168.1.1-192.168.1.10范围内的主机。
                -m iptange ! --src-range 192.168.1.100 :匹配源地址不是192.168.1.100的所有主机。

string --algo bm|kmp [!] --string 'parrern'   
        --algo bm|kmp 指定字符串查找算法。
            例: -m string --algo bm --string 'chrome' :匹配所有报文中出现了chrome字符的报文。
                -m string --algo kmp --sring 'ie8' :匹配所有报文中除了ie8字符外的所有报文。

limit --limit rate[/second|/minute|/hour|/day] 
      --limit-burst num
            例: -m limit --limite 30/minute :报文传输速率为每分钟最多30封报文,即2秒一封最大速率
                -m limit --limit-burst 100 :令牌桶允许存放100个令牌,如果存放的令牌超过100则开始丢弃令牌。

connlimit --connlimit-above num
          --conlimit-upto num
            例: -m connlimit --connlimit-above 30 :允许并发连接数量要小于30.
                 -m connlimit --connlimit-upto 10 : 允许并发连接数量大于10.

recent  --name #设定列表名称,默认DEFAULT。
        --rsource:源地址,此为默认。
        --rdest:目的地址
        --seconds:指定时间内
        --hitcount:命中次数
        --set:将地址添加进列表,并更新信息,包含地址加入的时间戳。
        --rcheck:检查地址是否在列表,以第一个匹配开始计算时间。
        --update:和rcheck类似,以最后一个匹配计算时间。
        --remove:在列表里删除相应地址,后跟列表名称及地址。
            例: -m recent --name web --set 
                -m recent --name web --update --seconds 300 -hitconut 10 -j DROP

mac [!] --mac-source address 
            例: -m mac --mac-source 00:00:00:00:00:00 :匹配mac地址为00:00:00:00:00:00的报文。

time --datastart yyyy-mm-dd --datastop yyyy-mm-dd
     --timestart hh:mm[:ss] --timestop hh:mm[:ss]
     [!] --monthdays day1,day2...
     [!] --weekdays day1,day2...
            例: -m time --datastart 2016-05-30 --datastop 2016-06-01 :匹配两个日期段内的报文。
               -m time --timestart 10:00:00 --tiomestop 18:30:00 :匹配两个时间段内的报文。
               -m time ! --monthdays 1-20 :匹配月除了1-20号外的所有天数。
               -m time --monthdays 25- :匹配25号之后的所有天数。
               -m time --weekdays 1-3 :匹配周的周一周二周三。
               -m time ! --weekdays 3,5 :匹配除了周三与周五的所有天。

state [!] --state INVALID|ESTABLISHED|NEW|RELATED
      INVALID:无法识别的连接。
      ESTABLISHED:建立新连接后,在此连接失效前的所有连接。
      NEW:新连接。
      RELATED:相关的连接,建立连接后产生的新连接等,如ftp协议第一次连接21命令通道后产生的20端口的数据通道连接。
            例:  -m state --state NEW,WSTABLISHED :新连接与ESTABLISHED连接。
                 -m state ! --state RELATED :除了无法识别的连接外的所有连接。

动作(-j active):

DROP:丢弃。
REJECT:允许。
ACCEPT:拒绝。  

RETURN::结束在目前规则链中的过滤程序,返回主规则链继续过滤。
LOG:记录日志
    --log-level NUM :日志等级。
    --log-prefix STRING :日志前缀。
MASQUEARDE:不设置地址转换,而采用地址隐藏的策略来使的iptables自动取得转换地址。
MARK:防火墙标记,用来批量标识地址和端口。
    --mark VALUE[/mask]

SNAT:源地址转换。
    --to-source IPADDR[:PORT]
DNAT:目标地址转换。
    --to-destination IPADDR[:PORT]

保存和导入

iptables-save [file] :保存规则到文件。
iptables-restore [file] :从文件导入规则。

常用命令组合示例:

iptables [-t filter] -L -n  :显示指定的表规则状况,默认为filter表。

iptables -A INTPUT -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT  放开80端口的请求。
iptables -A OUTPUT -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT  放开80端口的响应。

iptables -t mangle -A PREROUTING -d 192.168.1.1 -p tcp -m mutilport --dports 22,80 -j MARK --mark 100  将22和80端口设置为一个防火墙标记100。

iptables -t NAT -A POSTROUTING -s 192.168.1.0 -p tcp -j SNAT --to-source 172.16.0.1   所有内网网段192.168.1.0的ip都将被映射为172.16.0.1这个ip
iptables -t NAT -A PREROUTING -d 172.16.0.1 -p tcp -m mutilport --dports 22,80 -j DNAT --to-destination 192.168.1.1  所有目标ip 172.16.0.1的22,80请求都被转到192.168.1.1的相应端口上。

iptables -A INPUT -d 192.168.1.1 -p icmp --icmp-type 0 -j ACCEPT  允许icmp的响应报文。
iptables -A OUTPUT -s 192.168.1.1 -p icmp --icmp-type 8 -j ACCEPT  允许icmp的请求报文。

iptables -A FORWARD  -d 192.168.1.3 -p tcp --dport 80 -j ACCEPT  允许目标地址为192.168.1.3的请求转发。

原创文章,作者:Net18_肖肖,如若转载,请注明出处:http://www.178linux.com/17185