iptables简介 Netfilter/Iptables是Unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具 它的功能强大,使用灵活,可以对流入和流出 服务器的数据包进行很精细的控制。特别是它可以在一台非常低的配件配置下跑的非常好。 Iptables是Linux2.4/2.6内核中集成的服务 其功能与安全性很牛逼,工作在OSI二三四层 如果重新编译内核 也可以支持7层控制。 iptables名称和术语 容器:iptables里用来描述这种包含或者说属于的关系 Netfilter:netfilter是表(tables)的容器,【房子-->一栋楼的关系】这套房子(tables)属于这栋楼"netfilter" tables:表是链的容器,即所有的链(chains)都属于对应的表(tables) chains链:链是规则(Policys)的容器 Policy规则:就是iptables一系列过滤信息的规范和具体方法 iptables工作流程 数据包过滤机制,iptables会对请求的数据包的包头数据进行分析 并根据我们预先设定的规则进行匹配,来决定是否可以进入主机。 小结: 1、防火墙是层层过滤的 实际按照规则的顺序从上到下 从前到后进行过滤的 2、如果匹配上规则 明确表明是阻止还是通过 数据包就是不再向下匹配新规则 3、如果规则中没有明确表明是阻止还是通过 也就是没有匹配规则 向下进行匹配 直到匹配默认规则得到明确的阻止还是通过 4、默认规则是所有的规则执行完才会执行的 提示:iptables匹配上了拒绝规则也是匹配。 iptables表(tables)和链(chains) 根据功能和表的定义划分包含三个表:filter,nat,mangle 其中每个表又包含不同的操作链(chains) Filter表:主要和主机自身有关,真正负责主机防火墙功能(过滤流入流出主机的数据包),filter表是iptables默认使用的表, 这个表有3个链,INPUT FORWARD OUTPUT INPUT:负责过滤所有目标地址是本机地址的数据包,通俗的讲,就是过滤进入主机的数据包 FORWARD:负责转发流经主机的数据包,起到转发的作用,和Nat关系很大 OUTPUT:处理所有源地址是本机地址的数据包 通俗讲 就是处理从主机发出去的数据包 提示:对filter表的控制是实现本机防火墙功能的重要手段 Nat表:负责网络地址转换,即来源于目的ip地址和port的转换,一般用于局域网共享上网或者特殊的端口转换 企业应用场景:1、用来做路由或网关 2、做内部外部ip地址一对一映射 端口映射 对应的三个链(chains),NAT功能相当于网络的acl OUTPUT:和主机发出去的数据包有关 改变主机发出数据包的目标地址 PREROUTING:在数据包到达防火墙时进行路由判断之前执行的规则 作用是改变数据包的目的地址 目的端口等 如,把公网IP:121.11.24.56映射到局域网的10.8.8.2的服务器上,如果是web服务可以把80端口转为局域网的服务器上的9000端口 POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址 源端口等 Mangle表:主要负责修改数据包中特殊的路由标记,如TTL TOS MARK等,定义了5个链 INPUT FORWARD OUTPUT PREROUTING POSTROUTING 根据数据包的目的地址判断是发往本地进程还是被转发到其他网络上。如果是发往防火墙本身,在被传递到本地进程之前需要经过NF_IP_LOCAL_IN钩子进行处理;如果数据包需要经其他接口被转发出去,它需要被NF_IP_FORWARD钩子处理,然后交由NF_IP_POST_ROUTING 钩子进行处理 iptables -h#查看命令帮助 iptables -L -n iptables -F #删除所有链规则 [[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected] ~]# iptables -F [[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected] ~]# [[email protected] ~]# iptables -L -n -t nat # -t指定表(不指定则默认是filter表) Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected] ~]# 参数 -X 清掉用户定义的链 -Z 清掉iptables的计数器 iptables -F<==>iptables --flush iptables -X<==>iptables --delete-chain iptables -Z<==>iptables --zero iptables -L -n -t ... 禁止规则: 封掉22端口 语法:iptables -t [tables] -[AD] chain rule-specification [option] [[email protected] ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP #filter表是默认的表,不指定就是默认 可以不加 iptables -A INPUT -p tcp --dport 22 -j DROP [[email protected] ~]# iptables -D INPUT -p tcp --dport 22 #删除链 处理的行为:ACCEPT(接受),DROP(丢弃),REJECT(拒绝)【reject会返回信息】 丢弃好于拒绝 命令行执行的规则 仅仅在内存里临时生效 使用-I和-A的顺序,防火墙的过滤是根据规则的顺序进行的 -A添加规则到指定链的结尾 -I添加规则到指定链的开头 如: [[email protected] ~]# iptables -A INPUT -p tcp --dport 9001 -j DROP [[email protected] ~]# iptables -A INPUT -p tcp --dport 9002 -j DROP [[email protected] ~]# iptables -A INPUT -p tcp --dport 9003 -j DROP [[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9001 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9002 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9003 .... [[email protected] ~]# iptables -I INPUT -p tcp --dport 9006 -j DROP [[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9006 #-I的规则 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9001 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9002 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9003 企业应用 awk '{print $1}' /app/log/access_log|sort|uniq -c|sort -rn -k1#日志分析,单ip访问次数 iptables -I INPUT -p tcp -s 192.168.157.132 --dport 80 -j DROP #封杀恶意ip,让此规则放最前面,避免默认规则导致拒绝无效 防火墙每条规则对应一个序号 [[email protected] ~]# iptables -L -n --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9006 2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:90 指定序号进行删除规则 [[email protected] ~]# iptables -D INPUT 5 指定位置插入规则:如插入到第三行 [[email protected] ~]# iptables -I INPUT 3 -p tcp -s 192.168.157.132 --dport 8080 -j ACCEPT [[email protected] ~]# iptables -L -n --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9006 2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9001 3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 ..... 小结删除规则的方法: 1、iptables -D INPUT -p tcp --dport 8080 -j DROP 2、iptables -F 删除所有规则 3、/etc/init.d/iptables restart(命令临时生效) 4、iptables -D INPUT 规则序号 禁止某网段连入 iptables -A INPUT -i eth0 -s 192.168.157.0/24 -j DROP # -s指定源地址,-i指进入接口 iptables -D INPUT -i eth0 -s 192.168.157.0/24 -j DROP#删除规则 拒绝规则也是匹配(非的作用是对ip或者网段进行取反) iptables -A INPUT -i eth0 -s ! 192.168.157.132 -j DROP (C6 C7 !要放s参数前;5.8没问题) iptables -A INPUT -i eth0 -s ! 192.168.157.132 -j ACCEPT#。。。 [[email protected] ~]# iptables -A INPUT -i eth0 -s ! 192.168.157.132 -j ACCEPT Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`). iptables -A INPUT -i eth0 ! -s 192.168.157.132 -j DROP [[email protected] ~]# iptables -A INPUT -i eth0 ! -s 192.168.157.132 -j DROP [[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination 。。。 ACCEPT all -- !192.168.157.132 0.0.0.0/0 DROP all -- !192.168.157.132 0.0.0.0/0 测试[!非] 1、拒绝源地址不是192.168.157.132单个ip的禁止连接 [[email protected] ~]# iptables -A INPUT -i eth0 ! -s 192.168.157.132 -j DROP #其它ping不同了 2、允许143所有协议通过132 [[email protected] ~]# iptables -I INPUT -p all -s 192.168.157.143 -j ACCEPT [[email protected] ~]# iptables -L -n --line Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 192.168.157.143 0.0.0.0/0 2 DROP all -- !192.168.157.132 0.0.0.0/0 。。 iptables -I INPUT -p icmp --icmp-type 8 -i eth0 ! -s 192.168.157.132 -j DROP #拒绝除132外的ping 禁止不是192.168.157.0/24网段的连接 iptables -I INPUT -i eth0 ! -s 192.168.157.0/24 -j DROP 等价于 iptables -I INPUT -i eth0 -s 192.168.157.0/24 -j ACCEPT 工作场景:不是局域网段的ip拒绝连接ssh iptables -A INPUT -p tcp --dport 52113 ! -s 192.168.157.0/24 -j DROP iptables -A INPUT -p tcp --dport 52113 ! -s 124.42.80.0/24 -j DROP VPN服务,拨号到VPN上 然后以VPN的内网地址去访问内部(IDC)的机器 前端对外提供服务的机器ssh端口都做禁止外部IP访问限制 可以开启后端或者不对外提供服务的机器 保留SSH服务(更改root和SSH端口),然后 平时就连接此机器 在去连接其它机器 流量特别大的外网机器不要开防火墙 会影响性能 购买硬件防火墙(前端用硬件防火墙封堵) 协议匹配 -p iptables -A -p tcp/udp/icmp/all(所有协议) 匹配指定协议外的所有协议 iptables -A INPUT -p ! tcp 匹配主机源IP iptables -A INPUT -s 192.168.157.11 iptables -A INPUT ! -s 192.168.157.11 匹配网段 iptables -A INPUT -s 92.168.157.0/24 iptables -A INPUT ! -s 92.168.157.0/24 匹配单一端口 iptables -A INPUT -p tcp --sport 53 iptables -A INPUT -p udp --dport 53 匹配指定端口之外的端口 iptables -A INPUT -p tcp --dport ! 22 匹配端口范围 iptables -A INPUT -p tcp --sport 22:80 iptables -I INPUT -p tcp --dport 21,22,23,24 -j ACCEPT#错误语法 iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT iptables -I INPUT -p tcp --dport 18:80 -j DROP 匹配指定的网络接口 iptables -A INPUT -i eth0 iptables -A FORWARD -o eth0 匹配网络状态 -m ---------------------------------------------------- 生产环境主机防火墙的配置 1、先清空 [[email protected] ~]# iptables -F#清除当前所有链的规则 [[email protected] ~]# iptables -X#删除用户自定义的链 [[email protected] ~]# iptables -Z#清除当前所有链的计数 [[email protected] ~]# iptables默认三个链是允许的 [[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected] ~]# 先配置运行SSH登录端口的进入,防止把自己关在外边,连不上IDC iptables -A INPUT -p tcp --dport 22 -s 192.168.157.0/24 -j ACCEPT 或者 iptables -A INPUT -p tcp --dport 52113 -j ACCEPT 执行过程 [[email protected] ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT [[email protected] ~]# iptables -I INPUT -s 192.168.157.0/24 -j ACCEPT 设置允许本机lo通信规则,运行本机回环lo接口 [[email protected] ~]# iptables -A INPUT -i lo -j ACCEPT [[email protected] ~]# iptables -A OUTPUT -o lo -j ACCEPT 设置默认的防火墙禁止和运行规则 -P [[email protected] ~]# iptables -P INPUT DROP #把进和转发剔除 [[email protected] ~]# iptables -P FORWARD DROP [[email protected] ~]# iptables -P OUTPUT ACCEPT #保留出去规则 [[email protected] ~]# iptables -L -n --line Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- 192.168.157.0/24 0.0.0.0/0 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 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 [[email protected] ~]# 开启信任的IP网段 如:允许IDC LAN/WAN和办公网IP的访问 及对外合作机构访问 iptables -A INPUT -s 124.43.62.98/27 -p all -j ACCEPT #办公室固定IP段 iptables -A INPUT -s 192.168.157.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.26.0/24 -p all -j ACCEPT #IDC机房的外网网段 iptables -A INPUT -s 201.82.25.0/24 -p all -j ACCEPT #其它IDC机房的外网网段 允许业务服务端口对外访问(允许http服务无条件通过) iptables -A INPUT -p tcp --dport 80 -j ACCEPT 允许ICMP类型协议通过 iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT 对内开,外不可icmp iptables -A INPUT -p icmp -s 192.168.157.0/24 -m icmp --icmp-type any -j ACCEPT 允许关联的状态包通过 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT --------------命令配置仅仅在内存中,重启失效,所有将以上配置保存 cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak 或者/etc/init.d/iptables save保存--->/etc/sysconfig/iptables(规则保存位置) 或者iptables-save >/etc/sysconfig/iptables 提示:/etc/sysconfig/iptables为iptables的默认配置文件路径 第一次保存可以覆盖 以后保存只能追加 生产环境防火墙的维护 1、编辑/etc/sysconfig/iptables 加入一条规则 -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT /etc/init.d/iptables restart 2、某个ip 192.168.157.143的机器攻击服务器 手工封IP:习惯命令行 用I参数 [[email protected] ~]# iptables -I INPUT -s 192.168.157.143 -j DROP 或者仁慈点封80端口 iptables -I INPUT -p tcp -s 192.168.157.143 --dport 80 -j DROP 如果有多个恶意IP攻击,写脚本自动封 a、根据建立连接的IP #!/bin/sh netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -10|grep -v -E '192.168|127.0'|awk '{if ($2!=null && $1>4) {print $2}}'>/home/dropip for i in $(cat /home/dropip) #过滤办公网的ip do /sbin/iptables -I INPUT -s $i -j DROP echo "$i kill at `date`" >>/var/log/ddos done ----------------- b、分析web日志 配置服务器iptables做为网关 生产网关的配置需求 环境: GW节点, eth0: eth1: IPADDR=192.168.157.136 IPADDR=192.168.1.19 GATEWAY=192.168.157.2 #不配网关 另一主机节点C eth0: IPADDR=192.168.1.17 GATEWAY=192.168.1.19 条件: 1、GW具备双网卡 建议eth0外网地址,eth1内网地址(不配网关) 2、确保GW能上网,否则代理不了其它机器上网 3、在GW开启内核转发,内核文件/etc/sysctl.conf里开启转发功能(net.ipv4.ip_forward=1), 4、iptables的filter表的FORWARD链运行转发 5、或者不要filter防火墙功能共享上网 因此 最后暂时停掉防火墙测试/etc/init.d/iptables stop 加载iptables内核模块 配置网关需要加载iptables的nat表 PREROUTING POSTROUTING 载入iptables内核模块,执行后放入rc.local modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state [[email protected] ~]# lsmod|egrep ^ip iptable_filter 2793 1 iptable_nat 6158 0 ip_tables 17831 2 iptable_filter,iptable_nat ipt_REJECT 2351 0 ipv6 321422 72 [email protected] ~]# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:192.168.157.136 SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:192.168.157.136 Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected] ~]# PREROUTING 一般用于改变目标地址和端口 POSTROUTING用于改变源端口和IP地址 iptables -t nat -A PREROUTING -d 192.168.157.136 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.17:80 #把请GW的80服务转发到后端的17的80服务上 [[email protected] ~]# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 192.168.1.19 tcp dpt:80 to:192.168.1.17:80 企业案例:实现外部IP 124.42.34.112一对一映射到内部server 10.0.0.8 网关IP:eth0:124.42.60.109 eth1:10.0.0.254 首先路由器网关绑定124.42.34.112可以是别名的方式 -A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8 #只要请112,则转发给.8 -A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112#一来一回 -A POSTROUTING -s 10.0.0.0/255.255.240.0 -d 124.42.34.112 -j SNAT --to-source 10.0.0.254#内网的机器访问交给网关 到目的网络192.168.1.0/24走 网关10.0.0.19 route add -net 192.168.1.0/24 gw 10.0.0.19 映射多个外网IP上网 iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.240.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的内核优化 net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 #iptables优化 net.ipv4.ip_conntrack_max = 25000000 net.ipv4.netfilter.ip_conntrack_max=25000000 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120 |
标签: iptables INPUT 0.0 ACCEPT 192.168 tcp 规则 destination root DROP 出处: https://www.toutiao.com/article/7077929455640969742/ |