本文以CentOS 7.4为例

selinux

查看SELinux状态

[[email protected] ~]# sestatus -v
SELinux status:                 enabled
或
[[email protected] ~]# getenforce
Enforcing

临时关闭、启用selinux

[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
[[email protected] ~]# setenforce 1
[[email protected] ~]# getenforce
Enforcing

永久关闭、启用selinux

[[email protected] ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

firewall

查看firewall状态

firewall-cmd命令
[[email protected] ~]# firewall-cmd --state
running
systemctl命令
[[email protected] ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-09-29 10:39:26 CST; 25s ago
     Docs: man:firewalld(1)
 Main PID: 590 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─590 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Sep 29 10:39:23 centos systemd[1]: Starting firewalld - dynamic firewall da.....
Sep 29 10:39:26 centos systemd[1]: Started firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
enabled表示firewall开机启动
running表示firewall目前的状态是启动状态

防火墙的程序名称或进程名称为firewalld,而不是firewall

启动、关闭firewall

启动firewall
[[email protected] ~]# systemctl start firewalld
[[email protected] ~]# [  850.999137] ip_tables: (C) 2000-2006 Netfilter Core Team
[  851.045986] ip6_tables: (C) 2000-2006 Netfilter Core Team
[  851.093338] Ebtables v2.0 registered
[  851.180931] nf_conntrack version 0.5.0 (3902 buckets, 15608 max)
关闭firewall
[[email protected] ~]# systemctl stop firewalld
[  603.169348] Ebtables v2.0 unregistered
[[email protected] ~]# firewall-cmd --state
not running
这种方法只是临时关闭firewall,系统重启后,firewall是否启动取决于systemctl enbable/disable
开机启动firewall
[[email protected] ~]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
开机不启动firewall
[[email protected] ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

查看firewall规则

查看开放的端口

[[email protected] ~]# firewall-cmd --list-ports
(新装的系统没有开放端口)
[[email protected] ~]#

查看开放的服务

[[email protected] ~]# firewall-cmd --list-service
ssh dhcpv6-client

在firewall中port和service的区别
查看所有规则

[[email protected] ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

开放、关闭端口

[[email protected] ~]# firewall-cmd --add-port=80/tcp --permanent
success
--permanent选项表示永久生效
[[email protected] ~]# firewall-cmd --reload
success
对防火墙规则进行修改后,修改的规则需要重新加载才会生效。不必重启firewalld服务
[[email protected] ~]# firewall-cmd --list-ports
80/tcp
查看开放的端口
[[email protected] ~]# netstat -tunp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address        Foreign Address      State       PID/Program name
tcp        0      0 192.168.8.153:80     192.168.8.1:12345    ESTABLISHED -
使用Telnet工具连接本机的80端口后,使用netstat命令查看连接状态

关闭端口

[[email protected] ~]# firewall-cmd --remove-port=80/tcp --permanent
success
[[email protected] ~]# firewall-cmd --reload
success

在上面的命令中,并没有指定区域、接口、方向等选项,只要没有指定的规则,都是使用默认值,即firewall预先设置好的值。

[[email protected] ~]# firewall-cmd --get-default-zone
public
default-zone指的是,没有指定zone的时候,默认是对哪个zone进行操作
[[email protected] ~]# firewall-cmd --get-active-zone
public
  interfaces: eth0

iptables

查看当前规则

[[email protected] ~]# iptables-save

添加规则

[[email protected] ~]# iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-I,插入规则,没有指定行号时默认在第一行插入,其它规则顺序下移

删除规则

[[email protected] ~]# iptables -D INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-D,删除规则

显示规则的号码

[[email protected] ~]# iptables -nL -t filter --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
2    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
-n,以数字方式显示IP、端口
-L,
--line-number,显示规则的行号
输出中的num即规则的号码(行号),每个链都有独立的号码

在指定的行插入规则

[[email protected] ~]# iptables -I INPUT 2 -p tcp -m tcp --dport 8080 -j ACCEPT
-I,插入规则
2,在第二行插入规则
[[email protected] ~]# iptables -nL -t filter --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080
3    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
在第二行中插入一条新的规则,原来第二行及之后的规则向后移

根据行号删除规则

[[email protected] ~]# iptables -D INPUT 2
-D,删除规则
2,删除第二行的规则

保存规则

[[email protected] ~]# service iptables save
如果没有安装iptables-services,会提示错误(CentOS 7.4最小化安装默认没有安装iptables-services)
[[email protected] ~]# yum install iptables-services
安装iptables-services
[[email protected] ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
执行命令后,会生成文件/etc/sysconfig/iptables,如果之前存在这个文件就把它覆盖
重启系统之后,新增的规则并没有生效,使用iptables-save查看规则时,没有那条新增的规则,查看/etc/sysconfig/iptables文件时,那条规则确实是存在的。说明iptables这个文件在系统启动时并没有调用?
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
关闭firewall并重启系统
使用iptables-save查看规则,filter表只剩下INPUT/OUTPUT/FORWARD这三个链
之前在其它链添加的规则都消失了,需要重新添加规则,如在INPUT链中添加
在INPUT链重新添加规则,保存,重启系统后规则仍然没生效。

原因是,iptables并没有随系统启动

开机启动iptables

[[email protected] ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
安装iptables-services时,自动创建了/usr/lib/systemd/system/iptables.service,只要将此脚本配置为开机启动即可
[[email protected] ~]# systemctl start iptables.service
如果没有安装iptables-service,这个命令会提示错误
[[email protected] ~]# systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[[email protected] ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: active (exited) since Mon 2018-10-15 10:33:30 CST; 24s ago
 Main PID: 1488 (code=exited, status=0/SUCCESS)

firewall与iptables的关系

[[email protected] ~]# firewall-cmd --add-port=80/tcp --permanent
[[email protected] ~]# firewall-cmd --reload
[[email protected] ~]# iptables-save
*filter
:IN_public_allow - [0:0]
-A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
使用firewall添加一个端口,再使用iptables-save查看,发现是在filter表的IN_public_allow链中添加了规则
通常看到filter表的链包括INPUT/OUTPUT/FORWARD等,实际上链是可以自定义的,“IN_public_allow”是firewall创建的链,你也可以根据需要自己创建一个链。
使用firewall时,设置的选项非常少,但使用iptables-save查看时,出现了很多选项,这些选项都是默认的。即,如果你不指定这些选项,它就取这些值。

使用firewall-cmd命令添加规则

[[email protected] ~]# firewall-cmd --add-port=80/tcp --permanent

使用iptables命令查看规则,新增的规则是在IN_public_allow这个链中

[[email protected] ~]# iptables -t filter -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out  source          destination
    0     0 ACCEPT     udp  --  virbr0 *    0.0.0.0/0       0.0.0.0/0       udp dpt:53
    0     0 ACCEPT     tcp  --  virbr0 *    0.0.0.0/0       0.0.0.0/0       tcp dpt:53
    0     0 ACCEPT     udp  --  virbr0 *    0.0.0.0/0       0.0.0.0/0       udp dpt:67
    0     0 ACCEPT     tcp  --  virbr0 *    0.0.0.0/0       0.0.0.0/0       tcp dpt:67
   74  4948 ACCEPT     all  --  *      *    0.0.0.0/0       0.0.0.0/0       ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     *    0.0.0.0/0       0.0.0.0/0
    0     0 INPUT_direct  all  --  *      *    0.0.0.0/0       0.0.0.0/0
    0     0 INPUT_ZONES_SOURCE  all  --  *   *       0.0.0.0/0       0.0.0.0/0
    0     0 INPUT_ZONES  all  --  *      *    0.0.0.0/0       0.0.0.0/0
    0     0 DROP       all  --  *      *    0.0.0.0/0       0.0.0.0/0       ctstate INVALID
    0     0 REJECT     all  --  *      *    0.0.0.0/0       0.0.0.0/0       reject-with icmp-host-prohibited
Chain INPUT_ZONES (1 references)
 pkts bytes target     prot opt in     out  source          destination
    0     0 IN_public  all  --  ens33  *    0.0.0.0/0       0.0.0.0/0      [goto]
    0     0 IN_public  all  --  +      *    0.0.0.0/0       0.0.0.0/0      [goto]
Chain IN_public (2 references)
 pkts bytes target     prot opt in     out  source          destination
    0     0 IN_public_allow  all  --  *      *    0.0.0.0/0       0.0.0.0/0
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out  source          destination
    0     0 ACCEPT     tcp  --  *      *    0.0.0.0/0       0.0.0.0/0    tcp dpt:22 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *    0.0.0.0/0       0.0.0.0/0    tcp dpt:80 ctstate NEW

表和链的结构如下:

filter (表)
  |-- INPUT_ZONES (链)
        |-- IN_public (链)
              |-- IN_public_allow (链)
                    |-- tcp 80 (具体规则)

链(Chain)类似硬件防火墙中的对象,在硬件防火墙中,对象里面还可以调用另一个对象,一级一级地嵌套 在一个链中,可以写具体的规则,也可以调用另一个链。链中的匹配顺序仍然是从上到下进行比较。

[[email protected] ~]# iptables -I IN_public_allow -p tcp --dport 8080 -j ACCEPT
[[email protected] ~]# iptables -t filter -nvL
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out   source        destination
    0     0 ACCEPT     tcp  --  *      *     0.0.0.0/0     0.0.0.0/0     tcp dpt:8080
    0     0 ACCEPT     tcp  --  *      *     0.0.0.0/0     0.0.0.0/0     tcp dpt:22 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *     0.0.0.0/0     0.0.0.0/0     tcp dpt:80 ctstate NEW

如果关闭firewall,只使用iptables,则filter表只能看到在INPUT/OUTPUT/FORWARD这三个链添加的新规则,像IN_public_allow这些链中新添加的规则都不见了。如果之前是在IN_public_allow链添加的规则,现在都无法访问。但这些规则并没有被真正删除,如果再次启动firewalld,则会看到相应的规则。

firewall和iptalbes共存

配置firewalld.service和iptables.service开机启动,测试。
在CentOS7.4的最小安装中,默认安装了firewalld.service,但并没有iptalbes.service(需要安装iptables-service),但iptalbes的一些命令仍然可以使用。
使用firewall-cmd命令添加的规则,如果添加了–permanent就会在下次启动时生效。
如果使用iptables命令添加规则,用命令service iptables save进行保存,下次启动时生效。

[[email protected] ~]# firewall-cmd --state
running
[[email protected] ~]# firewall-cmd --add-port=8081/tcp --permanent
success
[[email protected] ~]# iptables -I INPUT -p tcp --dport 8082 -j ACCEPT
[[email protected] ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[[email protected] ~]# firewall-cmd --reload
success
[[email protected] ~]# firewall-cmd --list-ports
80/tcp 8081/tcp
[[email protected] ~]# iptables -t filter -nvL

使用firewall-cmd命令添加的规则,在/etc/sysconfig/iptables中看不到,因为这个文件是iptables命令生成的

-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
-A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
firewall-cmd命令添加的TCP 8081并没有出现在/etc/sysconfig/iptables文件中
但是可以看到iptables命令添加的tcp 8082
-A INPUT -p tcp -m tcp --dport 8082 -j ACCEPT

使用iptables -t filter -nvL命令查看规则时,出现了相反的情况

[[email protected] ~]# iptables -t filter -nvL
使用iptables-save命令查看也一样,只是显示格式不一样
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out  source      destination
    0     0 ACCEPT     udp  --  virbr0 *    0.0.0.0/0   0.0.0.0/0     udp dpt:53
    0     0 ACCEPT     tcp  --  virbr0 *    0.0.0.0/0   0.0.0.0/0     tcp dpt:53
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out  source      destination
    0     0 ACCEPT     tcp  --  *      *    0.0.0.0/0   0.0.0.0/0     tcp dpt:22 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *    0.0.0.0/0   0.0.0.0/0     tcp dpt:80 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *    0.0.0.0/0   0.0.0.0/0     tcp dpt:8081 ctstate NEW
可以看到firewall-cmd命令添加的TCP 8081,看不到iptables命令添加的tcp 8082(/etc/sysconfig/iptalbes文件中是存在TCP 8082的)
使用nc命令监听tcp 8081和tcp 8082,最终只有tcp 8081可以连接。
[[email protected] ~]# netstat -tunlp
Proto Recv-Q Send-Q Local Address     Foreign Address     State       PID/Program name
tcp        0      0 0.0.0.0:8081      0.0.0.0:*           LISTEN      1626/nc
tcp        0      0 0.0.0.0:8082      0.0.0.0:*           LISTEN      1627/nc
关闭firewalld.service,重启系统
[[email protected] ~]# systemctl disable firewalld.service
iptables-save查看到了tcp 8082,且telnet连接成功
-A INPUT -p tcp -m tcp --dport 8082 -j ACCEPT

在实际使用中,建议只用firewall或只用iptables,而不是同时使用。

0 Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注