通过树莓派的NAPT来访问子网的PostgreSQL服务器

关于这篇文章

我們將建立像圖中所示的網絡,搭建了一個樹莓派NAPT(NAT伺服器)和樹莓派PostgreSQL伺服器。

我会创建一篇文章作为构建步骤备忘录。

顺便一提,安装在树莓派4B上的是NAT服务器,树莓派3B(+)上则是用作PostgreSQL服务器,这是为了方便用户的需求而设立的。

undefined

环境与设置 yǔ

在创建操作系统映像时,将相同的公钥嵌入NAT服务器和PostgreSQL服务器中。

NAT服务器

树莓派:树莓派4型号B修订版1.2
操作系统:树莓派OS Lite 64位(Debian GNU/Linux 12(书虫))
主机名:MyNAT
静态公共子网IP:192.168.1.100
静态路由/公共子网DNS:192.168.1.1
静态私有子网IP:10.1.1.1
静态路由/私有子网DNS:10.1.1.1
NAPT端口:11111

“PostgreSQL服务器”

树莓派:树莓派 3 Model B Plus Rev 1.3
操作系统:树莓派 OS Lite 64 位(Debian GNU/Linux 11 (bullseye))
主机名:MyPsql
数据库:PostgreSQL-15
静态私有子网 IP:10.1.1.11
PostgreSQL 端口:5432

构建NAT服务器

安装

#アップデート
sudo apt update  
sudo apt -y upgrade  

#python関連インストール
sudo apt install -y python3-dev python3-pip  

#dns、ntp、iptables他インストール
sudo apt install -y dnsmasq ntp iptables iptables-persistent postfix git

sudo apt update  
sudo reboot

私有子网的DHCP设置

domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv
no-dhcp-interface=wlan0
interface=eth0
dhcp-range=10.1.1.11,10.1.1.20,255.255.255.0,24h

将自动启动功能启用并开始运行。

sudo systemctl enable dnsmasq  
sudo systemctl start dnsmasq  

网络时间协议设置

#追加
pool 192.168.1.1 iburst
pool ntp.nict.jp iburst
・
・
・
#アンコメント・追加
restrict default kod nomodify nopeer noquery limited
restrict 10.1.1.0 mask 255.255.255.0 kod nomodify nopeer notrap

自动启动启用并开始。

sudo systemctl enable ntp  
sudo systemctl start ntp  

eth0的IP地址固定不变。

Debian12版使用NetworkManager作为默认配置,可以直接使用。
由于NetworkManager默认使用”Wired connection 1″,比较繁琐,因此会更改为”eth0″。

sudo nmcli connection add type ethernet ifname eth0 con-name eth0 autoconnect yes
sudo nmcli c delete Wired\ connection\ 1

将私有子网(Private subnet)上的eth0网络接口的IP地址固定化,并禁用IPv6。

sudo nmcli connection modify eth0 ipv4.method manual ipv4.addresses 10.1.1.1/24 ipv6.method disabled

设定过滤器

sudo iptables -F
sudo iptables -X
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.0/24 -i wlan0 -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.0/24 -i eth0 -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.1/32 -p udp -m udp --dport 123 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.0/24 -i eth0 -p udp -m udp --dport 123 -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m hashlimit --hashlimit-upto 1/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name t_sshd --hashlimit-htable-expire 120000 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m hashlimit --hashlimit-upto 1/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name t_sshd --hashlimit-htable-expire 120000 -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type 8 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.0/24 -p icmp -m icmp --icmp-type 8 -j ACCEPT
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
sudo iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -d 10.1.1.11/32 -p tcp -m tcp --dport 5432 -j ACCEPT
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

将IPv4的转发设置永久化。

sudo sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g" /etc/sysctl.conf
sudo sysctl -p

NAT/NAPT的设置

我們將在公共子網路上設定一個NAPT,當我們訪問到Port 11111時,會將流量轉發至私有子網路的Port 5432。

sudo iptables -t nat -A PREROUTING -d 192.168.1.100/32 -p tcp -m tcp --dport 11111 -j DNAT --to-destination 10.1.1.11:5432
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -d 10.1.1.11/32 -p tcp -m tcp --dport 5432 -j SNAT --to-source 10.1.1.1

筛选/网络地址转换/网络地址端口转换反映

sudo service netfilter-persistent reload
sudo service netfilter-persistent save
sudo sh -c "iptables-save >/etc/iptables.ipv4.filter"
sudo sh -c "iptables-save >/etc/iptables.ipv4.nat"

SSH配置设置

简化从NAT到子网中安装了PostgreSQL的主机的ssh连接。

#login先のhostname
Host MyPsql
  HostName 10.1.1.11
  #自分のusername
  User user
  Port 22
  #自分の秘密鍵のPATH
  IdentityFile ~/.ssh/My_pem.pem
  TCPKeepAlive yes
  IdentitiesOnly yes

我将秘钥设置在/.ssh文件夹中,并更改权限。

sudo chmod 600 ~/.ssh/My_pem.pem

建立PostgreSQL服务器。

在使用树莓派NAT服务器连接以太网之前,请先进行互联网连接,并进行以下设置。

安裝

#アップデート
sudo apt update
sudo apt -y upgrade

#python関連インストール
sudo apt install -y python3-dev python3-pip

#iptables他インストール
sudo apt install -y iptables iptables-persistent postfix git

sudo apt update
sudo reboot

安装PostgreSQL-16

我已经在搭建时点(2023年11月17日)安装了最新的15版(最新版本为16)。
由于Debian11的apt/source.list的最新版本是PostgreSQL-13,所以我将向列表中添加存储库。

#依存関係インストール
sudo apt install wget curl gnupg2 -y

#ファイルリポジトリ構成作成
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

#リポジトリ署名keyインポート
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

#インストール
sudo apt update
sudo apt -y install postgresql

postgresql.conf的配置

打开 listen address。(由于不知道固定 IP 范围的方法,所以需要确认一下)

sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '\*'/g" /etc/postgresql/16/main/postgresql.conf

更改Postgres用户密码

我要更改树莓派上Postgres用户的密码。

sudo passwd postgres

新密码:您的密码
重新输入新密码:您的密码
密码更新成功。

使用”alter role postgres with password ‘your password’;”命令在PostgreSQL中更改postgres用户的密码,通过认证alter role来创建your password。

su - postgres
postgres@MyPsql:~$ psql
・
・
postgres=# alter role postgres with password 'your password';

pg_hba.conf配置文件的设置。

允许从NAT服务器的子网访问。

echo "host all all 10.1.1.0/24 md5" | sudo tee -a /etc/postgresql/16/main/pg_hba.conf

反映设定

/etc/init.d/postgresql restart

因为被要求输入密码,所以将输入更改后的密码。

重新启动PostgreSQL(通过systemctl):postgresql.service====正在验证org.freedesktop.systemd1.manage-units===
需要身份验证才能重新启动’postgresql.service’。
身份验证为:,,,(用户)
密码:您的密码
====验证完成===

eth0的IP地址是固定的。

Debian 11版本默认使用dhcpcd,可直接使用。

#追加
interface eth0
static ip_address=10.1.1.11/24
static routers=10.1.1.1
static domain_name_servers=10.1.1.1 8.8.8.8

将IPv6禁用。

sudo sed -i "s/rootwait/ipv6.disable=1 rootwait/g" /boot/cmdline.txt

文件設置

因为监听地址为”any”,所以需要设置过滤器。

sudo iptables -F
sudo iptables -X
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.1/32 -i eth0 -p udp -m udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.1/32 -i eth0 -p udp -m udp --dport 123 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.1/32 -p tcp -m state --state NEW -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m hashlimit --hashlimit-upto 1/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name t_sshd --hashlimit-htable-expire 120000 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
sudo iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
sudo service netfilter-persistent reload
sudo service netfilter-persistent save
sudo sh -c "iptables-save >/etc/iptables.ipv4.filter"

timesyncd的设定和重新启动

sudo sed -i "s/#NTP=/NTP=10.1.1.1/g" /etc/systemd/timesyncd.conf
sudo systemctl restart systemd-timesyncd
sudo reboot

确认动作

启动NAT服务器和PostgreSQL服务器,并通过以太网电缆连接,确认能够从NAT服务器登录到PostgreSQL服务器的ssh。

user@MyNAT:~ $ ssh MyPsql  

Linux MyPsql 6.1.21-v8+ #1642 SMP PREEMPT 2023年4月3日星期一17:24:16英国夏令时 aarch64
Debian GNU/Linux 系统附带的程序属于自由软件;
每个程序的具体发行条款在 /usr/share/doc/*/copyright 的各个文件中有详细描述。
Debian GNU/Linux 不提供任何保证,受适用法律限制。
上次登录时间:2023年11月23日星期四00:22:51,IP地址为10.1.1.1
user@MyPsql:~ $

检查PostgreSQL服务器上是否运行着postgresql.service。

user@MyPsql:~ $ sudo systemctl status postgresql

● postgresql.service – PostgreSQL 关系数据库管理系统
已加载:已加载 (/lib/systemd/system/postgresql.service; 已启用; 供应商预设:已启用)
活跃状态:活跃(已退出)自 Thu 2023-11-23 00:28:31 JST 至今已有 53 分钟
进程:25879 ExecStart=/bin/true (状态码=已退出, 状态=0/成功)
主 PID:25879 (状态码=已退出, 状态=0/成功)
CPU:5ms
11月 23 00:28:31 MyPsql systemd[1]: 正在启动 PostgreSQL 关系数据库管理系统…
11月 23 00:28:31 MyPsql systemd[1]: PostgreSQL 关系数据库管理系统启动完成。

也要确保可以从NAT服务器访问到postgresql.service。

user@MyNAT:~ $ nc -v -w 1 10.1.1.11 -z 5432 

10.1.1.11的反向主机查找失败:未知主机
(未知)[10.1.1.11] 5432(postgresql)开启

最后,我们将验证从连接到同一网络段的NAT服务器和PostgreSQL服务器的Windows PC上,通过NAPT能够访问到PostgreSQL。

PS C:\Users\MyAccount> Test-NetConnection  192.168.1.100  -port 11111

计算机名称:192.168.1.100
远程地址:192.168.1.100
远程端口:11111
接口别名:Wi-Fi 2
源地址:192.168.1.5
TCP测试成功:是

我确认通过NAPT可以从指定的段落访问Raspberry Pi私有子网上的PostgreSQL服务器。

资料来源

    • https://www.postgresql.org/

 

    • Debian11にPostgres15をインストールし、nfsしてマウントしたHDDにバックアップをとる方法

 

    • IoTセンサーデータをPostgreSQLに保存してPower BIで見る

 

    PostgreSQL クライアント接続ツール pgAdmin 4 をインストールする (Windows 版)
广告
将在 10 秒后关闭
bannerAds