Linux学习笔记<三十四>――iptables

防火墙的简单定义:工作在主机或网络边沿,根据事先设定的规则对进出的报文进行检测,符合规则的就放行。


iptables是一个生成规则的命令,并将生成的规则添加到内核中的netfilter框架实现对数据报文的过滤。


iptables中的规则链

PREROUTING:数据进行路由判断前

INPUT:数据交给主机上层处理前

OUTPUT:数据从主机上层出去前

FORWARD:数据按照路由表转发时

POSTROUTING:数据送出网卡前


iptables中的表

filter(过滤):通常加到INTPUT、OUTPUT、FORWARD规则链中

nat(地址转换):通常加到PREROUTING(dnat)、POSTROUTING(snat)规则链中

mangle(拆开、修改、封装):可加到所有规则链中

raw(结合-j NOTRACK跳过其他表的处理):通常加到PREROUTING、OUTPUT规则链中

检查优先次序:raw->mangle->nat->filter


默认规则

默认全ACCEPT:堵特定的

默认全REJECT:通特定的


iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法

COMMAND

    管理规则

    -A CHAIN [num]:附加一条规则,添加在链的尾部

-I CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条

-D CHAIN [num]:删除指定链中的第num条规则

-R CHAIN [num]:替换指定的规则

    管理链:

-F [CHAIN]:清空指定规则链,如果省略就可以删除对应表中的所有链

-P CHAIN 动作:设定指定链的默认策略

-N:自定义一个新的空链

-X:删除一个自定义的空链

-Z:置零,指定链中所有规则的计数器

-E old_chain new_chain:重命名自定义的链

查看类:

-L:显示指定表中的规则

-n:以数字格式显示主机地址和端口号

-v:显示详细的信息

-vv:显示更详细的信息

-x:显示计数器的精确值

--line-numbers:显示规则号码


匹配标准

通用匹配

    -s,--src:指定源地址

-d,--dst:指定目的地址

-p {tcp|udp|icmp}:指定协议

-i INTERFACE:指定数据报文流入的接口,只用在PREOUTING,INPUT,FORWARD

-o INTERFACE:指定数据报文流出的接口,只用在OUTPUT,POSTROUTING,FORWAR

扩展匹配

隐含扩展:不用特别由哪3个模块进行的扩展

-p tcp

--sport PORT[-PORT]:源端口

--dport PORT[-PORT]:目标端口

-p icmp

--icmp-type

8:请求报文

0:应答报文

-p udp

--sport

--dport

显式扩展:使用额外的匹配机制,必须指明由哪个模块进行的扩展,在iptables中使                  用-m选项可完成此功能

-m state --state:结合ip_conntrack追踪会话的状态

NEW:新连接请求

ESTABLISHED:已建立的连接

INVALID:非法连接

RELATED:相关联的,用于ftp

例子:-m state --state NEW,ESTABLISHED -j ACCEPT


-m multiports:离散的多端口匹配扩展

--source-ports PORT1,PORT2,... (最多带15个端口)

--destination-ports

--ports

例子:-m multiports --ports 80,443 -j ACCEPT

-m iprange:IP范围

--src-range

--dst-range

例子:-m iprange --src-range 172.16.100.3-172.16.100.100 -j ACCEPT

-m connlimit:连接数限制

--connlimit-above n

            例子:-m connlimit ! --connlimit-above 2 -j ACCEPT

-m limit

--limit RATE:限制速率

--limit-burst n:限制一次的最大连接数

-m string:匹配字符串

--algo {bm|kmp}

--string "STRING"

            例子:-m string --algo kmp --string"h7n9" -j DROP


处理办法

    ACCEPT:放行

DROP:丢弃

REJECT:拒绝

DNAT:目标地址转换,添加到PREROUTING规则链上

SNAT:源地址转换,添加到POSTROUTING规则链上

REDIRECT:端口重定向

MASQUERADE:地址伪装

LOG:日志

--log-prefix "STRING"

MARK:打标记


装载或移除iptables/netfilter相关的内核模块

编辑/etc/sysconfig/iptables-config,修改为IPTABLES_MODULES="..."字段,在""内增删。

常见模块:iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack:跟踪连接会话处于什么状态


保存规则

# service iptables save

保存到/etc/sysconfig/iptables

# service iptables save > /path/to/file

# iptables-restore < /path/to/file

iptstate 查看与本机有关的连接的状态

相关文件:/proc/net/ip_conntrack  /proc/sys/net/ipv4/ip_conntrack_max

sysctl -w net.ipv4.ip_conntrack_max=65535    立即生效

编辑/etc/sysctl.conf                  永久生效

/proc/sys/net/ipv4/netfilter/*



利用iptables的recent模块来抵御DOS攻击


iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP


1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。


下面对最后两句做一个说明:

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

--update 是指每次建立连接都更新列表;

--seconds必须与--rcheck或者--update同时使用

--hitcount必须与--rcheck或者--update同时使用

3.iptables的记录:/proc/net/ipt_recent/SSH


也可以使用下面的这句记录日志:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"



练习:判断下述规则的意义:

# iptables -N clean_in

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP


# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

# iptables -A clean_in -d 172.16.100.7 -j RETURN 



# iptables -A INPUT -d 172.16.100.7 -j clean_in


# iptables -A INPUT  -i lo -j ACCEPT

# iptables -A OUTPUT -o lo -j ACCEPT



# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP


# iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT


你可能感兴趣的:(iptables,Linux学习)