解析Linux网络
1. tcpdump
tcpdump
是一个网络抓包工具,可以捕获并分析网络流量。
基本用法:
tcpdump -i eth0 |
捕获接口 eth0
上的所有数据包。
高级用法:
tcpdump -i eth0 host 192.168.1.1 |
捕获与特定主机 192.168.1.1
相关的数据包。
tcpdump -i eth0 port 80 |
捕获接口 eth0
上所有通过端口 80
的数据包。
tcpdump -i eth0 -w capture.pcap |
将捕获的数据包保存到文件 capture.pcap
。
tcpdump -r capture.pcap |
读取并分析 capture.pcap
文件中的数据包。
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' |
捕获所有带有 SYN 或 ACK 标志的 TCP 包。
2. lsof
lsof
显示系统中打开的文件,常用于查看打开的网络连接。
基本用法:
lsof -i |
显示所有打开的网络连接。
高级用法:
lsof -i :80 |
显示所有使用端口 80
的网络连接。
lsof -p <PID> |
显示特定进程 <PID>
打开的文件。
lsof -u <username> |
显示特定用户打开的文件。
lsof /path/to/file |
显示哪个进程打开了指定文件。
3. net-tools
net-tools
包含 ifconfig
、netstat
等工具。
基本用法:
ifconfig eth0 |
显示接口 eth0
的配置信息。
netstat -an |
显示所有活动的网络连接及其状态。
高级用法:
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 |
配置接口 eth0
的 IP 地址和子网掩码。
netstat -r |
显示路由表信息。
netstat -i |
显示网络接口统计信息。
netstat -plnt |
显示所有监听的 TCP 端口及其关联的进程。
4. iproute2
iproute2
是 net-tools
的替代品,提供 ip
命令。
基本用法:
ip link show |
显示所有网络接口。
ip addr show |
显示所有接口的 IP 地址信息。
高级用法:
ip addr add 192.168.1.100/24 dev eth0 |
为接口 eth0
添加 IP 地址。
ip link set eth0 up |
启用接口 eth0
。
ip route add default via 192.168.1.1 |
设置默认网关。
ip link set eth0 down |
禁用接口 eth0
。
ip rule add from 192.168.1.0/24 table 1 |
添加路由规则,使来自 192.168.1.0/24
的流量使用路由表 1
。
5. NetworkManager
NetworkManager
是管理网络配置的工具。
基本用法:
nmtui |
交互命令窗口
nmcli device status |
查看当前设备的连接状态。
nmcli con show |
列出所有已保存的网络连接。
高级用法:
nmcli device wifi list |
列出可用的 Wi-Fi 网络。
nmcli device wifi connect SSID password PASSWORD |
连接到指定的 Wi-Fi 网络。
nmcli con add type ethernet ifname eth0 con-name my-eth0 |
添加一个名为 my-eth0
的以太网连接。
nmcli con modify my-eth0 ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 |
修改连接 my-eth0
的 IP 地址和网关。
nmcli con up my-eth0 |
启用连接 my-eth0
。
6. firewalld
firewalld
提供动态的防火墙管理工具。
基本用法:
systemctl start firewalld |
启动 firewalld
服务。
firewall-cmd --get-active-zones |
查看当前活动的区域。
firewall-cmd --list-all |
列出当前区域的所有规则。
高级用法:
firewall-cmd --add-port=80/tcp --permanent |
永久打开端口 80
。
firewall-cmd --reload |
重新加载防火墙配置。
firewall-cmd --zone=public --add-service=http --permanent |
将 http
服务添加到 public
区域。
firewall-cmd --remove-port=80/tcp --permanent |
永久关闭端口 80
。
7. iptables
iptables
是 Linux 内核中的包过滤工具。
四表五链
iptables 是 Linux 系统中用于配置网络地址转换(NAT)、包过滤和包修改规则的工具。iptables 使用四个表和五个链来处理数据包。以下是对四个表和五个链的详细解释:
四个表(Tables)
filter 表:
- 用途:这是默认的表,用于网络包过滤。
- 链:包含 INPUT、FORWARD 和 OUTPUT 链。
- 示例规则:
# 允许所有进入本地网络接口的流量
iptables -A INPUT -i lo -j ACCEPT
# 允许所有从本地网络接口发出的流量
iptables -A OUTPUT -o lo -j ACCEPT
# 拒绝所有从外部到达本机的流量
iptables -A INPUT -i eth0 -j DROP
nat 表:
- 用途:用于网络地址转换(NAT),比如源 NAT(SNAT)和目标 NAT(DNAT)。
- 链:包含 PREROUTING、OUTPUT 和 POSTROUTING 链。
- 示例规则:
# 将外部访问的80端口重定向到内部服务器的8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# 将发往外部的流量的源IP地址更改为指定的IP地址
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.2.3.4
mangle 表:
- 用途:用于修改 IP 包头信息,如 TOS、TTL 等。
- 链:包含 PREROUTING、OUTPUT、INPUT、FORWARD 和 POSTROUTING 链。
- 示例规则:
# 修改流经本机的包的TTL值
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 128
raw 表:
- 用途:用于在连接跟踪(conntrack)机制之前对数据包进行处理。
- 链:包含 PREROUTING 和 OUTPUT 链。
- 示例规则:
# 标记流经本机的包,以不进行连接跟踪
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
五个链(Chains)
INPUT 链:
- 用途:处理入站流量,即目标为本机的数据包。
- 示例规则:
# 拒绝所有到达本机的入站流量
iptables -A INPUT -j DROP
FORWARD 链:
- 用途:处理转发流量,即通过本机路由的数据包。
- 示例规则:
# 允许所有通过本机的转发流量
iptables -A FORWARD -j ACCEPT
OUTPUT 链:
- 用途:处理出站流量,即从本机发出的数据包。
- 示例规则:
# 允许所有从本机发出的出站流量
iptables -A OUTPUT -j ACCEPT
PREROUTING 链:
- 用途:在路由决策之前处理入站流量,用于 nat 和 mangle 表。
- 示例规则:
# 在路由之前修改入站包的目的IP地址
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
POSTROUTING 链:
- 用途:在路由决策之后处理出站流量,用于 nat 和 mangle 表。
- 示例规则:
# 在路由之后修改出站包的源IP地址
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.2.3.4
基本用法:
iptables -L |
列出所有当前规则。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
允许所有进入的 TCP 连接通过端口 80
。
高级用法:
iptables -D INPUT -p tcp --dport 80 -j ACCEPT |
删除规则,阻止端口 80
的连接。
iptables -A INPUT -s 192.168.1.1 -j DROP |
丢弃来自 192.168.1.1
的所有连接。
iptables -A OUTPUT -p icmp -j ACCEPT |
允许所有 ICMP 出站流量。
iptables-save > /etc/iptables/rules.v4 |
保存当前规则到文件。
iptables-restore < /etc/iptables/rules.v4 |
从文件恢复规则。
8. nftables
NFTables 是一个用于包过滤、网络地址转换 (NAT) 和流量控制的框架。它替代了 iptables、ip6tables、arptables 和 ebtables。NFTables 的配置文件通常使用简单的脚本语言来定义规则。以下是 NFTables 的表、链和规则的基本结构和语法。
一、基础结构
表(table)
- 表是规则集的容器。每张表可以包含多个链。
链(chain)
- 链是规则的有序列表。链可以是内置的(如
input
、output
、forward
)或用户定义的。
- 链是规则的有序列表。链可以是内置的(如
规则(rule)
- 规则定义了特定条件下应执行的动作。
二、表、链和规则的语法
创建表
nft add table <family> <table_name>
<family>
: 地址族,常见的有ip
(IPv4)、ip6
(IPv6)、inet
(支持 IPv4 和 IPv6)、arp
(ARP)、bridge
(网桥)。<table_name>
: 表的名称。
删除表
nft delete table <family> <table_name>
列出现有表
nft list tables
创建链
nft add chain <family> <table_name> <chain_name> { type <type> hook <hook> priority <priority>; }
<type>
: 链的类型,可以是filter
、nat
等。<hook>
: 钩子点,可以是input
、output
、forward
、prerouting
、postrouting
等。<priority>
: 优先级。
例如:
nft add chain ip mytable mychain { type filter hook input priority 0\; }
删除链
nft delete chain <family> <table_name> <chain_name>
添加规则
nft add rule <family> <table_name> <chain_name> <expression> <action>
<expression>
: 匹配条件,例如ip saddr 192.168.1.1
。<action>
: 动作,例如accept
、drop
、reject
、log
等。
例如:
nft add rule ip mytable mychain ip saddr 192.168.1.1 drop
删除规则
可以通过规则句柄删除:nft delete rule <family> <table_name> <chain_name> handle <handle_number>
首先列出链中的规则以找到句柄:
nft list chain <family> <table_name> <chain_name>
列出规则
nft list ruleset
三、示例
假设我们要创建一个简单的防火墙配置,允许入站 SSH 连接并拒绝所有其他入站流量。
创建表
nft add table ip filter
创建链
nft add chain ip filter input { type filter hook input priority 0\; }
nft add chain ip filter forward { type filter hook forward priority 0\; }
nft add chain ip filter output { type filter hook output priority 0\; }添加规则
nft add rule ip filter input ip protocol tcp tcp dport 22 accept
nft add rule ip filter input drop查看配置
nft list ruleset
这样,我们就配置了一个简单的防火墙,允许入站 SSH 连接并拒绝所有其他入站流量。
基本用法:
nft list ruleset |
列出当前规则集。
nft add rule ip filter input tcp dport 80 accept |
添加规则,允许通过端口 80
的 TCP 连接。
高级用法:
nft delete rule ip filter input tcp dport 80 accept |
删除规则,阻止端口 80
的连接。
nft add rule ip filter input ip saddr 192.168.1.1 drop |
丢弃来自 192.168.1.1
的所有连接。
nft add table ip mytable |
添加一个名为 mytable
的表。
nft add chain ip mytable mychain { type filter hook input priority 0 \; } |
在 mytable
表中添加一个名为 mychain
的链。
nft add rule ip mytable mychain counter |
在 mychain
链中添加一个计数规则。
9. curl
curl
是用于传输数据的命令行工具。
基本用法:
curl -O http://example.com/file |
下载文件 file
。
curl -I http://example.com |
获取 HTTP 响应头信息。
高级用法:
curl -X POST -d "param1=value1¶m2=value2" http://example.com/api |
发送 POST 请求。
curl -u username:password http://example.com |
使用基本身份验证下载文件。
curl -k https://example.com |
忽略 SSL 证书错误。
curl -L http://example.com |
跟随重定向。
curl -C - -O http://example.com/file |
断点续传下载文件。
10. wget
wget
是另一个下载文件的命令行工具。
基本用法:
wget http://example.com/file |
下载文件 file
。
wget -q http://example.com/file |
静默模式下载文件,不输出任何信息。
高级用法:
wget --mirror -p --convert-links -P ./local http://example.com |
递归下载整个网站,并将文件保存到 ./local
目录中
wget -c http://example.com/file |
断点续传下载文件。
wget --limit-rate=100k http://example.com/file |
限制下载速度为 100kB/s
。
wget --user=username --password=password http://example.com/file |
使用基本身份验证下载文件。
11. iptop
iptop
是一个实时显示网络流量的工具。
基本用法:
iptop |
启动 iptop
,显示实时网络流量。
高级用法:
iptop -i eth0 |
显示特定接口 eth0
的网络流量。
iptop -f src net 192.168.1.0/24 |
显示来自特定子网 192.168.1.0/24
的流量。
iptop -f dst port 80 |
显示发送到端口 80
的流量。