懒人少语之十四周 1 ?iptables命令 2 ?规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions] 3 -t table: 4 raw, mangle, nat, [filter]`若不指定-t该项为默认` 5 SUBCOMMAND: 6 1、 链管理: 7 -N: new 自定义/`新增一条新的规则`链 `抛弃默认的vnL表示方法` 8 例子: 9 iptables -N deny_invalid_packet `新增规则(规则名自定义),用于给一个信息指定多条规则` 10 iptables -A deny_invalid_packet -p tcp --tcp-flags ALL ALL -j REJECT 11 iptables -A deny_invalid_packet -p tcp --tcp-flags ALL NONE -j REJECT 12 iptables -A INPUT -j deny_invalid_packet `将已有的链关联到现有的链` 13 `将所有INPUT信息将关联到deny_.....的两条规则里` 14 iptables -A INPUT -s 192.168.25.0/24 -j deny_invalid_packet `关联该地址到两条规则...` 15 -X: delete `删除自定义的空的规则`链 16 例子: 17 iptables -X deny_invalid_packet `删除deny_.....该链定义` 18 iptables -F INPUT `因为之前常规定义了两条规则,清理INPUT链的规则` 19 -P: Policy 设置/`改默认策略`;对filter表中的链而言,其默认策略有: 20 `改默认,第一行信息有个policy ACCEPT表示默认允许连接` 21 ACCEPT 接受 22 DROP 丢弃 23 iptables -P INPUT DROP 24 -E: 重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除 25 26 2、查看: 27 -L: list `列出指定链上的所有规则,本选项必须放置最后` 28 -n: numberic `以数字格式显示地址和端口号` 29 -v: verbose `详细信息` 30 -vv 更详细 31 -x: exactly 显示计数器结果的精确值,而非单位转换后的易读值 `默认显示k/m单位等,将转化为字节单位` 32 --line-numbers 显示规则的序号 33 常用组合: 34 -vnL `iptables -vnL` 35 -vvnxL --line-numbers 36 -S selected 以iptables-save命令格式显示链上规则 `显示当前防火墙有几条规则` 37 iptables -S 38 [root@Centos7 07:23:11 ~]#iptables -vnL --line-number 39 Chain INPUT (policy ACCEPT 630K packets, 65M bytes) 40 num pkts bytes target prot opt in out source destination 41 多一个num序号 42 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 43 num pkts bytes target prot opt in out source destination 44 3、规则管理: 45 -A: append 追加 46 iptables -A INPUT -s 192.168.55.55 -j ACCEPT 47 -I: insert 插入,要指明插入至的规则编号,默认为第一条 `插入规则到某条位置` 48 iptables -I INPUT -s 192.168.0.1 -j ACCEPT 49 iptables -I INPUT 2 -s 192.168.0.1 -j ACCEPT 50 -D: delete 删除 51 (1) 指明规则序号 52 iptables -D INPUT 2 53 (2) 指明规则本身 54 iptables -D INPUT -s 192.168.55.55 -j ACCEPT 55 -R: replace 替换指定链上的指定规则编号 `替换规则` 56 iptables -R INPUT 3 -s 1.1.1.1 -j REJECT 57 -F: flush 清空指定的规则链 `统计规则数清零` 58 iptables -F 59 -Z: zero 置零 `统计数据包清零;pkts值清零` 60 iptables的每条规则都有两个计数器 61 (1) 匹配到的报文的个数 62 iptables -Z 63 (2) 匹配到的所有报文的大小之和 64 chain: PREROUTING, INPUT, FORWARD, OUTPUT, 65 POSTROUTING 66 67 ?匹配条件 `在规则之后,配置条件方式` 68 谨慎使用,避免把自己给拒绝了.添加策略可以设置五分钟生效时间,五分钟后恢复等() 69 基本: 通用的, PARAMETERS `系统自带功能,无需添加模块` 70 扩展: 需加载模块, MATCH EXTENTIONS `需自增模块` 71 72 1、基本匹配条件: 无需加载模块,由 iptables/netfilter自行提供 73 开头带!感叹号是代表取反,只能单元取反,不能多元取反.`匹配(单一的一个条件)单个地址/网段,取之外的所有地址` 74 [!] -s, --source address[/mask][,...] 源IP地址或范围 75 iptables -A INPUT -s x.x.x.x -j REJECT 76 -s 192.168.0.0/24; -s 192.168.1.1; 192.168.1.2,192.168.2.2 77 [!] -d, --destination address[/mask][,...] 目标IP地址或范围 78 iptables -A INPUT -s 192.168.1.4 -d 192.168.1.3 -j REJECT `-s和-d是并且关系,一条相当于两条规则,每条源和目标地址都将会结合匹配一次(交叉乘积)` 79 iptables -A INPUT ! -s 192.168.1.6 -j REJECT 80 [!] -p, --protocol protocol 指定协议,可使用数字如0( all)protocol: tcp, udp, icmp, icmpv6, udplite, esp, ah, sctp,mh or “all“ 参看: /etc/protocols 81 iptables -A INPUT -p icmp -j REJECT `icmp都被拒绝,一般不会做tcp拒绝的...呵呵` 82 [!] -i, --in-interface name 报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、 FORWARD、 PREROUTING链 83 iptables -A INPUAT -i eth0 -p icmp -j REJECT `eth0网卡进入流icpm信息将被拒绝` 84 [!] -o, --out-interface name 报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、 OUTPUT、 POSTROUTING链 85 iptables -A OUPUT -i ens33 -p icmp -j REJECT `ens33网卡流出icmp信息将被拒绝` 86 2、扩展匹配条件: 87 查看帮助 man iptables-extensions 88 需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效 89 (1)隐式扩展: 在使用 -p 选项指明了特定的协议时,无需再用 -m 选项指明扩展模块的扩展机制,不需要手动加载扩展模块 90 `直接根据协议来判断,无需指定扩展模块` 91 如tcp协议的扩展选项 92 [!] --source-port, --sport port[:port]: 匹配报文`源端口` ,可为端口范围 93 94 [!] --destination-port, --dport port[:port]: 匹配报文`目标端口` ,可为范围 95 iptables -A INPUT -p tcp --dport 80 -j REJECT 96 iptables -A INPUT -p tcp --destination-port 80 -j REJECT `没写ip地址,代表任何人的80都被拒绝,端口需单个写` 97 [!] --tcp-flags mask comp `tcp的标记位用法` 98 `mask 指定需检查的标志位列表,用,分隔` 99 例如 SYN,ACK,FIN,RST100 `comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,逗号分隔`101 示例: 102 --tcp-flags SYN,ACK,FIN,RST SYN `表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0`103 --tcp-flags SYN,ACK,FIN,RST SYN,ACK `在4中标识有两个必须为1的情况下`104 --tcp-flags ALL ALL `检查所有,并确保所有为1的情况下(不合理,或黑客构造包)`105 --tcp_flags ALL NONE `检查所有,并确保所有为0的情况下(不合理,一般直接拒绝以上两种ALL和NONE状态)`106 [!] --syn: 用于匹配第一次握手 `保留原有状态,根据设定拒绝新连接`107 相当于: --tcp-flags SYN,ACK,FIN,RST SYN108 udp109 [!] --source-port, --sport port[:port]: 匹配报文的源端口;可以指定端口范围,不允许离散范围(显示扩展支持离散范围)110 用冒号表示范围80:90表示80端口到90端口之间111 [!] --destination-port, --dport port[:port]: 匹配报文的目标端口;可以是端口范围112 icmp113 [!] --icmp-type {type[/code]|typename} `用于指定ping命令的请求还是回应状态`114 type/code115 0/0 echo-reply icmp应答116 8/0 echo-request icmp请求117 iptables -A INPUT -p icmp --icmp-type 8 -j REJECT118 Win结果显示: 来自 172.18.252.180 的回复: 无法连到端口。119 (2)显式扩展: 必须使用 -m 选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块120 -m 略......121 [-m matchname [per-match-options]]122 处理动作: 123 -j targetname [per-target-options]124 简单: ACCEPT, DROP125 扩展: REJECT: --reject-with: icmp-port-unreachable默认126 RETURN: 返回调用链 `结果跳到某个链里,类似-N和-X那边的实验;仅返回,并非拒绝或允许;类似函数的return`127 REDIRECT: 端口重定向128 LOG: 记录日志, dmesg129 MARK: 做防火墙标记130 DNAT: 目标地址转换131 SNAT: 源地址转换132 MASQUERADE: 地址伪装133 ...134 自定义链: 135 显式扩展: 必须显式地指明使用的扩展模块进行的扩展136 使用帮助: 137 CentOS 6: man iptables138 CentOS 7: man iptables-extensions139 1、 multiport扩展 `离散支持,使同个地址多个端口用一条规则来表示`140 支持离散方式定义多端口匹配,最多指定15个端口141 [!] --source-ports, --sports port[,port|, port:port]...指定多个源端口142 [!] --destination-ports, --dports port[,port|, port:port]...指定多个目标端口143 冒号表示范围,逗号表示另一个端口144 [!] --ports port[,port|, port:port]...多个源或目标端口145 示例: 146 iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT147 iptables -A INPUT -s 192.168.66.66 -p tcp -m multiport --dports 22,80 -j ACCEPT148 2、 iprange扩展 `从哪到哪的一个地址范围`149 指明连续的(但一般不是整个网络) ip地址范围150 [!] --src-range from[-to] `源IP`地址范围151 iptables -A INPUT -m iprange --src-range 192.168.66.66-192.168.66.77 -p tcp -m multiport --dports 22,80 -j REJECT152 `表示源进来的地址范围在66-77的tcp协议端口走22和80端口的将被拒绝`153 [!] --dst-range from[-to] `目标IP`地址范围154 示例: 155 iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP156 3、 mac扩展157 指明源MAC地址158 适用于: PREROUTING, FORWARD, INPUT chains159 [!] --mac-source XX:XX:XX:XX:XX:XX160 iptables -A INPUT -m mac --mac-source 00:0c:93:c9:d9 -p tcp -m multiport --dports 22,80 -j REJECT161 `表示该mac地址将被拒绝22和80端口进入`162 示例: 163 iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT164 iptables -A INPUT -s 172.16.0.100 -j REJECT165 4、 string扩展 (扫描数据包,检测字符串)166 对报文中的应用层数据做字符串模式匹配检测167 `针对数据包包含的特定字符串进行监控`168 --algo {bm|kmp}: 字符串匹配检测算法(随意)169 bm: Boyer-Moore170 iptables -A OUTPUT -m string --algo bm --string "Pass" -j REJECT171 `数据传出的情况下包含Pass字符串进行屏蔽`172 kmp: Knuth-Pratt-Morris173 --from offset 开始偏移 `开始检查处`174 --to offset 结束偏移 `结束检查处`175 [!] --string pattern: 要检测的字符串模式176 [!] --hex-string pattern: 要检测字符串模式, 16进制格式177 示例: 178 iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT179 5、 time扩展(时间扩展)180 根据将报文到达的时间与指定的时间范围进行匹配181 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 开始日期182 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束日期183 --timestart hh:mm[:ss] 开始时间184 --timestop hh:mm[:ss] 结束日期185 iptables -A INPUT -m time --timestart 10:00 --timestop 11:00 -m string --algo bm --string "google" -j REJECT `该时段内有google的字符串将被拒绝进入`186 [!] --monthdays day[,day...] 每个月的几号187 [!] --weekdays day[,day...] 星期几 188 --kerneltz: 内核时区(本地时间,代替UTC时间),不建议使用; CentOS7系统默认为UTC189 `注意: centos6 不支持kerneltz , --localtz指定本地时区(默认选项)`190 示例: 191 iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP `开始时间结束时间必须定义,星期几可忽略`192 iptables -A INPUT -m time --timestart 01:11 --timestop 12:22 -p tcp --dport 80 -j REJECT `该时段拒绝tcp的80端口进入`193 6、 connlimit扩展 `并发连接,防CC,避免一个客户端进行多个请求`194 根据每客户端IP做并发连接数数量匹配195 可防止CC(Challenge Collapsar挑战黑洞)攻击196 --connlimit-upto n 连接的数量小于等于n时匹配197 --connlimit-above n 连接的数量大于n时匹配198 通常分别与默认的拒绝或允许策略配合使用199 示例: 200 iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT201 `连接请求到100.10主机的tcp的22端口,超过大于两次以上的请求将被拒绝`202 7、 limit扩展 `传输的报文数据过快,进行限流`203 基于收发报文的速率做匹配204 令牌桶过滤器 `有令牌允许通过,无则拒绝;从第一到第十个给你发令牌,从11个之后每隔多久再发一个令牌操作`205 --limit rate[/second|/minute|/hour|/day] `表示之后每隔多久发令牌`206 --limit-burst number `表示前几个不限令牌/限流`207 示例: 208 iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT209 `icmp请求包当中前5个允许进入无限制,之后每分钟只有3个允许进入`210 iptables -I INPUT 2 -p icmp -j REJECT211 `该策略必须结合上条策略,除了上条被允许之外的其它将被拒绝icmp`212 8、 state扩展 `状态跟踪扩展`213 根据”连接追踪机制“去检查连接的状态,较耗资源214 conntrack机制: 追踪本机上的请求和响应之间的关系215 状态有如下几种: -216 NEW: 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求 `同一个端口,第一个进来`217 ESTABLISHED: NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态 `同一个端口,第二个返回`218 RELATED: 新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系 `相对于21端口相关的协议`219 INVALID: 无效的连接,如flag标记不正确 `无效连接,如全是1或全是0的标记码`220 UNTRACKED: 未进行追踪的连接,如raw表中关闭追踪-221 [!] --state state222 示例: 223 iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT224 `80和22端口若是新发起的请求并是建立连接的状态连接请求将被允许`225 iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT226 `一般会针对新发起请求,而久请求是被允许的`227 =========----========---=======--======-=====228 已经追踪到的并记录下来的连接信息库 `记录下来的信息`229 /proc/net/nf_conntrack230 调整连接追踪功能所能够容纳的最大连接数量 `默认Centos7.4:65536;CentOS7.3:31248`231 /proc/sys/net/nf_conntrack_max232 不同的协议的连接追踪时长 `连接的跟踪时长`233 /proc/sys/net/netfilter/234 `注意: CentOS7 需要加载模块: modprobe nf_conntrack`235 可查: lsmod |grep nf_conntrack236 iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时()237 ⭐解决方法两个: 238 (1) 加大nf_conntrack_max 值239 vim /etc/sysctl.conf240 net.nf_conntrack_max = 393216241 net.netfilter.nf_conntrack_max = 393216242 (2) 降低 nf_conntrack timeout时间243 vim /etc/sysctl.conf244 net.netfilter.nf_conntrack_tcp_timeout_established = 300245 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120246 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60247 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120248 iptables -t nat -L -n249 开放被动模式的ftp服务250 (1) 装载ftp连接追踪的专用模块: 251 跟踪模块路径: /lib/modules/kernelversion/kernel/net/netfilter252 vim /etc/sysconfig/iptables-config 配置文件253 IPTABLES_MODULES="nf_conntrack_ftp" `iptables需要利用上该模块来监听21端口访问的是什么信息`254 modproble nf_conntrack_ftp `加载该模块的命令`255 (2) 放行请求报文: 256 命令连接: NEW, ESTABLISHED257 数据连接: RELATED, ESTABLISHED258 iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT259 iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT260 (3) 放行响应报文: 261 iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT262 `一般定义都是INPUT,很少定义OUTPUT.`263 264 例子:265 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT266 `建立连接的和建立连接相关的将被接受进入`