Proxmox VE 设置Nat端口转发
一、ip段实例
母鸡外网ip:1.2.3.4
内网ip段: 10.21.21.254
小鸡ip:10.21.21.5
二、开始折腾
1. 方法 1(不推荐)
这个方法不推荐,因为修改一个端口pve整台服务器都要重启,非常影响到其他机器的正常运行。但是是官方的说明。还是有必须说明一下!了解了这个方法才能理解方法2怎么实现的!
1.1 设置内网ip段
vim /etc/network/interfaces
1.2 原来配置
auto vmbr0
iface vmbr0 inet static
address 1.2.3.4
netmask 255.255.255.0
network 1.2.3.0
broadcast 1.2.3.255
gateway 1.2.3.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
1.3 增加一个内网的网卡
auto vmbr2
iface vmbr2 inet static
address 10.21.21.254
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22
1.4 详细解说
1.4.1 内网ip段
address 10.21.21.254
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
1.4.2 vmbr2 ip转发 vmbr0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
1.4.3 允许ip段转发
post-up iptables -t nat -A POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
1.4.4 设置小鸡ip转发
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22
2222是你外网链接的端口,22是你内网小鸡的端口!由此类推80,443等端口也是这样设置,必须设置2条!
例如80端口
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.21.21.6:80
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.21.21.6:80
2. 方法 2(推荐)
方法2比较推荐,这样的做法主服务器不用重启,只需要重启当前的vm就可以了!
2.1 设置内网ip段
vim /etc/network/interfaces
2.2 增加网卡
auto vmbr2
iface vmbr2 inet static
address 10.21.21.254
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
2.3 设置网卡转发
vim /etc/sysctl.conf
#看看有没有这行,没增加。有被注释,取消注释!
net.ipv4.ip_forward=1
#让他立刻生效
/sbin/sysctl -p
2.4 设置要转发的端口
iptables -t nat -A POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
#10.21.21.0/24是2.2步骤里面你设置的ip段
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.10:22
#vmbr0 为你的实体网卡,而不是vmbr2虚拟网卡,别搞错了!
#10.21.21.6:22就是你要转发的vm端口
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.21.21.10:80
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to 10.21.21.10:443
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 3312 -j DNAT --to 10.21.21.6:3306
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 3390 -j DNAT --to 10.21.21.2:3389
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 808 -j DNAT --to 10.21.21.2:808
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2223 -j DNAT --to 10.21.21.8:22
安装apt-get install iptables-persistent
apt-get install iptables-persistent
保存规则
iptables-save > /etc/iptables/rules.v4
规则生效加载
iptables-restore < /etc/iptables/rules.v4
####2.5 开启加载规则
touch /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables
vi /etc/network/if-pre-up.d/iptables
在打开的编辑器里面输入以下文本,然后保存退出
#!/bin/sh
/sbin/iptables-restore < /etc/iptables/rules.v4
这样设置后,每次开机会从/etc/iptables读取iptables设置。修改iptables规则后,执行iptables-save > /etc/iptables这个命令就会把设置好的iptables规则保存到/etc/iptables这个文件。这样就不怕重启后丢失iptables设置了。
3.全部设置完成以后重启网卡
/etc/init.d/networking restart
三、设置80,443端口为全局都可以用
1 安装Nginx
我们上面教程大家大概明白了,一个小鸡只能使用1个唯一的端口。这样对于我们来说不太方便,万一我要用很多80端口和443端口呢?所以我们还的必须折腾一个80和443的全局都可以使用的端口!这里呢,我们借助Nginx的负载均衡或者反向代理都可以实现,haproxy也可以实现!
1.1 小鸡安装Nginx
可以选择Lnmp或者直接Nginx,本人比较建议安装Lnmp。因为方便申请SSL证书!
wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz -cO lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 && ./install.sh lnmp
2 配置Nginx规则
2.1 反代服务器Nginx规则
server
{
listen 80;
server_name blog.e9china.net ;
location / {
proxy_connect_timeout 300; #跟后端服务器连接超时时间,发起握手等候响应时间
proxy_send_timeout 300; #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
proxy_read_timeout 600; #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
proxy_buffer_size 256k; #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
proxy_buffers 4 256k; #同上,告诉nginx保存单个用几个buffer最大用多少空间
proxy_busy_buffers_size 256k; #如果系统很忙时候可以申请最大的proxy_buffers
proxy_temp_file_write_size 256k; #proxy缓存临时文件的大小
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.21.21.6;
}
access_log off;
}
server
{
listen 443 ssl http2;
server_name blog.e9china.net ;
ssl_certificate /usr/local/nginx/conf/ssl/blog.e9china.net/fullchain.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/blog.e9china.net/blog.e9china.net.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_session_cache builtin:1000 shared:SSL:10m;
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
location / {
proxy_connect_timeout 300; #跟后端服务器连接超时时间,发起握手等候响应时间
proxy_send_timeout 300; #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
proxy_read_timeout 600; #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
proxy_buffer_size 256k; #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
proxy_buffers 4 256k; #同上,告诉nginx保存单个用几个buffer最大用多少空间
proxy_busy_buffers_size 256k; #如果系统很忙时候可以申请最大的proxy_buffers
proxy_temp_file_write_size 256k; #proxy缓存临时文件的大小
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://10.21.21.6:443;
}
access_log off;
}
2.2 真实服务器Nginx规则
先将反代服务器的ssl证书上传到你实际的服务器上,然后在Nginx下设置
server
{
listen 80;
#listen [::]:80;
server_name blog.e9china.net ;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/blog.e9china.net;
include rewrite/diguo.conf;
#error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
include enable-php-pathinfo.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log off;
}
server
{
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name blog.e9china.net ;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/blog.e9china.net;
ssl_certificate /usr/local/nginx/conf/ssl/blog.e9china.net/fullchain.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/blog.e9china.net/blog.e9china.net.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_session_cache builtin:1000 shared:SSL:10m;
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
include rewrite/diguo.conf;
#error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
include enable-php-pathinfo.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log off;
}
2.3 伪静态规则
伪静态规则在实体机器上生效,反代服务器只是起了一个桥链的作用!
2.4 mysql应该放那里?
由于我们是Nat模式,所以我们的数据库最好是放到独立一个vm下。也可以装到反代服务器里面,这样的好处就是一个mysql服务器管理全部vm的数据库处理。怎么链接呢?利用内网模式链接,看看下面的例子
下面把localhost改成远程IP即可了 实例
<br />$conn=mysql_connect('10.21.21.5','root','123');
安装帝国cms,Wordpress或者其他的程序的时候把localhost修改成你的内网ip
Lnmp使用者请注意要修改网卡规则。因为Lnmp安装的时候会加入一个iptables,禁止远程连接3306端口!
解决办法,请参考Sandy之前写的Blog:LNMP1.5解决MySQL无法远程连接问题
四、安装母鸡安装BBR
什么是BBR。TCP-BBR是谷歌出品的TCP拥塞控制算法。BBR目的是要尽量跑满带宽,并且尽量不要有排队的情况。BBR可以起到单边加速TCP连接的效果。
BBR解决了两个问题:在有一定丢包率的网络链路上充分利用带宽。非常适合高延迟,高带宽的网络链路。降低网络链路上的buffer占用率,从而降低延迟。非常适合慢速接入网络的用户。
linux内核4.9及以上默认支持bbr。debian9内核为4.9,Proxmox5.2的默认内核4.15,可以直接开启使用。以下在root用户操作:
4.1 开启BBR
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
4.2 保存生效
sysctl -p
4.3 执行,查看生效情况
sysctl net.ipv4.tcp_available_congestion_control
结果如下就是开启了
net.ipv4.tcp_available_congestion_control = reno cubic bbr
可以lsmod看一下
lsmod|grep bbr
tcp_bbr 20480 238
五、Nat能做些什么?
生产力和想象力是相辅相成的,没想象力只有生产力,那是富士康工厂模式!有了想象力就是Apple公司!
比如你有一台E5,64G的服务器。但只有1个ip,又不想花钱去买昂贵的ip。毕竟现在请求ipv4资源没剩多少了,老外也不想以前一样傻乎乎的给你一大堆。这时候Nat就有作用了!
Sandy打个比方吧!
现在做网站依靠的是火车头和python,2个目前比较牛的采集器!但是呢?python在linux的表现和实际生产力肯定比在win下强,而火车头又必须在win下运行,作用就来了。
又比如一些自动的化的脚本,以前是把网站和脚本全部放一个服务器,严重混合使用导致Log、目录非常乱。那么Nat的作用就可以体现了!
剩下的就得靠你自己去想像了!