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)
在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
让日志rotate(滚动)
vim /etc/logrotate.d/syslog
加入/var/log/iptables
这样配置完就有iptables对应的log文件啦
一些使用例子与说明
- 清空当前的所有规则和计数
1 |
|
- 允许ssh端口连接
如下例子,22端口是ssh的端口, 192.168.1.0/24表示该网段的所有ip(使用了CIDR,也就是192.168.0.1~192.168.0.254)
1 |
|
- 允许本地回环地址可以正常使用
1 |
|
- 每秒中最多允许5个新连接
1 |
|
- 防止各种端口扫描
1 |
|
- 防止ping洪水攻击
1 |
|
- 关闭别人对服务器的ping
1 |
|
- 防止同步包洪水(Sync Flood)
1 |
|
- 利用recent模块 限制60秒内只有10个新链接
例子中的–SYN TCP是由于syn的tcp中建立连接时的第一个包,通过–syn可以限定TCP 连接
而使用了 state new则无需再使用 –SYN,因为state new包括TCP UDP IMCP参考链接
1 |
|
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,中括号里面的两个数字代表的是这条链上已经接受到的包的数量及字节数量[包的数量:包的总字节数]
- 本文作者:So1n
- 本文链接:http://so1n.me/2019/04/15/iptables/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!