This commit is contained in:
2026-03-10 01:35:53 +08:00
parent c33559fcf8
commit dd0780f17e
2 changed files with 213 additions and 10 deletions

View File

@@ -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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

View File

@@ -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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 的 eth1192.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 |