Compare commits

...

4 Commits

Author SHA1 Message Date
dd0780f17e update 2026-03-10 01:35:53 +08:00
c33559fcf8 ip转发 2026-03-05 23:30:12 +08:00
xiao.xiong
e6cbbd27d4 Merge branch 'main' of git.xiongxiao.me:abearxiong/dnake 2026-03-05 21:04:34 +08:00
xiao.xiong
cef9b1dd39 update run.sh 2026-03-05 21:03:10 +08:00
5 changed files with 243 additions and 2 deletions

1
apps/socket/run.sh Normal file
View File

@@ -0,0 +1 @@
pm2 start "uv run app.py" --name "dnake-socket-app"

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

166
docs/src/pages/ip-step.md Normal file
View File

@@ -0,0 +1,166 @@
## 需求描述
有一个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. 查看网卡信息
```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
# 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 |

View File

@@ -8,7 +8,15 @@ layout: ../layouts/MDXPost.astro
## 提示词
有一个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如何配置
有一个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 设备
## 开启 iptables

View File

@@ -1,3 +1,12 @@
查看iptables规则
```bash
iptables -L -n -v
# 查看nat表的PREROUTING链
iptables -t nat -L PREROUTING -n --line-numbers
# 查看nat表的POSTROUTING链
iptables -t nat -L POSTROUTING -n --line-numbers
```
# 1. 允许转发从eth1到eth0的SIP数据包目的192.168.9.4:5060
iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 5060 -d 192.168.9.4 -j ACCEPT
@@ -8,4 +17,7 @@ iptables -A FORWARD -i eth0 -o eth1 -p udp --sport 5060 -s 192.168.9.4 -j ACCEPT
iptables -t nat -A PREROUTING -i eth1 -p udp --dport 5060 -j DNAT --to-destination 192.168.9.4:5060
# 4. SNAT修改转发包的源地址为设备eth0的IP192.168.9.57确保192.168.9.4的响应能回传给设备
iptables -t nat -A POSTROUTING -o eth0 -p udp --dport 5060 -d 192.168.9.4 -j SNAT --to-source 192.168.9.57
iptables -t nat -A POSTROUTING -o eth0 -p udp --dport 5060 -d 192.168.9.4 -j SNAT --to-source 192.168.9.57
# 5. 保存iptables规则
iptables-save > /etc/iptables/rules.v4