Linux网络相关及防火墙
Linux网络相关
查看网卡IP
ip add
[root@zyxlinux01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9a:c2:c6 brd ff:ff:ff:ff:ff:ff
inet 192.168.101.128/24 brd 192.168.101.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe9a:c2c6/64 scope link
valid_lft forever preferred_lft forever
ifconfig [-a]
安装:yum install -y net-tools
[root@zyxlinux01 ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.101.128 netmask 255.255.255.0 broadcast 192.168.101.255
inet6 fe80::20c:29ff:fe9a:c2c6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9a:c2:c6 txqueuelen 1000 (Ethernet)
RX packets 999 bytes 117272 (114.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 584 bytes 75852 (74.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这连个命令作用几乎一样,ifconfig的结果更容易看懂
打开/关闭网卡
-
ifup 网卡名
打开网卡 -
ifdown 网卡名
关闭网卡
在有网卡不能被重启的情况下,单独重启某些网卡时使用
在远程连接的情况下可以使用
ifdown eth0 && ifup eth0
设定虚拟网卡
-
1
cp ifcfg-eno16777736 ifcfg-eno16777736\:0
: 复制原网卡配置文件给虚拟网卡配置文件 -
2 修改虚拟网卡配置文件
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736" (修改网卡名为eno16777736:0)
UUID="1b105702-ca5b-4ef4-ae4c-a86e8fdec536"
DEVICE=eno16777736 (修改设备名为eno16777736:0)
ONBOOT="yes"
HWADDR="00:0C:29:9A:C2:C6"
PEERDNS="yes"
PEERROUTES="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPADDR=192.168.101.128 (修改IP地址)
NETMASK=255.255.255.0
GATEWAY=192.168.101.2 (可以不用)
DNS1=119.29.29.29 (可以不用)
- 3 重启网络服务 即可成功添加虚拟网卡
ifdown eno16777736 && ifup eno16777736
测试网卡是否连接
mii-tool 网卡名
(link ok 表示已经连接)
[root@zyxlinux01 network-scripts]# mii-tool eno16777736
eno16777736: negotiated 1000baseT-FD flow-control, link ok
ethtool 网卡名
[root@zyxlinux01 network-scripts]# ethtool !$
ethtool eno16777736
Settings for eno16777736:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: off (auto)
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
Link detected: yes
表示已经连接
更改主机名
hostnamectl set-hostname neme
及时生效
主机名配置文件/etc/hostname
DNS配置文件
/etc/resolv.conf
: DNS 配置文件(由网卡配置文件内容决定)
/etc/hosts
Linux主机名的相关配置文件就是/etc/hosts;这个文件告诉本主机哪些域名对应那些ip,那些主机名对应哪些ip
[root@zyxlinux01 network-scripts]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
实例:
[root@zyxlinux01 network-scripts]# ping www.baidu.com
PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data.
64 bytes from 180.97.33.108: icmp_seq=1 ttl=128 time=34.7 ms
[root@zyxlinux01 network-scripts]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.101.128 www.baidu.com
[root@zyxlinux01 network-scripts]# ping www.baidu.com
PING www.baidu.com (192.168.101.128) 56(84) bytes of data.
64 bytes from www.baidu.com (192.168.101.128): icmp_seq=1 ttl=64 time=0.295 ms
64 bytes from www.baidu.com (192.168.101.128): icmp_seq=2 ttl=64 time=0.113 ms
64 bytes from www.baidu.com (192.168.101.128): icmp_seq=3 ttl=64 time=0.117 ms
来源从
from 180.97.33.108
变成了from www.baidu.com (192.168.101.128)
只在本机生效,支持一个IP配多个域名
firewalld和netfilter
- selinux临时关闭:
setenforce 0
- selinux永久关闭:
vi /etc/selinux/config
将SELINUX=enforcing
改为SELINUX=disabled
selinux状态可以用命令 getenforce 来查看
-
CentOS 7 以前的版本中的防火墙netfilter
-
CentOS 7 默认使用的是firewalld(也可以使用netfilter)
如何在CentOS 7中使用 netfilter:
1:关闭 **firewalld** ,stop 停止服务
`systemctl disable firewalld` --> `systemctl stop firewalld`
2:安装iptables工具包(开启netfilter)
`yum install -y iptables-services`
3: 开启iptables服务
`systemctl enable iptables` --> `systemctl start iptables`
4: `iptables -nvL` :查看iptables默认规则
netfilter(Linux防火墙机制)
Netfilter采用模块化设计,具有良好的可扩充性,其重要工具模块IPTables连接到Netfilter的架构中,并允许使用者对数据报进行过滤、地址转换、处理等操作
Netfilter提供了一个框架,将对网络代码的直接干涉降到最低,并允许用规定的接口将其他包处理代码以模块的形式添加到内核中,具有极强的灵活性
iptables包含5个表(4个表:filter,nat,mangle,raw),5个链(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING)。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度:
五个表:
- fileer: 一般的过滤功能.
- nat: 用于nat功能(端口映射, 地址映射等).
- mangle: 用于对特定数据包的修改.
- raw: 优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理, 提高性能.
- security
五个链:
-
PREROUTING:数据包进入路由表之前
-
INPUT:通过路由表后目的地为本机
-
FORWARDING:通过路由表后,目的地不为本机
-
OUTPUT:由本机产生,向外转发
-
POSTROUTIONG:发送到网卡接口之前
iptables语法
iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置
语法: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默认表为:filter
表名包括:
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量
net:地址转换,用于网关路由器
filter:包过滤,用于防火墙规则
规则链名包括:
INPUT链:处理输入数据包
OUTPUT链:处理输出数据包
PORWARD链:处理转发数据包
PREROUTING链:用于目标地址转换(DNAT)
POSTOUTING链:用于源地址转换(SNAT)
动作包括:
accept:接收数据包
DROP:丢弃数据包
REDIRECT:重定向、映射、透明代理
SNAT:源地址转换
DNAT:目标地址转换
MASQUERADE:IP伪装(NAT),用于ADSL
LOG:日志记录
实例应用:
iptables配置文件: /etc/sysconfig/iptables
-
查看iptables规则
iptables -nvL
-
清空规则
iptables -F
,然后service iptables save
才能将规则保存到配置文件中;如果不保存,重启服务service iptables restart
后,原规则不变 -
iptables -Z
: 清零计数器 -
iptables -A INPUT -s 192.168.101.1 -p tcp --port 1234 -d 192.168.101.128 --dport 80 -j DROP
:增加一条新规则,扔掉针对链(INPUT),通过tcp协议,来源ip为192.168.101.1,来源端口1234,目标IP为192.168.101.130,目标端口为80的数据包. -
iptables -I INPUT -p tcp --dport 80 -j DROP
:插入一条规则:'扔掉针对链(INPUT),通过tcp协议,目标端口为80的数据包.'
插入的规则会排在规则表的第一行,默认过滤是从第一行开始
-
iptables -D INPUT -p tcp --dport 80 -j DROP
: 删除这条规则(扔掉针对链(INPUT),通过tcp协议,目标端口为80的数据包.) -
iptables -nvl --line-number
:打印规则序列号 -
iptables -D INPUT 序列号
: 删除该序列号对应的规则 -
iptables -P 链 操作
: 更改链的默认规则(最好不要更改)
filter表应用小案例
需求:放行端口80、22、21;但是针对22端口指定的IP段放行,其他拒绝。(用一个脚本的方式来实现)
[root@localhost ~]# vim /usr/local/sbin/iptables.sh
#! /bin/bash
ipt="/usr/sbin/iptables" (定义变量$ipt)
$ipt -F (清除所有规则)
$ipt -P INPUT DROP (将默认INPUT链策略拒绝,丢弃)
$ipt -P OUTPUT ACCEPT (默认放行OUTPUT链)
$ipt -P FORWARD ACCEPT (默认放行FORWARD链)
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT (增加规则:对指定状态RELATED,ESTABLISHED接受,放行)
$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT (放行网段为192.168.133.0,通过tcp协议,目标端口为22的数据包)
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT (放行通过tcp协议,目标端口为80的数据包)
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT (放行通过tcp协议,目标端口为21的数据包)
icmp示例
让本就能够ping出去,但是不能被ping进来
iptables -I INPUT -p tcp icmp --icmp-type 8 -j DROP
nat表应用
条件:A机有两块网卡ens33.(192.168.133.130),ens37(192.168.100.1);ens33可以上外网,ens37为内部网络;B机只有ens37(192.168.100.100),可以和A机通信互联;C机只能和A机通信。
需求1:让B机能连接外网
- 打开A机路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1
0表示路由转发关闭,1表示打开
- 在A机添加一条规则:针对POSTROUTING链,将源IP段为192.168.100.0的数据包伪装封包为ens33的IP出去的数据包
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
- 设置B机的网关为192.168.100.1
route add default gw 192.168.100.1
需求2:让C机可以直接连通B机的22端口
- A机打开路由转发
echo "1" > /proc/sys/net/ipv4/ip_forward
- A机上添加一条规则:针对PREROUTING链,将通过协议tcp,目标IP为192.168.133.130,目标端口为1122的数据包映射到192.168.100.100:22端口。
iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
- A机添加一条规则:针对POSTROUTING链,将源IP为192.168.100.100的数据包转换到192.168.133.130
iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
- B机设置网关为192.168.100.1
vim /etc/resolv.conf
修改DNS
iptables 扩展
iptables应用在一个网段
iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP
针对INPUT链,将ip为61.4.176.0-61.4.191.255之间的数据包丢弃
sant,dnat,masquerade
-
DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映谢。而SNAT(Source Network Address Translation,源地址转换)通常被叫做源映谢。
-
这是我们在设置Linux网关或者防火墙时经常要用来的两种方式。以前对这两个都解释得不太清楚,现在我在这里解释一下。首先,我们要了解一下IP包的结构:在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。
-
数据包在iptables中要经过的链:
a. PREROUTING-->Routing Decision(在这里系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址) --> 数据将会被转交给INPUT链
b. PREROUTING-->Routing Decision(在这里系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress不是本机地址) --> 则交给FORWARD链检测
也就是说,我们要做的DNAT要在进入这个菱形转发区域之前,也就是在PREROUTING链中做,比如我们要把访问202.103.96.112的访问转发到192.168.0.112上:
iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112
而SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66
这个语句就是告诉系统把即将要流出本机的数据的source ip address修改成为58.20.51.66。这样,数据包在达到目的机器以后,目的机器会将包返回到58.20.51.66也就是本机。如果不做这个操作,那么你的数据包在传递的过程中,reply的包肯定会丢失
假如当前系统用的是ADSL/3G/4G动态拨号方式,那么每次拨号,出口IP都会改变,SNAT就会有局限性
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
重点在那个『 MASQUERADE 』!这个设定值就是『IP伪装成为封包出去(-o)的那块装置上的IP』!不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换
iptables限制syn速率
原理,每5s内tcp三次握手大于20次的属于不正常访问
iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.0.101 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP
其中192.168.0.0/255.255.255.0 为不受限制的网段, 192.168.0.101 为本机IP。
该iptables策略,可有效预防syn攻击,也可以有效防止机器人发垃圾帖
iptables规则备份和恢复
-
默认情况下:
service iptables save
会保存在`/etc/sysconfig/iptables中 -
自定义路径:
iptables-save > 自定义文件名
-
恢复规则:
iptables-restore < 已保存的规则文件
linux 防火墙 firewalld
打开Linux防火墙firewalld
systemctl disable iptables
systemctl stop iptables
systemctl enable firewalld
systemctl start firewalld
firewalld的9个zone
每一个zone好比一个规则集,自带一些规则
- drop:丢弃,丢弃接收到的任何网络数据包,且没有任何回复,仅有发送出去的网络连接
- block:限制,任何接收到的网络数据包都被IPv4的 icmp-host-prohibited信息和IPv6的icmp-host-prohibited信息所拒绝
- public:公共,在公共区域内使用,不相信网络内的其他计算机不会对你的计算机造成伤害,只接受经过选取的连接
- external:外部,特别是为路由器启用了伪装功能的外部网,不相信网络内的其他计算机不会对你的计算机造成伤害,只接受经过选取的连接
- dmz:非军事区,用于你的非军事区内的计算机,此区域内可以公开访问,可以有限的进入你的内部网络,仅接受经过选择的连接
- work:工作,用于工作区,可以基本相信网络内的其他计算机不会危害你的计算机,仅接受经过选择的连接
- home:家庭,用于家庭网络,可以基本相信网络内的其他计算机不会危害你的计算机,仅接受经过选择的连接
- internal:内部,用于内部网络,可以基本相信网络内的其他计算机不会危害你的计算机,仅接受经过选择的连接
- trusted:信任,可以接受所有的网络连接
zone的操作
一些常用的关于zone的操作
firewalld-cmd --set-default-zone=home
:设定默认zone为homefirewalld-cmd --get-zone-of-interface=ens33
:查看ens33使用的是哪一个zonefirewalld-cmd --zone=public --add-interface=lo
:指定网卡lo的zone为publicfirewalld-cmd --zone=dmz --change-interface=lo
:更改网卡lo的zone为dmzfirewalld-cmd --zone=dmz --remove-interface=lo
:删除网卡lo的zonefirewalld-cmd --get-active-zone
:查看系统中所有网卡所在的zone
service的操作
service相当于zone下的子单元,针对每一个端口去做一些限制
/usr/lib/firewalld/zone/
:zone的配置文件模板
/usr/lib/firewalld/services/
:services的配置文件模板
关于service常用的操作
-
firewall-cmd --get-services
:查看系统中所有的service -
firewall-cmd --list-services
:列出当前zone下有哪些service -
firewall-cmd --zone=public --add-service=http
:将http服务添加到public zone下 -
firewall-cmd --zone=public --remove-service=http
:将http服务从public zone中删除 -
``firewall-cmd --zone=public --add-service=http --permanent`: 将http服务添加到public zone下(使用 --permanent,会在更改配置后在 /etc/firewalld/zones/下生成配置文件)
应用实例
需求:ftp服务端自定义端口为1122,在work zone下放行ftp
a. cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/
:拷贝ftp配置模板文件ftp.xml到/etc/firewalld/services/下
b. vim /etc/firewalld/services/ftp.xml
:编辑配置文件,将端口号由21更改为1121
c. cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/
:拷贝work配置模板文件work.xml到/etc/firewalld/zones/下
d. vim /etc/firewalld/zones/work.xml
:编辑work.xml,增加一行
e. firewall-cmd --reload
:重新加载
firewall-cmd --zone=work --list-services
:查看work zone下有没有ftp服务