1.防火墙iptables介绍
防火墙相关概念
此处先描述一些相关概念。
从逻辑上讲。防火墙可以大体分为主机防火墙和网络防火墙。
主机防火墙:针对于单个主机进行防护。
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体), 主机防火墙主内(个人)。
从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
iptables是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(Network Address Translate)
数据包内容修改
以及数据包过滤的防火墙功能
1.1iptables基础四表五链
四表
filter表:负责过滤功能,防火墙;内核模块:iptables_filter 企业工作场景:主机防火墙
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw
也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张”表”中。
五链
PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表,filter表。
OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING 的规则可以存在于:mangle表,nat表。
表和链的关系
表(功能)<–> 链(钩子):
raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
处理动作
处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
2.iptables命令介绍
选项
-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
iptables命令选项输入顺序:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
实例
清除已有iptables规则
iptables -F iptables -X iptables -Z
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口 iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口 iptables -A INPUT -j reject #禁止其他未允许的规则访问 iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
查看已添加的iptables规则
iptables -L -n -v Chain INPUT (policy DROP 48106 packets, 2690K bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
删除已添加的iptables规则
将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
3.实用命令记录
1).禁用ssh
端口
~]# iptables -t filter -A INPUT 1 -p tcp --dport 22 -j DROP ##禁止访问22端口,指定位置 ~]# iptables -t filter -D INPUT -p tcp --dport 22 -j DROP ##删除规则
2).禁止192.168.56.0
网段接入
~]# iptables -t filter -A -i eth0 -s 192.168.56.0/25 -j DROP
~]# iptables -t filter -A -i eth0 ! -s 192.168.56.0/25 -j DROP ##取反
3).禁用端口及网段接入
~]# iptables -t filter -A INPUT -p tcp --dport 22:52113 -i eth0 ! -s 192.168.56.0/24 -j DROP
4).禁ping
服务器
~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -s 192.168.56.0/24 -j ACCEPT
5).状态匹配
~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ##ESTABLISHED 已建立的连接 ##RELATED 正在启动的新连接
6).限制指定时间内的允许通过数量及并发数
-m limit --limit n/(second/miuute/hour) ##指定时间内的请求速率"n"不指定默认为5,分别为(秒,分,时) --limit-burst [2] ~]# iptables -t filter -I INPUT -s 192.168.56.0/24 -p icmp --icmp-type 8 -m limit --limit 5/min --limit-burst 2 -j ACCEPT
7).脚本
#!/bin/bash #define variable PATH IPT=/sbin/iptables #Remove any existing rules $IPT -F $IPT -X $IPT -Z #setting default firewall policy $IPT --policy OUTPUT ACCEPT $IPT --policy FORWARD DROP $IPT -P INPUT DROP #setting for loopback interface $IPT -A INPUT -i lo -j ACCEPT #setting access rules #one,ip access rules,allow all the ips of $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT $IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT $IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT $IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT $IPT -A INPUT -s 192.168.56.0/24 -p all -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
8).局域网上网
1.环境 server-网关A 能上网 eth0:118.190.201.21 eth1:192.168.56.21 client01-服务器B eth1:192.168.56.32 2.说明 网关B eth0 118.190.201.21 配上级网关 118.190.201.2 eth1 192.168.56.21 不配网关 服务器C eth1 192.168.56.32 配网关 192.168.56.21 3.实践步骤 3.1添加静态网关-client01 ~]# route add default gw 192.168.56.21 3.2打开内核转发-server 编辑/etc/sysctl.conf永久生效将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1 ~]# sysctl -p 关闭iptables stop方便测试临时生效~]# echo 1 > /proc/sys/net/ipv4/ip_forward~]# sysctl -w net.ipv4.ip_forward=1 ##-w 临时改变某个指定参数的值4.载入内核模块 modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state ~]# lsmod |egrep ^ip 5.局域网共享上网两条命令 1.适合有固定外网地址的-server21: ~]# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j SNAT --to-source 118.190.201.21 命令说明: 1)-s 192.168.56.0/24 办公室或IDC内网网段 2)-o eth0 为网关的外网卡接口 3)-j SNAT --to-source 118.190.201.21 是网关外网卡IP地址 2.适合变化的外网地址(ADSL): ~]# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE 使用route命令 route add -net 192.168.56.0/24 gw 118.190.201.21 tcpdump -nnn -i eth1 -s 1000 -A host 192.168.56.21
9).端口映射
===================================================== 浏览器访问 118.190.201.21:9000 ===> 192.168.56.32:80 NAT表 PREROUTING链 ===================================================== ~]# iptables -t nat -A PREROUTING -d 118.190.201.21 -p tcp --dport 9000 -j DNAT --to-destnation 192.168.56.32:80
10).一对一地址映射
=============================================================================== 实现外部IP 118.190.201.21 一对一映射到内部 server:192.168.56.32 网关IP:118.190.201.12 eth1:192.168.56.254 =============================================================================== 首先在路由网关上绑定VIP 118.190.201.21 可以是别名或辅助IP的方式 ~]# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -d 118.190.201.21 -j SNAT --to-source 192.168.56.254 ~]# iptables -t nat -A PREROUTING -d 118.190.201.21 -j DNAT --to-destination 192.168.56.32 ~]# iptables -t nat -A POSTROUTING -s 192.168.56.32 -o eth0 -j SNAT --to-source 118.190.201.21 写入配置文件/etc/sysctl.conf -A POSTROUTING -s 192.168.56.0/24 -d 118.190.201.21 -j SNAT --to-source 192.168.56.254 -A PREROUTING -d 118.190.201.21 -j DNAT --to-destination 192.168.56.32 -A POSTROUTING -s 192.168.56.32 -o eth0 -j SNAT --to-source 118.190.201.21
11).映射多个外网IP上网
~]# iptables -t nat -A POSTROUTING -s 192.168.56.32 -o eth0 -j SNAT --to-source 118.190.201.21-118.190.201.26
命令小记
# 清理Iptables表
## 注意:如果节点Iptables有特殊配置,以下命令请谨慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain
Get busy living or get busy dying. 努力活出精彩的人生,否则便如行尸走肉
- 转载请注明来源:IPTABLES防火墙
- 本文永久链接地址:https://www.xionghaier.cn/archives/128.html