阿汤博客-承接中小企业服务器维护和网站维护,有意者可以联系博主!

Linux防火墙iptables

学习笔记 418℃ 0评论

Linux防火墙

netfilter:frame

iptables:数据报文过滤,NAT、mangle等规则生成的工具

网络:IP报文首部,TCP报文首部

Linux防火墙iptables

防火墙:硬件、软件:规则(匹配标准,处理办法)

Framework: 

默认规则:

开放:堵

关闭:通

规则:匹配标准

IP:源IP,目标IP

TCP:源端口(sport),目标端口(dport),SYN=1,FIN=0,RST=0,ACK=0 ; SYN=1,ACK=1,FIN=0,RST=0 ;ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)

UDP:源端口(sport),目标端口(dport)

ICMP:icmp-type

数据报文过滤:

OpenDBS

Linux2.0

ipfw/firewall

Linux2.2

ipchain/firewall

Linux2.4

iptables/netfilter

hook function:钩子函数

prerouting

input

output

forward

postrouting

规则链:

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

filter(过滤):表

input 进

output 出

forward 转发

nat(地址转换):表

prerouting

output

postrouting

mangle(拆开、修改、封装):表

prerouting

input

forward

output

postrouting

raw():

prerouting

output

数据包过滤匹配流程

Linux防火墙iptables

可以使用自定义链,但只在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制

用户可以删除自定义的空链

默认链无法删除

每个规则都有两个内置的计数器

被匹配的报文个数

被匹配的报文大小之和

规则:匹配标准,处理动作

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

匹配标准:

通用匹配

-s, –src :指定源地址

-d, –dst:指定目标地址

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

-i INTERFACE :指定数据报文流入的接口

可用于定义标准的链:PREOUTING,INPUT,FORWARD

-o INTERFACE:指定数据报文流出的接口

可用于标准定义的链:OUTPUT ,POSTROUTING,FORWARD

扩展匹配

隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用 -p {tcp|udp|icmp}

–sport PORT[-PORT]: 源端口

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

–tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;

–tcp-flags SYN,FIN,ACK,RST SYN = –syn

–syn:匹配tcp三次握手的第一次

-p icmp

–icmp-type 

0: echo-reply 响应报文

8: echo-request 请求报文

iptables -A INPUT -d 172.16.100.7 -p icmp –icmp-type 8 -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 172.16.100.7 -p icmp –icmp-type 0 -m state –state ESTABLISHED -j ACCEPT

-p udp

–sport

–dport

-p tcp –dport

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

-m EXTESTION –spe-opt

state: 状态扩展

结合 追踪会话的状态

NEW: 新连接请求

ESTABLISHED:已建立的连接

INVALID:非法连接

RELATED:相关联的

-m state –state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -d 172.16.100.7 -p tcp -m state –state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 172.16.100.7 -m state –state RELATED,ESTABLISHED -j ACCEPT

ftp服务首先要装载ip_conntrack_ftp和ip_nat_ftp模块

#vim /etc/sysconfig/iptables-config 

IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"

iptables -A INPUT -d 172.16.100.7 -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT

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

–source-ports

–destination-ports

–ports

-m multiport –destination-ports 21,22,80 -j ACCEPT

条件取反:!,-s ! 172.16.100.6

-m iprange

–src-range

–dst-range

-s,-d

-s IP ,NET

172.16.0.0/16 , 172.16.100.3-172.16.100.100

iptables -A INPUT -p tcp -m iprange –src-range 172.16.100.3-172.16.100.100 –dport 22 -m state –state NEW,ESTABLISHED -j ECCEPT

-m connlimit :链接数限制

! –connlimit-above n

iptables -A INPUT -d 172.16.100.7 -p tcp –dport 80 -m connlimit –connlimit-above 2 -j ACCEPT

-m limit

–limit RATE:#/minute  #/second

–limit-burst  :#最多同时几个

iptables -A INPUT -d 172.16.100.7 -p icmp –icmp-type 8 -m limit –limit 5/minute –limit-burst 6  -j ACCEPT

-m string

–algo {bm|kmp}

–sting "STRING"

iptables -A OUTPUT -s 172.16.100.7 -p tcp –drort 80 -m sting –algo kmp –sting "hehe"  -j REJECT

处理动作:

-j  TARGET :

ACCEPT:通过

DROP:丢弃

REJECT:拒绝

LOG

–log-prefix "SRTING"

命令:

管理规则

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

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

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

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

管理链:

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

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

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

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

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

-E: 重命名自定义的链;

查看类:

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

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

-v: 显示链及规则的详细信息

-vv: 

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

–line-numbers: 显示规则号码

动作(target):

ACCEPT:放行

DROP:丢弃

REJECT:拒绝

DNAT:目标地址转换

SNAT:源地址转换

REDIRECT:端口重定向

MASQUERADE:地址伪装

LOG:日志

MARK:打标记

RETURN:返回,在自定义链执行完毕后使用返回,来返回原规则链

iptables -t filter -A INPUT -s 172.16.0.0/16 -j DROP

例:允许172.16.100.7,sshd:22/tcp被访问

iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp –dport 22 -j ACCEPT

iptables -t filter -A OUTPUT -s 172.16.0.7 -d 172.16.0.0/16 -p tcp –sport 22 -j ACCEPT

iptables不是服务,但有服务脚本;服务脚本的主要作用在于管理保存的规则

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

iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, nf_conntrack

nf_conntrack:cat /proc/net/nf_conntrack

/proc/sys/net/nf_conntrack_max 记录数量

/proc/sys/net/netfilter/

保存规则:

#service iptables save

/etc/sysconfig/iptables

#iptables -save > /etc/sysconfig/iptables.2016

#iptables -restore < /etc/sysconfig/iptables.2016

默认规则

iptables -A INPUT -d 192.168.108.130 -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT 

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -d 192.168.108.130 -p tcp -m multiport –destination-ports 21,22,80,3306 -m state –state NEW -j ACCEPT

iptables -A INPUT -d 192.168.108.130 -p icmp –icmp-type 8 -m limit –limit 1/second –limit-burst 5 -j ACCEPT

iptables -A OUTPUT -s 192.168.108.130/32 -m state –state RELATED,ESTABLISHED -j ACCEPT 

iptables -P INPUT DROP

iptables -P OUTPUT DROP

service iptables save

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

# 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的recent模块来抵御DOS攻击

ssh: 远程连接,

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"

NAT :Network address Translation

DNAT:目标地址转换

SNAT:源地址转换(POTROUTING, OUTPUT)

-j SNAT

–to-source

-j MASQUERADE 自动识别外网网卡

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to-source 123.2.13.2

-j DNAT

–to-destination IP[:port]

iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp –dport 80 -j DNAT –to-destination 192.168.100.2

PNAT:port NAT

layer7 — l7

应用:xunlei, qq, netfilter<–patch

-m layer7 –l7proto xunlei -j DROP

1、给内核打补丁,并重新编译内核

2、给iptables源码打补丁,并重新编译iptables

3、安装l7proto

kernel, patch

iptables, patch

Kernel Patch

# tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src

# tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src

# cd /usr/src

# ln –s  linux-2.6.28.10  linux

# cd /usr/src/linux/

# patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch 

# cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config

# make  menuconfig

Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration

<M>  Netfilter connection tracking support 

<M>  “layer7” match support

<M>  “string” match support

<M>  “time”  match support

<M>  “iprange”  match support

<M>  “connlimit”  match support

<M>  “state”  match support

<M>  “conntrack”  connection  match support

<M>  “mac”  address  match support

<M>   "multiport" Multiple port match support

Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration

<M> IPv4 connection tracking support (required for NAT)

<M>   Full NAT

<M>     MASQUERADE target support                                                                                   

<M>     NETMAP target support                                                                               

<M>     REDIRECT target support 

# make 

# make modules_install

# make install

Compiles iptables :

# cp /etc/init.d/iptables ~/iptables

# cp /etc/sysconfig/iptables-config ~/

# rpm  -e  iptables-ipv6  iptables  iptstate  –nodeps

# tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src

# cd /usr/src/iptables-1.4.6

# cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*   ./extensions/

# ./configure  –prefix=/usr  –with-ksource=/usr/src/linux

# make

# make install

# tar zxvf l7-protocols-2009-05-28.tar.gz

# cd l7-protocols-2009-05-28

# make install

# mv ~/iptables  /etc/rc.d/init.d/

# service iptables start

l7-filter uses the standard iptables extension syntax 

# iptables [specify table & chain] -m layer7 –l7proto [protocol name] -j [action] 

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT –to-source 172.16.100.7

iptables -A FORWARD -s 192.168.10.0/24 -m layer7 –l7proto qq -j REJECT

-m time

–datestart  –datestop

–timestart   –timestop

iptables -A FORWARD -s 192.168.10.0/24 -m time –timestart 08:10:00 –timestop 12:00:00 -j DROP

iptables -A FORWARD -s 192.168.10.0/24 -m time –timestart 14:30:00 –timestop 18:00:00 -j DROP

iptables脚本:

#!/bin/bash

ipt=/usr/sbin/iptables

einterface=eth1

linterface=eth0

eip=172.16.100.7

lip=192.168.10.6

$ipt -t nat -F

$ipt -t filter -F

$ipt -t mangle -F

$ipt -N clean_up

$ipt -A clean_up -d 255.255.255.255 -p icmp -j DROP

$ipt -A clean_up -j RETURN

IDS:

nids:snort + iptables =NIPS

hids:

转载请注明:阿汤博客 » Linux防火墙iptables

喜欢 (0)or分享 (0)