计算机领域的安全技术多种多样,广义上来说,一般有:入侵检测系统(Intrusion
Detection System)、入侵检测与防御系统(Intrusion Detection and Prevention
System)和防火墙技术(Firewall)。
在计算机领域,防火墙(FireWall)就是基于预先定义的安全规则来监视和控制来往的
网络流量的网络安全系统。防火墙的核心是隔离,其将受信任的内部网络和不受信任的
外部网络隔离开。内部网络一般是公司的内部局域网,外部网络一般是 Internet。
一般防火墙工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,
并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认
情况下关闭所有的通过型访问,只开放允许访问的策略。
Netfilter 官网文档
Netfilter–WIKI
hooks
,其允许特定的内核模块向内核的chain
(链)中,预先chain
有五个(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING),[root@centos7 ~]# rpm -qi iptables
Name : iptables
Version : 1.4.21
Release : 33.el7
Architecture: x86_64
Install Date: Sun 15 Dec 2019 07:16:07 PM CST
Group : System Environment/Base
Size : 1555528
License : GPLv2
Signature : RSA/SHA256, Fri 23 Aug 2019 05:26:19 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : iptables-1.4.21-33.el7.src.rpm
Build Date : Thu 08 Aug 2019 07:42:19 PM CST
Build Host : x86-02.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.netfilter.org/
Summary : Tools for managing Linux kernel packet filtering capabilities
Description :
The iptables utility controls the network packet filtering code in the
Linux kernel. If you need to set up firewalls and/or IP masquerading,
you should install this package.
iptables 是个工作在用户空间的工具软件,其允许系统管理员配置由 linux 内核防火墙
(由多个 Netfilter 内核模块实现)提供的表
,表中存有多个链
和规则
。也可以使用
iptables 编写规则,写好的规则被送往 netfilter 内核模块,告诉内核如何去处理信息包。
iptables 被用来处理 IPv4 协议,除了 iptables,还有处理其他协议的不同工具,每个工具
对应内核中的一个模块,不同的内核模块和软件被用来处理不同的网络协议:
用户空间工具 | 内核模块 | 处理的协议 |
---|---|---|
iptables | ip_tables | IPv4 |
ip6tables | ip6_tables | IPv6 |
arptables | arp_tables | ARP 地址解析协议 |
ebtables | ebtables | Ethernet frames 以太网帧 |
以上四个模块是 Netfilter hook system 比较重要的模块 |
[root@centos7 ~]# ip6tables --version
ip6tables v1.4.21
[root@centos7 ~]# arptables --version
arptables v0.0.4
[root@centos7 ~]# ebtables --version
ebtables v2.0.10-4 (December 2011)
从 CentOS 7 版开始引入了新的前端管理工具
ipchains
,同为一个作者开发Rusty_Russell;用户空间工具 | 合并进 linux 时内核版本 | 发行日期 | 作者 |
---|---|---|---|
ipfwadm | Linux kernel 2.0.x | 没查到,based on BSD’s ipfw | FreeBSD volunteer staff members |
ipchains | Linux kernel 2.2 series | pre-1998 | Rusty Russell |
iptables | Linux kernel 3.13 | 1998 | Rusty Russell |
nftables | Linux kernel 3.13 | March 2009 | The Netfilter Project |
数据来源2 | |||
实际上在 ipchains 出现之前也有相关的防火墙管理工具,ipchains 之前使用的工具为ipfwadm |
iptables 也用来专指内核中的模块名,x_tables 就表示在内核中包含被四个模块(ip_tables,
ip6_tables,arp_tables,ebtables)引用的共享代码和提供给其他扩展程序的 API 的模块。
后来 Xtables 被用来代表整个 linux 的防火墙架构。在 centos 下可以看出 iptables 工具
实际上是xtables-multi
的软连接。
[root@centos7 ~]# iptables --version
iptables v1.4.21
[root@centos7 ~]# ll `which iptables`
lrwxrwxrwx. 1 root root 13 Dec 15 19:16 /usr/sbin/iptables -> xtables-multi
[root@centos8 ~]# iptables --version
iptables v1.8.2 (nf_tables)
[root@centos8 ~]# ll `which iptables`
lrwxrwxrwx. 1 root root 17 May 11 2019 /usr/sbin/iptables -> xtables-nft-multi
iptables 由五个表和五个链以及一些规则组成,每个表的实现在内核中对应一个模块
表 | 内核模块 | 功能 |
---|---|---|
raw | iptable_raw module | 关闭启用的连接跟踪机制(更消耗内存和时间),加快封包穿越防火墙速度 |
mangle | iptable_mangle module | 修改数据标记位规则表,该操作使得后面的如 nat 和包过滤等动作可行 |
nat | iptable_nat module | network address translation 实现网络地址转换规则,用来评估是否以及如何修改数据包的原地址和目标地址,一般在无法直接访问某网络时用到,用来转发数据包到目的网络 |
filter | iptable_filter module | 过滤规则表,根据预定义的规则过滤符合条件的数据包,即让该数据包继续到达其预定的目的地还是拒绝其请求 |
security | security_filter module | 用于强制访问控制(MAC)网络规则 |
在数据包经过 Netfilter 的过程中,某些表会被首先执行,并对数据包做相应处理,使得接下
来的表能够正常处理和过滤包。因此表的调用和执行是由前后优先级关系的,一般的优先级
如下:
security --> raw --> mangle --> nat --> filter
security 最先,filter 最后执行。
规则 rule:
根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理,
规则在链接上的次序即为其检查时的生效次序
匹配条件:默认为与
条件,即同时满足
基本匹配
:IP,端口,TCP 的 Flags(SYN,ACK 等)
扩展匹配
:通过复杂高级功能匹配,需要指定特定的模块
规则要添加在链上,才生效;添加在自定义上不会自动生效
链 chain 有内置链和自定义链:
内置链
:每个内置链对应于一个钩子函数
自定义链
:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有
Hook 钩子调用自定义链时,才生效
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-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] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table
指定表ACCEPT
:接受DROP
:丢弃iptables -vnL
iptables -vvnL --line-numbers
(1) 可以指明规则序号
(2) 可以指明规则本身
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
预置的链 chain
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配条件
PARAMETERS
MATCH EXTENTIONS
-j targetname [pre-target-options]
ACCEPT
,DROP
REJECT
:--reject-with:icmp-port-unreachable
默认动作RETURN
:返回调用链REDIRECT
:端口重定向LOG
:记录日志,dmesgMARK
:做防火墙标记DNAT
:目标地址转换SNAT
:源地址转换MASQUERADE
:地址伪装[!] -s, --source address[/mask][,...]:匹配源IP地址或范围
[!] -d, --destination address[/mask][,...]:目标IP地址或范围
[!] -p, --protocol protocol:指定协议,可使用数字如0(all)
protocol:( tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or "all")参看:/etc/protocols
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于 FORWARD、OUTPUT、POSTROUTING链
隐式扩展
显式扩展
mask
需检查的标志位列表,用,分隔comp
在 mask 列表中必须为 1 的标志位列表,无指定则必须为 0,--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必
须为1,余下的必须为0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
--tcp-flags ALL ALL
--tcp_flags ALL NONE
[-m matchname [per-match-options]]
以离散方式定义多端口匹配,最多指定 15 个端口
指定多个源端口
[!] --source-ports,--sports port[,port|,port:port]...
指定多个目标端口
[!] --destination-ports,--dports port[,port|,port:port]...
多个源或目标端
[!] --ports port[,port|,port:port]...
例如
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
指明连续的(但一般不是整个网络)ip 地址范围
源 IP 地址范围
[!] --src-range from[-to]
目标 IP 地址范围
[!] --dst-range from[-to]
例如
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-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
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 42 --string "google" -j REJECT
--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 分别表示星期一到星期日
--kerneltz:内核时区,不建议使用,CentOS 7系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
注意:CentOS 8 此模块有问题
--connlimit-upto # :连接的数量小于等于#时匹配
--connlimit-above # :连接的数量大于#时匹配
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit above 2 -j REJECT
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
示例:
[root@fffffffff ~]# iptables -A INPUT -p icmp -m limit --limit-burst 10 --limit 20/minute -j ACCEPT
[root@fffffffff ~]# iptables -A INPUT -p icmp -j REJECT
[root@fffffffff ~]# iptables -vnL
Chain INPUT (policy ACCEPT 54 packets, 4526 bytes)
pkts bytes target prot opt in out source destination
16 1344 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 20/min burst 10
5 420 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
[root@ppppppppp ~]# ping 172.20.1.207
PING 172.20.1.207 (172.20.1.207) 56(84) bytes of data.
64 bytes from 172.20.1.207: icmp_seq=1 ttl=64 time=1.35 ms
64 bytes from 172.20.1.207: icmp_seq=2 ttl=64 time=0.358 ms
64 bytes from 172.20.1.207: icmp_seq=3 ttl=64 time=1.80 ms
64 bytes from 172.20.1.207: icmp_seq=4 ttl=64 time=0.479 ms
64 bytes from 172.20.1.207: icmp_seq=5 ttl=64 time=0.196 ms
64 bytes from 172.20.1.207: icmp_seq=6 ttl=64 time=0.218 ms
64 bytes from 172.20.1.207: icmp_seq=7 ttl=64 time=0.274 ms
64 bytes from 172.20.1.207: icmp_seq=8 ttl=64 time=0.482 ms
64 bytes from 172.20.1.207: icmp_seq=9 ttl=64 time=0.311 ms
64 bytes from 172.20.1.207: icmp_seq=10 ttl=64 time=0.332 ms
64 bytes from 172.20.1.207: icmp_seq=11 ttl=64 time=0.323 ms
64 bytes from 172.20.1.207: icmp_seq=12 ttl=64 time=0.196 ms
64 bytes from 172.20.1.207: icmp_seq=13 ttl=64 time=1.16 ms
64 bytes from 172.20.1.207: icmp_seq=14 ttl=64 time=0.301 ms
From 172.20.1.207 icmp_seq=15 Destination Port Unreachable
64 bytes from 172.20.1.207: icmp_seq=16 ttl=64 time=0.451 ms
From 172.20.1.207 icmp_seq=17 Destination Port Unreachable
From 172.20.1.207 icmp_seq=18 Destination Port Unreachable
64 bytes from 172.20.1.207: icmp_seq=19 ttl=64 time=0.345 ms
From 172.20.1.207 icmp_seq=20 Destination Port Unreachable
From 172.20.1.207 icmp_seq=21 Destination Port Unreachable
^C
--- 172.20.1.207 ping statistics ---
21 packets transmitted, 16 received, +5 errors, 23% packet loss, time 20033ms
rtt min/avg/max/mdev = 0.196/0.536/1.801/0.457 ms
NEW
:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其
ESTABLISHED
:NEW 状态之后,连接追踪信息库中为其建立的条目失效之前期间内
RELATED
:新发起的但与已有连接相关联的连接,如:ftp 协议中的数据连接与命令
INVALID
:无效的连接,如 flag 标记不正确
UNTRACKED
:未进行追踪的连接,如 raw 表中关闭追踪
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
[root@localhost ~]# cat /proc/net/nf_conntrack
ipv4 2 udp 17 17 src=172.20.4.115 dst=172.20.255.255 sport=138 dport=138 [UNREPLIED] src=172.20.255.255 dst=172.20.4.115 sport=138 dport=138 mark=0 zone=0 use=2
ipv4 2 udp 17 29 src=172.20.1.11 dst=172.20.255.255 sport=137 dport=137 [UNREPLIED] src=172.20.255.255 dst=172.20.1.11 sport=137 dport=137 mark=0 zone=0 use=2
ipv4 2 udp 17 28 src=172.20.0.25 dst=172.20.255.255 sport=138 dport=138 [UNREPLIED] src=172.20.255.255 dst=172.20.0.25 sport=138 dport=138 mark=0 zone=0 use=2
ipv4 2 udp 17 20 src=172.20.4.121 dst=172.20.255.255 sport=138 dport=138 [UNREPLIED] src=172.20.255.255 dst=172.20.4.121 sport=138 dport=138 mark=0 zone=0 use=2
ipv4 2 tcp 6 431999 ESTABLISHED src=172.20.1.207 dst=172.20.1.33 sport=22 dport=42838 src=172.20.1.33 dst=172.20.1.207 sport=42838 dport=22 [ASSURED] mark=0 zone=0 use=2
ipv4 2 udp 17 7 src=172.20.30.30 dst=172.20.255.255 sport=137 dport=137 [UNREPLIED] src=172.20.255.255 dst=172.20.30.30 sport=137 dport=137 mark=0 zone=0 use=2
ipv4 2 udp 17 29 src=172.20.12.12 dst=172.20.255.255 sport=137 dport=137 [UNREPLIED] src=172.20.255.255 dst=172.20.12.12 sport=137 dport=137 mark=0 zone=0 use=2
ipv4 2 udp 17 8 src=172.20.30.30 dst=172.20.255.255 sport=57621 dport=57621 [UNREPLIED] src=172.20.255.255 dst=172.20.30.30 sport=57621 dport=57621 mark=0 zone=0 use=2
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/netfilter/nf_conntrack_max
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_max
65536
查看连接跟踪有多少条目
/proc/sys/net/netfilter/nf_conntrack_count
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_count
6
不同的协议的连接追踪时长
/proc/sys/net/netfilter/nf_conntrack_generic_timeout
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_generic_timeout
600
以上文件存在的前提是加载了nf_conntrack_ipv4
模块
iptables 的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max
当服务器连接多于最大连接数时会出现
kernel: ip_conntrack: table full, dropping packet
错误
各种状态的超时后,相应的链接会从表中删除
连接过多的解决方案
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_syn_sent
120
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_syn_recv
60
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
432000
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
120
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close
nf_conntrack_tcp_timeout_close nf_conntrack_tcp_timeout_close_wait
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait
60
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close
10
[root@localhost ~]# vim /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
[root@localhost ~]# iptables -t nat -L -n
[!] --state state
iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
vim /etc/sysconfig/iptables-config
IPTABLES_MODULES=“nf_conntrack_ftp"
modproble nf_conntrack_ftp
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
iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
具体操作: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
ACCEPT, DROP, REJECT, RETURN,LOG, SNAT, DNAT, REDIRECT, MASQUERADE,...
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系
统日志中
--log-level level 级别: debug,info,notice, warning, error, crit, alert,emerg
--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "
[root@centos8 ~]#iptables -R INPUT 2 -p tcp --dport 21 -m state --state NEW -j
LOG --log-prefix "ftp new link: "
[root@centos8 ~]#tail -f /var/log/messages
Dec 21 10:02:31 centos8 kernel: ftp new link: IN=eth0 OUT=
MAC=00:0c:29:f9:8d:90:00:0c:29:10:8a:b1:08:00 SRC=192.168.39.6 DST=192.168.39.8
LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=15556 DF PROTO=TCP SPT=53706 DPT=21
WINDOW=14600 RES=0x00 SYN URGP=0
使用 iptables 命令定义的规则,手动删除之前,其生效期限为 kernel 存活期限
持久保存规则:
iptables-save > /PATH/TO/SOME_RULES_FILE
# 将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save
加载规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE
# 会自动从/etc/sysconfig/iptables 重新载入规则
service iptables restart
开机自动重载规则
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
yum install iptables-services
iptables-save > /etc/sysconfig/iptables
systemctl enable iptables.service
iptables/netfilter 利用 filter 表的 FORWARD 链,可以充当网络防火墙:
注意
NAT: 网络地址转换(network address translation),支持 PREROUTING,INPUT,
OUTPUT,POSTROUTING 四个链
请求报文:修改源/目标 IP,由定义决定如何修改
响应报文:修改源/目标 IP,根据跟踪机制自动实现
SNAT:基于 nat 表的 target,适用于固定的公网 IP
SNAT 选项:
–to-source [ipaddr[-ipaddr]][:port[-port]]
–random
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
例:10.0.1.0/24 网段的主机访问外部网络时,IP 数据包源地址被替换为
172.18.1.6-172.18.1.6 中的某一个地址
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
另一个 target 为MASQUERADE
,适用于动态的公网 IP,如拨号网络
MASQUERADE 选项:
–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
DNAT:nat 表的 target,适用于端口映射
DNAT 选项
–to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to- destination InterSeverIP[:PORT]
例如
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
iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080
# Generated by iptables-save v1.4.7 on Wed May 18 09:22:34 2016
*filter
:INPUT ACCEPT [85890:4530430]
:FORWARD ACCEPT [76814:55698470]
:OUTPUT ACCEPT [166620:238017546]
-A FORWARD -s 172.16.0.100/32 -j ACCEPT
-A FORWARD -s 172.16.0.200/32 -j ACCEPT
-A FORWARD -s 172.16.0.67/32 -j ACCEPT
#WANG ADD NEXT LINE IN 20170627
#-A FORWARD -s 172.16.0.0/16 -j ACCEPT
#WANG ADD NEXT LINE IN 20170704
#-A FORWARD -s 172.18.0.0/16 -j ACCEPT
#-A FORWARD -s 172.18.0.0/16 -j REJECT
#-A FORWARD -s 172.16.0.68/32 -j ACCEPT
#-A FORWARD -s 172.16.0.69/32 -j ACCEPT
#-A FORWARD -s 172.16.0.6/32 -j ACCEPT
-A FORWARD -s 172.17.200.200/32 -j ACCEPT
-A FORWARD -s 172.17.136.136/32 -j ACCEPT
-A FORWARD -s 172.17.0.100/32 -j ACCEPT
-A FORWARD -s 172.18.100.1/32 -j ACCEPT
-A FORWARD -s 172.18.0.100/32 -j ACCEPT
-A FORWARD -s 172.18.200.2/32 -j ACCEPT
-A FORWARD -s 172.18.200.3/32 -j ACCEPT
-A FORWARD -s 172.18.211.211/32 -j ACCEPT
-A FORWARD -s 172.18.212.212/32 -j ACCEPT
-A FORWARD -m iprange --src-range 172.16.0.100-172.16.0.110 -j ACCEPT
-A FORWARD -m iprange --src-range 172.17.0.100-172.17.0.110 -j ACCEPT
-A FORWARD -m iprange --src-range 172.18.0.100-172.18.0.110 -j ACCEPT
-A FORWARD -m iprange --src-range 172.17.100.6-172.17.100.16 -j ACCEPT
-A FORWARD -m iprange --src-range 172.18.100.61-172.18.100.70 -j ACCEPT
-A FORWARD -s 172.16.0.0/16 -m string --string "verycd.com" --algo kmp --to
65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "tudou.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "youku.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "iqiyi.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "pptv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "letv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m string --string "xunlei.com" --algo kmp --to
65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "verycd.com" --algo kmp --to
65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "tudou.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "youku.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "iqiyi.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "pptv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "letv.com" --algo kmp --to 65535
-j REJECT --reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m string --string "xunlei.com" --algo kmp --to
65535 -j REJECT --reject-with icmp-port-unreachable
#-A FORWARD -s 172.18.0.0/16 -j REJECT
#-A FORWARD -s 172.16.0.0/16 -j REJECT
#-A FORWARD -i ppp0 -m string --string ".exe" --algo bm --to 65535 -j REJECT --
reject-with icmp-port-unreachable
-A FORWARD -s 172.18.0.0/16 -m time --timestart 08:50:00 --timestop 18:00:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
-A FORWARD -s 172.17.0.0/16 -m time --timestart 08:50:00 --timestop 18:00:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m time --timestart 08:50:00 --timestop 12:30:00 --
weekdays Tue,Thu,Sat --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
-A FORWARD -s 172.16.0.0/16 -m time --timestart 13:50:00 --timestop 18:00:00 --
weekdays Tue,Thu,Sat --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#wang next 2 lines changed in 20170619
#-A FORWARD -s 172.17.0.0/16 -m time --timestart 08:50:00 --timestop 12:30:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#-A FORWARD -s 172.17.0.0/16 -m time --timestart 13:30:00 --timestop 18:10:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#-A FORWARD -s 172.18.0.0/16 -m time --timestart 08:50:00 --timestop 18:10:00 --
weekdays Mon,Wed,Fri --datestop 2038-01-19T11:14:07 -j REJECT --reject-with
icmp-port-unreachable
#-A FORWARD -s 172.18.0.0/16 -m time --timestart 08:50:00 --timestop 18:10:00 --
weekdays Tue,Thu --datestop 2038-01-19T11:14:07 -j REJECT --reject-with icmp-
port-unreachable
COMMIT
# Completed on Wed May 18 09:22:34 2016
# Generated by iptables-save v1.4.7 on Wed May 18 09:22:34 2016
*nat
:PREROUTING ACCEPT [1429833:65427211]
:POSTROUTING ACCEPT [850518:35452195]
:OUTPUT ACCEPT [120198:9146655]
-A POSTROUTING -s 172.16.0.100/32 -j MASQUERADE
-A POSTROUTING -s 172.18.0.100/32 -j MASQUERADE
#-A POSTROUTING -s 172.16.0.200/32 -j MASQUERADE
#wang add next 1 line in 20170619
#wang add next 1 line in 20170704
-A POSTROUTING -s 172.16.0.69/32 -j MASQUERADE
-A POSTROUTING -s 172.17.200.200/32 -j MASQUERADE
-A POSTROUTING -s 172.17.136.136/32 -j MASQUERADE
-A POSTROUTING -s 172.17.0.100/32 -j MASQUERADE
#-A POSTROUTING -s 172.18.0.0/16 -j MASQUERADE
#-A POSTROUTING -s 172.16.0.6/32 -j MASQUERADE
-A POSTROUTING -m iprange --src-range 172.16.0.100-172.16.0.110 -j MASQUERADE
-A POSTROUTING -m iprange --src-range 172.17.0.100-172.17.0.110 -j MASQUERADE
-A POSTROUTING -m iprange --src-range 172.18.0.100-172.18.0.110 -j MASQUERADE
-A POSTROUTING -s 172.16.0.0/16 -p tcp -m multiport --dports 80,443,53,22,6666 -
j MASQUERADE
-A POSTROUTING -s 172.16.0.0/16 -p udp -m multiport --dports 22 -j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 -p tcp -m multiport --dports 80,443,53,22,6666 -
j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 -p udp -m multiport --dports 22 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 -p tcp -m multiport --dports
80,443,53,22,6666,1206,5938,1949 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 -p udp -m multiport --dports 22,1206,5938,1949 -
j MASQUERADE
COMMIT
# Completed on Wed May 18 09:22:34 2016
数据包归入zone
的顺序
zone 名称 | 默认配置 |
---|---|
trusted | 允许所有流量 |
home | 拒绝除和传出流量相关的,以及 ssh,mdsn,ipp-client,samba-client,dhcpv6-client 预定义服务之外其它所有传入流量 |
internal | 和 home 相同 |
work | 拒绝除和传出流量相关的,以及 ssh,ipp-client,dhcpv6-client 预定义服务之外的其 所有传入流量 |
public | 拒绝除和传出流量相关的,以及 ssh,dhcpv6-client 预定义服务之外的其它所有传入流量,新加的网卡默认属于 public zone |
externa | 拒绝除和传出流量相关的,以及 ssh 预定义服务之外的其它所有传入流量,属于 external zone 的传出 ipv4 流量的源地址将被伪装为传出网卡的地址。 |
dmz | 拒绝除和传出流量相关的,以及 ssh 预定义服务之外的其它所有传入流量 |
block | 拒绝除和传出流量相关的所有传入流量 |
drop | 拒绝除和传出流量相关的所有传入流量(甚至不以 ICMP 错误进行回应) |
服务名称 | 配置 |
---|---|
ssh | Local SSH server. Traffic to 22/tcp |
dhcpv6-client | Local DHCPv6 client. Traffic to 546/udp on the fe80::/64 IPv6 network |
ipp-client | Local IPP printing. Traffic to 631/udp. |
samba-client | Local Windows file and print sharing client. Traffic to 137/udp and 138/udp. |
mdns | Multicast DNS (mDNS) local-link name resolution. Traffic to 5353/udp to the |
224.0.0.251 (IPv4) or ff02::fb (IPv6) multicast addresses.
firewalld 预定义服务配置
firewall-cmd --get-services
查看预定义服务列表
/usr/lib/firewalld/services/\*.xml
预定义服务的配置
firewalld 三种配置方法
firewall-config
(firewall-config 包)图形工具
firewall-cmd
(firewalld 包)命令行工具
/etc/firewalld
配置文件,一般不建议
用法
firewall-cmd [OPTIONS...]
选项
--get-zones 列出所有可用区域
--get-default-zone 查询默认区域
--set-default-zone= 设置默认区域
--get-active-zones 列出当前正使用的区域
--add-source=[--zone=] 添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域
--remove-source= [--zone=] 从指定区域删除源地址的流量,如无--zone= 选项,使用默认区域
--add-interface=[--zone=] 添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域
--change-interface=[--zone=] 改变指定接口至新的区域,如果无--zone= 选项,使用默认区域
--add-service= [--zone=] 允许服务的流量通过,如果无--zone= 选项,使用默认区域
--add-port=<PORT/PROTOCOL>[--zone=] 允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
--remove-service= [--zone=] 从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用认区域
--remove-port=<PORT/PROTOCOL>[--zone=] 从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选项,使用默认区域
--reload 删除当前运行时配置,应用加载永久配置
--list-services 查看开放的服务
--list-ports 查看开放的端口
--list-all [--zone=] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无--zone=选项,使用默认区域
# 查看默认zone
firewall-cmd --get-default-zone
# 默认zone设为dmz
firewall-cmd --set-default-zone=dmz
# 在internal zone中增加源地址192.168.0.0/24的永久规则
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
# 在internal zone中增加协议mysql的永久规则
firewall-cmd --permanent –zone=internal --add-service=mysql
# 加载新规则以生效
firewall-cmd --reload
systemctl mask iptables
systemctl mask ip6tables
systemctl status firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public
firewall-cmd --permanent --zone=public --list-all
firewall-cmd --permanent --zone=public --add-port 8080/tcp
firewall-cmd ---reload
man 5 firewalld.richlanguage
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
选项 | 描述 |
---|---|
–add-rich-rule=’’ | Add to the specified zone, or the default zone if no zone is specified. |
–remove-rich-rule=’’ | Remove to the specified zone, or the default zone if no zone is specified. |
–query-rich-rule=’’ | Query if has been added to the specified zone, or the default zone if no zone is specified. Returns 0 if the rule is present, otherwise 1. |
–list-rich-rules | Outputs all rich rules for the specified zone, or the default zone if no zone is specified. |
拒绝从 192.168.0.11 的所有流量,当 address 选项使用 source 或 destination 时,必须用 family= ipv4
|ipv6
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
限制每分钟只有两个连接到 ftp 服务
firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/m accept’
抛弃 esp( IPsec 体系中的一种主要协议)协议的所有数据包
firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'
接受所有 192.168.1.0/24 子网端口 5900-5905 范围的 TCP 流量
firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'
rich 日志规则
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value=""]
<LOGLEVEL> 可以是emerg,alert, crit, error, warning, notice, info, debug.
<DURATION> s:秒, m:分钟, h:小时, d:天
audit [limit value=""]
# 接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh"
log prefix="ssh " level="notice" limit value="3/m" accept
# 从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息
firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64"
service name="dns" audit limit value="1/h" reject' --timeout=300
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source
address=172.25.X.10/32 service name="http" log level=notice prefix="NEW HTTP "
limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com
firewall-cmd --permanent --zone=<ZONE> --add-masquerade
firewall-cmd --query-masquerade # 检查是否允许伪装
firewall-cmd --add-masquerade # 允许防火墙伪装IP
firewall-cmd --remove-masquerade # 禁止防火墙伪装IP
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
firewall-cmd --permanent --zone= --add-forward-port=port=:proto=[:toport=][:toaddr=]
# 转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
firewall-cmd --add-masquerade 启用伪装
firewall-cmd --zone=public --add-forward-
port=port=9527:proto=tcp:toport=80:toaddr=192.168.0.254
rich 规则的 port 转发语法:
forward-port port=
例子
# 转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source
address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source
address=172.25.X.10/32 forward-port port=443 protocol=tcp to-port=22'
firewall-cmd --reload
ssh -p 443 serverX.example.com
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
vim /etc/firewalld/services/ssh.xml
<port protocol="tcp" port="999"/>
systemctl restart sshd.service
systemctl status -l sshd.service
sealert -a /var/log/audit/audit.log
semanage port -a -t ssh_port_t -p tcp 999
systemctl restart sshd.service
ss -tulpn | grep sshd
firewall-cmd --permanent --zone=work --add-source=172.25.X.0/24
firewall-cmd --permanent --zone=work --add-port=999/tcp
firewall-cmd --reload
略
说明:以下练习 INPUT 和 OUTPUT 默认策略均为 DROP
1、限制本地主机的 web 服务器在周一不允许访问;新请求的速率不能超过 100 个每秒;
web 服务器包含了 admin 字符串的页面不允许访问;web 服务器仅允许响应报文离开本机
2、在工作时间,即周一到周五的 8:30-18:00,开放本机的 ftp 服务给 172.16.0.0
网络中的主机访问;数据下载请求的次数每分钟不得超过 5 个
3、开放本机的 ssh 服务给 172.16.x.1-172.16.x.100 中的主机,x 为你的学号,新请求
建立的速率一分钟不得超过 2 个;仅允许响应报文通过其服务端口离开本机
4、拒绝 TCP 标志位全部为 1 及全部为 0 的报文访问本机
5、允许本机 ping 别的主机;但不开放别的主机 ping 本机
6、判断下述规则的意义
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,873,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,873,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,3389 -j DROP
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
作者:no.body
链接:https://www.zhihu.com/question/19801131/answer/27459821
来源:知乎
版权声明:本文为 CSDN 博主「极客点儿」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yilovexing/article/details/93192484
回调函数: 参考上面两篇文章 ↩︎
ipchhains,iptables,nftables ↩︎