iptables防火墙设置 喜欢ヅ旅行 2022-10-23 04:55 741阅读 0赞 # 介绍 # iptables防火墙具有4表5链,4表分别是filter表、nat表、raw表、mangle表,5链分别是INPUT链、OUTPUT链、FORWARD链、PREROUTING链、POSTROUTING链。防火墙规则要求写在特定表的特定链中。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70] **\#注意事项与规律:** #可以不指定表,默认为filter表 #可以不指定链,默认为对应表的所有链 #按顺序匹配,匹配即停止,如果没有找到匹配条件,则执行防火墙默认规则 #选项/链名/目标操作用大写字母,其余都小写 **\#目标操作:** # ACCEPT:允许通过/放行 # DROP:直接丢弃,不给出任何回应 # REJECT:拒绝通过,必要时会给出提示 # LOG:记录日志,然后传给下一条规则 **iptables常用的管理选项:** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 1] 常见配置 将该规则添加到策略首位置。-I 表示则策略首部插入规则,-A 表示在策略尾部追加规则。 iptables -I INPUT -s <your IP> -j ACCEPT #有效地避免封锁自己的设置 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #开发已经使用的数据连接 iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT #开发21端口 iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT #放行响应报文 iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080 #172.16.100.10的80端口,转发到8080 # 给Mysql服务添加防火墙策略 # 查看防火墙策略 # iptables -L -n --line-number|grep 3306 添加3306端口访问策略 # iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT # iptables -L -n --line-number|grep 3306 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:3306 可以看到已经添加了3306端口的访问策略,外部应用可以通过TCP协议访问3306端口。 **删除防火墙策略** # iptables -D INPUT 1 # iptables -L -n --line-number|grep 3306 **创建规则** iptables -F #清空所有规则: iptables -t filter -A INPUT -p tcp -j ACCEPT #追加规则至filter表中的INPUT链的末尾,允许任何人使用TCP协议访问本机 iptables -I INPUT -p udp -j ACCEPT #插入规则至filter表中的INPUT链的开头,允许任何人使用UDP协议访问本机 iptables -I INPUT 2 -p icmp -j ACCEPT #插入规则至filter表中的INPUT链的第2行,允许任何人使用ICMP协议访问本机 查看iptables防火墙规则 iptables -nL INPUT #仅查看INPUT链的规则 iptables -L INPUT --line-numbers #查看规则,显示行号 删除规则,清空所有规则: iptables -D INPUT 3 #删除filter表中INPUT链的第3条规则 iptables -F #清空filter表中所有链的防火墙规则 iptables -t nat -F #清空nat表中所有链的防火墙规则 iptables -t mangle -F #清空mangle表中所有链的防火墙规则 iptables -t raw -F #清空raw表中所有链的防火墙规则 **设置防火墙默认规则** 设置INPUT链默认规则为DROP: iptables -t filter -P INPUT DROP iptables -nL Chain INPUT (policy DROP) … … 设置INPUT链默认规则为ACCEPT iptables -t filter -P INPUT ACCEPT **filter过滤和转发控制** 主机型防火墙,主要保护的是服务器本机(过滤威胁本机的数据包)。 网络防火墙,主要保护的是防火墙后面的其他服务器,如web服务器、FTP服务器等。 iptables防火墙可以根据很多规则进行过滤行为 ![在这里插入图片描述][80e50e9087af42a19bc3490ada6a25f0.png] 1)主机型防火墙 iptables -I INPUT -p tcp --dport 80 -j REJECT iptables -I INPUT -s 192.168.2.100 -j REJECT iptables -I INPUT -d 192.168.2.5 -p tcp --dport 80 -j REJECT iptables -I INPUT -i eth0 -p tcp --dport 80 -j REJECT 丢弃192.168.2.0/24网络中所有主机发送给本机的所有数据包: iptables -A INPUT -s 192.168.2.0/24 -j DROP 拒绝114.212.33.12使用tcp协议远程连接本机ssh(22端口): iptables -A INPUT -s 114.212.33.12 -p tcp --dport 22 -j REJECT 2)网络型防火墙 要把proxy主机的路由转发功能打开 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 2] nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.5/24 autoconnect yes nmcli connection up eth0 nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.5/24 autoconnect yes nmcli connection up eth1 iptables -F Linux内核默认支持软路由功能,通过修改内核参数即可开启或关闭路由转发功能。 echo 0 > /proc/sys/net/ipv4/ip_forward #关闭路由转发 echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发 \#注意以上操作仅当前有效,计算机重启后无效 \#修改/etc/sysctl.conf配置文件,可以实现永久有效规则 echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf 3)web1主机配置IP、添加网关(网卡名称仅供参考) 注意:如果web1主机有4网段IP的网卡,必须要关闭该网卡 nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.2.100/24 autoconnect yes nmcli connection modify eth0 ipv4.gateway 192.168.2.5 nmcli connection up eth0 4)确认不同网络的联通性 ping 192.168.2.100 ping 192.168.4.10 5)在web1主机上启动http服务 yum -y install httpd echo "test page" > /var/www/html/index.html systemctl restart httpd 没有防火墙的情况下client访问web服务(成功) curl http://192.168.2.100 设置proxy主机的防火墙规则,保护防火墙后面的Web服务器 iptables -I FORWARD -s 192.168.4.10 -p tcp --dport 80 -j DROP 设置完防火墙规则后,再次使用client客户端访问测试效果(失败) curl http://192.168.2.100 **三、禁ping的相关策略** ping的流程(A主机pingB主机): ![在这里插入图片描述][1b26e53c09a447968508589b395db818.png] 禁止其他主机ping本机,允许本机ping其他主机,仅禁止入站的ping请求,不拒绝入站的ping回应包。 iptables -A INPUT -p icmp --icmp-type echo-request -j DROP 注意:关于ICMP的类型,可以参考help帮助,参考命令如下: iptables -p icmp --help # iptables配置SNAT实现共享上网 # 设置防火墙规则,允许位于局域网中的主机可以访问外网: * 搭建内外网案例环境 * 配置SNAT策略实现共享上网访问 ![在这里插入图片描述][00d0e9d002414f40b8e8364c0d980bb6.png] 设定192.168.2.0/24网络为外部网络,192.168.4.0/24为内部网络。 现在,在外部网络中有一台web服务器192.168.2.100,因为设置了网关,client已经可以访问此web服务器了。但,如果查看web1的日志就会发现,日志里记录的是192.168.4.10在访问网页。 我们需要实现的效果是,client可以访问web服务器,但要伪装为192.168.2.5后再访问web服务器(模拟所有位于公司内部的电脑都使用的是私有IP,希望访问外网,就需要伪装为公司的外网IP后才可以)。 **IP地址的伪装(SNAT源地址转换)** 1)确保proxy主机开启了路由转发功能 开启路由转发 echo 1 > /proc/sys/net/ipv4/ip_forward 2)设置防火墙规则,实现SNAT地址转换 iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.2.5 3)登陆web主机查看日志 tail /var/log/httpd/access_log 192.168.2.5 - - [12/Aug/2018:17:57:10 +0800] "GET / HTTP/1.1" 200 27 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" 通过日志会发现,客户端是先伪装为了192.168.2.5之后再访问的web服务器! 4)扩展知识,对于proxy外网IP不固定的情况可以执行下面的地址伪装,动态伪装IP iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j MASQUERADE 防火墙规则存放文件: /etc/sysconfig/iptables **生产环境可以使用案例** 开放端口 vi /etc/sysconfig/iptables # iptables -A INPUT -p tcp --dport 22 -j ACCEPT #iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT(常用) 全部放行匹配21,22,25,80,110端口 # iptables -A INPUT -i lo -j ACCEPT #必须放行回环扣 # iptables -A INPUT -p icmp -j ACCEPT #允许ping iptables -A OUTPUT -p tcp -d ubuntu.com -j ACCEPT iptables -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT #开放本机登录 iptables -A INPUT -p tcp -s 10.0.3.1 --dport 22 -j DROP #iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #对已连接的,未连接的ESTABLISHED,RELATED两种状态放行 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT #允许已经建立的连接接收进来的数据 iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP #限制与80端口连接的IP最大连接数为50, iptables -A INPUT -p tcp -s 10.112.18.0/24 --dport 22 -j ACCEPT #允许10.112.18.0/24登陆服务器 iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.10-192.168.4.20 -j ACCEPT #允许从 192.168.4.10-192.168.4.20 主机ssh远程登录本机 iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP # 禁止从 192.168.4.0/24 网段其他的主机ssh远程登录本机 #外网需要访问内网服务器一般使用static nat进行解决 iptables -t nat -A POSTROUTING -s 192.168.103.0/24 ! -d 192.168.103.0/24 -j SNAT --to-source 11.5.1.7 #外网访问内网设置 iptables -A PREROUTING -d 192.168.103.71/32 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.103.71:8080 ###端口转发到192.168.103.71:8080 iptables限制同一IP连接数,预防CC/DDOS攻击 # iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP #限制与80端口连接的IP最大连接数为50 防止同步包洪水(Sync Flood) # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT 防止各种端口扫描 # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT Ping洪水攻击(Ping of Death) # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT 配置防火墙防止syn,ddos攻击 # vim /etc/sysconfig/iptables 在iptables中加入下面几行 #anti syn,ddos -A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT sudo iptables-save | sudo tee /root/my.active.firewall.rules sudo apt install anacron 或者 yum install -y anacron #设置开机自启 #使用 iptables-save 工具保存规则文件 #系统每次启动时运行一个相关的工具,叫做 iptables-restore sudo nano /etc/anacrontab 或者 sudo vi /etc/anacrontab iptables-restore < /root/my.active.firewall.rules #保存规则 > 将安装一个名为anacron的程序,该程序将在 /etc/ 目录中为我们提供一个名为 anacrontab 的文件。我将编辑该文件并添加这个 iptables-restore 命令,告诉它加载那个 .rule 文件的当前内容。当引导后,规则每天(必要时)01:01 时加载到 iptables 中(LCTT 译注:anacron 会补充执行由于机器没有运行而错过的 cron 任务,因此,即便 01:01 时机器没有启动,也会在机器启动会尽快执行该任务)。我会给该任务一个标识符(iptables-restore),然后添加命令本身。如果你在家和我一起这样,你应该通过重启系统来测试一下。 示例:CentOS7的规则 ![在这里插入图片描述][d0a8586a148240c8accb418e203a984a.png] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 3] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 4] **多端口匹配(multiport)** \-m multiport <–sports|–dports|–ports> 端口1\[,端口2,…,端口n\] 一次性匹配多个端口,可以区分源端口,目的端口或不指定端口 例如: iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT(常用) 全部放行匹配21,22,25,80,110端口 注意: 必须与 -p 参数一起使用 保存: # service iptables save 将设置写入配置文件中,防止配置规则被清空。导致无法登陆机器 #vi /etc/sysconfig/iptables iptables -A INPUT -p icmp -j ACCEPT iptables -A INPUT -i lo -j ACCEPT #必须放行回环扣 iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT(常用) iptables -A INPUT -p tcp -s 10.112.18.0/24 --dport 22 -j ACCEPT 在生产环境中,使用-P DROP 这条规则,一定要小心,设置之前最好配置下面两个任务计划,否则容易把自己drop掉,链接不上远程主机。 配置crontab : */15 * * * * iptables -P INPUT ACCEPT */15 * * * * iptables -F 扩展 # iptables -D INPUT 1 #删除规则1 # iptables/netfilter # **可提供网络防火墙功能;** 防火墙至少要有2个网卡,一个为内网网卡,一个接外网网卡; 内网主机发报文时,经过防火墙内网卡时拆除mac封装,先到达prerouting链,如果报文目标IP地址不是本机,就不会进入input 链,经本机转发进入到forward链后到达postrouting链通过外网卡发送出去;回应的报文进入外网网卡先到达prerouting链,经 由forward链后到达postrouting通过内网卡发送给内网主机; prerouting、posting链等,跟网卡无关,只跟报文出入方向有关; 防火墙当做网络防火墙时,应把规则添加forward链上; 内网主机之间通信时,防火墙设置是不起作用的;只能靠内网的主机防火墙发挥作用; 防火墙当做主机防火墙时,应把规则添加input和output链上; 尽可能控制内网主机访问外网时,应把规则添加在forward链上,要考虑进、出两个方向的规则;添加了-s或-d就有了方向性; 一般状态是establish的都放行,只是在new在方向上限制; 如果内网服务器是对外提供服务的,对new状态是限制由外而内,只开放对外开放的协议和端口,而由内而外的可不限制端口、协议的放行出去; 所以一般当服务器端,设置规则时,只放行(由外而内的)有限服务的端口和协议,对客户端设置规则是通常放行所有请求,除非限制内网用户访问某些服务 * filter表:如果不使用-t(–table)选项,则过滤器表是规则使用的默认表,也是最常用的表。 * nat:此表用于网络地址转换(NAT)。如果数据包创建新连接,则会检查NAT表中的规则。 * mangle:mangle表用于修改或标记数据包及其标头信息。 * raw:此表的主要目的是从使用NOTRACK目标的连接跟踪中排除某些数据包。 * **INPUT**:此链用于控制传入连接的行为。 例如,如果用户尝试通过SSH进入您的PC /服务器,则iptables将尝试将IP地址和端口与输入链中的规则进行匹配。 * **OUTPUT**:此链用于传出连接。例如,如果您尝试ping www.baidu.com,iptables将在决定允许或拒绝连接尝试之前检查其OUTPUT链,以查看有关ping和www.baidu.com的规则是什么。 * **FORWARD**:此链用于实际不在本地传递的传入连接。 想一想路由器–数据总是被发送到路由器,但实际上很少发送给路由器本身。 数据只是转发到其目标。 除非您在系统上进行某种形式的路由,NAT或其他需要转发的操作,否则您甚至都不会使用此链。 \-A 添加规则到指定链的结尾,最后一条 \-I 添加规则到指定链的开头,第一条 \-t 指定表,也可以不指定默认是filter \-p 指定协议(all.tcp,udp.icmp)默认all –dport 指定端口 \-j 处理的行为 ACCPET接收、DROP丢弃、REJECT拒绝 最好使用ACCPET和DROP,因为拒绝会返回给用户信息。 链接:https://www.jianshu.com/p/c47037d3e260 # Ubuntu 18.04 搭建iptables防火墙 # 1、检查是否有安装iptables, 我是在root账号下执行的,如果非root有些请加上sudo # 检查 root@cocosum:~# which iptables /sbin/iptables root@cocosum:~# whereis iptables iptables: /sbin/iptables /etc/iptables /usr/share/iptables /usr/share/man/man8/iptables.8.gz # 说明有安装iptables ![在这里插入图片描述][20210318143043603.png] 2、如果没有安装iptables则需要安装 # 进行安装 sudo apt-get install iptables #yum install -y iptables-services 3、如果安装了需要配置防火墙规则,我这里自己创建一个防火墙规则 # 创建防火墙规则的文件 root@cocosum:~# vi /etc/iptables # 添加下面的规则 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :syn-flood - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 7070 -j ACCEPT -A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood -A INPUT -j REJECT --reject-with icmp-host-prohibited -A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN -A syn-flood -j REJECT --reject-with icmp-port-unreachable COMMIT 4、保存规则 # iptables-save > /etc/iptables #echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables chmod +x /etc/network/if-pre-up.d/iptables 设定开机自动恢复iptables规则 vim /etc/rc.d/rc.local iptables-restore < /etc/sysconfig/iptables #chmod +x /etc/rc.d/rc.local #source /etc/rc.d/rc.local 创建关机时要执行的脚本,并且确保其有执行权限 vim /etc/init.d/shutdownsh iptables-save > /etc/sysconfig/iptables chmod +x /etc/sysconfig/shutdownsh ls /etc/sysconfig/shutdownsh -rwxr-xr-x 1 root root 40 Jan 16 22:05 shutdownsh 5、创建一个脚本, 为了每次重启系统, iptables防火墙自动启动 # 直接创建,目的是为了系统每次重启自动加载 # vi /etc/network/if-pre-up.d/iptables # 内容 #!/bin/bash iptables-restore < /etc/iptables # :wq保存 6、给添加的脚本有执行的权限 # chmod +x /etc/network/if-pre-up.d/iptables 7、查看iptables;直接iptables -L ,和centos 差不多 # iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:https ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:mysql ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http-alt ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:7070 ACCEPT icmp -- anywhere anywhere limit: avg 100/sec burst 100 ACCEPT icmp -- anywhere anywhere limit: avg 1/sec burst 10 syn-flood tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain syn-flood (1 references) target prot opt source destination RETURN tcp -- anywhere anywhere limit: avg 3/sec burst 6 **查看iptables规则** # iptables -vnL --line-numbers \-v 是输出详细信息 \-n 指的是显示地址和端口号 \-L 指显示链里面的规则 –line-number参数用来显示行号,删除的时候很有用 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 5] 删除所有规则 iptables -F > 注意,如果在INPUT DROP策略启用的同时,采用了-F删除规则,会导致22端口的规则被删除,因此被阻在服务器外面了。所以要特别小心,-F本身无害,但是和DROP策略在一起的时候,就是危险的。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 6] > 执行iptables -F,删除了22端口的规则,导致断开连接,重启恢复 删除指定规则 iptables -D INPUT 4 添加一个规则,允许已经建立的连接接收进来的数据 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT **只接受指定的服务器访问** 如果想限制有限的机器向服务器发起请求,可以用-s参数,比如: iptables -A INPUT -p tcp -s 10.112.18.0/24 --dport 27017 -j ACCEPT 仅在10.112.18.0/0网段的机器才能连接上本机的27017端口。 如果去掉/24,代表指定的某个IP才能访问。 如果仅仅想本机访问,用下面的命令: iptables -A INPUT -p tcp -s 127.0.0.1 --dport 27017 -j ACCEPT 也可以通过这个命令,将本地访问完全放开: iptables -A INPUT -i lo -j ACCEPT # 用iptables限制sftp端口连接数 # 启动sftp本机的iptables防火墙功能,限制每个ip连接22端口(sftp连接端口即是ssh端口)最大为50个,当超过50后的连接数的流量就会被DROP掉! 同时iptables需要开放50000-65535范围的端口的访问(linux系统最大的端口为65535) [root@localhost ~]# cat /etc/sysconfig/iptables # Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT #-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 50 --connlimit-mask 0 -j DROP -A INPUT -m state --state NEW -m tcp -p tcp --dport 50000:65535 -j ACCEPT #-A INPUT -j REJECT --reject-with icmp-host-prohibited //注意这两行需要注释掉!否则设置的策略无效! #-A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT **解释说明** 上面限制端口连接数主要用到的模块是connlimit。 \-A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 50 --connlimit-mask 0 -j DROP 说明输入的目标端口是22,也就是访问sftp本机22端口的流量,如果连接数大于50,则DROP流量,connlimit-above这个是连接数的统计, 如果大于50就满足条件,connlimit-mask这个是定义那组主机,此处跟的一个数值是网络位,即子网掩码,也就是connlimit-mask 0 这个ip组的连接数大于connlimit-above 50则DROP掉! 总体描述为流量过滤端口和连接数以及网络位,如果满足第一条,则拒绝,流量不再匹配下边的规则,如果不匹配,则第二条规则会允许流量。 –connlimit-mask 0 即子网掩码为0,表示所有的ip,也就是说不管什么ip,只要连接此服务器的22端口超过3个,则DROP。 如果将–connlimit-mask 0去掉,则子网掩码默认是32,也就是说某个ip连接此服务器的22端口超哥50个,则DROP掉! 如果有51台机器,每台机器连接一个,则不会被DROP掉! 也就是说connlimit-above 3这个的数量所限制的区域是由–connlimit-mask 0而定! **使用sftp或ftp协议上传文件,上传文件大小为0** 客户端上传报错:error while writing: received failure with description 'Failure' 服务器端/var/log/message报错:sftp-server[15747]: error: process_write: write failed 造成这个错误大致就两个原因: 1) ulimit限制. 在sftp连接使用的账号下增大ulimit的值 # ulimit -n 65535 2) 磁盘空间不够了 **iptables限制同一IP连接数,预防CC/DDOS攻击** 1)限制与80端口连接的IP最大连接数为50,可自定义修改。 [root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP 2)使用recent模块限制同IP时间内新请求连接数。 下面策略表示:60秒有10个新连接,超过记录日志。 [root@localhost ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options 下面策略表示:60秒10个新连接,超过丢弃数据包 [root@localhost ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP 可以在iptables配置文件中 [root@localhost ~]# vim /etc/sysconfig/iptables //删除原来的内容输入如下内容 保存 # Generated by iptables-save v1.3.5 on Sun Dec 12 23:55:59 2010 *filter :INPUT DROP [385263:27864079] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [4367656:3514692346] -A INPUT -i lo -j ACCEPT -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -s 127.0.0.1 -j ACCEPT -A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name WEB –rsource -A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 5 –hitcount 20 –rttl –name WEB –rsource -j DROP -A INPUT -p tcp -m multiport –ports 21,22,80 -j ACCEPT -A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m ttl –ttl-eq 117 -j DROP -A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m length –length 0:40 -j DROP -A INPUT -p tcp -m tcp ! –tcp-flags SYN,RST,ACK SYN -m state –state NEW -j DROP COMMIT # Completed on Sun Dec 12 23:55:59 2017 以上配置,说明此设定仅对外开放21(FTP),22(SSH),80(http网站)三个TCP端口。设置80端口5秒内20个连接。 [root@localhost ~]# /etc/init.d/iptables restart **如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.2.1** Iptables -A PREROUTING -d 192.168.2.1 -p tcp -m tcp –dport 80 -j DNAT –to-destination 192.168.2.1:8080 如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.16.1,其中本地 网卡eth0: 答: #iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to 192.168.16.1:8080 或者: #iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080 # 案例 # 腾讯云ubuntu配置iptables黑白名单防火墙规则 腾讯云主机ubuntu默认没有iptables service文件所以要自行配置 如果不配可以按照如下方式配置加载新增防火墙规则 ![在这里插入图片描述][20210415112015294.png] mkdir /etc/iptables & vi /etc/iptables/rules.v4 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :syn-flood - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT # 禁止8080所有IP访问 配置白名单 允许118.249.xx.xx/24 公网访问 -I INPUT -p tcp --dport 8080 -j DROP -I INPUT -s 118.249.xxx.xx/24 -p tcp --dport 8080 -j ACCEPT -A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood -A INPUT -j REJECT --reject-with icmp-host-prohibited -A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN -A syn-flood -j REJECT --reject-with icmp-port-unreachable COMMIT 使防火墙生效 vi /etc/network/if-pre-up.d/iptables #!/bin/bash iptables-restore < /etc/iptables/rules.v4 chmod +x /etc/network/if-pre-up.d/iptables iptables -L -n apt-get install iptables 安装后一般自带iptables.service那么即可用如下方式添加黑白名单 vim /etc/sysconfig/iptables # 或 /etc/rc.d/init.d/iptables目录 #先关闭所有的3306端口 iptables -I INPUT -p tcp --dport 3306 -j DROP #开启ip段192.168.1.0/24端的3306口 iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT #/etc/rc.d/init.d/ 或 /etc/sysconfig 目录下 service iptables save service iptables restart 1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后失效 开启: service iptables start 关闭: service iptables stop 限制ip访问某个端口 和开放 1、在tcp协议中,禁止所有的ip访问本机的50070端口。 iptables -I INPUT -p tcp --dport 50070 -j DROP 2、允许192.168.1.123访问本机的50070端口 iptables -I INPUT -s 192.168.1.123 -p tcp --dport 50070 -j ACCEPT 3、允许192.168.1.124访问本机的50070端口 iptables -I INPUT -s 192.168.1.124 -p tcp --dport 50070 -j ACCEPT 4、允许192.168.1.100访问本机的50070端口 iptables -I INPUT -s 192.168.1.100 -p tcp --dport 50070 -j ACCEPT iptables -L -n --line-numbers #定义白名单变量名 -N whitelist #设置白名单ip段 -A whitelist -s 116.90.86.196 -j ACCEPT -A whitelist -s 116.90.86.197 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j whitelist -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j whitelist -A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT **测试** 环境:CentOS 8.2 让某一个ip访问或者禁止 [root@localhost ~]# iptables -I INPUT -s 192.168.1.163 -p tcp --dport 22 -j ACCEPT [root@localhost ~]# iptables -I INPUT -s 192.168.1.163 -p tcp --dport 22 -j DROP ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 7] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 8] 实例 : #ipset add ping_allows 48.151.108.107 timeout 0 #iptables -A INPUT -p icmp --icmp-type 8 -m set --match-set ping_allows src -j ACCEPT #del_add_rule -A "INPUT -p icmp --icmp-type 8 -j DROP" # create/clear port-san chain iptables -N port-scan iptables -F port-scan # create ipset lists needed by port-scan chain ipset destroy port_scanners -q # port scan ban list: ban 10 hours ipset create port_scanners hash:ip family inet hashsize 32768 maxelem 65536 timeout 86400 ipset destroy scanned_ports -q # keep ip:port access log for 1 hour ipset create scanned_ports hash:ip,port family inet hashsize 32768 maxelem 65536 timeout 3600 # define port-scan chain # max 10 different ports access in 1 hour is allowed. iptables -A port-scan -p tcp -m state --state NEW -m set ! --match-set scanned_ports src,dst -m hashlimit --hashlimit-above 5/hour --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name portscan --hashlimit-htable-expire 3600000 -j SET --add-set port_scanners src --exist iptables -A port-scan -p tcp -m state --state NEW -m set --match-set port_scanners src -j LOG_DROP iptables -A port-scan -p tcp -m state --state NEW -j SET --add-set scanned_ports src,dst --exist # enable port-scan del_add_rule -A "INPUT -j port-scan" # 核心转发 # # cat /proc/sys/net/ipv4/ip_forward 查看核心转发功能,为0表示核心转发是关闭的; 此时,测试从内网主机1.22 ping 防火墙外网地址11.114,且防火墙核心转发是关闭,此时仍然能ping通,因为linux系统中同一 主机的网卡之间是互通的,ip地址属于内核不属于网卡;只要内网主机1.22的网关指向了防火墙的1.1,那么1.1所在主机的所有地 址,1.22可以ping通防火墙上的所有地址;其实这不叫转发这是默认法则;如果1.22没有把网关指向1.1,只能ping通1.1,ping 不同11.114了;1.22是通过网关1.1转发的;没有网关就不能非本地通信; 如果防火墙没有打开核心转发,1.22不能ping通外网地址11.111; 在1.22主机ping11.111 在11.111抓包,只抓icmp的ping包 # tcpdump -i eno16777736 icpm 此时ping不通,而且也抓不到icmp的包; 打开防火墙的核心转发后,再测试是否能ping通 # echo 1 > /proc/sys/net/ipv4/ip_forward 此时在11.111抓到了ping包,但在1.22扔然显示ping不通; 应该在11.111主机上加一条路由; # route add -net 10.0.1.0/24 gw 172.18.11.114 此时,1.22主机ping通11.111主机; 演示在防火墙上添加iptables规则; 在防火墙关闭转发; # iptables -P FORWARD DROP 此时,1.22主机ping不通11.111主机; 若要内网主机能ping通外网主机,当反之则不允许; # iptables -A FORWARD -s 10.0.1.0/24 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT 放png包出去但没放进返回的包 可在,外网11.111主机抓包; # tcpdump -i eno16777736 -nn icmp 有1.22请求11.111,有11.111响应1.22; 也可在本地1.22主机,虚拟机按ctrl+alt+f2再打开一个控制台吗,抓包; # tcpdump -i eno16777736 -nn icmp 有1.22请求11.111,没响应; 也可在防火墙主机的内网网卡、外网网卡上分别抓包; # tcpdump -i eth0 -nn icmp 收到1.22请求11.111,也收到11.113响应1.22 # tcpdump -i eth1 -nn icmp 仅收到1.22请求11.111,没响应; 打开从内网主机能ping通外网主机; 在防火墙主机只添加一条放进来外网ping包的规则; # iptables -A FORWARD -s 0/0 -d 10.0.1.0/24 -p icmp --icmp-type 0 -j ACCEPT 此时从内网主机能ping通外网主机,放开了仅内网能ping外网主机的规则,可抓包验证; 但仍然不能从外网主机ping通内网主机;即11.111ping不通1.22; 可在防火墙主机外网网卡上抓包,能抓到进来的包; # tcpdump -i eth0 -nn icmp 如果要实现内网主机能ping外网主机互通,则还有添加2条规则,即: 放行从外到内的icmp请求类型为8的,从内到外icmp响应类型为0的即可; 使用基于状态追踪设定规则时,如果只允许内网ping出去,就可把之前设定的两条规则合并; # iptables -F # iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT # iptables -A FORWARD -s 10.0.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT 此时,内网主机1.22能ping通11.111; 当外网主机11.111为web、vsftp服务器时,要允许内网主机访问外网的服务器; 在防火墙主机设置规则: # iptables -F # iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT # iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT 仅放行出去的请求; 此时内网主机能访问外网web服务器了; # curl httpd://172.18.11.111 # iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEP 此时,放行的是vsftp的命令连 接,响应通过上面的ESTABLISHED也没问题,但数据连接在被动模式下,没有放行只有在related状态放行才行;数据连接只有第 一次请求是related的,而且要识别related而不是new要先装载iptables的模块,即ftp连接追踪的模块; 装载iptables的追踪ftp的连接追踪模块 # modprobe nf_conntrack_ftp 在被动模式下,服务器发请求,第一次请求为related的,所以是从外网到内网的为related; 替换第一条规则: # iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT 此时在内网主机测试服务ftp服务 # lftp 172.18.11.111 能访问 在centos7系统上保存规则: iptables-save > /etc/sysconfig/iptables.v2 重启后规则消失,要想开机自动运行: # vim /etc/rc.d/rc.local 添加: #iptables-restore < /etc/sysconfig/iptables.v2 在centos6系统上保存规则: # service iptables save 要想开机自动运行: # chkconfig iptables on LOG:开启内核关于匹配到的报文日志记录规则; –log-level level 可用日志级别:emerg, alert, crit, error, warning, notice, info,debug –log-prefix prefix 日志行前缀,最长29个字母; 说明对应的日志信息,是由谁产生的; –log-ip-options 记录在tcp或ip报文首部中有可变长的可选项信息 注意:target为log日志规则时,应添加在accept、drop、reject规则之前;所以先做日志,再做其它的规则; # iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,22,23,21 -m state --state NEW -j LOG --log- prefix "new connctions: " # iptables -vnL 有访问80的web服务时,可查看日志记录; # tail /var/log/messages 例如: # iptables -F # iptables -N web 创建自定义链 # iptables -vnL # iptables -A web -s 10.0.1.0/24 -p tcp --dport 80 -j ACCEPT 添加web链规则,允许本地主机访问web服务; # iptables -I web 1 -m string --algo kmp --string "old" -j REJECT 插入第1条web链,包含了old字符串的页面禁止访问; 只要状态是ESTABLISHED应放行; # iptables -I web 2 -p tcp -m state --state ESTABLISHED -j ACCEPT 插入web链第2条,放行状态是ESTABLISHED; 此时,内网用户访问web服务:不能访问 # curl httpd://172.18.11.111 是不能访问的,因为自定义链不会直接生效的,只有被调用才生效; # iptables -A FORWARD -p tcp -j web 在forward链上调用web自定义链; 此时,内网用户就能访问web服务了; 再放行ssh服务: # iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -m state --state NEW -j ACCEPT 由内而外放行请求的报文,虽然 没有放行响应的报文,但是在web自定义链上的规则已经放行了; 例如: 编辑11.111为web服务:修改端口为8080 # vim /etc/httpd/conf/httpd.conf Listen 8080 # systemctl restart httpd.service 在web服务器上添加规则:端口映射(地址转换–>端口转换) # iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 80 # iptables -t nat -D PREROUTING 1 # iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 8080 访问浏览器172.18.11.111可浏览web服务; 注意:假设启动了2个服务ngix使用80端口,httpd使用8080,添加以上规则时,ngix就没用了,不能对外提供服务; 在内网1.22主机请求外网web服务 # curl http://172.18.11.111 可访问外网web访问 可在外网web主机查看日志 # tail /var/log/httpd/message 可看到内网请求web时,源地址为1.22,目标地址为11.111;mac地址会不断变化的; 为内网用户访问外网在防火墙设置SNAT: # iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114 如果防火墙有多个外网地址可设为地址范围;如下: # iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114-172.18.11.117 # iptables -t nat -vnL # iptables -vnL 在内网1.22上ping外网11.111; 可在11.111抓包: # tcpdump -i eno16777736 -nn icmp IP 172.18.11.114 > 172.18.11.111: ICMP echo request IP 172.18.11.111 > 172.18.11.114: ICMP echo reply 再打开内网1.22的一个控制台(crtl+alt+f2)抓包: # tcpdump -i eth0 -nn icmp IP 10.0.1.22 > 172.18.11.111: ICMP echo request IP 172.18.11.111 > 10.0.1.22: ICMP echo reply 还可在网关防火墙抓包: 外网网卡抓包: # tcpdump -i eth0 -nn icmp IP 172.18.11.114 > 172.18.11.111: ICMP echo request IP 172.18.11.111 > 172.18.11.114: ICMP echo reply 内网网卡抓包: # tcpdump -i eth1 -nn icmp IP 10.0.1.22 > 172.18.11.111: ICMP echo request IP 172.18.11.111 > 10.0.1.22: ICMP echo reply 还可在内网主机测试80端口: # curl http://172.18.11.111 在11.111服务器上查看日志: # tail /var/log/httpd/access_log 172.18.11.114 - - [28/Apr/2016:19:13:03 +0800] "GET / HTTP/1.1" 200 36 "-" "curl/7.29.0" 要禁止内网用户访问ssh服务,22端口: 在网关防火墙设置规则: # iptables -t filter -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -j REJECT 此时在内网主机连接ssh服务被拒绝访问,但其它服务扔可访问; # ssh root@172.18.11.111 如果规则使用drop则不会立即显示拒绝,而会滞留在连接状态; # 外网转发 # 通过8888 端口在路由器上做一个 端口转发 访问光猫 路由器上配置防火墙规则 iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 192.168.1.1:80 iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.1 --dport 80 -j SNAT --to-source 192.168.1.100 192.168.1.100 是路由器配置的光猫段IP http://xxx.ddns.net:8888/cgi-bin/luci # 内网转发 # 在防网关火墙添加规则: # iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22 此时,在外网主机11.111上访问网关防火墙11.114的ssh服务,被转给了内网10.22主机; # ssh root@172.18.11.114 这样,内网主机服务可随意指定端口,对外发布服务; 在防网关火墙添加规则: # iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 0 -j DNAT --to-destination 10.0.1.22 此时,把目的端口设为0,外网11.111再访问11.114的web服务或ssh服务都被拒绝;在特殊场景中不会是此效果,例如,用到负 载均衡器的lvs场景时,会把11.114上的所有端口,统统转到内网主机服务器上; 例如: # vim /etc/hosts.deny 清空所有条目 # vim /etc/hosts.allow 仅写一条:11.114的ftp服务仅拒绝了11.111主机访问;在allow中deny: vsftpd: 172.18.11.111 :deny # vim /etc/hosts.allow 清空所有条目 # vim /etc/hosts.deny 在deny中allow: vsftpd: 172.18. :allow # 使用案例 # ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 9] WEB服务器,开启80端口. [root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT 邮件服务器,开启25,110端口. [root@localhost ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT FTP服务器,开启21端口 [root@localhost ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT DNS服务器,开启53端口 [root@localhost ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT 允许icmp包通过,也就是允许ping, [root@localhost ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话) [root@localhost ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话) 将本机的8080端口转发至其他主机,主机IP:192.168.1.12,目标主机IP和端口:192.168.1.13:8088,规则如下; iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.118:8080 iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 8080 -j SNAT --to-source 192.168.2.11:80 **multiport扩展** 以离散方式定义多端口匹配,最多指定15个端口 * \[!\] --source-ports,–sports port\[,port|,port:port\]… 指定多个源端口 * \[!\] --destination-ports,–dports port\[,port|,port:port\]… 指定多个目标端口 * \[!\] --ports port\[,port|,port:port\]…多个源或目标端口 **允许172.16.100.10 的20:22,80 访问172.16.0.0/16网段** iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT **iprange扩展** 指明连续的(但一般不是整个网络)ip地址范围 \[!\] --src-range from\[-to\] 源IP地址范围 \[!\] --dst-range from\[-to\] 目标IP地址范围 示例: iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src- range 172.16.1.5-172.16.1.10 -j DROP 指明源MAC地址 适用于:PREROUTING, FORWARD,INPUT chains \[!\] --mac-source XX:XX:XX:XX:XX:XX 示例: iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT iptables -A INPUT -s 172.16.0.100 -j REJECT **connlimit扩展** 根据每客户端IP做并发连接数数量匹配 可防止CC(Challenge Collapsar挑战黑洞)攻击 –connlimit-upto n:连接的数量小于等于n时匹配 –connlimit-above n:连接的数量大于n时匹配 通常分别与默认的拒绝或允许策略配合使用 示例: iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT **limit扩展** 基于收发报文的速率做匹配 令牌桶过滤器 –limit rate\[/second|/minute|/hour|/day\] –limit-burst number 示例: iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute -- limit-burst 5 -j ACCEPT iptables -I INPUT 2 -p icmp -j REJECT **iptables命令** iptables的链接跟踪表最大容量为/proc/sys/net/nf\_conntrack\_max,各种状态的超 时链接会从表中删除;当模板满载时,后续连接可能会超时 解决方法两个: (1) 加大nf\_conntrack\_max 值 vi /etc/sysctl.conf net.nf_conntrack_max = 393216 net.netfilter.nf_conntrack_max = 393216 (2) 降低 nf\_conntrack timeout时间 vi /etc/sysctl.conf net.netfilter.nf_conntrack_tcp_timeout_established = 300 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 iptables -t nat -L -n 开放被动模式的ftp服务 (1) 装载ftp连接追踪的专用模块: 跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter vim /etc/sysconfig/iptables-config 配置文件 IPTABLES_MODULES=“nf_conntrack_ftp" modproble nf_conntrack_ftp (2) 放行请求报文: 命令连接:NEW, ESTABLISHED 数据连接:RELATED, ESTABLISHED iptables –I INPUT -d LocalIP -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT (3) 放行响应报文: iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT 开放被动模式的ftp服务示例 yum install vsftpd systemctl start vsftpd modprobe nf_conntrack_ftp iptables -F iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -vnL **SNAT** nat表的target: SNAT:固定IP –to-source \[ipaddr\[-ipaddr\]\]\[:port\[-port\]\] –random iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to- source ExtIP 示例: iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT -- to-source 172.18.1.6-172.18.1.9 SNAT MASQUERADE:动态IP,如拨号网络 –to-ports port\[-port\] –random iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE 示例: iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22 iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080 **转发** REDIRECT: NAT表 可用于:PREROUTING OUTPUT 自定义链 通过改变目标IP和端口,将接受的包转发至不同端口 –to-ports port\[-port\] 示例: iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080 # 扩展 # 此时在本机地址为172.18.11.114,在远程主机172.18.11.111不能ping通,ssh链接也无法登录; # iptables -A INPUT -s 172.18.0.0/16 -j ACCEPT 指定原IP地址可入站,目标地址不限制; # iptables -A OUTPUT -d 172.18.0.0/16 -j ACCEPT 指定目标IP地址可出站,源地址不限制,肯定为本机地址; 此时172.18.11.111可ping通本地主机 # iptables -F 清空规则 设置仅172.18.11.112能连接本机; # iptables -A INPUT -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT 设置入站放行; # iptables -A OUTPUT -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT 设置出站放行; 此时,只有172.18.11.112能ping同本地主机; 设置处理除了172.18.11.112不能连接本机,其它主机均可连接; # iptables -A INPUT ! -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT # iptables -A OUTPUT ! -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT 此时,只有172.18.11.112不能连接本地主机; 设置仅允许172.18网段的tcp连接本机 # iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -j ACCEPT # iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -j ACCEPT 此时,在172.18.11.111主机不能ping通本机,但可以ssl本机; 注意:ping不通不能说明不能访问,每一种协议都有专用的扩展;可扩展的内容就是协议中的部分字段; 注意:如果要设置默认DROP的策略,建议只开放指定主机IP地址ssh服务,以便能远程登录; 例如: 浏览器可访问172.18.11.114网页; 放行本地主机ssh服务,任意主机可远程登录本机; # iptables -A INPUT -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j ACCEPT 入站规则,-s 0/0可省略默认为所有地址; # iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p tcp --sport 22 -j ACCEPT 出站规则; # iptables -P INPUT DROP 默认策略设为禁止访问;所有服务禁止访问本机; 浏览器不能访问172.18.11.114网页; 开行本机80端口 # iptables -A INPUT -d 172.18.11.114 -p tcp --dport 80 -j ACCEPT 入站规则; # iptables -A OUTPUT -s 172.18.11.114 -p tcp --sport 80 -j ACCEPT 出站规则; 浏览器可访问172.18.11.114网页; **00 协议类型和代码:表示ping应答; 80 协议类型和代码:表示ping请求;** 本机被ping时,别人的请求时,icmp协议类型,入站为8,出站是0; 本机ping别人时,icmp协议类型,出站是8,入站是0; 允许自己png别人,禁止别人ping自己: # iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT 出站设置 # iptables -A INPUT -s 0/0 -d 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT 入站设置 开放别人可ping自己: # iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -j ACCEPT 入站设置 # iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT 出站设置 显示扩展,多端口一条规则指明:开放22和80端口: # iptables -I INPUT -s 0/0 -d 172.18.11.114 -p tcp -m multiport --dports 22,80 -j ACCEPT # iptables -I OUTPUT -d 0/0 -s 172.18.11.114 -p tcp -m multiport --sports 22,80 -j ACCEPT 例如: 删除原来的定义的22端口: # iptables -D INPUT 2 删入站的22端口规则; # iptables -D INPUT 2 删入站的80端口规则; # iptables -D OUTPUT 2 删出站的22端口规则; # iptables -D OUTPUT 2 删出站的80端口规则; 禁止响应页面内容有test字样 # iptables -I OUTPUT -s 172.18.11.114 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "test" -j REJECT 在工作时间内9:00-16:00,放行访问telnet服务 # iptables -R INPUT 4 -d 172.18.11.114 -p tcp --dport 23 -m iprange --src-range 172.18.11.1- 172.18.11.111 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT connlimit:根据每客户端做并发连接数限制,即每客户端最多发起的连接数量; –connlimit-upto n:连接数量小于等于n,则匹配; –connlimit-abvoe n:连接数量大于n则匹配; 例如:限制每台主机访问telnet最大并发数为2个 # iptables -A INPUT -s 0/0 -d 172.18.11.114 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT 允许别人ping设置一分钟20包,突发值为3,表示一次ping需要3秒; # iptables -R INPUT 5 -d 172.18.11.114 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j 查看已追踪并记录到的连接信息; # cat /proc/net/nf_conntrack 连接追踪功能所能够记录最大连接数量:(可调整) /proc/sys/net/nf\_conntrack\_max 调整内核参数,使用echo重定向,或使用syctemctl命令 例如:设置记录最大连接数为300000 # systemctl -w net.nf_conntrack_max=300000 # echo 300000 > /proc/net/nf_conntrack_max 允许172.18网段访问,本机的telnet,ssh,web服务 # iptables -F 清空规则,默认均为拒绝访问 # iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -d 172.18.0.0/16 -s 172.18.11.114 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEPT 开放ping请求,让别人能ping进来 # iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT 放行命令连接 iptables -A INPUT -d 原ip 服务器地址 -p tcp --dport 21 -m state --state NEW,ESTABLIEHED -j ACCEPT iptables -A OUTPUT -s 原ip服务器地址 -p tcp --sport 21 -m state --state ESTABLIEHED -j ACCEPT 放行数据连接 iptables -A INPUT -d 服务器原ip地址 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 服务器原ip地址 -p tcp -m state --state ESTABLISHED -j ACCEPT **例子** 合并规则尽量写为一条 # iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # iptables -A INPUT -d 172.18.11.114 -p tcp -m multiport --dports 22,23,80 -m state --state NEW -j ACCEPT # iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT # iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT # ping 172.18.11.114 在另一台主机观察 # watch -n1 'iptables -vnL' # 保存规则: # centos 6:两种方式 ]# service iptables save 或:]# iptables-save > /etc/sysconfig/iptables ]# iptables-save > /PATH/TO/SOME_RELE_FILE 保存任意位置,但是系统不会自动加载;会把文件中原有规则覆盖; Centos 7:一种方式 ]# iptables -S > /PATH/TO/SOME_RELE_FILE 或:]# iptables-save > /PATH/TO/SOME_RELE_FILE 加载文件预存的规则 ]# iptables-restore < /etc/sysconfig/iptables.v1 **判断下述规则的意义:** # iptables -N clean_in # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP # iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP # iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP # iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP # iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP # iptables -A clean_in -d 172.16.100.7 -j RETURN # iptables -A INPUT -d 172.16.100.7 -j clean_in # iptables -A INPUT -i lo -j ACCEPT # iptables -A OUTPUT -o lo -j ACCEPT # iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP # iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP # iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP # iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP # iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT # iptables防火墙企业级应用案例 # 检查您的系统是否使用/需要FORWARD链 iptables -L -v 既然是DNS请求是他自己发起的,那么它的数据报文请求就需要发送到外部的服务器,那么对于iptables来说,这个DNS请求需要经由OUTPUT链处理. ![在这里插入图片描述][20210429104237773.png] iptables -I OUTPUT -d 0.0.0.0/0 -p udp --dport 53 -j ACCEPT 当dns的查询结果返回到DNS服务器,此时返回的数据报文用到源端口53,并且是进入dns服务器的,该数据报文必须经过iptables的INPUT链处理的。 iptables -I INPUT -s 0.0.0.0/0 -p udp --sport 53 -j ACCEPT 上面的两条防火墙条目,我们不妨配置iptables后,并且执行dns查询后,使用如下命令测试 iptables -L INPUT-v 和 iptables -L OUTPUT -v 看看测试的结果是否如我们所料!,INPUT链中有数据包流量 [root@fw yening]# iptables -L INTPUT -v Chain INPUT (policy ACCEPT 2527K packets, 3753M bytes) pkts bytes target prot opt in out source destination 1258 261K ACCEPT udp -- any any anywhere anywhere udp spt:domain OUTPUT链中的数据包流量 [root@fw yening]# iptables -L OUTPUT -v Chain OUTPUT (policy ACCEPT 1918K packets, 136M bytes) pkts bytes target prot opt in out source destination 3117 220K ACCEPT udp -- any any anywhere anywhere udp dpt:domain **允许或阻止特定连接** 来自单个IP地址的连接 iptables -I INPUT -s 192.168.50.10 -j DROP ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 10] 如果我们将上面的规则的连接动作改成REJECT iptables -I INPUT -s 192.168.50.10 -j REJECT 此时,我们再次ping 192.168.50.253,网关会因为Reject动作向主机反馈一个错误信息-无法连接到端口,但这从某种程度上也向窥探者也暴露了服务器在公网中的存在。**因此使用DROP会比REJECT更为保守一些。** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 11] 来自某个IP段的连接 本例显示如何192.168.50.0/24网络范围内的所有IP地址。您可以使用网络掩码或标准斜杠表示法来指定IP地址范围。通常来说我们对于来自内网的任何一台计算机都认为可信任的主机,因此对于类似这样的情况,防火墙可接受来自一个可信任的ip范围的连接请求。 iptables -A INPUT -s 192.168.50.0/24 -j ACCEPT 或 iptables -A INPUT -s 192.168.50.0/255.255.255.0 -j ACCEPT **连接到特定端口** 例如我们允许某个公网IP访问我们服务器上的某个特定的服务端口 iptable -A INPUT -s 171.92.42.37/32 --dport 7213 -j ACCEPT **连接到特定的端口范围** 例如我们允许公网外访问我们内网的某台服务器上的应用需要用到5151到5253这些端口范围,很笨的方法是这么做 iptables -I INPUT -s 0.0.0.0/0 -d 192.168.117.2 -p tcp --dport 5151 -j ACCEPT iptables -I INPUT -s 0.0.0.0/0 -d 192.168.117.2 -p tcp --dport 5252 -j ACCEPT iptables -I INPUT -s 0.0.0.0/0 -d 192.168.117.2 -p tcp --dport 5253 -j ACCEPT iptables -I OUTPUT -s 192.168.117.2 -d 0.0.0.0/0 -p tcp --sport 5151 -j ACCEPT iptables -I OUTPUT -s 192.168.117.2 -d 0.0.0.0/0 -p tcp --sport 5152 -j ACCEPT iptables -I OUTPUT -s 192.168.117.2 -d 0.0.0.0/0 -p tcp --sport 5153 -j ACCEPT iptables 对于端口的区间有很简洁的语法,见下面的例子 iptables -I INPUT -s 0.0.0.0/0 -d 192.168.117.2 -p tcp --dport 5151:5253 -j ACCEPT iptables -I OUTPUT -s 192.168.117.2 -d 0.0.0.0/0 -p tcp --sport 5151:5253 -j ACCEPT 另外,:717表示717以及之前所有端口,523: 表示523以及以上所有端口 关于开放什么端口,IT管理员应该根据各个部门的信息化流程中提取这些应用中有用的信息就是域名,ip地址和目标端口号,添加到我们防火墙规则中,例如我所在单位,职员上网基本而上没什么限制的,常用的http/https/imap/stmp/pop3这些端口基本上都必须开通的 iptables -I INPUT -p tcp --dport http -j ACCEPT iptables -I INPUT -p tcp --dport https -j ACCEPT iptables -I INPUT -p tcp --dport imap -j ACCEPT iptables -I INPUT -p tcp --dport smtp -j ACCEPT iptables -I INPUT -p tcp --dport pop3 -j ACCEPT iptables -I OUTPUT -p tcp --sport http -j ACCEPT iptables -I OUTPUT -p tcp --sport https -j ACCEPT iptables -I OUTPUT -p tcp --sport imap -j ACCEPT iptables -I OUTPUT -p tcp --sport smtp -j ACCEPT iptables -I OUTPUT -p tcp --sport pop3 -j ACCEPT **关于防火墙开放SSH端口** 我们都知道ssh的标准端口是22端口,而对于上了一定资历的攻击者来说,当他臭探工具,扫描到你的防火墙居然开放了22端口,它一定欣喜若狂。因为标准的ssh端口是不安全的。此时,有安全意识的IT管理员会更改一个对ssh服务选择一个随机很多服务不会用到的端口号。如下图这样的一个服务器,enp3s0是暴露在公网的接口,enp5s0是可信任内网接口 一旦这样的配置规则,我们认为是不安全的,因为标准的端口众所周之。 iptable -A INPUT -s 0.0.0.0/0 --dport 22 -p tcp -j ACCEPT 而相对安全一些的做法是,们在ssh配置文档更改一个随机端口,比如7234 iptable -A INPUT -s 0.0.0.0/0 --dport 7234 -p tcp -j ACCEPT **更为严谨保守的做法** 但如果你的服务器并提供的服务并向不是面向互联网上的用户,那么上面配置也太过开放了,我们应该采取更加保守严谨的做法。比如大型的企业,每个事业部的点对点互联的同时,在规划IT应用架构的之初,尽量减少服务器在公网上的暴露,而仅信任我们的伙伴机构有限地接入,这就是白名单的做法。 * 首先,IT规划者认为所有通讯连接都是不可信(最后一条规则的动作-j DROP)。 * 然后,我们公司业务上用到通讯的ip和端口逐一加入白名单(-j ACCEPT) ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 12] 对于香港事业部的服务器,它进允许北京事业部和越南事业部的服务器的特定通讯 **INPUT链配置** iptable -A INPUT -s 117.232.42.13/32 --dport 4747 -p tcp -j ACCEPT iptable -A INPUT -s 101.23.71.5/32 --dport 4747 -p tcp -j ACCEPT iptable -A INPUT -s 117.232.42.13/32 --dport 7234 -p tcp -j ACCEPT iptable -A INPUT -s 101.23.71.5.5/32 --dport 7234 -p tcp -j ACCEPT iptable -A INPUT -s 192.168.50.17/24 --dport 53 -p udp -j ACCEPT iptable -A INPUT -s 192.168.50.0/24 --dport ntp -p udp -j ACCEPT .... iptable -A INPUT -j DROP **连接状态** 正如我们前面提到的,很多协议将需要双向通信。例如,如果您希望允许SSH连接到您的系统,则INPUT链和OUTPUT链将需要添加一个规则。但是,如果您只希望允许SSH进入您的系统,该怎么办呢?不往OUTPUT链添加规则也要允许传出SSH尝试吗? 这就是连接状态的用武之地,它为您提供了允许双向通信但只允许建立单向连接所需的功能。看看这个示例,\*\*其中来自10.10.10.10的SSH连接是允许的,但连接到10.10.10.10的SSH连接是不允许的。\*\*但是,只要会话已经建立,系统就可以通过SSH发回信息,这使得这两台主机之间可以进行SSH通信。 iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT # iptables安全设置 # **清空所有的规则,只留下默认规则** [root@web02 ~]# iptables -F [root@web02 ~]# iptables -X [root@web02 ~]# iptables -Z iptables -F 清除所有规则 iptables -X 删除用户自定义规则 iptables -Z 链的计数器清零 **例:禁止10.0.0.0网段接入** 基于客户端网段控制 # iptables -A INPUT -s 10.0.0.0/24 -j DROP \-s指定源地址 还可以使用不是这个网段的进行操作 # iptables -A INPUT ! -s 10.0.0.0/24 -j DROP **案例:控制22端口 eth0网卡进来的数据** iptables -A INPUT -p tcp --dport 22 -i eth0 ! -s 10.0.0.0/24 -j DROP iptables -A INPUT -p tcp --dport 22 -i eth0 ! -s 192.168.1.1 -j DROP 封掉3306端口 iptables -A INPUT -p tcp --dport 3306 -j DROP 企业场景禁ping iptables -A INPUT -p icmp --icmp-type 8 -s 10.0.0.0/24 -j ACCEPT **1.设置允许SSH登录端口** [root@web02 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCETP [root@web02 ~]# iptables -A INPUT -p tcp -s 10.0.0.1/24 -j ACCEPT 2.设置允许本机lo通信规则 [root@web02 ~]# iptables -A INPUT -i lo -j ACCEPT [root@web02 ~]# iptables -A OUTPUT -o lo -j ACCEPT 3.设置默认规则 [root@web02 ~]# iptables -P INPUT DROP [root@web02 ~]# iptables -P OUTPUT ACCEPT [root@web02 ~]# iptables -P FORWARD DROP 查看规则(现在的服务器是最安全的) [root@web02 ~]# iptables -nL --line-number Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 ACCEPT tcp -- 10.0.0.0/24 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4.开启信任的IP网段 允许IDC LAN/WAN 和办公网IP的访问,及对外合作机构访问 iptables -A INPUT -s 124.23.62.96/27 -p all -j ACCEPT #办公室固定IP段 iptables -A INPUT -s 192.168.2.0/24 -p all -j ACCEPT #IDC机房的内网网段 iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT #其他机房的内网网段 iptables -A INPUT -s 203.82.24.0/24 -p all -j ACCEPT #IDC机房的外网网段 iptables -A INPUT -s 203.82.23.0/24 -p all -j ACCEPT #其他IDC机房的外网网段 现在还只是我们可以访问,对外还无法访问 **5.允许icmp类型协议通过** iptables -A INPUT -p icmp -m icmp-type any -j ACCEPT 提示:如果不想开,就不执行此命令 iptables -A INPUT -p icmp -s 10.0.0.0/24 -m icmp --icmp-type any -j ACCEPT **6.允许关联的状态包通过(Web服务不要使用FTP服务)** iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 提示:以上配置就是合格服务器应该配置的 # 保存 # 默认使用iptables并没有永久保存,重启失效。 **第一种方法:** /etc/init.d/iptables save 保存到/etc/sysconfig/iptables 下面 显示如下格式 [root@web02 ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Mon Aug 15 01:33:44 2016 *nat :PREROUTING ACCEPT [1413:153792] :POSTROUTING ACCEPT [132:8834] :OUTPUT ACCEPT [132:8834] COMMIT # Completed on Mon Aug 15 01:33:44 2016 # Generated by iptables-save v1.4.7 on Mon Aug 15 01:33:44 2016 *filter :INPUT DROP [1798:662465] :FORWARD DROP [0:0] :OUTPUT ACCEPT [288:21100] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 10.0.0.0/24 -p tcp -j ACCEPT -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT COMMIT # Completed on Mon Aug 15 01:33:44 2016 **第二种方法:** # iptables-save >/etc/sysconfig/iptables > 推荐使用第一种方式 **开放单个服务** nagios $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 5666 -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 5666 -j ACCEPT #db $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 3307 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 3306 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 3307 -j ACCEPT #ssh difference from other servers here.>> $IPT -A INPUT -s 10.0.0.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp --dport 52113 -j ACCEPT $IPT -A INPUT -p tcp --dport 22 -j ACCEPT #http $IPT -A INPUT -p tcp --dport 80 -j ACCEPT #snmp $IPT -A INPUT -s 10.0.0.0/24 -p UDP --dport 161 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p UDP --dport 161 -j ACCEPT #rsync $IPT -A INPUT -s 10.0.0.0/24 -p tcp -m tcp --dport 873 -j ACCEPT $IPT -A INPUT -s 10.0.10.0/24 -p tcp -m tcp --dport 873 -j ACCEPT #icmp #$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT #others RELATED $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT **企业案例**:写一个脚本解决DOS攻击生产案例 提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP 本脚本使用测试文件进行编写 # cat test_6.sh #!/bin/sh # [ -f /etc/init.d/functions ] && . /etc/init.d/functions IP_file="/server/scripts/ddos.txt" IP_filter_command="iptables -I INPUT -j DROP -s" IP_recover_command="iptables -D INPUT -j DROP -s" function IP_check(){ grep "EST" ${IP_file}|awk -F "[ |:]+" '{print $6}'|sort |uniq -c|sort -rn -k1 > /server/scripts/ip.txt } function IP_filter(){ exec < /server/scripts/ip.txt while read line do IP_count=`echo $line|awk '{print $1}'` IP=`echo $line|awk '{print $2}'` IP_fil=`iptables -L -n|grep "\b${IP}\b"|wc -l` if [ ${IP_count} -gt 25 -a ${IP_fil} -eq 0 ];then ${IP_filter_command} ${IP} echo "${IP}" >> /server/scripts/ip_filtered.txt action "Filter ${IP}" /bin/true fi done } function IP_recover(){ exec < /server/scripts/ip.txt while read line do IP_count=`echo $line|awk '{print $1}'` IP=`echo $line|awk '{print $2}'` IP_fil=`iptables -L -n|grep "\b${IP}\b"|wc -l` if [ ${IP_count} -le 25 -a ${IP_fil} -eq 1 ];then ${IP_recover_command} ${IP} echo "${IP}" >> /server/scripts/ip_filtered.txt action "Recover ${IP}" /bin/true fi done } function main(){ case "$1" in filter) IP_check echo "$(date +%F-%H:%M:%S) filtered by $(whoami)" >> /server/scripts/ip_filtered.txt IP_filter ;; recover) IP_check echo "$(date +%F-%H:%M:%S) recovered by $(whoami)" >> /server/scripts/ip_filtered.txt IP_recover ;; *) echo "USAGE:$0 {filter|recover}" exit 1 esac } main $* 开启内核转发 vim /etc/sysctl.conf net.ipv4.ip_forward = 1 #sysctl -p 生效 **案例2:实现把访问10.0.0.5:80的请求转到172.16.1.8:80** [root@web02 ~]# iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8:80 [root@web02 ~]# iptables -P FORWARD DROP #iptables -L -n ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 13] **映射多个外网IP上网** iptables -t nat -A POSTROUTING -s 10.0.0.1/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 iptables -t nat -A POSTROUTING -s 172.16.1.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.103-124.42.60.106 #iptables -t nat -A postrouting -S 192.168.1.0/22 -o eth0 -j SNAT --to-source 10.0.0.241-10.0.0.249 调整内核参数/etc/sysctl.conf后,需执行/sbin/sysctl -p使得修改生效。 net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 **强调:如果并发比较大,或者日PV多的情况下,开启防火墙要注意,很可能导致网站访问缓慢** **大并发(并发1万,PV日3000万)要么购买硬件防火墙,要么不开iptables防火墙** # 常用命令 # 停止firewalld服务 systemctl stop firewalld 禁用firewalld服务 systemctl mask firewalld 查看iptables现有规则 iptables -L -n 先允许所有,不然有可能会杯具 iptables -P INPUT ACCEPT 清空所有默认规则 iptables -F 清空所有自定义规则 iptables -X 所有计数器归0 iptables -Z 允许来自于lo接口的数据包(本地访问) iptables -A INPUT -i lo -j ACCEPT 开放22端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 允许ping iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT 允许接受本机请求之后的返回数据 RELATED,是为FTP设置的 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 其他入站一律丢弃 iptables -P INPUT DROP 所有出站一律绿灯 iptables -P OUTPUT ACCEPT 所有转发一律丢弃 iptables -P FORWARD DROP 如果要添加内网ip信任(接受其所有TCP请求) iptables -A INPUT -p tcp -s 45.96.174.68 -j ACCEPT 过滤所有非以上规则的请求 iptables -P INPUT DROP 要封停一个IP,使用下面这条命令: iptables -I INPUT -s ... -j DROP 要解封一个IP,使用下面这条命令: iptables -D INPUT -s ... -j DROP 保存上述规则 service iptables save 注册iptables服务 相当于以前的chkconfig iptables on systemctl enable iptables.service 开启服务 systemctl start iptables.service 查看状态 systemctl status iptables.service 最后重启防火墙使配置生效 /etc/init.d/iptables restart 解决vsftpd在iptables开启后,无法使用被动模式的问题 1.首先在/etc/sysconfig/iptables-config中修改或者添加以下内容 添加以下内容,注意顺序不能调换 IPTABLES_MODULES="ip_conntrack_ftp" IPTABLES_MODULES="ip_nat_ftp" 2.重新设置iptables设置 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables 常用示例 # **1、阻止指定IP地址** 例:丢弃来自IP地址x.x.x.x的包 BLOCK_THIS_IP="x.x.x.x" iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP 注:当你在log里发现来自某ip地址的异常记录,可以通过此命令暂时阻止该地址的访问以做更深入分析 例:阻止来自IP地址x.x.x.x eth0 tcp的包 iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP **2. 允许所有SSH的连接请求** 例:允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT **3. 仅允许来自指定网络的SSH连接请求** 例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 4、. 仅允许来自指定网络的SSH连接请求 例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求 iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 5.允许http和https的连接请求 例:允许所有来自web - http的连接请求 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 例:允许所有来自web - https的连接请求 iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT 6、. 使用multiport 将多个规则结合在一起 允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示: 例:允许所有ssh,http,https的流量访问 iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT 1. 允许从本地发起的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 请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。 1. 仅允许从本地发起到一个指定的网络域的SSH请求 例:仅允许从内部连接到网域192.168.100.0/24 iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 1. 允许从本地发起的HTTPS连接请求 下面的规则允许输出安全的网络流量。如果你想允许用户访问互联网,这是非常有必要的。在服务器上,这些规则能让你使用wget从外部下载一些文件 iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT > 注:对于HTTP web流量的外联请求,只需要将上述命令中的端口从443改成80即可。 1. 负载平衡传入的网络流量 使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。 例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443 11、. 允许外部主机ping内部主机 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT 1. 允许内部主机ping外部主机 iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT 1. 允许回环访问 例:在服务器上允许127.0.0.1回环访问。 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT .14 允许内部网络域外部网络的通信 防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用以下规则允许内部网络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。 iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT 15、. 允许出站的DNS连接 iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT 16、. 允许NIS连接 如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口号,此例中为853和850端口。 rpcinfo -p | grep ypbind 例:允许来自111端口以及ypbind使用端口的连接请求 iptables -A INPUT -p tcp --dport 111 -j ACCEPT iptables -A INPUT -p udp --dport 111 -j ACCEPT iptables -A INPUT -p tcp --dport 853 -j ACCEPT iptables -A INPUT -p udp --dport 853 -j ACCEPT iptables -A INPUT -p tcp --dport 850 -j ACCEPT iptables -A INPUT -p udp --dport 850 -j ACCEPT 注:当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP 2)编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。 1. 允许来自指定网络的rsync连接请求 例:允许来自网络192.168.101.0/24的rsync连接请求 iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT 18、. 允许来自指定网络的MySQL连接请求 很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令: iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT 1. 允许Sendmail, Postfix邮件服务 Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。 iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT 1. 允许IMAP和IMAPS 例:允许IMAP/IMAP2流量,端口为143 iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT 例:允许IMAPS流量,端口为993 iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT 1. 允许POP3和POP3S 例:允许POP3访问 iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT 例:允许POP3S访问 iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT 1. 防止DoS攻击 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT 上述例子中: > \-m limit: 启用limit扩展 > –limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。 > –limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。 1. 端口转发 例:将来自422端口的流量全部转到22端口。 这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。 iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22 除此之外,还需要允许连接到422端口的请求 iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT 1. 记录丢弃的数据表 第一步:新建名为LOGGING的链 iptables -N LOGGING 第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中 iptables -A INPUT -j LOGGING 第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped” iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7 第四步:丢弃这些数据包 iptables -A LOGGING -j DROP 1. 使用recent模块限制同IP时间内新请求连接数。 下面策略表示:60秒有10个新连接,超过记录日志。 iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options 1. 60秒10个新连接,超过丢弃数据包 # iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP # vim /etc/sysconfig/iptables //删除原来的内容输入如下内容 保存 # Generated by iptables-save v1.3.5 on Sun Dec 12 23:55:59 2010 *filter :INPUT DROP [385263:27864079] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [4367656:3514692346] -A INPUT -i lo -j ACCEPT -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -s 127.0.0.1 -j ACCEPT -A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name WEB –rsource -A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 5 –hitcount 20 –rttl –name WEB –rsource -j DROP -A INPUT -p tcp -m multiport –ports 21,22,80 -j ACCEPT -A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m ttl –ttl-eq 117 -j DROP -A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m length –length 0:40 -j DROP -A INPUT -p tcp -m tcp ! –tcp-flags SYN,RST,ACK SYN -m state –state NEW -j DROP COMMIT # Completed on Sun Dec 12 23:55:59 2017 以上配置,说明此设定仅对外开放21(FTP),22(SSH),80(http网站)三个TCP端口。设置80端口5秒内20个连接。 # /etc/init.d/iptables restart **常用的一些iptables策略:** 1、拒绝转发来自192.168.2.33主机的数据 iptables -A FORWARD -s 192.168.2.33 -j REJECT 2、允许转发来自192.168.2.1/99网段的数据 iptables -A FORWARD -s 192.168.2.1/99 -j ACCEPT 3、允许本机开放从TCP端口20-1024提供的应用服务。 iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT 4、只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。 iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP 5、 允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。 iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT 6、屏蔽ip 110.1.1.1的访问 iptables -I INPUT -s 110.1.1.1 -j DROP 7、屏蔽从123.0.0.1到123.255.255.254iptables -I INPUT -s 123.0.0.0/8 -j DROP 8、屏蔽从从123.45.0.1到123.45.255.254iptables -I INPUT -s 124.45.0.0/16 -j DROP 9、屏蔽从从123.45.6.1到123.45.6.254iptables -I INPUT -s 123.45.6.0/24 -j DROP 10、允许所有本机向外的访问iptables -A OUTPUT -j ACCEPT 11、允许访问22端口iptables -A INPUT -p tcp --dport 22 -j ACCEPT 常用的iptables命令: 1、查看当前 IPTABLES 规则 service iptables status 2、 将所有iptables以序号标记显示 iptables -L -n --line-numbers 3、 比如要删除INPUT里序号为22的规则 iptables -D INPUT 22 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 14] # 设置防火墙规则开机自启(亲测) # 新建规则文件 mkdir /etc/iptables #先新建目录,本身无此目录 vim /etc/iptables/rules.v4 /etc/iptables/rules.v4 中的内容是 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :syn-flood - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT -A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood -A INPUT -j REJECT --reject-with icmp-host-prohibited -A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN -A syn-flood -j REJECT --reject-with icmp-port-unreachable COMMIT 4.使防火墙生效 iptables-restore < /etc/iptables/rules.v4 创建文件,添加以下内容,使防火墙开机启动 vim /etc/network/if-pre-up.d/iptables #!/bin/bash iptables-restore < /etc/iptables/rules.v4 添加执行权限 chmod +x /etc/network/if-pre-up.d/iptables **查看规则是否生效** iptables -L -n ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 15] iptables -N clean_in iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP iptables -A clean_in -d 172.16.100.7 -j RETURN iptables -A INPUT -d 172.16.100.7 -j clean_in iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT # iptables防火墙如何记录日志 # 首先,我们需要了解如何将所有的iptables的INPUT链数据包记录到/var/log/messages中。如果你已经有一些iptables规则了,那么将记录日志的规则放在这些规则的顶部,如果放在规则的后面,将不会记录日志。 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 4/min -j LOG --log-prefix "Iptables-SSH-IN: " --log-level 4 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -P INPUT DROP 在上面的示例中,它执行以下操作: > 第一条规则记录所有访问目的端口为22的,将记录日志,限制日志每分钟4条,日志前缀为“Iptables-SSH-IN: > ”,日志记录级别为Warning。 第二条规则允许所有源地址的新连接访问目的端口22。 第三条规则允许所有已建立的连接访问本机。 > 设置INPUT链的默认规则为DROP。 上面第一条规则解释: > \-m limit:使用limit模块。使用此选项,可以使用–limit选项限制访问速率。 > –limit 4/min:这表示记录的最大平均访问速率。在此示例中,对于类似的数据包,它将日志记录限制为每分钟4个。还可以设置为2/second, > 2/minute, 2/hour, 2/day。 > \-j LOG:这表示此数据包的目标是LOG。即写入日志文件。 > –log-prefix "Iptables-SSH-IN: ” 可以指定任何日志前缀,这些前缀将写入到/var/log/messages日志文件中。 > –log-level 4这是标准的系统日志级别。4是警告(warning)。可以使用0到7之间的数字。0是emerg,1是alert,2是crit,3是err,4是warning,5是notice,6是info,7是debug。 **修改iptables日志存放位置** 默认情况下,iptables将使用/var/log/messages记录所有消息。如果要将其更改为自己的定制日志文件,将下面命令添加到/etc/rsyslog.conf中。前提需要安装rsyslog服务: # 安装rsyslog服务 [root@localhost ~]# yum -y install rsyslog # 设置开机启动、并立即启动 [root@localhost ~]# systemctl enable rsyslog --now # 编辑/etc/rsyslog.conf文件,添加下面内容到文件底部 [root@localhost ~]# vim /etc/rsyslog.conf kern.warning /var/log/iptables.log 查看刚才设置的日志文件: [root@localhost ~]# ll -h /var/log/iptables.log -rw-------. 1 root root 2.0K Feb 9 10:46 /var/log/iptables.log [root@localhost ~]# tail -f /var/log/iptables.log # 案例 # iptables优化案例 [root@ghzz ~]# vi /root/shell/iptables.sh #!/bin/bash #by qiuyuetao #-------------------------------------------------------------------------- IPTAB=/sbin/iptables #定义环境变量 $IPTAB -X #清空自定义链 $IPTAB -Z #清空计数器 $IPTAB -F #清空当前表的所有规则 $IPTAB -t nat -F #清空nat表的所有规则 $IPTAB -t mangle -F #清空mangel 表规则 $IPTAB -t raw -F #清空raw表规则 $IPTAB -X -t nat #清空自定义链 $IPTAB -X -t raw $IPTAB -X -t mangle #-------------------------------------------------------------------------- $IPTAB -A INPUT -i lo -j ACCEPT #允许回环地址访问 $IPTAB -A INPUT -s 127.0.0.1 -j ACCEPT #允许自己访问 $IPTAB -A INPUT -s 192.168.0.0/22 -j ACCEPT# 允许内网访问 $IPTAB -A INPUT -s 119.161.189.1 -j ACCEPT #允许跳板机访问 #-------------------------------------------------------------------------- $IPTAB -A INPUT -p icmp -j ACCEPT #允许icmp 也就是ping $IPTAB -A INPUT -p tcp -m multiport --dport 80,22,3306,2188 -j ACCEPT #对外开放的端口 $IPTAB -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #对进来的包的状态进行检测。已经建立tcp连接的包以及该连接相关的包允许通过! $IPTAB -P INPUT DROP #除了上面的fiter表input链 $IPTAB -P FORWARD DROP $IPTAB -P OUTPUT ACCEPT #-------------------------------------------------------------------------- $IPTAB-save > /etc/sysconfig/iptables ##修改iptables -F -X -Z 都需要 /etc/init.d/iptables save ## -t:指定要保存的表的名称。 # iptables-save -t filter > iptables.bak 恢复备份的iptables配置: 恢复备份的iptables配置: iptables-restor < /etc/sysconfig/iptables 开启内核转发 将net.ipv4.ip_forward = 1 由0改为1 sed -i 'snet.ipv4.ip_forward = 0net.ipv4.ip_forward = 1g' sysctl -p 生效 添加iptables模块 lsmod 显示已经加载到内核中的模块的状态信息 lsmod|egrep "nat|filter" 查看nat 与filter表加载的模块信息 modprobe ip_tables modprobe ip_conntrack modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack_ftp 连接跟踪 modprobe ip_nat_ftp nat模块 modprobe ipt_state 状态模块 https://www.linuxprobe.com/enterprise-firewall-practice.html # 使用state扩展模块 # https://www.zsythink.net/archives/1663 #如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文。 #使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启 cat /proc/sys/net/ipv4/ip_forward #使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。 方法一:echo 1 > /proc/sys/net/ipv4/ip_forward 方法二:sysctl -w net.ipv4.ip_forward=1 #使用如下方法开启核心转发功能,重启网络服务后永久生效。 配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1 #由于iptables此时的角色为"网络防火墙",所以需要在filter表中的FORWARD链中设置规则。 #可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。 #配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。 #示例为允许网络内主机访问网络外主机的web服务与sshd服务。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT #可以使用state扩展模块,对上述规则进行优化,使用如下配置可以省略许多"回应报文放行规则"。 iptables -A FORWARD -j REJECT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT **参考链接:** **Linux系统管理员要知道的16个iptables使用技巧** :https://www.ywnz.com/linuxaq/3394.html 用iptables限制sftp端口连接数 : https://www.jianshu.com/p/303257b33835 https://blog.csdn.net/csfreebird/article/details/8132362 https://help.ubuntu.com/community/IptablesHowTo CentOS下实现iptables持久化 : https://www.jianshu.com/p/afa6f9e908d0 https://blog.csdn.net/qq\_40058321/article/details/103180923 https://www.jianshu.com/p/04959f472eca 第1篇:Linux防火墙企业级应用案例 https://www.jianshu.com/p/079ca81497d6 **服务器安全之iptables** https://i4t.com/1283.html 2篇:Linux防火墙企业级应用案例 :https://www.jianshu.com/p/3dca273ea222 服务器安全之iptables : https://i4t.com/1283.html **干货:25 条有用的 iptables 常用示例** :https://mp.weixin.qq.com/s/drwxYze6waAka1bAhpYNcg iptables拓展规则(多端口、根据IP地址范围、MAC地址设置) :https://www.jianshu.com/p/5bee3be85f20 **centos7启用iptables :** https://www.cnblogs.com/ainimore/p/12502609.html **ubuntu中防火墙iptables配置** https://www.cnblogs.com/xwgcxk/p/10820518.html centos 7防火墙firewalld实用操作 :https://www.cnblogs.com/stulzq/p/9808504.html iptables防火墙如何记录日志 :https://www.linuxprobe.com/iptables-record-log.html **https://www.linuxprobe.com/enterprise-firewall-practice.html** centos7.5配置iptables防火墙 : https://www.jianshu.com/p/ad4209ae0f9a \*\*Iptables 限制连接数(如SFTP) 以及 谨防CC/DDOS攻击的配置 ( connlimit模块) \*\* :https://www.cnblogs.com/kevingrace/p/8082700.html Linux的铜墙铁壁iptables 原文来自:https://mp.weixin.qq.com/s/4lqXoABgdl75w98YfLCCGg 本文地址:https://www.linuxprobe.com/bastion-iron-iptables.html **iptables 如何防止 syn ddos ping 攻击 :https://www.linuxprobe.com/iptables-syn-ddos-ping.html** **25个iptables常用示例 :https://www.linuxprobe.com/25-iptables-common-examples.html** **VPS安全之iptables基本配置 远离暴力破解** : https://www.linuxprobe.com/vps-iptables.html [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70]: /images/20221022/9b8abfb4a97349a4862044580a5d194e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 1]: /images/20221022/36a0d56d82264c74b8524400427bf680.png [80e50e9087af42a19bc3490ada6a25f0.png]: /images/20221022/b2c3519a48cc45f0b06f7fe29e178e65.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 2]: /images/20221022/90606da8c1e0496d8c9f819fe9921036.png [1b26e53c09a447968508589b395db818.png]: /images/20221022/9666f38d10c84fc0878313ce8da5bbf9.png [00d0e9d002414f40b8e8364c0d980bb6.png]: /images/20221022/4a1b1b6d3bff4249856df7f1910d3500.png [d0a8586a148240c8accb418e203a984a.png]: /images/20221022/e8bae83022184ef49a9fcf3a97ec519e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 3]: /images/20221022/7b11ece8f4ee4c1698709fa7fb4686f8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 4]: /images/20221022/6c1b0dbb03c748ed8d7886a44dc3c852.png [20210318143043603.png]: /images/20221022/9cf889ed37ad4b728f938dc5b7f3570f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 5]: /images/20221022/5a0df4711a644254bdbcadc105bf7c04.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 6]: /images/20221022/49bdfdc19e684f7a8d556a0715f3c8a1.png [20210415112015294.png]: /images/20221022/4c1443bdeb1245c3a82748a05c019507.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 7]: /images/20221022/2dfcab7f048d475da6dba3e681e4f855.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 8]: /images/20221022/b5493f331a9c47d6bb809b7d12c6c5d5.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 9]: /images/20221022/c002ea8d90794c6e9b0735fef2e52ce4.png [20210429104237773.png]: /images/20221022/49852acf97634769965834971c4a5f62.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 10]: /images/20221022/05081490557e40d7a39cedcba4e8c8c9.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 11]: /images/20221022/ccb23fad0a734888a4ef2ac984a4000e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 12]: /images/20221022/69f248d8e7004a76b3885dc7a0b167b5.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 13]: /images/20221022/88ccd7e5a25c4c808ea9efb277c2a8a6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 14]: /images/20221022/66acf6d420d541d8953d68ef281c22e8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3_size_16_color_FFFFFF_t_70 15]: /images/20221022/6b051569fdbc4cc0a94f58d0e2b0a385.png
还没有评论,来说两句吧...