实例描述:
双千兆网口x86架构主机,Ubuntu Linux 22.04 Desktop版(Server版本同理),enp1s0连接需要认证的校园网(可能有设备最大连接数限制),enp2s0连接路由器。此时假设Ubuntu Linux已经通过校园网的认证并设置无感上网。
需求
让enp1s0的网络转发到enp2s0的路由器里面,无需认证实现上网冲浪。
一、设置网卡
使用ifconfig
查看网卡信息,如图:
在netplan
中设置网卡:
sudo nano /etc/netplan/00-installer-config.yaml
yaml 文件名称可能不同,tab出来哪个就是哪个。
配置文件修改如下,其中enp2s0连接路由器,address是内网局域网的网关,是自己定的。无线网卡设置不在这里,默认就行。
# This is the network config written by 'subiquity'
version: 2
network:ethernets:enp2s0:dhcp4: falseaddresses:- 172.168.2.1/24
让enp1s0使用DHCP服务获取校园网给定的ip地址,enp2s0使用静态ip并分配网段,可以为192.168.1.1/24
,172.10.0.1/24
,10.0.0.1/24
等私网ip,子网掩码分别为255.255.255.0
,255.255.0.0
,255.0.0.0
,子网掩码代表了最大可分配给设备ip的数量。
ctrl + X 按下Y回车保存退出
使配置生效:
sudo netplan apply
二、开启内核转发
编辑/etc/sysctl.conf
配置文件,
sudo nano /etc/sysctl.conf
找到#net.ipv4.ip_forward=1
这一行,去掉注释,改为 net.ipv4.ip_forward=1
使生效:
sudo sysctl -p
三、配置NAT转发规则
sudo iptables -t nat -A POSTROUTING -s 172.168.2.0/24 -o enp1s0 -j MASQUERADE
使用sudo iptables -t nat -nL
查看配置规则,sudo iptables -t nat -F
清空规则。
这条命令让来自 172.168.2.0/24
网段的所有流量(all 协议),在离开本机时会进行 IP 伪装(MASQUERADE),通常用于共享本机网络。
让 172.168.2.0/24
网段的设备通过本机的公网 IP 访问外部网络。
然而这是临时的,服务器重启后便会失效,因此使用iptables-persistent
工具永久保存。
sudo apt install iptables-persistent
netfilter-persistent save
四、配置DHCP服务
使用isc-dhcp-server
sudo apt install isc-dhcp-server -y
修改配置文件
sudo nano /etc/default/isc-dhcp-server
第一个ipv4协议改为要连接路由器网口的名称。
接下来修改dhcpd.conf
文件
sudo nano /etc/dhcp/dhcpd.conf
前面的全部注释(注意确保所有内容全为#注释,否则将影响路由规则),添加以下内容在最后:
subnet 172.168.2.0 netmask 255.255.255.0 {range 172.168.2.10 172.168.2.233;option routers 172.168.2.1;option domain-name-servers 172.168.2.1;option broadcast-address 172.168.2.255;default-lease-time 600;max-lease-time 7200;
}
最后重启DHCP服务
sudo service isc-dhcp-server restart
大功告成,试着运行sudo systemctl status isc-dhcp-server
查看运行情况
出现active(running)
即代表DHCP服务正常运行,从下面的输出能看到路由器通过DHCP获取到的IP地址和路由器WAN网口的MAC地址。
后把DHCP服务器加入开机自启计划
sudo systemctl enable isc-dhcp-server
验一下
sudo systemctl enable isc-dhcp-server
出现enable则代表已经加入开机自启。
四、测试
ping 一下enp1s0获取到的DNS和网关,看看能不能通。
ping一下enp2s0的通过enp1s0获取到的DNS和网关,看看能不能通。
ping一下外部网络,如cn.bing.com,www.baidu.com, 看看能不能通。
以上三者全部返回数据包,则任务圆满完成。
其他
我在测试的过程中遇到了dns问题,isc-dhcp-server返回内容全部正常,但就是连接不上网络,检查发现dns诊断出错了,使用dig @172.168.2.1 www.baidu.com 也能正常返回结果,nslookup www.baidu.com 172.168.2.1也正常,但就是死活连不上,最终我排查了是不是防火墙的问题……
sudo iptables -L FORWARD -v -nroot@cherry:~# sudo iptables -L FORWARD -v -n
Chain FORWARD (policy DROP 9570 packets, 631K bytes)
pkts bytes target prot opt in out source destination
9596 633K ufw-before-logging-forward all -- * * 0.0.0.0/0 0.0.0.0/0
9596 633K ufw-before-forward all -- * * 0.0.0.0/0 0.0.0.0/0
9570 631K ufw-after-forward all -- * * 0.0.0.0/0 0.0.0.0/0
9570 631K ufw-after-logging-forward all -- * * 0.0.0.0/0 0.0.0.0/0
9570 631K ufw-reject-forward all -- * * 0.0.0.0/0 0.0.0.0/0
9570 631K ufw-track-forward all -- * * 0.0.0.0/0 0.0.0.0/0
看到iptables的FORWARD链默认策略是DROP,并且有UFW(Uncomplicated Firewall)规则在管理流量。问题很可能出在UFW没有允许DNS流量转发。
先检查UFW状态和规则
sudo ufw status verbose
然后允许DNS流量通过UFW
sudo ufw allow in on enp2s0 to any port 53 proto udp
sudo ufw allow out on enp2s0 to any port 53 proto udp
# 或者更简单地允许所有转发(如果安全允许)
sudo ufw default allow routed
直接配置UFW转发规则也行
# 启用IP转发
sudo ufw --force enable
# 允许端口转发
echo 'DEFAULT_FORWARD_POLICY="ACCEPT"' | sudo tee -a /etc/default/ufw
# 再添加NAT规则
sudo sed -i '/^*filter/i *nat\n:POSTROUTING ACCEPT [0:0]\n-A POSTROUTING -o enp1s0 -j MASQUERADE\nCOMMIT\n' /etc/ufw/before.rules
最后重启UFW服务
sudo ufw disable
sudo ufw enable
验证一下,强烈的预感
sudo iptables -L FORWARD -v -n
sudo ufw status verbose
测一下DNS转发
在其他设备上测试:
nslookup www.baidu.com 172.168.2.1
ok啊,大功告成,累死我了。