常用网络命令
网络参数设置
针对 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 :与路由有关的相关设定
- option :设定参数
# 查看所有网络接口
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 根据封包表头数据,逐个规则比对过滤。因此,规则顺序设置不当,回导致正常的网络访问被丢弃或拒绝。
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 :破坏者,这个很少用到
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系统,未测试可参考借鉴。
为了未来修改维护方便,鸟哥将整个脚本拆分三个部分,分别是:
- 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服务器(路由器)转发出去,流程如下:
- 先经过 NAT table 的 PREROUTING 链;
- 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;
- 再经过 Filter table 的 FORWARD 链;
- 通过 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