From dd0780f17e84516a0dcbc9800dde28fec1bca481 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Tue, 10 Mar 2026 01:35:53 +0800 Subject: [PATCH] update --- docs/src/pages/ip-step-back.md | 54 +++++++++++ docs/src/pages/ip-step.md | 169 +++++++++++++++++++++++++++++++-- 2 files changed, 213 insertions(+), 10 deletions(-) create mode 100644 docs/src/pages/ip-step-back.md diff --git a/docs/src/pages/ip-step-back.md b/docs/src/pages/ip-step-back.md new file mode 100644 index 0000000..7e94a92 --- /dev/null +++ b/docs/src/pages/ip-step-back.md @@ -0,0 +1,54 @@ +## 需求描述 + +有一个andorid有两个网口,一个网口是A局域网,一个是B局域网。 +A 的地址是 192.168.3.3, 名字叫 A地址, +B 地址是 192.168.9.57,名字叫 B 地址, + +如何实现A局域网下的有一个设备能直接访问B局域网的一个设备,192.168.9.4这是 C 设备,他是是B的局域网内的. + +要从192.168.3.33 的 D 设备,D 设备是 MAC 设备,是 A 局域网的。 + +A 局域网的 D需要访问到 B 局域网中的 192.168.9.4的设备 C,如何配置,D 发送 UDP 包到 C 设备 + +## 0. enter +``` +adb shell +``` + +```sh +> ip addr show eth0 +8: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 + link/ether bc:f8:11:01:84:23 brd ff:ff:ff:ff:ff:ff + inet 192.168.9.57/24 brd 192.168.9.255 scope global eth0 + inet6 fd1c:e6a5f70:0:bef8:11ff:fe01:8423/64 scope global dynamic + valid_lft 7152sec preferred_lft 1752sec + inet6 fe80::bef8:11ff:fe01:8423/64 scope link + valid_lft forever preferred_lft forever + +> ip addr show eth1 +9: eth1: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 + link/ether bc:f8:12:01:84:23 brd ff:ff:ff:ff:ff:ff + inet 192.168.3.3/24 brd 192.168.3.255 scope global eth1 + inet6 2408:8240:610:3af0:bef8:12ff:fe01:8423/64 scope global dynamic + valid_lft 7018sec preferred_lft 3418sec + inet6 fe80::bef8:12ff:fe01:8423/64 scope link + valid_lft forever preferred_lft forever +``` +# 1. 清理重复规则 +iptables -t nat -F PREROUTING +iptables -t nat -F POSTROUTING +iptables -t nat -F OUTPUT + +# 2. 重新添加正确规则 +# DNAT - 目的地址转换 +iptables -t nat -A PREROUTING -i eth1 -p udp --dport 5060 -j DNAT --to-destination 192.168.9.4:5060 + +# SNAT - 源地址转换 +iptables -t nat -A POSTROUTING -o eth0 -p udp --dport 5060 -j SNAT --to-source 192.168.9.57 + +# 3. 开启 IP 转发 +echo 1 > /proc/sys/net/ipv4/ip_forward + +# 4. 添加 FORWARD 规则(重要!) +iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 5060 -j ACCEPT +iptables -A FORWARD -i eth0 -o eth1 -p udp --sport 5060 -j ACCEPT diff --git a/docs/src/pages/ip-step.md b/docs/src/pages/ip-step.md index 6abc85c..7eecfaf 100644 --- a/docs/src/pages/ip-step.md +++ b/docs/src/pages/ip-step.md @@ -1,17 +1,166 @@ -# 1. 清理重复规则 -iptables -t nat -F PREROUTING -iptables -t nat -F POSTROUTING +## 需求描述 -# 2. 重新添加正确规则 -# DNAT - 目的地址转换 -iptables -t nat -A PREROUTING -i eth1 -p udp --dport 5060 -j DNAT --to-destination 192.168.9.4:5060 +有一个andorid有两个网口,一个网口是A局域网,一个是B局域网。 +A 的地址是 192.168.3.3, 名字叫 A地址, +B 地址是 192.168.9.57,名字叫 B 地址, -# SNAT - 源地址转换 -iptables -t nat -A POSTROUTING -o eth0 -p udp --dport 5060 -j SNAT --to-source 192.168.9.57 +如何实现A局域网下的有一个设备能直接访问B局域网的一个设备,192.168.9.4这是 C 设备,他是是B的局域网内的. -# 3. 开启 IP 转发 +要从192.168.3.33 的 D 设备,D 设备是 MAC 设备,是 A 局域网的。 + +A 局域网的 D需要访问到 B 局域网中的 192.168.9.4的设备 C,如何配置,D 发送 UDP 包到 C 设备 + +## 0. 查看网卡信息 + +```sh +adb shell +``` + +```sh +> ip addr show eth0 +8: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 + link/ether bc:f8:11:01:84:23 brd ff:ff:ff:ff:ff:ff + inet 192.168.9.57/24 brd 192.168.9.255 scope global eth0 + inet6 fd1c:e6a:5f70:0:bef8:11ff:fe01:8423/64 scope global dynamic + valid_lft 7152sec preferred_lft 1752sec + inet6 fe80::bef8:11ff:fe01:8423/64 scope link + valid_lft forever preferred_lft forever + +> ip addr show eth1 +9: eth1: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 + link/ether bc:f8:12:01:84:23 brd ff:ff:ff:ff:ff:ff + inet 192.168.3.3/24 brd 192.168.3.255 scope global eth1 + inet6 2408:8240:610:3af0:bef8:12ff:fe01:8423/64 scope global dynamic + valid_lft 7018sec preferred_lft 3418sec + inet6 fe80::bef8:12ff:fe01:8423/64 scope link + valid_lft forever preferred_lft forever +``` + +--- + +## 排查:转发无效怎么办? + +### 1. 检查 IP 转发是否开启 + +```sh +cat /proc/sys/net/ipv4/ip_forward +``` + +如果返回 `0`,需要重新开启: + +```sh +echo 1 > /proc/sys/net/ipv4/ip_forward +``` + +### 2. 检查当前 iptables 规则 + +```sh +iptables -t nat -L -n -v +iptables -L FORWARD -n -v +``` + +### 3. SELinux 限制(如有) + +```sh +setenforce 0 +``` + +--- + +## 配置方案一:简化版(推荐) + +适用于任意 UDP 端口转发: + +```sh +# 1. 开启转发 echo 1 > /proc/sys/net/ipv4/ip_forward -# 4. 添加 FORWARD 规则(重要!) +# 2. 清理旧规则 +iptables -t nat -F +iptables -F FORWARD + +# 3. 设置 FORWARD 策略为 ACCEPT +iptables -P FORWARD ACCEPT + +# 4. NAT 规则 - 使用 MASQUERADE 自动源地址转换 +iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE + +# 5. 允许转发 +iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT +iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT +``` + +--- + +## 配置方案二:指定端口转发 + +适用于只转发特定端口(如 5060): + +```sh +# 1. 开启转发 +echo 1 > /proc/sys/net/ipv4/ip_forward + +# 2. 清理旧规则 +iptables -t nat -F +iptables -F FORWARD + +# 3. DNAT - 目的地址转换 +iptables -t nat -A PREROUTING -i eth1 -p udp --dport 5060 -j DNAT --to-destination 192.168.9.4:5060 + +# 4. SNAT - 源地址转换(使用 MASQUERADE 更简单) +iptables -t nat -A POSTROUTING -o eth0 -p udp --dport 5060 -j MASQUERADE + +# 5. FORWARD 规则 iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 5060 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -p udp --sport 5060 -j ACCEPT +``` + +--- + +## 配置方案三:完整严格版 + +```sh +# 1. 开启转发 +echo 1 > /proc/sys/net/ipv4/ip_forward + +# 2. 清理旧规则 +iptables -t nat -F +iptables -F FORWARD + +# 3. 设置默认 FORWARD 策略 +iptables -P FORWARD DROP + +# 4. 允许已建立的连接 +iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT + +# 5. 允许 eth1 -> eth0(从 A 到 B) +iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT + +# 6. 允许 eth0 -> eth1(从 B 回包) +iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT + +# 7. NAT 规则 +iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE +``` + +--- + +## 验证是否生效 + +在 D 设备(192.168.3.33)上发送 UDP 包到 Android 的 eth1(192.168.3.3),然后在 C 设备(192.168.9.4)上抓包确认是否收到。 + +```sh +# 在 C 设备上抓包 +tcpdump -i eth0 -n port 5060 -v +``` + +--- + +## 常见问题 + +| 问题 | 解决方案 | +|------|----------| +| 转发不生效 | 确认 `ip_forward=1` | +| 能ping但UDP不通 | 检查端口是否匹配,检查防火墙 | +| 只有单向通 | 检查 FORWARD 双向规则 | +| Android 系统限制 | 确保 root 权限,尝试关闭 SELinux |