网络工具-iptables路由转发

Posted by 周思进 on August 26, 2021

前面文章 iptables常用命令 主要讲解的是针对地址过滤的命令操作,本文针对 iptables 在路由转发中的设置操作。

对于路由转发场景,自然而然想到的就是路由器了,手机接入路由器热点,而路由器WAN口接有线连的公网,这样手机就能正常上网了,这中间路由转发就是完成了将无线网口接收的数据包转发到有线网口出去。

如果你身边刚好也有一台树莓派机器,那么只需要起个热点,并有线接入就可以来模拟路由转发操作了。


树莓派起热点

一、软件安装

想要让树莓派起热点,可以通过 hostapd 软件实现,再安装相关软件包之前,都先进行软件更新操作

sudo apt-get update;sudo apt-get upgrade

ps:如果更新慢,可能你还是系统默认软件源,可以上网搜索替换下。

更新完毕后安装相应的软件包

sudo apt-get install hostapd dnsmasq

这里 dnsmasq 用于手机接入热点后自动获取 ip 地址,之前文章 dnsmasq-域名访问及解析缓存 有简单写过。

安装完毕后,先设置无线网卡起热点后设置的IP地址,

二、配置无线网卡IP
sudo vim /etc/dhcpcd.conf

在文件末尾增加如下内容:

interface wlan0
    static ip_address=192.168.4.1/24
    nohook wpa_supplicant

这里指定 wlan0 的IP地址是 192.168.4.1,可以根据自己情况设置。然后重启 dhcpcd 服务

sudo systemctl restart dhcpcd
三、DHCP 分配IP段指定

接下来配置终端接入该热点后分配IP地址的范围

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf_back # 做下备份
sudo vim /etc/dnsmasq.conf

增加如下内容

interface=wlan0 
dhcp-range=192.168.4.10,192.168.4.20,12h # 指定分配IP范围是10-20,租期12小时
四、热点配置

接下来是热点配置文件修改,指定所要起的热点名称及密码等

sudo vim /etc/hostapd/hostapd.conf

内容如下:

interface=wlan0
ssid=pi_hostapd  # 热点名称
hw_mode=g   # 模式
channel=7   # 频道
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678 #热点密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

因为只是调试使用,所以这里并不考虑后面重启直接起热点所要进行的配置操作,直接执行 hostpad 并指定配置文件启动热点。

sudo hostapd /etc/hostapd/hostapd.conf

这时手机已经可以正常搜索到该热点并完成接入,但你会发现这个热点并不能完成上网。

接下来就要进行路由转发操作了。


路由转发

设置树莓派支持路由转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

可以查看默认该配置是0,即不支持路由转发。

设置了该值后,手机连接上热点,如手机发起访问百度的连接请求,树莓派收到后,根据路由判断目标主机不是自己,同时也支持转发,则数据包发往 FORWARD 链,再到 POSTROUTING 链将数据包最终发送出去。可以回顾查看 网络工具-iptables简介

image

但如果数据包就这样发送出去了,那永远也收不到响应。必须将数据包的源 IP 地址修改成实际有线网口的 IP 地址,对端才能将数据发送回来,所以还需要做如下 SNAT 源 IP 转换操作,如下:

iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth0 -j SNAT --to-source 192.168.2.2

这里 192.168.2.2 就是有线的 IP 地址,但如果这个 IP 地址是经常会动态变化,那这个过滤规则就需要经常重新设置,那有什么办法可以自适应地址呢,可以通过如下规则实现:

iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth0 -j MASQUERADE

MASQUERADE 就是专门用于那些动态 IP 地址连接的,会自动获取实际网口的 IP 地址。需要注意,MASQUERADE 和 SNAT 一样,只能用于 nat 表的 POSTROUTING 链。