Linux/CentOS 防火墙、iptables 入门到精通
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 #删除所有链规则
[root@C64-GW ~]# 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
[root@C64-GW ~]# iptables -F
[root@C64-GW ~]# 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
[root@C64-GW ~]#
[root@C64-GW ~]# 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
[root@C64-GW ~]#
参数 -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]
[root@C64-GW ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP #filter表是默认的表,不指定就是默认 可以不加
iptables -A INPUT -p tcp --dport 22 -j DROP
[root@C64-GW ~]# iptables -D INPUT -p tcp --dport 22 #删除链
处理的行为:ACCEPT(接受),DROP(丢弃),REJECT(拒绝)【reject会返回信息】
丢弃好于拒绝
命令行执行的规则 仅仅在内存里临时生效
使用-I和-A的顺序,防火墙的过滤是根据规则的顺序进行的
-A添加规则到指定链的结尾
-I添加规则到指定链的开头
如:
[root@C64-GW ~]# iptables -A INPUT -p tcp --dport 9001 -j DROP
[root@C64-GW ~]# iptables -A INPUT -p tcp --dport 9002 -j DROP
[root@C64-GW ~]# iptables -A INPUT -p tcp --dport 9003 -j DROP
[root@C64-GW ~]# 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
....
[root@C64-GW ~]# iptables -I INPUT -p tcp --dport 9006 -j DROP
[root@C64-GW ~]# 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,让此规则放最前面,避免默认规则导致拒绝无效
防火墙每条规则对应一个序号
[root@C64-GW ~]# 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
指定序号进行删除规则
[root@C64-GW ~]# iptables -D INPUT 5
指定位置插入规则:如插入到第三行
[root@C64-GW ~]# iptables -I INPUT 3 -p tcp -s 192.168.157.132 --dport 8080 -j ACCEPT
[root@C64-GW ~]# 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#。。。
[root@C64-GW ~]# 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
[root@C64-GW ~]# iptables -A INPUT -i eth0 ! -s 192.168.157.132 -j DROP
[root@C64-GW ~]# 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的禁止连接
[root@C64-GW ~]# iptables -A INPUT -i eth0 ! -s 192.168.157.132 -j DROP #其它ping不同了
2、允许143所有协议通过132
[root@C64-GW ~]# iptables -I INPUT -p all -s 192.168.157.143 -j ACCEPT
[root@C64-GW ~]# 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、先清空
[root@C64-GW ~]# iptables -F#清除当前所有链的规则
[root@C64-GW ~]# iptables -X#删除用户自定义的链
[root@C64-GW ~]# iptables -Z#清除当前所有链的计数
[root@C64-GW ~]#
iptables默认三个链是允许的
[root@C64-GW ~]# 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
[root@C64-GW ~]#
先配置运行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
执行过程
[root@C64-GW ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@C64-GW ~]# iptables -I INPUT -s 192.168.157.0/24 -j ACCEPT
设置允许本机lo通信规则,运行本机回环lo接口
[root@C64-GW ~]# iptables -A INPUT -i lo -j ACCEPT
[root@C64-GW ~]# iptables -A OUTPUT -o lo -j ACCEPT
设置默认的防火墙禁止和运行规则 -P
[root@C64-GW ~]# iptables -P INPUT DROP #把进和转发剔除
[root@C64-GW ~]# iptables -P FORWARD DROP
[root@C64-GW ~]# iptables -P OUTPUT ACCEPT #保留出去规则
[root@C64-GW ~]# 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
[root@C64-GW ~]#
开启信任的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参数
[root@C64-GW ~]# 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
[root@C64-GW ~]# 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
root@C64-GW ~]# 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
[root@C64-GW ~]#
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服务上
[root@C64-GW ~]# 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