Ubuntu 24.04.2 LTS 通过iptables共享上网

一、环境

准备三台机器,系统均为Ubuntu 24.04.2 LTS,建议都最小化安装。

root@ubuntu:/etc/privoxy# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04.2 LTS
Release:        24.04
Codename:       noble
root@ubuntu:/etc/privoxy#

临时规划三台机器的IP

序号 实例名称 IP 网卡 内部网IP
1 dmz-10 192.168.56.10 仅host-only+桥接+内部网络 172.16.1.10
2 srv01-16 192.168.56.16 仅host-only +nat+内部网络 172.16.2.16
3 srv02-17 192.168.56.17 仅host-only+nat +内部网络 172.16.3.17

需求:两台svr均不能单独上网,都需要通过dmz-10去共享上网。
仅host-only 是为了,windows 能够远程ssh登录。实现原理,是通过内部网络进行的,选择dmz-10作为路由器,内部网络相当于LAN直连,只有这种网络结构才能模拟实现效果。nat是为了方便下载依赖包,临时开网。设置好之后,就可以关闭了。



设置好之后,实际安装好的效果是这样的:
第一台机器不想用桥接,换成Nat也是可以的,只是这样就需要再增加一个host-only来进行远程连接,不然你无法通过SSH远程登录进去。简单一点,就通过桥接+内部网络就可以了。注意一定要是内部网络及LAN直连,中间不能经过任何网关路由,否则设置会失败。

序号 实例名称 IP 网卡 内部网IP
1 dmz-10 192.168.56.10 桥接+内部网络 172.16.1.10
2 srv01-16 192.168.56.16 内部网络 172.16.2.16
3 srv02-17 192.168.56.17 内部网络 172.16.3.17

最终,两台svr均不能单独上网,都需要通过dmz-10去共享上网。
因此,采用iptables来实现snat的方式,实现共享上网。

二、安装

采用最小化安装的系统,请先执行如下命令:

sudo apt install vim zip unzip wget tree gcc g++ automake iputils-ping telnet net-tools build-essential manpages-dev

安装iptables工具包,只需要安装可以上网的机器,其它两台可以不用安装。

sudo apt install iptables -y
sudo apt install iptables-persistent

安装完成查看一下,出现以下界面说明安装成功:

root@ubuntu:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
root@ubuntu:~#

查看安装版本

ubuntu@ubuntu:~$ iptables --version
iptables v1.8.10 (nf_tables)
ubuntu@ubuntu:~$

帮助命令

iptables -h

三、配置共享

第一台的机器网卡enp0s3配置一个DNS即可,第二台和第三台机器的网卡enp0s9的DNS一定要记得配置。以下是详细的配置。
第一台机器网络配置:

root@ubuntu:/etc/netplan# cat 50-cloud-init.yaml
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: false
      addresses:
      - 192.168.3.18/24
      routes:
      - to: default
        via: "192.168.3.1"
      nameservers:
        addresses:
        - 114.114.114.114
        - 8.8.8.8

    enp0s8:
      addresses:
      - "192.168.56.10/24"
      routes:
      - to: "192.168.56.0/24"
        via: "192.168.56.1"
    enp0s9:
      addresses:
      - 172.16.1.10/16

root@ubuntu:/etc/netplan#

第二台机器网络配置:

root@ubuntu:/etc/netplan# cat 50-cloud-init.yaml
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
      - "192.168.56.16/24"
      routes:
      - to: "192.168.56.0/24"
        via: "192.168.56.1"
    enp0s9:
      addresses:
        - 172.16.2.16/16
      nameservers:
        addresses:
        - 114.114.114.114
        - 8.8.8.8

root@ubuntu:/etc/netplan#

第三台机器网络配置:

root@ubuntu:/etc/netplan# cat 50-cloud-init.yaml
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
      - "192.168.56.17/24"
      routes:
      - to: "192.168.56.0/24"
        via: "192.168.56.1"
    enp0s9:
      addresses:
      - 172.16.3.17/16
      nameservers:
        addresses:
        - 114.114.114.114
        - 8.8.8.8

root@ubuntu:/etc/netplan#

此时,三台机器彼此用172.16.x.x彼此之间是可以ping通的【必须】。

root@ubuntu:/etc/netplan# ping 172.16.2.16
PING 172.16.2.16 (172.16.2.16) 56(84) bytes of data.
64 bytes from 172.16.2.16: icmp_seq=1 ttl=64 time=0.321 ms
64 bytes from 172.16.2.16: icmp_seq=2 ttl=64 time=0.189 ms
^C
--- 172.16.2.16 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1045ms
rtt min/avg/max/mdev = 0.189/0.255/0.321/0.066 ms
root@ubuntu:/etc/netplan# ping 172.16.1.10
PING 172.16.1.10 (172.16.1.10) 56(84) bytes of data.
64 bytes from 172.16.1.10: icmp_seq=1 ttl=64 time=0.342 ms
64 bytes from 172.16.1.10: icmp_seq=2 ttl=64 time=0.371 ms
64 bytes from 172.16.1.10: icmp_seq=3 ttl=64 time=0.233 ms
64 bytes from 172.16.1.10: icmp_seq=4 ttl=64 time=0.312 ms
^C
root@ubuntu:/etc/netplan# ping 172.16.3.17
PING 172.16.3.17 (172.16.3.17) 56(84) bytes of data.
64 bytes from 172.16.3.17: icmp_seq=1 ttl=64 time=0.185 ms
64 bytes from 172.16.3.17: icmp_seq=2 ttl=64 time=0.307 ms
64 bytes from 172.16.3.17: icmp_seq=3 ttl=64 time=0.234 ms
64 bytes from 172.16.3.17: icmp_seq=4 ttl=64 time=0.388 ms
64 bytes from 172.16.3.17: icmp_seq=5 ttl=64 time=0.304 ms
64 bytes from 172.16.3.17: icmp_seq=6 ttl=64 time=0.571 ms
64 bytes from 172.16.3.17: icmp_seq=7 ttl=64 time=0.488 ms
64 bytes from 172.16.3.17: icmp_seq=8 ttl=64 time=0.441 ms
64 bytes from 172.16.3.17: icmp_seq=9 ttl=64 time=0.298 ms
64 bytes from 172.16.3.17: icmp_seq=10 ttl=64 time=0.493 ms
^C
--- 172.16.3.17 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9221ms
rtt min/avg/max/mdev = 0.185/0.370/0.571/0.118 ms
root@ubuntu:/etc/netplan#

开始模拟环境:
第一台保持不变:可以上网

root@ubuntu:/etc/netplan# ping www.baidu.com
PING www.baidu.com (240e:ff:e020:98c:0:ff:b061:c306) 56 data bytes
64 bytes from 240e:ff:e020:98c:0:ff:b061:c306: icmp_seq=1 ttl=52 time=22.9 ms
64 bytes from 240e:ff:e020:98c:0:ff:b061:c306: icmp_seq=2 ttl=52 time=23.9 ms
^C

第二台和第三台,关闭nat网络接线:关闭上网


root@ubuntu:/etc/netplan# ping www.baidu.com
ping: www.baidu.com: Temporary failure in name resolution
root@ubuntu:/etc/netplan#

环境准备之后,下面正式进行iptables的配置。
只需要在第一台机器上,进行配置即可。

sysctl -w net.ipv4.ip_forward=1
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -t nat -F
# 不指定出口IP,伪装上网【建议这个就可以】
iptables -t nat -A POSTROUTING -s 172.16.2.0/16 -j MASQUERADE

或者

sysctl -w net.ipv4.ip_forward=1
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -t nat -F
# 通过指定的IP进行上网,注意网卡要对应上。
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o enp0s3 -j SNAT --to-source 192.168.3.18

最后保存配置

iptables-save

查看是否配置成功:

iptables -t nat -L -n --line-number

持久化保存

  • 确保两个都已经安装iptables-persistentnetfilter-persistent不然不会生效
sudo sudo apt install iptables-persistent
sudo apt-get install netfilter-persistent
sudo netfilter-persistent save
  • 持久化之后查看配置文件是否生效
root@ubuntu:/etc/iptables# cat rules.v4
# Generated by iptables-save v1.8.10 (nf_tables) on Sun Apr 27 13:55:22 2025
*filter
:INPUT ACCEPT [669:47400]
:FORWARD ACCEPT [4:432]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Sun Apr 27 13:55:22 2025
# Generated by iptables-save v1.8.10 (nf_tables) on Sun Apr 27 13:55:22 2025
*nat
:PREROUTING ACCEPT [34:3330]
:INPUT ACCEPT [17:1968]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [15:1220]
-A POSTROUTING -s 172.16.0.0/16 -j MASQUERADE
COMMIT
# Completed on Sun Apr 27 13:55:22 2025
root@ubuntu:/etc/iptables#

不持久化保存,重启之后就没有了。
PS:第一台机器一定要开启转发:sysctl -w net.ipv4.ip_forward=1
永久配置,修改内容为net.ipv4.ip_forward = 1,不转发是0

# 编辑/etc/sysctl.conf
vim /etc/sysctl.conf
# 修改内容为net.ipv4.ip_forward = 1,把ipv6也设置一下
# net.ipv6.conf.all.forwarding=1
# 然后执行sysctl -p使修改生效。
sysctl -p

需要上网机器,配置就非常简单了。只要设置路由指向第一台机器即可
临时配置,记得配置好DNS,否则域名使用不了。

ip route add default via 172.16.1.10 dev enp0s9

永久配置如下,其它需要上网机器参考配置即可。
在当前网卡enp0s9增加路由:

 routes:
        - to: default
          via: 172.16.1.10

完整配置如下:

root@ubuntu:/etc/netplan# cat 50-cloud-init.yaml
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
      - "192.168.56.16/24"
      routes:
      - to: "192.168.56.0/24"
        via: "192.168.56.1"
    enp0s9:
      addresses:
        - 172.16.2.16/16
      routes:
        - to: default
          via: 172.16.1.10
      nameservers:
        addresses:
        - 114.114.114.114
        - 8.8.8.8

root@ubuntu:/etc/netplan#

至此,Ubuntu 24.04.2 LTS 通过iptables共享上网搭建完成。

posted @ 2025-04-27 21:13  刘文江  阅读(329)  评论(0)    收藏  举报  来源