iptables 详细教程.docx
《iptables 详细教程.docx》由会员分享,可在线阅读,更多相关《iptables 详细教程.docx(28页珍藏版)》请在冰豆网上搜索。
![iptables 详细教程.docx](https://file1.bdocx.com/fileroot1/2023-1/29/a079f952-ed26-487f-9307-8037df71d147/a079f952-ed26-487f-9307-8037df71d1471.gif)
iptables详细教程
iptables四个表五条链
其实关于iptables的使用网上的资料和教程也比较多,主要是要理解其中的路由前和路由后每个表和链所处的位置和作用,明白了也就简单了,以下是我转载的觉得写的比较详细的一篇博客,有时间我将写一篇关于这些表和链的实质性的配置例子。
一、netfilter和iptables说明:
1、 netfilter/iptablesIP信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。
这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。
在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
虽然netfilter/iptablesIP信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter和iptables组成。
(1).netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
(2).iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
iptables包含4个表,5个链。
其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
2、 4个表:
filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。
表的处理优先级:
raw>mangle>nat>filter。
filter:
一般的过滤功能
nat:
用于nat功能(端口映射,地址映射等)
mangle:
用于对特定数据包的修改
raw:
有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。
一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
RAW表可以应用在那些不需要做nat的情况下,以提高性能。
如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
3、5个链:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:
数据包进入路由表之前
INPUT:
通过路由表后目的地为本机
FORWARD:
通过路由表后,目的地不为本机
OUTPUT:
由本机产生,向外转发
POSTROUTIONG:
发送到网卡接口之前。
如下图:
iptables中表和链的对应关系如下:
二、iptables的数据包的流程是怎样的?
一个数据包到达时,是怎么依次穿过各个链和表的(图)。
基本步骤如下:
1.数据包到达网络接口,比如eth0。
2.进入raw表的PREROUTING链,这个链的作用是赶在连接跟踪之前处理数据包。
3.如果进行了连接跟踪,在此处理。
4.进入mangle表的PREROUTING链,在此可以修改数据包,比如TOS等。
5.进入nat表的PREROUTING链,可以在此做DNAT,但不要做过滤。
6.决定路由,看是交给本地主机还是转发给其它主机。
到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:
7.进入mangle表的FORWARD链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
8.进入filter表的FORWARD链,在这里我们可以对所有转发的数据包进行过滤。
需要注意的是:
经过这里的数据包是转发的,方向是双向的。
9.进入mangle表的POSTROUTING链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
10.进入nat表的POSTROUTING链,在这里一般都是用来做SNAT,不要在这里进行过滤。
11.进入出去的网络接口。
完毕。
另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
7.进入mangle表的INPUT链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
8.进入filter表的INPUT链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
9.交给本地主机的应用程序进行处理。
10.处理完毕后进行路由决定,看该往那里发出。
11.进入raw表的OUTPUT链,这里是在连接跟踪处理本地的数据包之前。
12.连接跟踪对本地的数据包进行处理。
13.进入mangle表的OUTPUT链,在这里我们可以修改数据包,但不要做过滤。
14.进入nat表的OUTPUT链,可以对防火墙自己发出的数据做NAT。
15.再次进行路由决定。
16.进入filter表的OUTPUT链,可以对本地出去的数据包进行过滤。
17.进入mangle表的POSTROUTING链,同上一种情况的第9步。
注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
18.进入nat表的POSTROUTING链,同上一种情况的第10步。
19.进入出去的网络接口。
完毕。
三、iptablesraw表的使用
增加raw表,在其他表处理之前,-jNOTRACK跳过其它表处理
状态除了以前的四个还增加了一个UNTRACKED
例如:
可以使用“NOTRACK”target允许规则指定80端口的包不进入链接跟踪/NAT子系统
iptables-traw-APREROUTING-d1.2.3.4-ptcp--dport80-jNOTRACK
iptables-traw-APREROUTING-s1.2.3.4-ptcp--sport80-jNOTRACK
iptables-AFORWARD-mstate--stateUNTRACKED-jACCEPT
四、解决ip_conntrack:
tablefull,droppingpacket的问题
在启用了iptablesweb服务器上,流量高的时候经常会出现下面的错误:
ip_conntrack:
tablefull,droppingpacket
这个问题的原因是由于web服务器收到了大量的连接,在启用了iptables的情况下,iptables会把所有的连接都做链接跟踪处理,这样iptables就会有一个链接跟踪表,当这个表满的时候,就会出现上面的错误。
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。
所以解決方法一般有两个:
(1)加大ip_conntrack_max值
vi/etc/sysctl.conf
net.ipv4.ip_conntrack_max=393216
filter.ip_conntrack_max=393216
(2):
降低ip_conntracktimeout时间
vi/etc/sysctl.conf
filter.ip_conntrack_tcp_timeout_established=300
filter.ip_conntrack_tcp_timeout_time_wait=120
filter.ip_conntrack_tcp_timeout_close_wait=60
filter.ip_conntrack_tcp_timeout_fin_wait=120
上面两种方法打个比喻就是烧水水开的时候,换一个大锅。
一般情况下都可以解决问题,但是在极端情况下,还是不够用,怎么办?
这样就得反其道而行,用釜底抽薪的办法。
iptables的raw表是不做数据包的链接跟踪处理的,我们就把那些连接量非常大的链接加入到iptablesraw表。
如一台web服务器可以这样:
iptables-traw-APREROUTING-d1.2.3.4-ptcp--dport80-jNOTRACK
iptables-AFORWARD-mstate--stateUNTRACKED-jACCEPT
五、实例说明:
1、单个规则实例
iptables-F?
#-F是清除的意思,作用就是把FILTRETABLE的所有链的规则都清空
iptables-AINPUT-s172.20.20.1/32-mstate--stateNEW,ESTABLISHED,RELATED-jACCEPT
#在FILTER表的INPUT链匹配源地址是172.20.20.1的主机,状态分别是NEW,ESTABLISHED,RELATED的都放行。
iptables-AINPUT-s172.20.20.1/32-mstate--stateNEW,ESTABLISHED-ptcp-mmultiport--dport123,110-jACCEPT
#-p指定协议,-m指定模块,multiport模块的作用就是可以连续匹配多各不相邻的端口号。
完整的意思就是源地址是172.20.20.1的主机,状态分别是NEW,ESTABLISHED,RELATED的,TCP协议,目的端口分别为123和110的数据包都可以通过。
iptables-AINPUT-s172.20.22.0/24-mstate--stateNEW,ESTABLISHED-ptcp-mmultiport--dport123,110-jACCEPT
iptables-AINPUT-s0/0-mstate--stateNEW-ptcp-mmultiport--dport123,110-jDROP
#这句意思为源地址是0/0的NEW状态的的TCP数据包都禁止访问我的123和110端口。
iptables-AINPUT-s!
172.20.89.0/24-mstate--stateNEW-ptcp-mmultiport--dport1230,110-jDROP
#"!
"号的意思取反。
就是除了172.20.89.0这个IP段的地址都DROP。
iptables-RINPUT1-s192.168.6.99-ptcp--dport22-jACCEPT
替换INPUT链中的第一条规则
iptables-tfilter-LINPUT-vn
以数字形式详细显示filter表INPUT链的规则
#-------------------------------NATIP--------------------------------------
#以下操作是在NATTABLE里面完成的。
请大家注意。
iptables-tnat-F
iptables-tnat-APREROUTING-d192.168.102.55-ptcp--dport90-jDNAT--to172.20.11.1:
800
#-APREROUTING指定在路由前做的。
完整的意思是在NATTABLE的路由前处理,目的地为192.168.102.55的目的端口为90的我们做DNAT处理,给他转向到172.20.11.1:
800那里去。
iptables-tnat-APOSTROUTING-d172.20.11.1-jSNAT--to192.168.102.55
#-APOSTROUTING路由后。
意思为在NATTABLE的路由后处理,凡是目的地为172.20.11.1的,我们都给他做SNAT转换,把源地址改写成192.168.102.55。
iptables-AINPUT-d192.168.20.0/255.255.255.0-ieth1-jDROP
iptables-AINPUT-s192.168.20.0/255.255.255.0-ieth1-jDROP
iptables-AOUTPUT-d192.168.20.0/255.255.255.0-oeth1-jDROP
iptables-AOUTPUT-s192.168.20.0/255.255.255.0-oeth1-jDROP
#上例中,eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,上述规则用来防止IP欺骗,因为出入eth1的包的ip应该是公共IP
iptables-AINPUT-s255.255.255.255-ieth0-jDROP
iptables-AINPUT-s224.0.0.0/224.0.0.0-ieth0-jDROP
iptables-AINPUT-d0.0.0.0-ieth0-jDROP
#防止广播包从IP代理服务器进入局域网:
iptables-AINPUT-ptcp-mtcp--sport5000-jDROP
iptables-AINPUT-pudp-mudp--sport5000-jDROP
iptables-AOUTPUT-ptcp-mtcp--dport5000-jDROP
iptables-AOUTPUT-pudp-mudp--dport5000-jDROP
#屏蔽端口5000
iptables-AINPUT-s211.148.130.129-ieth1-ptcp-mtcp--dport3306-jDROP
iptables-AINPUT-s192.168.20.0/255.255.255.0-ieth0-ptcp-mtcp--dport3306-jACCEPT
iptables-AINPUT-s211.148.130.128/255.255.255.240-ieth1-ptcp-mtcp--dport3306-jACCEPT
iptables-AINPUT-ptcp-mtcp--dport3306-jDROP
#防止Internet网的用户访问 MySQL 服务器(就是3306端口)
iptables-AFORWARD-pTCP--dport22-jREJECT--reject-withtcp-reset
#REJECT,类似于DROP,但向发送该包的主机回复由--reject-with指定的信息,从而可以很好地隐藏防火墙的存在
2、www的iptables实例
#!
/bin/bash
exportPATH=/sbin:
/usr/sbin:
/bin:
/usr/bin
#加载相关模块
modprobeiptable_nat
modprobeip_nat_ftp
modprobeip_nat_irc
modprobeip_conntrack
modprobeip_conntrack_ftp
modprobeip_conntrack_irc
modprobeipt_limit
echo1>;/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo0>;/proc/sys/net/ipv4/conf/all/accept_source_route
echo0>;/proc/sys/net/ipv4/conf/all/accept_redirects
echo1>;/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo1>;/proc/sys/net/ipv4/conf/all/log_martians
echo1>;/proc/sys/net/ipv4/tcp_syncookies
iptables-F
iptables-X
iptables-Z
##允许本地回路?
Loopback-Allowunlimitedtraffic
iptables-AINPUT-ilo-jACCEPT
iptables-AOUTPUT-olo-jACCEPT
##防止SYN洪水?
SYN-FloodingProtection
iptables-Nsyn-flood
iptables-AINPUT-ippp0-ptcp--syn-jsyn-flood
iptables-Asyn-flood-mlimit--limit1/s--limit-burst4-jRETURN
iptables-Asyn-flood-jDROP
##确保新连接是设置了SYN标记的包?
MakesurethatnewTCPconnectionsareSYNpackets
iptables-AINPUT-ieth0-ptcp!
--syn-mstate--stateNEW-jDROP
##允许HTTP的规则
iptables-AINPUT-ippp0-ptcp-s0/0--sport80-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AINPUT-ippp0-ptcp-s0/0--sport443-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AINPUT-ippp0-ptcp-d0/0--dport80-jACCEPT
iptables-AINPUT-ippp0-ptcp-d0/0--dport443-jACCEPT
##允许DNS的规则
iptables-AINPUT-ippp0-pudp-s0/0--sport53-mstate--stateESTABLISHED-jACCEPT
iptables-AINPUT-ippp0-pudp-d0/0--dport53-jACCEPT
##IP包流量限制?
IPpacketslimit
iptables-AINPUT-f-mlimit--limit100/s--limit-burst100-jACCEPT
iptables-AINPUT-ieth0-picmp-jDROP
##允许SSH
iptables-AINPUT-ptcp-sip1/32--dport22-jACCEPT
iptables-AINPUT-ptcp-sip2/32--dport22-jACCEPT
##其它情况不允许?
Anythingelsenotallowed
iptables-AINPUT-ieth0-jDROP
3、一个包过滤防火墙实例
环境:
redhat9加载了stringtime等模块
eth0接外网──ppp0
eth1接内网──192.168.0.0/24
#!
/bin/sh
#
modprobeipt_MASQUERADE
modprobeip_conntrack_ftp
modprobeip_nat_ftp
iptables-F
iptables-tnat-F
iptables-X
iptables-tnat-X
###########################INPUT键###################################
iptables-PINPUTDROP
iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AINPUT-ptcp-mmultiport--dports110,80,25-jACCEPT
iptables-AINPUT-ptcp-s192.168.0.0/24--dport139-jACCEPT
#允许内网samba,smtp,pop3,连接
iptables-AINPUT-ieth1-pudp-mmultiport--dports53-jACCEPT
#允许dns连接
iptables-AINPUT-ptcp--dport1723-jACCEPT
iptables-AINPUT-pgre-jACCEPT
#允许外网vpn连接
iptables-AINPUT-s192.186.0.0/24-ptcp-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AINPUT-ippp0-ptcp--syn-mconnlimit--connlimit-above15-jDROP
#为了防止DoS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables-AINPUT-s192.186.0.0/24-ptcp--syn-mconnlimit--connlimit-above15-jDROP
#为了防止DoS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables-AINPUT-picmp-mlimit--limit3/s-jLOG--log-levelINFO--log-prefix