前言

因为自己办的宽带不能连接实验室的服务器,而免费的联通宿舍网只能连三个设备,所以拿出了树莓派来做两个网络之间的沟通。使得使用自己的电脑可以直接连接服务器,而且自己的宽带是公网IP,可以直接在家远程访问。

简单绘制一下网络拓扑

linux-route-2024-01-16-16-47-50

如果没有树莓派连接,那么宿舍网络和服务器网络是完全隔离的。
服务器网络为10.26.58.0/25,
宿舍网络为10.125.0.0/16,中间由上级路由转发。

路由表基础知识

先存一下关于路由表操作的基础命令

查看路由表

1
2
3
4
5
6
7
8
9
debin@raspberrypi:~ $ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 10.125.0.1 0.0.0.0 UG 600 0 0 wlan0
10.26.58.0 10.125.0.1 255.255.255.128 UG 0 0 0 wlan0
10.125.0.0 0.0.0.0 255.255.0.0 U 600 0 0 wlan0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

路由表字段说明

  • Destination:目的地址
  • Gateway:下一跳地址
  • Genmask:子网掩码
  • Flags:标志位,U表示路由可用,G表示网关,H表示主机
  • Metric:跳数
  • Ref:引用数
  • Use:使用数
  • Iface:接口

route命令

选项:

  • -A:设置地址类型
  • -C:打印 Linux 内核的路由缓存
  • -v:显示详细信息
  • -n:不执行 DNS 反向查找,直接显示数字形式的 IP 地址
  • -e:netstat 格式显示路由表
  • -net:到一个网络的路由表
  • -host:到一个主机的路由表

参数:

  • add:增加路由记录
  • del:删除路由记录
  • target:目的网络或目的主机
  • gw:设置默认网关
  • mss:设置TCP的最大区块长度(MSS),单位MB
  • window:指定通过路由表的TCP连接的TCP窗口大小
  • dev:路由记录所表示的网络接口

配置命令

添加主机路由

1
2
route add -host 192.168.1.11 dev eth0
route add -host 192.168.1.12 gw 192.168.1.1

添加网络路由

1
2
route add -net 192.168.1.0/24 gw 192.168.1.1
route add -net 192.168.1.0/24 gw 192.168.1.1 dev eth0

删除路由

1
2
route del -net 192.168.1.0/24 gw 192.168.1.1
route del -net 192.168.1.0/24 gw 192.168.1.1 dev eth0

设置默认网关

1
route add default gw 192.168.1.1

配置永久路由的方式

在/etc/rc.local中添加(推荐)

1
2
# 在exit 0前面添加
route add -net 192.168.1.0/24 gw 192.168.1.1

在/etc/sysconfig/network里追加

1
GATEWAY=[网关IP或者网关网卡名称]

在/etc/sysconfig/static-routes中添加

1
any net 192.168.1.0/24 gw 192.168.1.1

开启IP转发

将服务器的ssh的22端口转发到树莓派的50022端口

首先开启IP转发

1
2
3
4
5
# 临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启
vim /etc/sysctl.conf
# 找到net.ipv4.ip_forward=0,将0改为1

开启端口转发

1
2
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 50022 -j DNAT --to-destination 10.26.58.xx:22
sudo iptables -t nat -A POSTROUTING -o wlan0 -p tcp --dport 22 -j MASQUERADE

这两行命令是使用iptables配置网络地址转换(NAT)的例子。iptables是Linux操作系统中用于设置、维护和检查IPv4数据包过滤规则的工具。

第一行命令:

1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 50022 -j DNAT --to-destination 10.26.58.xx:22
  • sudo 表示以超级用户权限执行命令。
  • iptables 是命令名,用于配置Linux内核提供的防火墙表。
  • -t nat 指定要操作的表是NAT表。NAT表主要用于网络地址转换。
  • -A PREROUTING 表示在PREROUTING链上追加(Append)一条规则。PREROUTING链用于处理进入本机之前的数据包。
  • -i eth0 指定规则适用于进入网卡接口eth0的数据包。
  • -p tcp 指定协议类型为TCP。
  • --dport 50022 指定目标端口为50022,即捕获所有目标端口为50022的TCP数据包。
  • -j DNAT 指定动作是目的地址转换(Destination Network Address Translation)。
  • --to-destination 10.26.58.xx:22 指定将数据包的目的地址和端口转换为内部IP 10.26.58.xx 和端口22。

这条命令的作用是将所有到达本机eth0接口,目标端口为50022的TCP数据包的目的地地址转换为内网地址10.26.58.xx的22端口。这通常用于将外部流量转发到内部网络中的特定服务器。

第二行命令:

1
sudo iptables -t nat -A POSTROUTING -o wlan0 -p tcp --dport 22 -j MASQUERADE
  • sudo 同上。
  • iptables 同上。
  • -t nat 指定操作的是NAT表。
  • -A POSTROUTING 表示在POSTROUTING链追加一条规则。POSTROUTING链用于处理即将离开本机的数据包。
  • -o wlan0 指定规则适用于从网卡接口wlan0离开的数据包。
  • -p tcp 指定协议类型为TCP。
  • --dport 22 指定目标端口为22,即捕获所有目标端口为22的TCP数据包。
  • -j MASQUERADE 指定动作是伪装(MASQUERADE),它是源地址转换(Source NAT)的一种特殊形式。

这条命令的作用是在数据包从本机的wlan0接口发出时,如果数据包的目标端口为22,则将源IP地址转换为本机wlan0接口的IP地址。这通常用于动态IP环境(如拨号上网、移动网络)中,让内网的主机能够和外网通信,同时隐藏内网的真实IP地址。

综合这两条命令,它们一起实现了将外部到达的特定端口的请求转发到内部网络的服务器上,并在响应时对源地址进行伪装以确保响应可以正确返回给外部请求者。

配置树莓派

结合上面的内容,一共三行命令,首先是配置路由表

1
2
sudo nano /etc/rc.local
# 在exit 0前面添加route add -net 10.26.58.0/25 gw 10.125.0.1

然后是开启IP转发

1
2
sudo nano /etc/sysctl.conf
# 找到net.ipv4.ip_forward=0,将0改为1

最后是配置ssh端口转发

1
2
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 50022 -j DNAT --to-destination 10.26.58.xx:22
sudo iptables -t nat -A POSTROUTING -o wlan0 -p tcp --dport 22 -j MASQUERADE

访问服务器

1
ssh -p 5022 ldb@192.168.0.xx