Linux防火墙设置 FirewallD
entos从7.0 开始将原先的防火墙iptables换成了FirewallD。FirewallD支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项,被称作动态管理防火墙,也就是说不需要重启整个防火墙便可应用更改。centos7默认安装了firewalld,若没有安装,执行 yum install firewalld firewalld-config 安装,其中
entos从7.0 开始将原先的防火墙iptables换成了FirewallD。FirewallD支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项,被称作动态管理防火墙,也就是说不需要重启整个防火墙便可应用更改。centos7默认安装了firewalld,若没有安装,执行 yum install firewalld firewalld-config 安装,其中firewalld-config是GUI工具。FirewallD与iptables关系:
firewalld底层仍旧是基于iptables的,但还是有很多不同的地方:
- iptables在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,其中前者是默认的配置,请不要修改。可以在/etc/firewalld/中编辑自己的配置,firewalld优先使用/etc/firewalld/中的配置。
- 使用 iptables,每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables里读取所有新的规则,然而使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同之处。因此,firewalld 可以在运行时间内,改变设置而不丢失现行连接。
firewalld中zone概念(区域)
RHEL7中的不过貌似其实现方式还是和iptables一样的,但是不像mariaDB那样兼容MySQL命令,FirewallD无法解析由 ip*tables 和 ebtables 命令行工具添加的防火墙规则
FirewallD使用区域(zone)的概念来管理,每个网卡对应一个zone,这些zone的配置文件可在/usr/lib/firewalld/zones/下看到,默认的是public.由firewalld 提供的区域按照从不信任到信任的顺序排序:
- drop(丢弃)任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。
- block(阻塞)任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。
- public(公开) 在用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
- external(外部)用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
- dmz(隔离区)用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。
- work(工作)用在工作网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
- home(家庭)用在家庭网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
- internal(内部)用在内部网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
- trusted(信任)允许所有网络连接。
firewalld中的过滤规则
- source: 根据源地址过滤
- interface: 根据网卡过滤
- service: 根据服务名过滤
- port: 根据端口过滤
- icmp-block: icmp 报文过滤,按照 icmp 类型配置
- masquerade: ip 地址伪装
- forward-port: 端口转发
- rule: 自定义规则
其中,过滤规则的优先级遵循如下顺序
- source
- interface
- conf
firewalld常用命令
fierwalld可以直接修改配置文件进行配置,也可以通过配置工具的命令,这里因为是远程操作为了确保开启后ssh端口是开放的,所以直接修改配置文件。
先查看/etc/firewalld/firewalld.conf中DefaultZone的值,默认是DefaultZone=public,这时/etc/firewalld/zones/目录下应该有个public.xml文件,vi打开它修改成:
1
2
3
4
5
6
7
8
9
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
zone
>
<
short
>
Public
<
/
short
>
<
description
>
For
use
in
public
areas
.
You
do
not
trust
the
other
computers
on
networks
to
not
harm
your
computer
.
Only
selected
incoming
connections
are
accepted
.
<
/
description
>
<
service
name
=
"dhcpv6-client"
/
>
<
service
name
=
"ssh"
/
>
<
service
name
=
"http"
/
>
<
service
name
=
"https"
/
>
<
/
zone
>
|
这就代表在public zone中开放ssh(22)、http(80)、https(443)端口,其中对应每一个在/usr/lib/firewalld/services/下*.xml文件定义好的服务类型,比如http.xml文件如下:
1
2
3
4
5
6
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
service
>
<
short
>
WWW
(
HTTP
)
<
/
short
>
<
description
>
HTTP
is
the
protocol
used
to
serve
Web
pages
.
If
you
plan
to
make
your
Web
server
publicly
available
,
enable
this
option
.
This
option
is
not
required
for
viewing
pages
locally
or
developing
Web
pages
.
<
/
description
>
<
port
protocol
=
"tcp"
port
=
"80"
/
>
<
/
service
>
|
所以也可以直接在public.xml中这样:
1
2
3
4
5
6
7
8
9
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
zone
>
<
short
>
Public
<
/
short
>
<
description
>
For
use
in
public
areas
.
You
do
not
trust
the
other
computers
on
networks
to
not
harm
your
computer
.
Only
selected
incoming
connections
are
accepted
.
<
/
description
>
<
service
name
=
"dhcpv6-client"
/
>
<
service
name
=
"ssh"
/
>
<
port
protocol
=
"tcp"
port
=
"80"
/
>
#等效的
<
service
name
=
"https"
/
>
<
/
zone
>
|
每次改配置文件还是比较麻烦的,firewalld可以使用firewall-config和firewall-cmd进行配置,前者是由于GUI模式下,后者为命令行下工具,一些常用命令如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
systemctl
start
firewalld
#启动
systemctl
status
firewalld
#或者firewall-cmd –state 查看状态
sytemctl
disable
firewalld
#停止并禁用开机启动
systemctl
enable
firewalld
#设置开机启动
systemctl
stop
firewalld
#禁用
firewall
-
cmd
–
version
#查看版本
firewall
-
cmd
–
help
#帮助信息
firewall
-
cmd
–
get
-
active
-
zones
#查看区域信息
firewall
-
cmd
–
get
-
zone
-
of
-
interface
=
eth0
#查看指定接口所属区域
firewall
-
cmd
–
panic
-
on
#拒绝所有包
firewall
-
cmd
–
panic
-
off
#取消拒绝状态
firewall
-
cmd
–
query
-
panic
#查看是否拒绝
firewall
-
cmd
–
reload
#更新防火墙规则
firewall
-
cmd
–
complete
-
reload
#断开再连接
firewall
-
cmd
–
zone
=
public
–
add
-
interface
=
eth0
#将接口添加到public区域 , 默认接口都在public。若加上–permanet则永久生效
firewall
-
cmd
–
set
-
default
-
zone
=
public
#设置public为默认接口区域
firewall
-
cmd
–
zone
=
pulic
–
list
-
ports
#查看所有打开的端口
firewall
-
cmd
–
zone
=
pulic
–
add
-
port
=
80
/
tcp
#把tcp 80端口加入到区域
firewall
-
cmd
–
zone
=
public
–
add
-
service
=
http
#把http服务加入到区域
firewall
-
cmd
–
zone
=
public
–
remove
-
service
=
http
#移除http服务
|
部分命令共同的参数说明:
- –zone=ZONE 指定命令作用的zone,省缺的话命令作用于默认zone
- –permanent 有此参数表示命令只是修改配置文件,需要reload才能生效;无此参数则立即在当前运行的实例中生效,不过不会改动配置文件,重启firewalld服务就没效果了。
- –timeout=seconds 表示命令效果持续时间,到期后自动移除,不能和–permanent同时使用。例如因调试的需要加了某项配置,到时间自动移除了,不需要再回来手动删除。也可在出现异常情况时加入特定规则,过一段时间自动解除。
参考连接:
- https://fedoraproject.org/wiki/FirewallD/zh-cn
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7
拓展知识:Linux中的防火墙
netfilter
iptables、firewalld这些软件本身其实并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核的netfilter完成的。netfilter是Linux 2.4内核引入的包过滤引擎。由一些数据包过滤表组成,这些表包含内核用来控制信息包过滤的规则集。iptables、firewalld等等都是在用户空间修改过滤表规则的便捷工具。
linux内部结构可以分为三部分,从最底层到最上层依次是:硬件–>内核空间–>用户空间
netfilter在数据包必须经过且可以读取规则的位置,共设有5个控制关卡。这5个关卡处的检查规则分别放在5个规则链中:
- PREROUTING 数据包刚进入网络接口之后,路由之前
- INPUT 数据包从内核流入用户空间
- FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤。
- OUTPUT 数据包从用户空间流出到内核空间。
- POSTROUTING 路由后,数据包离开网络接口前。
链其实就是包含众多规则的检查清单,每一条链中包含很多规则。当一个数据包到达一个链时,系统就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则就继续检查下一条规则,如果该数据包不符合链中任一条规则,系统就会根据该链预先定义的默认策略来处理数据包。
当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出
可以看出,刚从网络接口进入的数据包尚未进行路由决策,还不知道数据要走向哪里,所以进出口处没办法实现数据过滤,需要在内核空间设置转发关卡、进入用户空间关卡和离开用户空间关卡。
iptables
iptablses按照用途和使用场合,将5条链各自切分到五张不同的表中。也就是说每张表中可以按需要单独为某些链配置规则。例如,mangle表和filter表中都能为INPUT链配置规则,当数据包流经INPUT位置(进入用户空间),这两个表中INPUT链的规则都会用来做过滤检查。
五张表,每张表侧重于不同的功能
- filter 数据包过滤功能。只涉及INPUT, FORWARD, OUTPUT三条链。是iptables命令默认操纵的表。
- nat 地址转换功能。NAT转换只涉及PREROUTING, OUTPUT, POSTOUTING三条链。可通过转发让局域网机器连接互联网
- mangle 数据包修改功能。每条链上都可以做修改操作。修改报文元数据,做防火墙标记等。
- raw 快速通道功能。为了提高效率,优先级最高,符合raw表规则的数据包会跳过一些检查。
- security 需要和selinux结合使用,内置规则比较复杂,通常都会被关闭。
iptables还支持自定义规则链。自定义的链必须和某个特定的链关联起来。可在某个链中设定规则,满足一定条件的数据包跳转到某个目标链处理,目标链处理完成后返回当前链中继续处理后续规则。因为链中规则是从头到尾依次检查的,所以规则的次序是非常重要的。越严格的规则应该越靠前。
iptablse服务管理
1
2
3
4
5
6
7
8
9
10
|
service
iptables
start
|
stop
|
restart
|
status
service
iptables
save
//定义的所有内容,在重启时都会失效。调用save命令可以把规则保存到文件/etc/sysconfig/iptables中。
iptables
-
save
//保存规则
iptables
-
restore
//加载规则。开机的时候,会自动加载/etc/sysconfig/iptables
iptables
-
restore
<
/
etc
/
sysconfig
/
iptables2
//加载自定义的规则文件
//iptables服务配置文件: /etc/sysconfig/iptables-config
//iptables规则文件: /etc/sysconfig/iptables
echo
"1"
>
/
proc
/
sys
/
net
/
ipv4
/
ip_forward
//打开iptables转发:
|
iptables命令参考
1
|
iptables
[
-
t
TABLE
]
COMMAND
[
CHAIN
]
[
CRETIRIA
]
.
.
.
[
-
j
ACTION
]
|
省缺表名为filter。命令中用到的序号(RULENUM)都基于1。
COMMAND 命令选项
1
2
3
4
5
6
7
8
9
10
11
12
|
-
A
|
--
append
CHAIN
//链尾添加新规则
-
D
|
--
delete
CHAIN
[
RULENUM
]
//删除链中规则,按需序号或内容确定要删除的规则
-
I
|
--
insert
CHAIN
[
RULENUM
]
//在链中插入一条新的规则,默认插在开头
-
R
|
--
replace
CHAIN
RULENUM
//替换、修改一条规则,按序号或内容确定
-
L
|
--
list
[
CHAIN
[
RULENUM
]
]
//列出指定链或所有链中指定规则或所有规则
-
S
|
--
list
-
urles
[
CHAIN
[
RULENUM
]
]
//显示链中规则
-
F
|
--
flush
[
CHAIN
]
//清空指定链或所有链中规则
-
Z
|
--
zero
[
CHAIN
[
RULENUM
]
]
//重置指定链或所有链的计数器(匹配的数据包数和流量字节数)
-
N
|
--
new
-
chain
CHAIN
//新建自定义规则链
-
X
|
--
delete
-
cahin
[
CHAIN
]
//删除指定表中用户自定义的规则链
-
E
|
--
rename
-
chain
OLDCHAIN
NEWCHAIN
//重命名链,移动任何引用
-
P
|
-
policy
CHAIN
TARGET
//设置链的默认策略,数据包未匹配任意一条规则就按此策略处理
|
CRETIRIA 条件匹配
分为基本匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配。
基本匹配:(可使用 ! 可以否定一个子句,如-p !tcp)
1
2
3
4
5
|
-
p
|
--
proto
PROTO
//按协议匹配,如tcp、udp、icmp,all表示所有协议。 (/etc/protocols中的协议名)
-
s
|
--
source
ADDRESS
[
/
mask
]
.
.
.
//按数据包的源地址匹配,可使用IP地址、网络地址、主机名、域名
-
d
|
--
destination
ADDRESS
[
/
mask
]
.
.
.
//按目标地址匹配,可使用IP地址、网络地址、主机名、域名
-
i
|
--
in
-
interface
INPUTNAME
[
+
]
//按入站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING链
-
o
|
--
out
-
interface
OUTPUTNAME
[
+
]
//按出站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING链
|
扩展匹配:(如: -p tcp -m tcp –dport 80)
1
|
-
m
|
--
match
MATCHTYPE
EXTENSIONMATCH
.
.
.
//扩展匹配,可能加载extension
|
隐式扩展匹配
对-p PROTO的扩展,或者说是-p PROTO的附加匹配条件,-m PROTO 可以省略,所以叫隐式
1
2
3
4
5
6
7
8
9
10
11
|
-
m
tcp
//-p tcp的扩展
--
sport
[
!
]
N
[
:
M
]
//源端口, 服务名、端口、端口范围。
--
dport
[
!
]
N
[
:
M
]
//目标端口,服务名、端口、端口范围
--
tcp
-
flags
CHECKFLAGS
FLAGSOFTRUE
//TCP标志位:SYN(同步),ACK(应答),RST(重置),FIN(结束),URG(紧急),PSH(强迫推送)。多个标志位逗号分隔。
//CHECKFLAGS为要检查的标志位,FLAGSOFTRUE为必须为1的标志位(其余的应该为0)
--
syn
//第一次握手。 等效于 --tcpflags syn,ack,fin,rst syn 四个标志中只有syn为1
-
m
udp
//-p udp的扩展
--
sport
N
[
-
M
]
--
dport
N
[
-
M
]
-
m
icmp
//隐含条件为-p icmp
--
icmp
-
type
N
//8:echo-request 0:echo-reply
|
显示扩展匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
-
m
state
--
state
//连接状态检测,NEW,ESTABLISHED,RELATED,INVALID
-
m
multiport
--
source
-
ports
PORT
[
,
PORT
]
.
.
.
|
N
:
M
//多个源端口,多个端口用逗号分隔,
--
destination
-
ports
PORT
[
,
PORT
]
.
.
.
|
N
:
M
//多个目的端口
--
ports
//多个端口,每个包的源端口和目的端口相同才会匹配
-
m
limit
--
limit
N
/
UNIT
//速率,如3/minute, 1/s, n/second , n/day
--
limit
-
burst
N
//峰值速率,如100,表示最大不能超过100个数据包
-
m
connlimit
--
connlimit
-
above
N
//多于n个,前面加!取反
-
m
iprange
--
src
-
range
IP
-
IP
--
dst
-
range
IP
-
IP
-
m
mac
--
mac
-
source
//mac地址限制,不能用在OUTPUT和POSTROUTING规则链上,因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址
-
m
string
--
algo
[
bm
|
kmp
]
//匹配算法
--
string
"PATTERN"
//匹配字符模式
-
m
recent
--
name
//设定列表名称,默认为DEFAULT
--
rsource
//源地址
--
rdest
//目的地址
--
set
//添加源地址的包到列表中
--
update
//每次建立连接都更新列表
--
rcheck
//检查地址是否在列表
--
seconds
//指定时间。必须与--rcheck或--update配合使用
--
hitcount
//命中次数。必须和--rcheck或--update配合使用
--
remove
//在列表中删除地址
-
m
time
--
timestart
h
:
mm
--
timestop
hh
:
mm
--
days
DAYS
//Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗号分隔
-
m
mark
--
mark
N
//是否包含标记号N
-
m
owner
--
uid
-
owner
500
//用来匹配来自本机的封包,是否为某特定使用者所产生的,可以避免服务器使用root或其它身分将敏感数据传送出
--
gid
-
owner
O
//用来匹配来自本机的封包,是否为某特定使用者群组所产生的
--
pid
-
owner
78
//用来匹配来自本机的封包,是否为某特定进程所产生的
--
sid
-
owner
100
//用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包
|
ACTION 目标策略(TARGET)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
-
j
|
--
jump
TARGET
//跳转到目标规则,可能加载target extension
-
g
|
--
goto
CHAIN
//跳转到指定链,不再返回
ACCEPT
规则验证通过,不再检查当前链的后续规则,直接跳到下一个规则链。
DROP
直接丢弃数据包,不给任何回应。中断过滤。
REJECT
拒绝数据包通过,会返回响应信息。中断过滤。
--
reject
-
with
tcp
-
reset
|
port
-
unreachable
|
echo
-
reply
LOG
在
/
var
/
log
/
messages文件中记录日志,然后将数据包传递给下一条规则。详细位置可查看
/
etc
/
syslog
.
conf配置文件
--
log
-
prefix
"INPUT packets"
ULOG
更广范围的日志记录信息
QUEUE
防火墙将数据包移交到用户空间,通过一个内核模块把包交给本地用户程序。中断过滤。
RETURN
防火墙停止执行当前链中的后续规则,并返回到调用链。主要用在自定义链中。
custom
_chain
转向自定义规则链
DNAT
目标地址转换,改变数据包的目标地址。外网访问内网资源,主要用在
PREROUTING。完成后跳到下一个规则链
--
to
-
destination
ADDRESS
[
-
ADDRESS
]
[
:
PORT
[
-
PORT
]
]
SNAT
源地址转换,改变数据包的源地址。内网访问外网资源。主机的
IP地址必须是静态的,主要用在
POSTROUTING。完成后跳到下一个规则链。
--
to
-
source
ADDRESS
[
-
ADDRESS
]
[
:
PORT
[
-
PORT
]
]
MASQUERADE
源地址伪装,用于主机
IP是
ISP动态分配的情况,会从网卡读取主机
IP。直接跳到下一个规则链。
--
to
-
ports
1024
-
31000
REDIRECT
数据包重定向,主要是端口重定向,把包分流。处理完成后继续匹配其他规则。能会用这个功能来迫使站点上的所有
Web流量都通过一个
Web高速缓存,比如
Squid。
--
to
-
ports
8080
MARK
打防火墙标记。继续匹配规则。
--
set
-
mark
2
MIRROR
发送包之前交换
IP源和目的地址,将数据包返回。中断过滤。
|
辅助选项:
1
2
3
4
5
6
7
8
9
10
11
12
|
-
t
|
--
table
TABLE
//指定操作的表,默认的表为filter
-
n
|
--
numeric
//用数字形式显示地址和端口,显示主机IP地址而不是主机名
-
x
|
--
exact
//计数器显示精确值,不做单位换算
-
v
|
--
verbose
(
x3
)
//查看规则列表时,显示更详细的信息
-
line
-
numbers
//查看规则表时,显示在链中的序号
-
V
|
--
version
-
h
|
--
help
[
option
]
--
help
//查看特定选项的帮助,如iptables -p icmp --help
--
fragment
-
f
//match second or further fragments only
--
modprobe
=
<
command
>
//try to insert modules using this command
--
set
-
counters
PKTS
BYTES
//set the counter during insert/append
|
state TCP链接状态
1
2
3
4
5
|
NEW
第一次握手,要起始一个连接(重设连接或将连接重导向)
ESTABLISHED
数据包属于某个已经建立的连接。第二次和第三次握手
(
ack
=
1
)
INVALID
数据包的连接编号(
Session
ID)无法辨识或编号不正确。如
SYN
=
1
ACK
=
1
RST
=
1
RELATED
表示该封包是属于某个已经建立的连接,所建立的新连接。如有些服务使用两个相关的端口,如
FTP,
21和
20端口一去一回,
FTP数据传输
(上传
/下载
)还会使用特殊的端口
只允许
NEW和
ESTABLISHED进,只允许
ESTABLISHED出可以阻止反弹式木马。
|
使用示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
iptables
-
F
//删除iptables现有规则
iptables
-
L
[
-
v
[
vv
]
-
n
]
//查看iptables规则
iptables
-
A
INPUT
-
i
eth0
-
p
tcp
--
dport
80
-
m
state
--
state
NEW
,
ESTABLISHED
-
j
ACCEPT
//在INPUT链尾添加一条规则
iptables
-
I
INPUT
2
-
i
eth0
-
p
tcp
--
dport
80
-
m
state
--
state
NEW
,
ESTABLISHED
-
j
ACCEPT
//在INPUT链中插入为第2条规则
iptables
-
D
INPUT
2
//删除INPUT链中第2条规则
iptables
-
R
INPUT
3
-
i
eth0
-
p
tcp
--
dport
80
-
m
state
--
state
NEW
,
ESTABLISHED
-
j
ACCEPT
//替换修改第三条规则
iptables
-
P
INPUT
DROP
//设置INPUT链的默认策略为DROP
//允许远程主机进行SSH连接
iptables
-
A
INPUT
-
i
eth0
-
p
tcp
--
dport
22
-
m
state
--
state
NEW
,
ESTABLISHED
-
j
ACCEPT
iptables
-
A
OUTPUT
-
o
eth0
-
p
tcp
--
sport
22
-
m
state
--
state
ESTABLISHED
-
j
ACCEPT
//允许本地主机进行SSH连接
iptables
-
A
OUTPUT
-
o
eth0
-
p
tcp
--
dport
22
-
m
state
--
state
NEW
,
ESTABLISHED
-
j
ACCEPT
iptables
-
A
INTPUT
-
i
eth0
-
p
tcp
--
sport
22
-
m
state
--
state
ESTABLISHED
-
j
ACCEPT
//允许HTTP请求
iptables
-
A
INPUT
-
i
eth0
-
p
tcp
--
dport
80
-
m
state
--
state
NEW
,
ESTABLISHED
-
j
ACCEPT
iptables
-
A
OUTPUT
-
o
eth0
-
p
tcp
--
sport
80
-
m
state
--
state
ESTABLISHED
-
j
ACCEPT
//限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个
iptables
-
A
INPUT
-
i
eth0
-
d
192.168.146.3
-
p
icmp
--
icmp
-
type
8
-
m
limit
--
limit
2
/
second
--
limit
-
burst
3
-
j
ACCEPT
//限制SSH连接速率(默认策略是DROP)
iptables
-
I
INPUT
1
-
p
tcp
--
dport
22
-
d
192.168.146.3
-
m
state
--
state
ESTABLISHED
-
j
ACCEPT
iptables
-
I
INPUT
2
-
p
tcp
--
dport
22
-
d
192.168.146.3
-
m
limit
--
limit
2
/
minute
--
limit
-
burst
2
-
m
state
--
state
NEW
-
j
ACCEPT
//防止syn攻击(限制syn的请求速度)
iptables
-
N
syn
-
flood
iptables
-
A
INPUT
-
p
tcp
--
syn
-
j
syn
-
flood
iptables
-
A
syn
-
flood
-
m
limit
--
limit
1
/
s
--
limit
-
burst
4
-
j
RETURN
iptables
-
A
syn
-
flood
-
j
DROP
//防止syn攻击(限制单个ip的最大syn连接数)
iptables
–
A
INPUT
–
i
eth0
–
p
tcp
--
syn
-
m
connlimit
--
connlimit
-
above
15
-
j
DROP
iptables
-
I
INPUT
-
p
tcp
-
dport
22
-
m
connlimit
--
connlimit
-
above
3
-
j
DROP
//利用recent模块抵御DOS攻击
iptables
-
I
INPUT
-
p
tcp
--
dport
22
-
m
state
--
state
NEW
-
m
recent
--
set
--
name
SSH
//单个IP最多连接3个会话
Iptables
-
I
INPUT
-
p
tcp
--
dport
22
-
m
state
NEW
-
m
recent
--
update
--
seconds
300
--
hitcount
3
--
name
SSH
-
j
DROP
//只要是新的连接请求,就把它加入到SSH列表中。5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。
iptables
-
I
INPUT
-
p
tcp
--
dport
80
-
m
connlimit
--
connlimit
-
above
30
-
j
DROP
//防止单个IP访问量过大
iptables
–
A
OUTPUT
–
m
state
--
state
NEW
–
j
DROP
//阻止反弹木马
iptables
-
A
INPUT
-
p
icmp
--
icmp
-
type
echo
-
request
-
m
limit
--
limit
1
/
m
-
j
ACCEPT
//防止ping攻击
//只允许自己ping别人,不允许别人ping自己
iptables
-
A
OUTPUT
-
p
icmp
--
icmp
-
type
8
-
j
ACCEPT
iptables
-
A
INPUT
-
p
icmp
--
icmp
-
type
0
-
j
ACCEPT
//对于127.0.0.1比较特殊,我们需要明确定义它
iptables
-
A
INPUT
-
s
127.0.0.1
-
d
127.0.0.1
-
j
ACCEPT
iptables
-
A
OUTPUT
-
s
127.0.0.1
-
d
127.0.0.1
-
j
ACCEPT
//SNAT 基于原地址转换。许多内网用户通过一个外网 口上网的情况。将我们内网的地址转换为一个外网的IP,共用外网IP访问外网资源。
iptables
-
t
nat
-
A
POSTROUTING
-
s
192.168.10.0
/
24
-
j
SNAT
--
to
-
source
172.16.100.1
//当外网地址不是固定的时候。将外网地址换成 MASQUERADE(动态伪装):它可以实现自动读取外网网卡获取的IP地址。
iptables
-
t
nat
-
A
POSTROUTING
-
s
192.168.10.0
/
24
-
j
MASQUERADE
//DNAT 目标地址转换。目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
iptables
-
t
nat
-
A
PREROUTING
-
d
192.168.10.18
-
p
tcp
--
dport
80
-
j
DNAT
--
to
-
destination
|
更多推荐
所有评论(0)