Linux 网络与防火墙

常用网络命令

网络参数设置

针对 IP 参数、路由参数等网络参数设置的相关指令有:

  • ifconfig :查询、设置网卡、IP。命令格式 ifconfig interface {options}
    • interface:网卡接口代号,包括 eth0, eth1等
    • options:可以接的参数,包括如下
      • up, down :启动 (up) 或关闭 (down) 该网络接口
      • mtu :可以设定不同的 MTU 数值,例如 mtu 1500(单位为 byte)
  • route :查询、设置路由表
  • ip :复合式指令,整合 ifconfig 和 route 指令。命令格式 ip [option] [动作] [指令]
    • option :设定参数
      • -s :显示出该装置的统计数据(statistics),例如总接受封包数等
    • 动作:亦即是可以针对哪些网络参数进行动作
      • link :关于装置 (device) 的相关设定,包括 MTU, MAC 地址等等
      • addr/address :关于额外的 IP 协议,例如多 IP 的达成等等
      • route :与路由有关的相关设定
# 查看所有网络接口
ifconfig
ifconfig ens33

# 启动或关闭网卡
ifconfig ens33 up
ifconfig ens33 down

# 查看路由状态
route -n

# 查看网络接口的统计数据
ip -s link show ens33

# 查看网络接口的信息
ip address show ens33

网络静态IP设置

一般来说,Linux连接网络是通过 DHCP 自动分配一个动态本地IP。有时,我们需要固定的IP方便设置一些服务,就需要设置静态IP。各个发行版的网络静态IP设置不太一样,参考如下。

Ubuntu 20 设置静态IP

# 查看当前网卡代号,一般是 ens33
ifconfig

# 或者通过 nmcli 查看,可能需要安装 apt install network-manager
nmcli device show ens33

# 修改配置文件,每个版本配置文件名可能不同,在/etc/netplan找一下
vim /etc/netplan/01-network-manager-all.yaml

# 修改配置如下
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    ens33:   # 配置的网卡的名称
      addresses: [192.168.159.128/24,192.168.159.129/24]   # 配置的静态ip地址和掩码,示例设置了两个固定IP
      dhcp4: false   # 关闭dhcp4
      optional: true
      gateway4: 192.168.159.2 # 网关地址
      nameservers:
        addresses: [192.168.159.2,114.114.114.114]  # DNS服务器地址,多个DNS服务器地址需要用英文逗号分隔开,可不配置

# 使配置生效
netplan apply

Debian 设置静态IP

# 查看网卡接口
ifconfig

# 修改配置文件
vim /etc/network/interfaces

# 修改配置如下
# The primary network interface
allow-hotplug ens3
iface ens3 inet static  # 设置静态IP模式,其中static对应修改为 dhcp 则为动态模式
address 192.168.3.151   # 静态IP地址
netmask 255.255.255.0   # 掩码
gateway 192.168.3.1     # 网关
dns-nameservers 192.168.3.1 # dns地址
dns-nameservers 114.114.114.114 #dns地址
dns-nameservers 8.8.8.8
mtu 1410

# 重启网络
systemctl restart NetworkManager.service

其他网络指令

检测Linux网络是否连通,网络连接质量如何。

  • ping :通过 ICMP 协议检测网络状况。
    • -c 数值:后面接的是执行 ping 的次数,例如 -c 5
    • -n :在输出数据时不进行 IP 与主机名的反查,直接使用 IP 输出(速度较快)
    • -s 数值:发送出去的 ICMP 封包大小,预设为 56bytes,不过你可以放大此一数值
    • -t 数值:TTL 的数值,预设是 255,每经过一个节点就会少一
    • -W 数值:等待响应对方主机的秒数
  • traceroute :追踪网络连接过程中通过的各个节点
    • -n :可以不必进行主机的名称解析,单纯用 IP ,速度较快!
    • -U :使用 UDP 的 port 33434 来进行侦测,这是预设的侦测协议
    • -I :使用 ICMP 的方式来进行侦测
    • -T :使用 TCP 来进行侦测,一般使用 port 80 测试
    • -w :若对方主机在几秒钟内没有回声就宣告不治…预设是 5 秒
    • -p 端口:若不想使用 UDP 与 TCP 的预设端口来侦测,可在此改变端口
  • netstat :查看本机的网络连接情况
  • wget :下载器
  • tcpdump :封包撷取,分析封包流向和监听封包内容,特别对明文传输的数据,可以轻易监听
    • -nn:直接以 IP 及 port number 显示,而非主机名与服务名称
    • -X :可以列出十六进制 (hex) 以及 ASCII 的封包内容,对于监听封包内容很有用
    • -i :后面接要『监听』的网络接口,例如 eth0, lo, ppp0 等等的界面
    • -w :如果你要将监听所得的封包数据储存下来,用这个参数就对了!后面接档名
    • -c :监听的封包数,如果没有这个参数, tcpdump 会持续不断的监听,直到使用者输入 [ctrl]-c 为止
# 检测网络
ping -c 168.95.1.1

# 检测网络节点
traceroute -n qq.com
traceroute -n -T qq.com

# 查看本机网路连接
netstat -tlunp

# 下载网络资源
wget https://www.google.com/demo.tar.gz

# 修改wget下载器的代理
vim /etc/wgetrc

#找到并修改下面两项
https_proxy = http://proxy.yoyodyne.com:18023/
use_proxy = on

# 监控网卡封包
tcpdump -i ens33 -nn

# 监听某个端口,且查看明文内容
tcpdump -i lo -nn -X 'port 21'

防火墙

Linux防火墙的主要作用及功能:

  • 拒绝让 Internet 的封包进入主机的某些端口,如限制仅允许访问主机的 80 22等端口
  • 拒绝让某些来源 IP 的封包进入,如限制某些恶意IP访问主机
  • 拒绝让带有某些特殊旗标 (flag) 的封包进入
  • 分析硬件地址 (MAC) 来决定联机与否,如屏蔽特定MAC地址访问主机
  • 防火墙并不能很有效的抵挡病毒或木马程序,如服务器开放了 WWW服务,此服务面向所有人,若www服务程序存在漏洞,同样回被黑客利用并侵入
  • 防火墙对于来自内部 LAN 的攻击较无承受力,一般局域网没有特别多防火墙限制

iptables

iptables 是Linux核心所提供的防火墙功能,性能优秀。
iptables 是利用封包过滤的机制, 所以他会分析封包的表头数据。根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃。

iptables 规则顺序很重要

iptables 根据封包表头数据,逐个规则比对过滤。因此,规则顺序设置不当,回导致正常的网络访问被丢弃或拒绝。

file

iptables 的表格(table)与链(chain)

Linux 的 iptables 至少有三个表格,每个表格又有若干链,具体如下:

  • filter :过滤器,主要跟进入Linux本机的封包有关,有以下链
    • INPUT :与进入 Linux 本机的封包有关
    • OUTPUT :与 Linux 本机所发出的封包有关
    • FORWARD :转发封包到后端计算机,与 nat 表相关
  • nat :地址转换 Network Address Translation,这个表是进行来源与目的 IP 或 port 的转换,与Linux本机无关,主要与局域网内后端计算机有关
    • PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
    • POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
    • OUTPUT:与发送出去的封包有关
  • mangle :破坏者,这个很少用到

file

iptables 语法

iptables [-t table] [-L] [-nv]

  • -t :后接 table ,例如 nat 或 filter ,默认filter
  • -L :列出目前的 table 的规则
  • -n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多
  • -v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
  • -F :清除所有的已订定的规则
  • -X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )
  • -Z :将所有的 chain 的计数与流量统计都归零
  • -D :删除规则,如 iptables -D INPUT 3 (删除INPUT的第三条规则)

iptables-save [-t table] 输出 iptables 规则,比iptables命令输出的信息更详细

定义预设策略(Policy)
当你的封包不在你设定的规则之内时,则该封包的通过与否,是以 Policy 的设定为准。
命令:iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]

封包基础比对规则
针对IP、网域、网络接口、协议等定义规则。
命令:iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源 IP/网域] [-d 目标 IP/网域] -j [ACCEPT|DROP|REJECT|LOG]

  • -AI 链名:针对某的链进行规则的 "插入" 或 "累加"
    • -A :新增加一条规则,该规则增加在原本规则的最后面
    • -I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。
  • 链名:有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关
  • -io 网络接口:设定封包进出的接口规范
    • -i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合
    • -o :封包所传出的那个网络接口,需与 OUTPUT 链配合
  • -p 协定:设定此规则适用于哪种封包格式,主要的封包格式有: tcp, udp, icmp 及 all 。
  • -s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域
    • IP :192.168.0.100
    • 网域:192.168.0.0/24
    • ! :非,如 -s ! 192.168.100.0/24 表示非 192.168.100.0/24 之封包来源。在其他参数前也可以使用 !,如 ! -i lo 等
  • –sport 来源端口范围:单个端口或一个端口范围,如 80 8001:8888
  • -d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。
  • –dport 目的端口
  • -j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)

iptables 外挂模块:mac 与 state
state 可以实现本机向外请求的访问,不受限制返回本机
命令:iptables -A INPUT [-m state] [--state 状态]

  • -m :一些 iptables 的外挂模块,主要常见的有
    • state :状态模块
    • mac :网络卡硬件地址 (hardware address)
  • –state :一些封包的状态,主要有
    • INVALID :无效的封包,例如数据破损的封包状态
    • ESTABLISHED:已经联机成功的联机状态;
    • NEW :想要新建立联机的封包状态;
    • RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关
# 列出 filter 多个链的规则
iptables -L -n

# 列出 nat 表
iptables -t nat -L -n

# 输出 filter 表信息
iptables-save

# 清除本机防火墙 (filter) 的所有规则
iptables -F
iptables -X
iptables -Z

# 将本机的 INPUT 设定为 DROP ,其他设定为 ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 设定 lo 成为受信任的装置
iptables -A INPUT -i lo -j ACCEPT

# 只要是来自内网的 (192.168.100.0/24) 的封包通通接受
iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT

# 禁止进入本机 21 端口
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

# 允许访问多个本机端口
iptables -A INPUT -i eth0 -p udp --dport 137:140 -j ACCEPT

# 只要已建立或相关封包就予以通过,实现本机请求访问,正常返回
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 针对局域网络内的 aa:bb:cc:dd:ee:ff 主机开放其联机
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT

基础防火墙设计案例
一台 Linux 最基础的防火墙设计规则及步骤示例:

  • 规则归零:清除所有已经存在的规则 (iptables -F…)
  • 预设政策:除了 INPUT 这个自定义链设为 DROP 外,其他为预设 ACCEPT
  • 信任本机:由于 lo 对本机来说是相当重要的,因此 lo 必须设定为信任装置
  • 回应封包:让本机主动向外要求而响应的封包可以进入本机(ESTABLISHED,RELATED)
  • 信任用户:这是非必要的,如果你想要让区网的来源可用你的主机资源时

制作定制防火墙脚本 vim bin/firewall.sh

#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin;
export PATH

# 1. 清除规则
iptables -F
iptables -X
iptables -Z

# 2. 设定政策
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 3~5. 制订各项规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT

# 6. 写入防火墙规则配置文件,需要先安装服务 apt install iptables-persistent
# 若不经过保存,已创建的规则,重启主机后丢失
netfilter-persistent  save

注意:所有通过命令添加的规则,若不保存写入,重启主机后丢失。如上面的脚本,可以使用一些写入规则的组件 iptables-persistent

单机防火墙实例
可以作为本机或路由器上的防火墙,以下示例规则摘录鸟哥,基于Centos系统,未测试可参考借鉴。

file

file

为了未来修改维护方便,鸟哥将整个脚本拆分三个部分,分别是:

  • iptables.rule:设定最基本的规则,包括清除防火墙规则、加载模块、设定服务可接受等;
  • iptables.deny:设定抵挡某些恶意主机的进入;
  • iptables.allow:设定允许某些自定义的后门来源主机!

主脚本 vim iptables.rule

#!/bin/bash

# 请先输入您的相关参数,不要输入错误了!
EXTIF="eth0" # 这个是可以连上 Public IP 的网络接口
INIF="eth1" # 内部 LAN 的连接接口;若无则写成 INIF=""
INNET="192.168.100.0/24" # 若无内部网域接口,请填写成 INNET=""
export EXTIF INIF INNET

# 第一部份,针对本机的防火墙设定!
##########################################
# 1. 先设定好核心的网络功能:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
    echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do
    echo "0" > $i
done

# 2. 清除规则、设定默认政策及开放 lo 与相关的设定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin;
export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 3. 启动额外的防火墙 script 模块
if [ -f /usr/local/virus/iptables/iptables.deny ]; then
    sh /usr/local/virus/iptables/iptables.deny
fi
if [ -f /usr/local/virus/iptables/iptables.allow ]; then
    sh /usr/local/virus/iptables/iptables.allow
fi
if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
    sh /usr/local/virus/httpd-err/iptables.http
fi

# 4. 允许某些类型的 ICMP 封包进入
AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
    iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done

# 5. 允许某些服务的进入,请依照你自己的环境开启
# iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # FTP
# iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS

# 第二部份,针对后端主机的防火墙设定!###############################
# 1. 先加载一些有用的模块
modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack
ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
    testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
    if [ "$testmod" == "" ]; then
        modprobe $mod
    fi
done

# 2. 清除 NAT table 的规则吧!
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# 3. 若有内部接口的存在 (双网卡) 开放成为路由器,且为 IP 分享器!
if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
        for innet in $INNET
        do
            iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
        done
    fi
fi
# 如果你的 MSN 一直无法联机,或者是某些网站 OK 某些网站不 OK,
# 可能是 MTU 的问题,那你可以将底下这一行给他取消批注来启动 MTU 限
制范围
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

# 4. NAT 服务器后端的 LAN 内对外之服务器设定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to-destination 192.168.1.210:80 # WWW

# 5. 特殊的功能,包括 Windows 远程桌面所产生的规则,假设桌面主机为 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000 -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389 -j DNAT --to-destination 192.168.100.20

# 6. 最终将这些功能储存下来吧!
/etc/init.d/iptables save

添加允许的规则 vim iptables.allow

#!/bin/bash
# 底下则填写你允许进入本机的其他网域或主机啊!
iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT

添加禁止的规则 vim iptables.deny

#!/bin/bash
# 底下填写的是『你要抵挡的那个咚咚!』
iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP

修改权限及增加到开机脚本里

chmod 700 iptables.*

vim /etc/rc.d/rc.local
# 添加类似主脚本路径 /usr/local/virus/iptables/iptables.rule
NAT 服务器

NAT 全名是 Network Address Translation 网络地址的转换。
内部 LAN 主机连接因特网,封包需要经过NAT服务器(路由器)转发出去,流程如下:

  1. 先经过 NAT table 的 PREROUTING 链;
  2. 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;
  3. 再经过 Filter table 的 FORWARD 链;
  4. 通过 NAT table 的 POSTROUTING 链,最后传送出去。

NAT服务器重点在于流程中的 1,4 步骤,也即是 NAT table 的两个重要链:PREROUTING 与 POSTROUTING。主要实现两个功能:

  • SNAT:来源NAT,修改LAN的来源IP,实现内部LAN访问外部因特网,与 POSTROUTING 有关
  • DNAT:目的NAT,修改目标IP,实现外部网络访问内部LAN主机,如内部 WWW服务器等,与 PREROUTING 有关

基础的 NAT 服务器设置
一台基础的 NAT,硬件上需要两个网卡接口:

  • 外部接口 eth0:这个接口需要有公网IP
  • 内部接口 eth1:局域网IP,如 192.168.100.254

NAT服务器的iptables设置,在上面单机防火墙实例中已经包含了,其中重要相关的有下面几行:

# 开启router功能,实现IP分享器
echo "1" > /proc/sys/net/ipv4/ip_forward

# SNAT
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE

# DNAT
iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to-destination 192.168.1.210:80 # WWW
未经作者允许,禁止转载。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇