iptables规则五条链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING 四个表:filter nat mangle rawweb
###netfilter和iptables说明: 一、 netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在作信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在咱们所谓的链(chain)中。bash
虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter 和 iptables 组成。服务器
RAW 表只使用在PREROUTING链和OUTPUT链上,由于优先级最高,从而能够对收到的数据包在链接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即再也不作地址转换和数据包的连接跟踪处理了. RAW表能够应用在那些不须要作nat的状况下,以提升性能。如大量访问的web服务器,可让80端口再也不让iptables作数据包的连接跟踪处理,以提升用户的访问速度。
cookie
iptables中表和链的对应关系以下: 网络
iptables的数据包的流程是怎样的?tcp
一个数据包到达时,是怎么依次穿过各个链和表的(图)。 工具
基本步骤以下:oop
到了这里咱们就得分两种不一样的状况进行讨论了,一种状况就是数据包要转发给其它主机,这时候它会依次通过: 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. 进入出去的网络接口。完毕。spa
增长raw表,在其余表处理以前,-j NOTRACK跳过其它表处理 状态除了之前的四个还增长了一个UNTRACKED
例如: 可使用 “NOTRACK” target 容许规则指定80端口的包不进入连接跟踪/NAT子系统
iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -t raw -A PREROUTING -s 1.2.3.4 -p tcp --sport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
在启用了iptables web服务器上,流量高的时候常常会出现下面的错误:
ip_conntrack: table full, dropping packet
这个问题的缘由是因为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 net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 下降 ip_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
上面两种方法打个比喻就是烧水水开的时候,换一个大锅。通常状况下均可以解决问题,可是在极端状况下,仍是不够用,怎么办?
这样就得反其道而行,用釜底抽薪的办法。iptables的raw表是不作数据包的连接跟踪处理的,咱们就把那些链接量很是大的连接加入到iptables raw表。
如一台web服务器能够这样:
iptables -t raw -A PREROUTING -d 192.168.100.100 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
一、单个规则实例
iptables -F
-F 是清除的意思,做用就是把 FILTRE TABLE 的全部链的规则都清空
iptables -A INPUT -s 172.20.20.1/32 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
在 FILTER 表的 INPUT 链匹配源地址是172.20.20.1的主机,状态分别是NEW,ESTABLISHED,RELATED 的都放行。
iptables -A INPUT -s 172.20.20.1/32 -m state --state NEW,ESTABLISHED -p tcp -m multiport --dport 123,110 -j ACCEPT
-p 指定协议,-m 指定模块,multiport模块的做用就是能够连续匹配多各不相邻的端口号。完整的意思就是源地址是172.20.20.1的主机,状态分别是NEW, ESTABLISHED,RELATED的,TCP协议,目的端口分别为123 和 110 的数据包均可以经过。
iptables -A INPUT -s 172.20.22.0/24 -m state --state NEW,ESTABLISHED -p tcp -m multiport --dport 123,110 -j ACCEPT
iptables -A INPUT -s 0/0 -m state --state NEW -p tcp -m multiport --dport 123,110 -j DROP
这句意思为源地址是0/0的 NEW状态的的TCP数据包都禁止访问个人123和110端口。
iptables -A INPUT -s ! 172.20.89.0/24 -m state --state NEW -p tcp -m multiport --dport 1230,110 -j DROP
"!"号的意思 取反。就是除了172.20.89.0这个IP段的地址都DROP。
iptables -R INPUT 1 -s 192.168.6.99 -p tcp --dport 22 -j ACCEPT
替换INPUT链中的第一条规则
iptables -t filter -L INPUT -vn
以数字形式详细显示filter表INPUT链的规则
-------------------------------NAT IP--------------------------------------
如下操做是在 NAT TABLE 里面完成的。请你们注意。
iptables -t nat -F
iptables -t nat -A PREROUTING -d 192.168.102.55 -p tcp --dport 90 -j DNAT --to 172.20.11.1:800
-A PREROUTING 指定在路由前作的。完整的意思是在 NAT TABLE 的路由前处理,目的地为192.168.102.55 的 目的端口为90的咱们作DNAT处理,给他转向到172.20.11.1:800那里去。
iptables -t nat -A POSTROUTING -d 172.20.11.1 -j SNAT --to 192.168.102.55
-A POSTROUTING 路由后。意思为在 NAT TABLE 的路由后处理,凡是目的地为 172.20.11.1 的,咱们都给他作SNAT转换,把源地址改写成 192.168.102.55 。
iptables -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP
iptables -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP
上例中,eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,上述规则用来防止IP欺骗,由于出入eth1的包的ip应该是公共IP
iptables -A INPUT -s 255.255.255.255 -i eth0 -j DROP
iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP
iptables -A INPUT -d 0.0.0.0 -i eth0 -j DROP
防止广播包从IP代理服务器进入局域网:
iptables -A INPUT -p tcp -m tcp --sport 5000 -j DROP
iptables -A INPUT -p udp -m udp --sport 5000 -j DROP
iptables -A OUTPUT -p tcp -m tcp --dport 5000 -j DROP
iptables -A OUTPUT -p udp -m udp --dport 5000 -j DROP
屏蔽端口 5000
iptables -A INPUT -s 211.148.130.129 -i eth1 -p tcp -m tcp --dport 3306 -j DROP
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s 211.148.130.128/255.255.255.240 -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP
防止 Internet 网的用户访问 MySQL 服务器(就是 3306 端口)
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
REJECT, 相似于DROP,但向发送该包的主机回复由--reject-with指定的信息,从而能够很好地隐藏防火墙的存在
#!/bin/bash
ipt=/sbin:/usr/sbin:/bin:/usr/bin
作一个变量方便应用,变量值使用绝对路径
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ipt_limit
echo 1 >;/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 >;/proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 >;/proc/sys/net/ipv4/conf/all/accept_redirects
echo 1 >;/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 >;/proc/sys/net/ipv4/conf/all/log_martians
echo 1 >;/proc/sys/net/ipv4/tcp_syncookies
ipt -F
ipt -X
ipt -Z
加载相关模块,清空iptables规则
iptables -A INPUT -i lo -j ACCEPT
容许本地回路?Loopback - Allow unlimited traffic
iptables -A OUTPUT -o lo -j ACCEPT
iptables -N syn-flood
防止SYN洪水?SYN-Flooding Protection
iptables -A INPUT -i ppp0 -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
iptables -A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DROP
确保新链接是设置了SYN标记的包?Make sure that new TCP connections are SYN packets
iptables -A INPUT -i ppp0 -p tcp -s 0/0 --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -s 0/0 --sport 443 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -d 0/0 --dport 80 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -d 0/0 --dport 443 -j ACCEPT
容许HTTP的规则
iptables -A INPUT -i ppp0 -p udp -s 0/0 --sport 53 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -d 0/0 --dport 53 -j ACCEPT
容许DNS的规则
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -j DROP
IP包流量限制?IP packets limit
iptables -A INPUT -p tcp -s ip1/32 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -s ip2/32 --dport 22 -j ACCEPT
容许SSH
iptables -A INPUT -i eth0 -j DROP
其它状况不容许?Anything else not allowed