iptables

本文总阅读量

iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。

iptables知识点

查看iptables 规则

1、iptables -L

查看filter表的iptables规则,包括所有的链。filter表包含INPUT、OUTPUT、FORWARD三个规则链。

说明:-L是–list的简写,作用是列出规则。

2、iptables -L [-t 表名]

只查看某个表的中的规则。

说明:表名一个有三个:filter,nat,mangle,如果没有指定表名,则默认查看filter表的规则列表(就相当于第一条命令)。

举例:iptables -L -t filter

3、iptables -L (-t 表名)(链名)

这里多了个链名,就是规则链的名称。

说明:iptables一共有INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING五个规则链。

举例:iptables -L INPUT

注意:链名必须大写。在Linux系统上,命令的大小写很敏感。

4、iptables -n -L

说明:以数字形式显示规则。如果没有-n,规则中可能会出现anywhere,有了-n,它会变成0.0.0.0/0

5、iptables -nv -L

说明:这个列表看起来更详细.

6、删除规则(-D)

如果想删除iptables规则我们可以如下操作

如删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):

[root@test ~]# iptables -D INPUT -s 192.168.1.5 -j DROP

有时候要删除的规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-number找出该条规则的行号,再通过行号删除规则。

[root@test ~]# iptables -nv –line-number

iptables v1.4.7: no command specified

Try `iptables -h’ or ‘iptables –help’ for more information.

[root@test ~]# iptables -nL –line-number

Chain INPUT (policy ACCEPT)

num target prot opt source destination

1 DROP all – 192.168.1.1 0.0.0.0/0

2 DROP all – 192.168.1.2 0.0.0.0/0

3 DROP all – 192.168.1.3 0.0.0.0/0

删除第二行规则

[root@test ~]# iptables -D INPUT 2

添加iptables规则

首先,从网络上出现最多的例子开始说起.

# iptables -A INPUT -p tcp –dport 80 -m connlimit –connlimit-above 50 -j DROP

  • -A

    填写的参数是链,目前iptables中有preouting, input, output, forward,postrouting链.详细参考

  • -p

    填写的是Tcp/ip协议簇

  • -dport

    填写连接到本机的端口

  • -m

    使用iptables的模块,示例中使用了connlimit模块,并且使用了里面的connlimit-above 和connlimit- mask,其中connlimit-above是连接数统计,如果大于50就满足条件,而connlimit-mask是定义组机,此处的数值是网络为,即子网掩码,示例中的子网掩码为0则表示所有ip

  • -j

    表示满足条件后执行的动作,以下为所有动作列表.

    ACCEPT #允许数据包通过

    DROP #丢弃数据包,不对该数据包进一步处理

    REFECT #丢弃数据包,同时发送响应报文

    –reject-with tcp-reset 返回tcp重置

    –reject-with icmp-net-unreachable 返回网络不可达

    –reject-with icmp-host-unreachable 返回主机不可达

    RETURN #转到其它链处理

    LOG #将数据包信息记录到syslog

此外,还有:

  • -s

    指定源地址

  • -d

    指定目标地址

  • -i

    指定数据报文流入接口

  • -o

    指定数据报文流出接口

iptables的日志

将上面的例子改为

# iptables -A INPUT -p tcp –dport 80 -m connlimit –connlimit-above 50 -j LOG –log-prefix ‘IptableslOG:’ –log-ip-options

iptables会对满足条件的连接打印出log而不是drop掉,其中 –log-profix是可以让用户自定义的log前缀, 合理的log-profix能让自己更快速的找到日志(使用grep),

–log-ip-options则是记录包中的ip header

除此之外,log还支持其他参数.

  • –log-tcp-sequence

    记录保中的TCP序列号

  • –log-tcp-options

    记录保重的TCP header

  • –log-uid

    记录生成数据包的进程的用户标识。

  • –log-level

    生成的日志等级, 等级对应说明如下:

  • 0 (KERN_EMERG) 系统无法使用

    • 1 (KERN_ALERT) 必须立即处理

    • 2 (KERN_CRIT) 关建事件

    • 3 (KERN_ERR) 非关键事件错误

    • 4 (KERN_WARNING) 应该注意的警告事件

    • 5 (KERN_NOTICE) 正常但比较重要的事件

    • 6 (KERN_INFO) info事件

    • 7 (KERN_DEBUG) 内核调试消息

之后满足条件iptables就可能产生一段如下一段日志(来源于网上)

Jun 19 17:20:04 webkernel: NEW DRAP IN=eth0 OUT=MAC=00:10:4b:cd:7b:b4:00:e0:le:b9:04:al:08:00SRC=192.168.150.1 DST=192.168.150.152 LEN=20 TOS=0X00 PREC=0x00 TTL=249ID=10492 DF PROTO=UDP SPT=53 DPT=32926 LEN=231

| 序号 | 字段名称 | 含义 |

| ——– | ———————————————————— | ———————————————————— |

| 1 | Jun 19 17:20:24 | 日期时间,由syslog生成 |

| 2 | Web | 主机名称 |

| 3 | Kernel | 进程名由syslogd生成kernel为内核产生的日志说明netfilter在内核中运行 |

| 4 | NEW_DRAP | 记录前缀,由用户指定—log-prefix”NEW_DRAP” |

| 5 | IN=eth0 | 数据包进入的接口,若为空表示本机产生,接口还有eth0、br0等 |

| 6 | OUT= | 数据包离开的接口,若为空表示本机接收 |

| 7 | MAC=00:10:4b:cd:7b:b4:00:e0:le:b9:04:al | 00:10:4b:cd:7b:b4 为目标MAC地址00:e0:le:b9:04:al 为源MAC地址 |

| 8 | 08:00 | 08:00 为上层协议代码,即表示IP协议 |

| 9 | SRC=192.168.150.1 | 192.168.150.1为源IP地址 |

| 10 | DST=192.168.150.152 | 192.168.150.152w为目标IP地址 |

| 11 | LEN=20 | IP封包+承载数据的总长度(MTU) |

| 12 | TOS=0x00 | IP包头内的服务类型字段,能反应服务质量包括延迟、可靠性和拥塞等 |

| 13 | PREC=0x00 | 服务类型的优先级字段 |

| 14 | TTL=249 | IP数据包的生存时间 |

| 15 | ID=10492 | IP数据包标示 |

| 16 | DF | DF表示不分段,此字段还可能为MF/FRAG |

| 17 | PROTO=UDP | 传输层协议类型,它代表上层协议是什么可分为TCP、UDP、ICMP等 |

| 18 | SPT=53 | 表示源端口号 |

| 19 | DPT=32926 | 表示目的端口号 |

| 20 | LEN=231 | 传输层协议头长度 |

| 21 | SEQ= 内容略 | TCP序列号 |

| 22 | ACK=内容略 | TCP应答号 |

| 23 | WINDOWS=内容略 | IP包头内的窗口大小 |

| 24 | RES | TCP-Flags中ECN bits的值 |

| 25 | CWR/ECE/URG/ACK/PSH/RST/SYN/FIN | TCP标志位 |

| 26 | URGP= | 紧急指针起点 |

| 27 | OPT( 内容略 ) | IP或TCP选项,括号内为十六进制 |

| 28 | INCOMPLETE[65535 bytes] | 不完整的数据包 |

| 29 | TYPE=CODE=ID=SEQ=PARAMETER= | 当协议为ICMP时出现 |

| 30 | SPI=0xF1234567 | 当前协议为AHESP时出现 |

| 31 | SYN | TCP-Flags中的SYN标志,此外还有FIN/ACK/RST/URG/PSH几种 |

| 32 | [ ] | 中括号出现在两个地方,在ICMP协议中作为协议头的递归使用;在数据包长度出现非法时用于指出数据实际长度 |

让日志变得清晰

目前iptables产生的日志会到了系统的日志里面,利用rsyslog则可以把日志分发到其他地方.(需要系统是使用rsyslog)

  1. 在rsyslog.conf 添加配置

    /etc/rsyslog.conf中添加不同的日志级别(默认warn(=4))

kern.warning /var/log/iptables.log

kern.debug /var/log/iptables.log

kern.info /var/log/iptables.log

如果全部都加入系统日志的话使用(推荐): kern.* /var/log/iptables.log

重启日志配置: /etc/init.d/rsyslogd restart

  1. 让日志rotate(滚动)

    vim /etc/logrotate.d/syslog

    加入/var/log/iptables

这样配置完就有iptables对应的log文件啦

一些使用例子与说明

  • 清空当前的所有规则和计数
1
2
3
4
5
6
7

iptables -F # 清空所有防火墙规则

iptables -X # 删除用户自定义的空链

iptables -Z # 清空计数

  • 允许ssh端口连接

如下例子,22端口是ssh的端口, 192.168.1.0/24表示该网段的所有ip(使用了CIDR,也就是192.168.0.1~192.168.0.254)

1
2
3

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport -j ACCEPT

  • 允许本地回环地址可以正常使用
1
2
3
4
5

iptables -A INPUT -i lo -j ACCEPT #本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许

iptables -A OUTPUT -o lo -j ACCEPT

  • 每秒中最多允许5个新连接
1
2
3

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT

  • 防止各种端口扫描
1
2
3

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

  • 防止ping洪水攻击
1
2
3

iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

  • 关闭别人对服务器的ping
1
2
3

iptables -A INPUT -p icmp -j DROP

  • 防止同步包洪水(Sync Flood)
1
2
3

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

  • 利用recent模块 限制60秒内只有10个新链接

例子中的–SYN TCP是由于syn的tcp中建立连接时的第一个包,通过–syn可以限定TCP 连接

而使用了 state new则无需再使用 –SYN,因为state new包括TCP UDP IMCP参考链接

1
2
3

iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP

iptables可以通过模块来执行许多灵活的功能,如:

  • -m state –state

    NEW,ESTABLISHED,RELATED 表示用state模块来匹配当前连接状态为这三种状态的连接

  • -m iprange

  • -src-range 用iprange模块匹配来源的ip地址范围

  • -dst-range 用iprange模块匹配目的的ip地址范围

  • -m multiport

  • -source-ports 用multiport模块来匹配来源的端口范围

  • -destination-ports 用multiport模块来匹配目的的端口范围

在配置文件中配置

使用命令配置时,配置的信息是存在于内存中的,重启iptables或重启计算机后就没有了,配置在配置文件能让iptables启动后能重新把配置加载到内存.

使用vim /etc/sysconfig/iptables打开配置文件

加上对应的命令即可(前面不需要iptables)了

最后执行命令:# /etc/init.d/iptables restar重启iptables

以下是来源于网络上的配置文件(越容易被执行的条件越应该房前面)

# Generated by iptables-save v1.4.7 on Wed Sep 28 18:06:07 2016

*filter

:INPUT DROP [8:632]

:FORWARD DROP [0:0]

:OUTPUT ACCEPT [4:416]

-A INPUT -s 192.168.1.0/24 -p tcp -m tcp –dport 22 -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -s 192.168.1.0/24 -j ACCEPT

-A INPUT -s 192.168.140.0/24 -j ACCEPT

-A INPUT -s 183.121.3.7/32 -p tcp -m tcp –dport 3380 -j ACCEPT

-A INPUT -p tcp -m tcp –dport 80 -j ACCEPT

-A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT

-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

-A OUTPUT -o lo -j ACCEPT

COMMIT

# Completed on Wed Sep 28 18:06:07 2016

前4行说明

*filter #代表接下来的配置都是在filter表上的。我们默认的配置都在filter表上的,当然还有其它表,如raw,mangle,nat

:INPUT DROP [8:632] #代表filter表上默认的input chain为drop ,对应上面的命令iptables -P INPUT DROP,中括号里面的两个数字代表的是这条链上已经接受到的包的数量及字节数量[包的数量:包的总字节数]

:FORWARD DROP [0:0] #代表filter表上默认的forward chain为drop ,对应上面的命令iptables -P FORWARD DROP,中括号里面的两个数字代表的是这条链上已经接受到的包的数量及字节数量[包的数量:包的总字节数]

:OUTPUT ACCEPT [4:416] #代表filter表上默认的forward chain为drop ,对应上面的命令iptables -P OUTPUT ACCEPT,中括号里面的两个数字代表的是这条链上已经接受到的包的数量及字节数量[包的数量:包的总字节数]

查看评论