当你在户外、移动环境的局域网内,有了一台linux的小工控机,它能上外网,往往是通过4g SIM卡上网,那么如果你想让其它机器,借助它上网,那么只要这台4g卡机器还有一块内置的以太网卡,就可以达到目的。这在移动物联网的应用中,很常见。这样就可以让它充当一个简便的路由器,而无需再配备什么专门的4g路由器,虽然那个也很便宜,但是更少的设备意味着故障点的减少+能源消耗的减少+对软件路由的充分理解。
服务端设置:
首先在装有4g卡的外网机器(假设以太网口IP为:192.168.1.1):
1)在 /etc/sysctl.conf中打开 ip4转发的注释,保证重启后不丢失iptables
net.ipv4.ip_forward=1
2) 设置宽容模式
apt install selinux-utils
setenforce 0
3)修改iptables
apt install iptables
iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 114.114.114.114
iptables -t nat -A POSTROUTING -j MASQUERADE
114那行,标识启用DNS转发114.114.114.114(这是个外网地址),此行不是必需,但加上没错。
MASQUERADE 这行,必加。表示NAT转发,这行为核心。
4) 保存iptables-save到文件
iptables-save>> /etc/iptables.up.rules
5)将文件,加载到网卡配置,启动后不会失效
vim /etc/network/interfaces 底部插入
dns-nameservers 114.114.114.114 114.114.115.115
pre-up iptables-restore < /etc/iptables.up.rules
客户端设置:
在客户端,把IP设置成刚才服务端的 IP在一个网段,假设叫:192.168.1.2,然后把网关IP指向4g机器(算是服务端)的 IP。
必要时,要把192.168.1.2 客户端的DNS,手动设置成114.114.114.114,即便你在192.168.1.1的网口上安装绑定了一个dhcp server,能让客户端192.168.1.2的IP是动态获取的,仍然,要手动指定DNS。
通常,192.168.1.1的DHCP Server不是必须的,除非你有很多机器,要轮番借助这个网口上网,此时有dhcp Server就不用挨个手动指定IP了;如果只拖带一个机器上网,那么给这个机器手工指定下IP就行了。
总结:
NAT转发的好处是简单,设置方便;缺点是不能跟踪机器上了哪些网站,权限控制较弱。比如:客户端上的程序,访问了某个视频站点的端口8088,那么这个行为在网关机器上,如果运行netstat -ano|grep :8088,是没有任何输出结果的,此时这个行为被软件指令iptables MASQUERADE所转发,但是iptables并不那么容易设置日志(可以设,要看主机的类型参考为何没有iptables的日志文件?-CSDN论坛 )
如果要做到这些,可以安装像squid这样的专业代理proxy。
附 iptables.up.rules 被修改后的内容:
root@localhost:# more /etc/iptables.up.rules
# Generated by iptables-save v1.6.0 on Sun Oct 31 05:14:41 2021
*raw
:PREROUTING ACCEPT [6491:789212]
:OUTPUT ACCEPT [3949:576976]
COMMIT
# Completed on Sun Oct 31 05:14:41 2021
# Generated by iptables-save v1.6.0 on Sun Oct 31 05:14:41 2021
*nat
:PREROUTING ACCEPT [164:10694]
:INPUT ACCEPT [4:1208]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p udp -m udp --dport 53 -j DNAT --to-destination 114.114.114.114
-A POSTROUTING -j MASQUERADE
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Sun Oct 31 05:14:41 2021
# Generated by iptables-save v1.6.0 on Sun Oct 31 05:14:41 2021
*mangle
:PREROUTING ACCEPT [6491:789212]
:INPUT ACCEPT [4555:667203]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3949:576976]
:POSTROUTING ACCEPT [3949:576976]
COMMIT
# Completed on Sun Oct 31 05:14:41 2021
# Generated by iptables-save v1.6.0 on Sun Oct 31 05:14:41 2021
*filter
:INPUT ACCEPT [4555:667203]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3949:576976]
COMMIT
# Completed on Sun Oct 31 05:14:41 2021