标签(空格分隔): Linux 运维 防火墙 iptables
iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。由iptables程序包提供.术语 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多 前端[broken link: invalid section]
和 图形界面[broken link: invalid section]
配置。iptables 用于 ipv4,ip6tables 用于 ipv6。
nftables 已经包含在 Linux kernel 3.13 中,以后会取代 iptables 成为主要的 Linux 防火墙工具。(摘自archwiki)
iptables的4表5链
Iptables,(带状态追踪的包过滤式)防火墙规则管理工具 组成部分(4表 5链 各种规则)如下:
netfilter: 防火墙框架,位于内核空间.
ip header(ipv4):
hook function: 报文的行走路线 5条'链'
input
output
forward
preroutings
postroutings
内置链(chain)相当于围墙上的各道门,iptables上对应的hook function(勾子函数)
❶ PREROUTING
❷ INPUT
❸ FORWARD
❹ OUTPUT
❺ POSTROUTING
表,也称功能(tables)(门上的各种规则)
❶ raw:关闭nat表上启用的连接追踪机制.剥离外部附加功能,以原始状态呈现
❷ mangle ['mæŋg(ə)l]: 拆解报文,做出修改,并重新封装起来.
❸ nat: network address translation网络地址转换,修改源IP或目标IP,也可以改端口(源端口目标端口)
❹ filter: 过滤,防火墙
表与链的关系与报文的流向
功能(tables) --> 链(chain)
tables规则在每道门(chain)执行次序(从高到低)如下
raw: REROUTING, OUTPUT
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
nat: PREROUTING, OUTPUT, POSTROUTING, [INPUT](CentOS7)
filter: INPUT, FORWARD, OUTPUT
报文流向
注入本机: PREROUTING --> INPUT
由本机流出: OUTPUT --> POSTROUTING
经由本机转发: PREROUTING --> FORWARD --> POSTROUTING
iptables命令的详细使用
iptables命令:将iptables的库想象成数据库,这些命令无非是对数据的增删改查等等。
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
iptables语法格式
iptables [-t table] COMMAND chain cretieria [-m matchname [per-match-options]] -j targetname [per-target-options]`
-t table # 指定规则所作用的表,raw, mangle, nat, [filter]
chain # 指定规则所作用的链 PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING
COMMAND # 对链及这个链上的规则的管理(增删查改)
cretieria # 匹配条件
COMMAND参数对链与规则的管理
`链管理`
-N:new,自定义一条新的规则链,默认是不会被引用的,仅在默认链上通过某规则进行调用方可生效,因此每个自定义链都有引用计数。
示例: iptables -t filter -N in_web
-X CHAIN_NAME: delete,只能删除自定义的规则链(空的且引用计数为0),如果没有加链名,则会删除所有自定义空链。
-E old_name new_name: rename,重命名自定义链,(引用计数为0才可以,正在被引用的链不能重命名)。
-P: Policy,设置默认策略,对filter表中的链而言,其默认的策略有ACCEPT DROP REJECT #注意这里不需要-j参数
示例: iptables -t filter -P INPUT DROP|ACCEPT|REJECT
-F: flush, 清空指定的规则链或删除指定链上的规则。如果没有跟链名则是删除指定表的所有链。
示例:iptables [-t table] -F [chain[rulenum][options...]]
-Z CHAIN_NAME: zero, 置零指定的链
iptables的每条规则都有两个计数器:
1.匹配到的报文的个数(pkts)
2.匹配的所有报文的大小之和(bytes)
`规则管理(自己编写的)`
-A: append,在末尾追加一条链规则.
例: iptables -t filter -A INPUT -s 192.168.1.10 -d 192.168.1.123 -j ACCEPT
-I: insert,插入,要指明rulenum,省略时默认插入到第1条。
-D: delete, 删除指定链上的指定规则,指明规则序号或规则本身。
例: iptabls -D INPUT 1 [-j DROP]
-R: replace,iptables [-t table] -R chain rulenum rule-specification;替换指定链上的指定规则.
例: iptables -t filter -R INPUT 1 -s 10.1.0.71 -j DROP
注:不同类别的规则顺序上面应该为使用较频繁的放上(前)面,相同类型的规则的话那么应该将匹配范围小的放在较上(前)面.
`查看选项`
-L: list,列出指定链上的所有规则。
-n: numberic,以数字格式显示地址和端口。
-v: verbose, 详细信息。
-vv,-vvv: 更详细的信息。
-x: exactly,显示计数器结果的精确值。
--line-numbers: 显示链上的某条规则的序号。
iptables命令的匹配条件(cretieria)(多个条件之间默认是与关系)
基本匹配条件:无需加载任何模块,由iptables/netfilter自行
[!] -s, --source address[/mask][,...]: 检查报文中的源IP地址是否符合此处指定的地址或范围。
例: iptables -t filter -A INPUT -s
[!] -d, --destination address[/mask][,...]: 检查报文中的目标IP地址是否符合此处指定的地址范围。
[!] -p, --protocol protocol: 传输层的协议(tcp, udp, udplite, icmp, esp, ah, sctp or all)类型 如没有指定的话则为all
[!] -i, --in-interface name: 数据报文流入的接口.只能用在INPUT, FORWARD 与 PREROUTING链上。
例: "iptables -t filter -R INPUT -s 172.16.100.6 -d 172.16.100.67 -p icmp -i eno16777736 -j DROP"
[!] -o, --out-interface name: 数据报文即将离开本机经由的接口.只能用在FORWARD, OUTPUT and POSTROUTING链上。
-m:显示指明要使用的扩展模块
-j, --jump TARGET: 跳转目标(即处理动作)
扩展匹配条件:需要加载扩展模块,方可生效. #CentOS中可以man iptables-extensions查看具体内容说明
㈠ 隐式扩展(不需要手动加载扩展模块); 因为它们是对协议的扩展,所以但凡使用-p指明了协议,就表示已经指明了要扩展的模块。
-p {tcp|udp|icmp}
tcp:
[!] --source-port,--sport port[:port]: 匹配报文的源端口(可给出多个连续的端口)
[!] --destination-port,--dport port[:port]: 匹配报文的目标端口(同上)
示例: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 22 -j DROP #禁止访问本机tcp的22号端口即ssh服务
[!] --tcp-flags mask comp: 带2个参数,其取值为(SYN(建立连接) ACK(ACK) FIN(关闭连接) RST(连接重置) URG() PSH(有数据传输) ALL NONE)
mask是我们必须要检查的标识位(值为0或1),而comp是我们必须要设置的.
"iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
will only match packets with the SYN flag set, and the ACK,
FIN and RST flags unset."--> 要检查的标识位有SYN,ACK,FIN,RST,其中SYN必须值为1,余下的必须为0.即匹配tcp第一次"握手" 即确认是一个新请求
[!] --syn: 相当于--tcp-flags SYN,ACK,FIN,RST SYN
udp:
[!] --source-port,--sport port[:port]:
Source port or port range specification. See the description
of the --source-port option of the TCP extension for details.
[!] --destination-port,--dport port[:port]
Destination port or port range specification.See the
description of the --destination-port option of the TCP
extension for details.
icmp: --protocol icmp被指定了才生效,提供下面的选项. # 互联网控制报文协议 主要是用于探测网络上主机或服务的可用性
[!] --icmp-type {type[/code]|typename}
This allows specification of the ICMP type, which can be a
numeric ICMP type, type/code pair, or one of the ICMP type
names shown by the command
iptables -p icmp -h
两个最常见的type/code(更详细的类型与代码请GOOGLE)
echo-request: 8/0 # ping出去的报文
echo-reply: 0/0 # ping返回的报文
示例: iptables -A INPUT -s 0.0.0.0/0 -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP # 限制任何人ping自己
iptables -A OUTPUT -d 0.0.0.0/0 -s 172.16.100.67 -p icmp --icmp-type 0/0 -j DROP #
㈡ 显式扩展(指明需要手动加载扩展模块), -m matchname [per-match-options]
1、multiport
以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;
例: iptables -t filter -A INPUT -d 10.1.0.6 -p tcp -m multport --dports 22,23,80 -j ACCEPT
iptables -t filter -A OUTPUT -s 10.1.0.6 -p tcp -m multport --sports 22,23,80 -j ACCEPT
2、iprange
以连续的ip地址范围指明多地址匹配条件();
[!] --src-range from[-to]
[!] --dst-range from[-to]
示例:
3、string
对报文中的应用层数据做字符串匹配检测(string或--hex-string 与 --algo必须给);
[!] --string pattern
[!] --hex-string pattern # 没有给出偏移量的话指代全文
--algo {bm|kmp}:字符串匹配检查算法;
--from offset: 从最开始处偏移多少个字符
--to offset: 从最尾端向前偏移多少个字符
示例: iptables -A OUTUT -d 172.18.20.0/24 -s 172.18.20.96 -p tcp --sport 80 -m string --string "sex" --algo bm -j REJECT
4、time
根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...] 1~7代表周一到周日,也可用 Mon,Tue,Wed, ...等英文标识
示例: iptables -t filter -I INPUT -d 10.1.0.6 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:59 --weekdays Sat,Sun -j REJECT
5、connlimit
根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;
--connlimit-upto n:连接数小于等于阈值; # 单ip并发连接数据<= n
--connlimit-above n:连接数超出阈值; # 单ip并发连接数 > n
例: iptables -t filter -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
6、limit -->基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day] # 包的速率,如每分钟多少个包 每小时多少个包
--limit-burst NUMBER # 默认值为5, 最大允许匹配的初始化包数量 想象一下摩天轮
例:iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
7、**state # 对系统安全性有很大的提升 cat /proc/sys/net/nf_conntrack_max 查看 在调度器主机千万不要开启此功能
状态(state_name)检测:连接追踪机制(conntrack) tcp udp icmp 都支持
NEW: 新连接
ESTABLISHED: 已建立的连接
RELATED: 相关联的连接,由某个已存在的连接发起请求之后建立的(第一次的)连接.
INVALID: 无法识别的连接, state表中有数据,但因为某种原因而无法识别了.
UNTRACKED: 未被追踪连接。
需要安装相关的内核模块:
modprobe nf_conntrack
modprobe nf_conntrack_ipv4
modprobe nf_conntrack_ftp --> 专门用来实现追踪ftp RELATED状态的
追踪到的连接:/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
建议调整至足够大;
不同的协议的连接追踪时长不同:
/proc/sys/net/netfilter/ # 建议调小
[!] --state state_name
如何开放被动模式的ftp服务:
(1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp
(2) 允许入站命令连接 NEW ESTABLISHED状态的报文
示例: iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
(3) 允许放行
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(4) 放行出站的ESTABLISHED连接 # 这条规则的好处是基本上控制了入站请求,就不需要新建出站请求了.以不变应万变
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -d 本机IP -p tcp -m multiport --dports 21,22,23,80 -m state --state NEW -j ACCEPT
iptables -t filter -A OUTPUT -s 172.18.20.96 -m state --state ESTABLISHED -j ACCEPT #以一敌万的配置
iptables -t filter -P INPUT DROP #这两条建议使用自定义规则实现,可以防止执行iptables -F命令后无法远程连接
iptables -t filter -P OUTPUT DROP
处理动作(target) # man iptables-extensions
-j targetname [per-target-options]
ACCEPT: 允许访问
DROP: 拒绝
REJECT: "礼貌"拒绝
--reject-with TYPE: TYPE(可以是 icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable... 默认为icmp-port-unreachable)
RETURN: 返回调用链 例如自定义链返回
REDIRECT: 端口重定向(映射) # 在nat表 PREROUTING OUTPUT链上有效
例:iptables -t nat -A PREROUTING -d 192.168.22.2,192.168.22.3 -p tcp
--dport 80 -j REDIRECT --to-ports 8080
LOG: 记录日志
--log-level:
--log-prefix: 日志信息的前导信息
--log-tcp:
...
MARK: 做防火墙转换
iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11
DNAT: 目标地址转换 放在PREROUTING链上 nat表
示例: iptables -t nat -A PREROUTING -d 10.1.0.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.22.2:80
iptables -t nat -A PREROUTING -d 10.1.0.6 -p tcp --dport 22 -j DNAT --to-destination 192.168.22.3:8800
SNAT: 源地址转换 只能放在POSTROUTING或INPUT链上 只在放在nat表
示例: iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -j SNAT --to-source 10.1.0.6 # 192.168.22网段的主机转换成网关地址10.1.0.6访问外网地址
MASQUERADE: 地址伪装, # 只能用在nat表 POSTROUTING链上
示例:
...
-j 自定义链名-->即处理动作转到自定义链上去 就像调用一个函数似的
保存和载入iptables规则
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不予提交;
注意:重载文件中的规则,会清除已有规则;
CentOS 6:
保存规则:service iptables save
保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;
重载规则:server iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
脚本配置文件:/etc/sysconfig/iptables-config
用于指明要装载的模块;
CentOS 7开机自动生效规则:
(1) firewalld服务;
(2) shell脚本,直接记录iptables命令;
(3) 自定义unit file或init script;
iptables规则优化的思路
(1) 优先放行双方向状态为ESTABLISHED,RELATED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制
(a) 可使用iptables -P设定默认策略;
(b) 建议在规则链的最后定义规则做为默认策略;