Linux系统 iptables进阶学习
一、IPTABLES四表五链学习: (1)Filter表:是iptables的默认表,它有以下三种内建链(chains): INPUT链 – 处理来自外部的数据。 OUTPUT链 – 处理向外发送的数据。 FORWARD链 – 将数据转发到本机的其他网卡设备上。 (2)NAT表:NAT表有三种内建链: PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。 POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。 OUTPUT链 – 处理本机产生的数据包 (3)Mangle表:Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链(chains): PREROUTING OUTPUT FORWARD INPUT POSTROUTING (4) Raw表:Raw表用于处理异常,它具有2个内建链: PREROUTING chain OUTPUT chain 二、IPTABLES 规则(Rules)学习: Rules包括一个条件和一个目标(target) 如果满足条件,就执行目标(target)中的规则或者特定值。 如果不满足条件,就判断下一条Rules。 三、目标值(Target Values)在target里指定的特殊值: ACCEPT – 允许防火墙接收数据包 DROP – 防火墙丢弃包 QUEUE – 防火墙将数据包移交到用户空间 RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。 四、查看表规则命令: 查看各表中的规则命令:iptables -t filter --list 相当于 iptables -nL 查看mangle表:iptables -t mangle --list 查看NAT表:iptables -t nat --list 查看RAW表:iptables -t raw --list 五、清空所有iptables规则 注:在配置iptables之前,你通常需要用iptables --list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则 iptables --flush 或者 iptables -F 例如清除iptables nat表规则 :iptables -t nat -F 六、永久生效 说明:当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。如下配置让配置永久生效 (1)生效方式1: yum install -y iptables* service iptables save(默认保存的配置在/etc/sysconfig/iptables) 重启iptables服务 service iptables stop service iptables start systemctl enable iptables.service (1)生效方式2: iptables-save > /etc/sysconfig/iptables.rules chmod 755 /etc/sysconfig/iptables.rules 在/etc/rc.local里添加下面这段文件(执行上面这条命令会自动添加,但是要有755权限)。权限为755 iptables-restore < /etc/sysconfig/iptables.rules 或者 iptables-restore /etc/sysconfig/iptables.rules 七、追加iptables规则 (1)追加规则的完整实例:仅允许SSH服务 1.清空所有iptables规则 iptables -F 2.接收目标端口为22的数据包 iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT 3.拒绝所有其他数据包 iptables -A INPUT -j DROP 八、更改默认策略(禁止操作,否则你就无法ssh连接了,只能重启解决) (1)给三个链单独添加DROP规则 iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP iptables -A FORWARD -j DROP (2)更改默认策略 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP 九、配置应用程序规则 (1)允许接收远程主机的SSH请求 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT (2)允许发送本地主机的SSH响应 iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 说明: -m state: 启用状态匹配模块(state matching module) –-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED –sport 22: sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务器而言,源端口就是22 –dport 22: ssh客户端程序可以从本机的随机端口与SSH服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22 (3)如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置: iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 10、规则增删改查等相关参数 iptables -t nat -D POSTROUTING 1 -A 追加规则-->iptables -A INPUT -D 删除规则-->iptables -D INPUT 1(编号) -R 修改规则-->iptables -R INPUT 1 -s 192.168.1.0 -j DROP 取代现行规则,顺序不变(1是位置) -I 插入规则-->iptables -I INPUT 1 --dport 22 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位 -L 查看规则-->iptables -L INPUT 列出规则链中的所有规则 -N 新的规则-->iptables -N allowed 定义新的规则 (1)查看Filter表中的所有链以及规则 iptables -nL --line-numbers (2)向Filter表的INPUT链中新增接收所有来自192.168.1.1的数据包并指定其序号为2,如果占用其他主机IP的序号,则其他主机序号会往下递减一个序号 iptables -I INPUT 1 -s 192.168.1.1/32 -j ACCEPT iptables -I INPUT 1 -s 192.168.1.2/32 -j ACCEPT (3)删除Filter表中INPUT链中序号为2的规则 iptables -D INPUT 2 (4)向filter表的INPUT链中追加(-A)一条拒绝所有发送到192.168.1.1的数据包 iptables -A INPUT -d 192.168.1.1/32 -j DROP (5)在nat表的PREROUTING链中新增一条序号为1的LOG规则(LOG目标通常放在对数据包过滤和处理前,可以用来分析数据包流向。) 说明:-I:表示insert,即向链中插入一条规则,PREROUTING为链名,没有指定序号默认为1,即顶部插入; -j:规则目标(Target),LOG代表获取数据包并打印日志; --log-prefix:日志信息的前缀,只能在-j LOG的情况下使用 iptables -I PREROUTING -t nat -j LOG --log-prefix "[NAT_PREROUTING_LOG]" (6)实战篇: 1、禁止源地址192.168.1.1访问服务器的22,53,80端口 iptables -I INPUT -s 192.168.1.1/32 -p tcp -m multiport --dport 22,53,80 -j DROP 2、对于访问量比较大的服务器,例如192.168.1.1,可以通过raw表配置绕过连接跟踪: iptables -t raw -A PREROUTING -d 192.168.1.1/32 -p tcp --dport 80 -j NOTRACK 3、将访问192.168.1.1:80的请求转到192.168.1.2:9000上 iptables -t nat -A PREROUTING -d 192.168.1.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.1.2:9000 4、将访问本机的udp 314端口转发到3140上 iptables -t nat -A PREROUTING -p udp --dport 314 -j DNAT --to-destination 124.222.170.39:3140 5、实现所有192.168.1.0/24的地址通过123.123.123.123公网地址访问公网 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 123.123.123.123 6、拒绝一分钟内新建超过4次SSH连接的IP再次连接 iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource -j DROP IPTABLES模块学习: 一、multiport模块:(连续匹配多个端口) (1)要求192.168.1.0/24网段的所有IP只能访问22,80,443端口,其他的拒绝(该命令具有风险) iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 443 -s 192.168.1.0/24 -j ACCEPT iptables -t filter -A INPUT -p tcp -j DROP 或者:(只放开22,80,443端口) iptables -t filter -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT iptables -t filter -A INPUT -p tcp -j DROP (2)要求192.168.1.0/24网段的所有ip只能访问22-90端口,其他拒绝 iptables -t filter -A INPUT -p tcp -m multiport --dport 22:90 -j ACCEPT iptables -t filter -A INPUT -p tcp -j DROP(其他未被允许的端口禁止访问) iptables -t filter -A INPUT -p tcp -m multiport --dports 80,22,8080:9090 -j ACCEPT (对所有的地址开放本机的tcp 80、22、8080-9090端口的访问) 二、iprange模块:(连续匹配多个IP) --src-range : 源地址范围 --dest-range: 目标地址范围 (1)要求只有192.168.1.1到192.168.1.20访问23端口,其他的拒绝 iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.1.1-192.168.1.20 -j ACCEPT iptables -t filter -A INPUT -p tcp -j DROP 三、string模块:(按照内容进行匹配) --string parttern:指定要匹配的字符串 --algo {bm|kmp}:匹配的查询算法 (1)要求访问的内容包含hello的内容不允许访问,其他的可以 iptables -t filter -A OUTPUT -p tcp -m string --string "hello" --algo kmp -j DROP 四、time模块(UTC时间):根据时间来控制访问(UTC)可以指定个端口 --timestart hh:mm[:ss]:开始时间 --timestop hh:mm[:ss]:结束时间 --monthdays day[,day...]:指定一个月的某一天 --weekdays day[,day...]:指定周还是周天 (1)要求上午的08:00到上午的10:30不允许访问,其他时间可以(UTC时间比北京时间要提前8个小时) iptables -t filter -A INPUT -p tcp -m time --timestart 00:00 --timestop 02:30 -j DROP 五、icmp模块:(控制icmp协议) --icmp-type{type[/code]|typename} echo-request(8)请求(我可以ping别人,别人休想ping我) echo-reply(0)回应(别人可以ping我,我休想ping别人) (1)禁止他人ping我,但本主机可以ping他人 iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j DROP (2)他人可以ping我,但本主机不能ping他人 iptables -t filter -I INPUT -p icmp --icmp-type "echo-reply" -j DROP (3)允许对所有的地址开放本机的基于ICMP协议的数据包 iptables -t filter -A INPUT -p icmp -j ACCEPT 六、connlimit模块:(控制并发数)没有什么用 --connlimit-upto n:如果现有连接数小于或等于n则匹配 --connlimit-above n: 如果现有连接数大于n则匹配 (1)要求登录192.168.1.1 的窗口最多两个 iptables -t filter -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 七、limit模块:(针对 报文速率 进行限制。秒、分钟、小时、天) --limit rate[/secon|/mintue|/hour|/day] :报文数量 --limit-burst number:报文数量(默认:5) 数据包数量=网速*1000/1500 限速:限制传输的宽带不可以超过500k(500*1000/1500=333包) (1)要求每秒只能够传输500k大小的数据 iptables -t filter -A INPUT -p tcp -m limit --limit 333/s -j ACCEPT iptables -t filter -A INPUT -p icmp -j DROP (2)允许10个数据报文快速通过,超过的数据报文1/m(一分钟一个) iptables -t filter -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT iptables -t filter -A INPUT -p icmp -j DROP