iptables命令:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches…] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
规则格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, [filter]
chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
COMMAND:
链管理:
-N:new, 自定义一条新的规则链;
-X:delete,删除自定义的规则链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
规则管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除;
(1) 指明规则序号;
(2) 指明规则本身;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和;
查看:
-L:list, 列出指定鏈上的所有规则;
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;
-vv, -vvv
-x:exactly,显示计数器结果的精确值;
–line-numbers:显示规则的序号;
匹配条件:
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
[!] -s, –source address[/mask][,…]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, –destination address[/mask][,…]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
[!] -p, –protocol protocol
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or “all”
{tcp|udp|icmp}
[!] -i, –in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
[!] -o, –out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
tcp:
[!] –source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] –destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围;
[!] –tcp-flags mask comp
mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST
comp is a comma-separated list of flags which must be set,例如SYN
例如:“–tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
[!] –syn:用于匹配第一次握手,相当于”–tcp-flags SYN,ACK,FIN,RST SYN“;
udp
[!] –source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] –destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围;
icmp
[!] –icmp-type {type[/code]|typename}
echo-request:8
echo-reply:0
扩展匹配条件: 需要加载扩展模块,方可生效;
1、multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
[!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;
[!] –destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;
[!] –ports port[,port|,port:port]…:指明多个端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport –dports 22,80 -j ACCEPT
2、iprange扩展
指明连续的(但一般不脑整个网络)ip地址范围;
[!] –src-range from[-to]:源IP地址;
[!] –dst-range from[-to]:目标IP地址;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp –dport 80 -m iprange –src-range 172.16.100.5-172.16.100.10 -j DROP
3、string
–algo {bm|kmp}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] –string pattern:要检测的字符串模式;
[!] –hex-string pattern:要检测的字符串模式,16进制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp –sport 80 -m string –algo bm –string “gay” -j REJECT
在入站请求上做检测意义不大
4、time 时间同步服务器 ntp 202.120.2.101
-m time
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –monthdays day[,day…]
[!] –weekdays day[,day…]
[root@localhost ~]# iptables -A INPUT -p tcp -d 192.168.68.134 -m time –timestart 1:00:00 –timestop 2:00:00 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p tcp -s 192.168.68.134 -m time –timestart 1:00:00 –timestop 2:00:00 -j ACCEPT
限制时间段9:00-10:00访问
看网上说要加–kerneltz 否则默认是UTC时间 亲测发现加不加都是UTC时间 按照你的时间-8就行了
5、connlimit扩展
根据每客户端IP做并发连接数数量匹配;
–connlimit-upto n:连接的数量小于等于n时匹配;
–connlimit-above n:连接的数量大于n时匹配;
[root@localhost ~]# iptables -A INPUT -d 192.168.68.134 -p tcp –dport 22 -m connlimit –connlimit-upto 2 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.68.134 -p tcp –sport 22 -j ACCEPT
6、limit扩展
基于收发报文的速率做匹配;
令牌桶过滤器;
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
[root@localhost ~]# iptables -A INPUT -d 192.168.68.134 -p icmp –icmp-type 8 -m limit –limit 3/min –limit-burst 5 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.68.134 -p icmp –icmp-type 0
[root@localhost ~]# iptables -A OUTPUT -s 192.168.68.134 -p icmp –icmp-type 0 -j ACCEPT
防DOS攻击
7、state:是conntrack的子集
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;
已经追踪到的链接可以在/proc/net/nf_conntrack中查看
最大追踪链接数 /proc/sys/net/nf_conntrack_max中查看
调整最大数~]# sysctl -w net.nf_conntrack_max=300000
或~]# echo 300001 > /proc/sys/net/nf_conntrack_max
超时的连接会被删除;当模板满载时,后续的新连接有可能会超时
1)加大nf_conntrack_max的值
2)降低nf_conntrack条目的超时时常
不同协议的连接追踪时长/proc/sys/net/netfilter/
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时
解決方法一般有两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
实用规则
iptables -A INPUT -d 192.168.68.134 -p tcp -m mulitiport –dports 22,23,80 -m state –state NEW -j ACCEPT
iptables -A INPUT -d 192.168.68.134 -p tcp -m multiport –dports 22,23,80 -m state –state NEW -j ACCEPT
iptables -A INPUT -d 192.168.68.134 -p icmp –icmp-type 8 -m state –state NEW,ESTABLISHED -jACCEPT
iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT
RELATED 如何放行被动的ftp服务
1)modprobe nf_conntrack_ftp #内核装载ftp模块
2)放行命令连接
iptables -A INPUT -d $sip -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT
3)放行数据连接
iptables -A INPUT -s $sip -p tcp -m state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $sip -p tcp -m state ESTABLISHED -j ACCEPT
规则的用效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;
保存规则:
保存规则至指定的文件:
CentOS 6:
~]# service iptables save
将规则保存至/etc/sysconfig/iptables文件中;
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 7:
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
重新载入预存规则文件中规则:
~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE
CentOS 6:
~]# service iptables restart
自动生效规则文件中的规则:
(1) 用脚本保存各iptables命令;让此脚本开机后自动运行;
/etc/rc.d/rc.local文件中添加脚本路径;
/PATH/TO/SOME_SCRIPT_FILE
(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;
/etc/rc.d/rc.local文件添加:
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
centos6
service iptables save
chkconfig iptales on
处理动作
-j ACCEPT DROP REJECT
RETURN 返回调用的链
REDIRECT 端口重定向
LOG日志
MARK 防火墙标记
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE地址伪装 POSTROUTING
LOG
iptables -I FORWARD 2 -s 10.0.0.0/24 -p tcp –dport 80 -m state –state NEW -j LOG –log-prefix “new connect:”
在/var/log/messages下看到日志
REDIRECT 端口映射
[root@centos ~]# iptables -t nat -A PREROUTING -d 192.168.68.144 -p tcp –dport 80 -j REDIRECT –to-ports 8080
客户端访问的80端口 实际响应的是8080端口
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88317