iptables_ip_iw

本文详细介绍Linux下网络配置工具iproute2的功能与用法,包括路由表管理、邻居表查询、iptables配置等。深入探讨了如何利用这些工具进行复杂的网络设置,如SNAT、DNAT、多IP配置等。

ip rule show

ip neigh show

ip route show table 0/254/255/local/main/...

iptables -t filter/nat/mangle/raw -L

iptables -nvL -line-number

iw list

 

Guide to IP Layer Network Administration with Linux

http://linux-ip.net/html/index.html

 

配置工具: https://en.wikipedia.org/wiki/Iproute2

    第一代网络配置工具: ifconfig+route+arp+netstat(基于proc和ioctl)、 iptables、iw

    第二代网络配置工具: ip(基于netlink)、 iptables 、iw

  

Linux内核维护了4张iptables表、 一个RPDB(Routing Policy DataBase)、 256张route表。 在内核协议栈里面设置了5个hook点: PREROUTING、 INPUT、 FORWARD、 OUTPUT、 POSTROUTING。 四张iptables表优先级由高到底: raw --> mangle --> nat --> filter。 路由的过程是先在RPDB里面找到对应的路由表,然后在路由表里面找到路由项。 256张路由表: 254号是主路由,255号是local路由+广播地址,253号表是default表,0号是全路由。每一个路由表对应一个或多个路由策略。 通过路由策略,可以为每个网卡提供一张路由表。

路由类型: unicast/segment/nat/unreachable/prohibit/blackhole

路由策略: lookup/nat/unreachable/prohibit/blackhole

默认PRDB: ip rule show

    0:    from all lookup local

    32766:    from all lookup main

    32767:    from all lookup default

数据流如下:

    输入流: Driver --> hook(PREROUTING) --> ROUTE --> hook(INPUT)

    输出流: App --> hook(OUTPUT) --> ROUTE --> hook(POSTROUTING)

    转发流: Driver --> hook(PREROUTING) --> ROUTE --> hook(FORWARD) --> ROUTE -->hook(POSTROUTING)

 

Bridge

  • brctl show #显示网桥信息
  • brctl addbr/delbr <bridge_name>
  • brctl addif/delif <bridge_name> <device_name>

 

Linux路由表索引/etc/iproute2/rt_tables, android路由表索引/data/misc/net/rt_tables。

  • ip rule show 查看路由策略route policy。
  • ip route show table [TABLE_ID|TABLE_NAME] 查看TABLE_ID号路由表。
  • ip rule add from 192.168.1.10/32 table 1 pref 100 增加路由策略。
  • ip route add default via 192.168.1.1 table 1 向1号表添加默认路由。
  • ip route add 192.168.0.0/24 via 192.168.1.2 table 1 向1号表添加网段路由。
  • ip route flush cache 使路由生效。

 

  • ip neigh show 查看邻居表。(arp -a)
  • ip addr add 192.168.1.100/24 dev eth0 配置IP,可配置成多IP。
  • ip link set dev eth0 address 08:00:27:75:2a:67

 

 

 

 查看iptables:

iptables -nvL –line-number

iptables -t nat -L

iptables -t filter -L

 

清空iptables:

    iptables -t nat -F

    iptables -t nat -X

    iptables -t raw -F

    iptables -t raw -X

    iptables -t mangle -F

    iptables -t mangle -X

    iptables -t filter -F

    iptables -t filter -X

默认ACCEPT

    iptables -P INPUT ACCEPT

    iptables -P OUTPUT ACCEPT

    iptables -P FORWARD ACCEPT

 

-A添加 -I插入 -D删除 -R修改

 

Example: create_ap

ip link set down dev wlan0

ip addr flush wlan0

ip link set up dev wlan0

ip addr add 192.168.12.1/24 broadcast 192.168.12.255 dev wlan0

iptables -w -t nat -I POSTROUTING -s 192.168.12.0/24 ! -o wlan0 -j MASQUERADE

iptables -w -I FORWARD -i wlan0 -s 192.168.12.0/24 -j ACCEPT

iptables -w -I FORWARD -i eth0 -d 192.168.12.0/24 -j ACCEPT

iptables -w -I INPUT -p tcp -m tcp --dport 5353 -j ACCEPT

iptables -w -I INPUT -p udp -m udp --dport 5353 -j ACCEPT

iptables -w -t nat -I PREROUTING -s 192.168.12.0/24 -d 192.168.12.1 -p tcp -m tcp --dport 53 -j REDIRECT --to-ports 5353

iptables -w -t nat -I PREROUTING -s 192.168.12.0/24 -d 192.168.12.1 -p udp -m udp --dport 53 -j REDIRECT --to-ports 5353

 

把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去 ------>

iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3

将源地址为172.16.93.0/24网段的数据包的源地址都转换为10.0.0.1 ------>

iptables -t nat -A POSTROUTING -s 172.16.93.0/24  -j SNAT --to-source 10.0.0.1

将请求IP为10.0.0.1的数据包转发到后端172.16.93.1主机上 ------>

iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT –-to-destination 172.16.93.1

将请求IP为10.0.0.1并且端口为80的数据包转发到后端的172.16.93.1主机上 ------>

iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1

(通过定义不同的端口,就可以实现PNAT,将同一个IP不同的端口请求转发到后端不同的主机)

在上条规则的基础上,发往后端的数据包的目标端口改为8080,在后端主机的web服务器上使用8080端口接收 ---->

iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1:8080

 

对接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):

iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100

iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200

所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由 202.110.123.100和202.110.123.200。

 

对接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):

iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100

iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200

所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和 192.168.1.200。

 

所有从eth1进入的请求80和82端口的数据,被转发到80端口 ---->

iptables -t nat -A PREROUTING - -i eth1 -p tcp -m multiport --dports 80,82 -j REDIRECT --to-ports 80

 

在路由之前所有从eth0进入的目的端口为53的数据包,都发送到1.2.3.4这台服务器解析 ---->

iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 1.2.3.4:53

iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to-destination 1.2.3.4:53

 

所有从eth0(外网卡)出来的数据包的源地址改成61.99.28.1 ---->

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 61.99.28.1

 

增加10.0.0.0/24网段的静态路由 ----> route add -net 10.0.0.0/24 gw 172.16.93.129

 

iw list可以查看wlan interface支持的工作模式。

 

 

Linux Iptables命令列表: 用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改 iptables - [RI] chain rule num rule-specification[option] 用iptables - RI 通过规则的顺序指定 iptables -D chain rule num[option] 删除指定规则 iptables -[LFZ] [chain][option] 用iptables -LFZ 链名 [选项] iptables -[NX] chain 用 -NX 指定链 iptables -P chain target[options] 指定链的默认目标 iptables -E old-chain-name new-chain-name -E 旧的链名 新的链名 用新的链名取代旧的链名 说明 Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。 可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。 TARGETS 防火墙的规则指定所检查包的特征,和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定.该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过], DROP[删除], QUEUE[排队], 或者 RETURN[返回]。 ACCEPT 表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配,到前一个链的规则重新开始。如果到达了一个内建的链(的末端),或者遇到内建链的规则是RETURN,包的命运将由链准则指定的目标决定。
<think> 首先,用户的问题是:“怎么检测‘没有获取到IP’这一异常”,这是在询问如何检测“没有获取到IP”的异常情况。用户之前提供了详细的场景和方案,所以我需要基于QCA方案来回答。 回想之前的对话:用户要求从QCA的wifi方案角度解释“没有获取到IP”的原因、复现方案、检测方案和恢复方案。我已经在之前的回答中详细列出了所有内容。 现在,用户直接问:“怎么检测‘没有获取到IP’这一异常”,所以我需要聚焦在检测方案部分。在我的上一个回答中,我已经为每个场景提供了详细的检测方案指令。 因此,我应该总结检测“没有获取到IP”异常的通用方法和具体指令,基于QCA方案。 关键点: - 检测的核心是确认STA是否成功获得了IP地址。 - 在AP侧,可以通过监控DHCP过程、日志、抓包等手段来实现。 - 使用QCA特定的命令如`cfg80211tool`、`iw`、`tcpdump`等。 在我的上一个回答中,检测方案部分包括: 1. 检查DHCP服务状态。 2. 监控日志文件。 3. 使用抓包工具确认DHCP通信。 4. 检查STA连接状态。 为了回答这个问题,我应该: 1. 简要概述检测方法。 2. 列出具体的指令或代码实现。 3. 确保适配QCA方案。 结构化我的回答: - 先解释通用的检测思路。 - 然后给出详细的指令或代码。 - 最后,提出相关问题。 用户强调:回答完后必须提出3-5个相关问题,以“§§相关问题§§”开头,且不能换行分散。 所以,回答结构: 1. 解释如何检测异常。 2. 提供指令或代码。 3. 输出相关问题。 相关问题需要基于用户的问题和我的回答。用户的问题是“怎么检测”,所以相关问题可以围绕更深入的检测方法、工具使用、自动化等。 可能的检测方案总结: - **通用检测**:在STA侧检查IP是否分配(如`ifconfig`或`ip addr`),但由于用户指定QCA方案,重点在AP侧。 - **AP侧检测**: - 检查DHCP服务器日志(如`journalctl -u dnsmasq`)。 - 检查租约文件(`cat /var/lib/misc/dnsmasq.leases`)。 - 使用`tcpdump`抓包分析DHCP对话。 - 检查防火墙规则。 - 使用QCA命令获取STA状态(`iw dev ath0 station dump`)。 在我的上一个回答中,我已经有详细的检测指令,我可以引用或总结它们。 为了这个回答,给出一个综合的检测方案。 完整回答内容: 1. **解释检测方法**:在QCA方案中,检测“没有获取到IP”异常主要通过在AP侧监控DHCP过程和STA连接状态来实现。关键步骤包括检查DHCP服务是否正常运行、分析租约分配、捕获网络包验证DHCP通信、以及确认无线接口配置。 2. **详细指令**:提供通用的检测指令,不必分场景,但可以覆盖所有。 - 例如: - 检查DHCP服务:`systemctl status dnsmasq.service` - 查看租约:`cat /var/lib/misc/dnsmasq.leases` - 抓包:`tcpdump -i ath0 port 67 or port 68 -vv` - 检查STA状态:`iw dev ath0 station dump | grep "assoc"` 或检查IP分配。 - 添加代码或指令实现。 3. **相关问题**:提出3-5个相关问题。 相关问题想法: 1. 如何自动化检测DHCP失败? 2. 在QCA方案中,哪些日志文件关键用于诊断IP获取问题? 3. 如何远程监控AP侧的STA IP获取状态? 4. 针对不同原因,检测方案有何优化? 5. 使用cfg80211tool能获取哪些相关参数? 确保相关问题数量为3-5,且以“§§相关问题§§”开头。 最终回答格式: - 回答检测问题。 - 结尾输出相关问题。 编写响应: </think> ### 如何检测“没有获取到IP”这一异常(基于QCA方案) 在QCA的Wireless LAN Driver Version 12.x方案中,检测“没有获取到IP”异常的核心目标是确认STA(客户端)在关联AP后未能成功获得有效的IP地址。由于该异常发生在STA侧,但检测主要在AP侧进行,通过监控DHCP过程、分析日志、抓包和检查STA连接状态来实现。以下是基于QCA方案的详细检测方案,包括通用的指令和代码实现。所有操作均假设无线接口名为`ath0`(可替换为实际接口名),使用QCA专用命令如`cfg80211tool`和标准工具如`tcpdump`。 #### 通用检测方案原理 - **关键指标**:DHCP服务器是否响应STA的请求、租约文件是否记录新IP、STA在AP侧的状态是否显示关联但无IP- **依赖工具**: - `cfg80211tool`:用于获取或设置QCA驱动的参数(如DTIM值)。 - `iw`:用于查询STA连接状态。 - `tcpdump`:抓包分析DHCP通信(UDP 67/68端口)。 - `journalctl` 或 `dmesg`:查看系统日志。 - `cat`:检查租约文件。 - **检测流程**: 1. **检查DHCP服务状态**:确认服务器正常运行。 2. **分析租约分配**:验证IP是否分配给STA。 3. **抓包验证DHCP对话**:捕获网络包确认请求-响应过程。 4. **监控STA连接**:检查STA是否关联但IP字段为空。 5. **检查配置参数**:如DTIM周期或VLAN设置。 #### 详细检测指令或代码实现 以下方案均在AP侧通过命令行执行(例如通过SSH登录AP)。指令覆盖所有可能原因,确保适配QCA方案。 1. **检查DHCP服务状态及日志** - **指令**:查看DHCP服务(如dnsmasq)是否运行正常,并过滤错误日志。 ```bash # 检查服务状态(返回active表示正常) systemctl status dnsmasq.service # 查看DHCP服务器日志,关键词如"DHCPDISCOVER"或错误 journalctl -u dnsmasq --since "5 minutes ago" | grep -E "DHCPDISCOVER|failed|error" ``` - **代码分析**:如果输出显示"active (running)"且无错误日志,则DHCP服务正常;否则可能未启动或配置错误。 2. **分析DHCP租约文件** - **指令**:直接读取租约文件,确认STA的MAC地址是否记录。 ```bash # 列出当前所有DHCP租约(STA的MAC和IP) cat /var/lib/misc/dnsmasq.leases # 查询特定STA(假设MAC为00:11:22:33:44:55) grep "00:11:22:33:44:55" /var/lib/misc/dnsmasq.leases ``` - **代码分析**:如果STA的MAC不存在于租约文件,或IP字段为空白,表明地址未分配(可能地址池耗尽)。 3. **抓包验证DHCP通信** - **指令**:使用tcpdump实时捕获DHCP包,确认STA请求和服务器响应。 ```bash # 启动抓包(捕获UDP 67和68端口,输出到文件) tcpdump -i ath0 -w dhcp_capture.pcap port 67 or port 68 # 后台运行抓包(持续监控) tcpdump -i ath0 -vv port 67 or port 68 & # 分析抓包文件(查看DHCP Offer/Ack) tcpdump -r dhcp_capture.pcap -vv | grep "DHCP" ``` - **代码分析**:如果输出中缺少"DHCPOFFER"或"DHCPACK",表明通信被阻止(如防火墙或VLAN错误)。 4. **监控STA连接状态** - **指令**:使用iw工具检查STA关联状态和IP信息。 ```bash # 列出所有STA连接状态(查看'Station'字段) iw dev ath0 station dump # 检查特定STA的IP是否为空(示例MAC) iw dev ath0 station get 00:11:22:33:44:55 | grep "ipaddr" ``` - **代码分析**:如果STA显示为"associated"但"ipaddr"字段缺失或为空白,确认无IP获取。 5. **检查关键配置参数** - **指令**:验证DTIM周期、VLAN ID等是否正常。 ```bash # 获取DTIM周期(单位ms) cfg80211tool ath0 get_dtim_period # 获取VLAN ID cfg80211tool ath0 get_vlan_id # 检查防火墙规则(阻止端口) iptables -L -v | grep "udp dpt:67\|udp dpt:68" ``` - **代码分析**:如果DTIM值过高(如>50ms)、VLAN ID无效或防火墙规则存在DROP,则可能导致异常。 #### 自动化检测脚本示例 以下是一个简单的Shell脚本,实现自动化检测(保存为`detect_no_ip.sh`),在AP侧运行: ```bash #!/bin/sh interface="ath0" # 设置接口名 sta_mac="00:11:22:33:44:55" # 替换为目标STA的MAC # 检查DHCP服务 dhcp_status=$(systemctl is-active dnsmasq.service) if [ "$dhcp_status" != "active" ]; then echo "异常:DHCP服务未运行" fi # 检查租约 if ! grep -q "$sta_mac" /var/lib/misc/dnsmasq.leases; then echo "异常:STA未在租约文件中" fi # 检查STA IP状态 ip_status=$(iw dev $interface station get $sta_mac | grep "ipaddr" | awk '{print $2}') if [ -z "$ip_status" ]; then echo "异常:STA关联但无IP地址" fi # 输出建议 echo "检测完成。如果异常,检查日志或抓包分析。" ``` - **使用说明**:运行`sh detect_no_ip.sh`后,脚本输出异常描述。结合日志和抓包,可精确定位原因。 通过以上方案,可以高效检测“没有获取到IP”异常。检测后,根据原因修复配置,并通过重关联(如`iw dev ath0 station del $mac`)恢复STA连接。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值