Debian系统选择及精简
基于64MB内存VPS(这里我选择搬瓦工VPS主机64MB方案)完成整个过程。
基于64MB内存VPS(这里我选择搬瓦工VPS主机64MB方案)完成整个过程。
Linux下利用TC命令,对PAC代理进行限速,限制某个进程端口的吞吐速度,预留给其他使用
Gigabyte/技嘉GA-B85M-D3H 主板 Intel B85/LGA1150 608.00
先马领军 台式机电脑主机机箱 读卡器 双USB3.0侧透 下置电源 129.00
包邮 Intel/英特尔 酷睿 四代 I3 4130 3.4G 中文盒装CPU LGA1150 717.00
ADATA/威刚 4G DDR3 1600 台式机 内存条 单条兼容1333 219.00
送HDMI线包完美LG 22EA63V-P 21.5寸IPS HDMI液晶显示器秒22EA63T 919.00
【1111购物狂欢节】静音!酷冷至尊新战斧500w电源额定电脑电源台式机电源主机箱atx 199.00
【1111购物狂欢节】【双碟】Seagate/希捷ST2000DM001 2T台式机硬盘3.5寸2TB盒装送线 528.00
闪迪加强版240G 399
ubuntu 下 /bin/sh 默认是dash,用ll /bin/sh就可以看出来sh是指向dash的链接,有时候会导致使用bash脚本的时候出问题。
如果遇到这个问题了,就要把sh指向bash。
可以用ln:ln -s /bin/bash /bin/sh
或者用sudo dpkg-reconfigure dash
选择否(no)
作者 yanjieee
转载:Debian vps上开通最低权限的ssh账号
在某些特殊用途想,我们需要用到vps的ssh账号,但是直接使用root账户是不安全的,这时我们可以创建一个最低权限的ssh账户。
1,登陆VPS,创建一个登录脚本:
vi /bin/nologin.sh
文件中添加以下内容
#!/bin/sh
echo ""
echo " ***********************************************************"
echo " * Sorry,you can't Login by this way, press a key to exit. *"
echo " ***********************************************************"
echo ""
read x
exit
写完之后按esc,输入:wq回车保存。
2、为此文件添加执行权限:
chmod 755 /bin/nologin.sh
3、添加一个用户到nogroup组,并且指定它的启动脚本:
useradd username -g nogroup -s /bin/nologin.sh
其中username修改为你的用户名
修改密码
passwd username
根据提示输入两遍新密码即可创建成功。
4、删除该用户
userdel -r username
5、显示所有用户
awk -F: '{print $1}' /etc/passwd
之前介绍了Debian vps上使用axel多线程下载百度网盘资源,对应的是想介绍下如何将VPS上的数据上传至百度网盘上。不过百度网盘现在貌似关闭了PCS的API接口申请,使用起来比较麻烦。退而求其次,这里介绍下如何定时备份VPS数据至Dropbox中。
在VPS上安装linux命令行版本的dropbox:
32-bit:
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86" | tar xzf -
64-bit:
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
下载完成之后,运行dropbox
~/.dropbox-dist/dropboxd
第一次运行该命令,会提示访问URL,通过访问该URL就可以绑定VPS与dropbox账号。此时查看命令行,会提示绑定成功。
绑定之后,root目录下会自动创建名为Dropbox的文件夹,Dropbox会自动同步该文件夹内的文件。
我们一般备份网站数据及数据库数据,正常情况下网站WEB目录不在root文件夹下,我们可以通过软连接指向网站WEB目录,而数据库数据可以通过命令行导出,并通过软连接指向该文件。
为了方便区分目录,可以在Dropbox文件夹下新建backups文件夹,用于备份数据。
1)定时备份网站数据
将网站WEB目录连接到/Dropbox/backups文件夹下,假定/var/www/wordpress为网站web目录
cd ~/Dropbox/backups
ln -s /var/www/wordpress
2)定时备份数据库文件
新建一个定时备份数据库文件的脚本
vi ~/backup/mysqlbackup.sh
脚本内容如下:
echo "start mysql back up "${date} >> /root/backup/backup.log
mysqldump -uroot -p123456 wordpress >/root/backup/mysqlback.sql
其中,root为数据库的用户名,123456为数据库密码,wordpress为数据库名。
添加可执行权限
chmod a+x ~/backup/mysqlbackup.sh
将mysqlback.sql连接到/Dropbox/backups文件夹下
#!/bin/sh
cd ~/Dropbox/backups
ln -s ~/backup/mysqlback.sql
定时执行备份脚本文件,输入
crontab -e
添加以下内容
* 3 * * * /root/backup/mysqlbackup.sh
3)定时开闭dropbox linux客户端
dropbox一直开着会占用vps的内存资源,没有必要一直开着,可以利用脚本定时运行和关闭dropbox。
创建脚本 ~/backup/dropboxswitch.sh
vi ~/backup/dropboxswitch.sh
内容如下
#!/bin/sh
date=`date +%Y%m%d_%H:%M:%S`
start() {
echo "starting dropbox "${date} >> /root/backup/backup.log
/root/dropbox/.dropbox-dist/dropbox &
}
stop() {
echo "stoping dropbox "${date} >> /root/backup/backup.log
pkill dropbox
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac
添加可执行权限
chmod a+x ~/backup/dropboxswitch.sh
然后定时每天凌晨4点启动dropbox,6点关闭:
crontab -e
添加以下内容
* 4 * * * /root/backup/dropboxswitch.sh start
* 6 * * * /root/backup/dropboxswitc.sh stop
首先,需要创建一个Dropbox应用,可以从该网址进行创建:https://www.dropbox.com/developers/apps/create。
在这里,应用类型选择Dropbox API App,数据存储类型选择Files and datastores,权限选择Yes(应用只需要访问它创建的文件)。然后命名创建。
dropbox_uploader 是一个第三方Dropbox备份脚本,首先下载脚本:
wget --no-check-certificate https://raw.githubusercontent.com/tennfy/Dropbox-Uploader/master/dropbox_uploader.sh
chmod a+x dropbox_uploader.sh
执行该脚本,绑定APP:
./dropbox_uploader.sh
根据提示输入Dropbox应用中的App key和App secret,许可类型选择a,确认y,复制给出的权限验证链接到浏览器,确认后回到终端按任意键完成。
之后可以执行下面的命令测试上传,提示Done就是绑定成功了:
./dropbox_uploader.sh upload /etc/passwd /backup/passwd.old
vi /root/backup.sh
内容如下:
#!/bin/bash
MYSQL_USER=root #mysql用户名
MYSQL_PASS=xxxxx #mysql密码
MYSQL_DATABASENAME=xxxxx #要备份的数据库名
WEB_DATA=/var/www/xxx #要备份的网站数据
#你要修改的地方从这里结束
# 定义备份存放目录
DROPBOX_DIR=/$(date +%Y-%m-%d) # Dropbox上的备份目录
LOCAL_BAK_DIR=/root/backup # 本地备份文件存放目录
#定义备份文件名字
DBBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +"%Y%m%d").tar.gz
# 定义旧数据名称
Old_DROPBOX_DIR=/$(date -d -3day +%Y-%m-%d)
OldDBBakName=Data_$(date -d -3day +"%Y%m%d").tar.gz
OldWebBakName=Web_$(date -d -3day +"%Y%m%d").tar.gz
#删除本地3天前的数据
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldWebBakName
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/
#导出mysql数据库
mysqldump -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DATABASENAME > $LOCAL_BAK_DIR/wordpress.sql
#压缩数据库
tar zcvf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/wordpress.sql
rm -rf $LOCAL_BAK_DIR/wordpress.sql
#压缩网站数据
tar zcvf $LOCAL_BAK_DIR/$WebBakName $WEB_DATA
#开始上传
cd ~
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName
echo -e "Backup Done!"
其中,用户可以根据自己的需求改编需要备份的目录,以及保留旧数据的时长(我这里设置的是3天)
如果mysql是编译安装,需要指定mysql的路径。
增加执行权限:
chmod +x /root/backup.sh
测试该备份脚本:
./backup.sh
执行:
crontab –e
添加以下内容:
30 3 * * * /root/backup.sh
这样,就可以每天凌晨3:30自动备份到Dropbox了。
service cron restart
重启之后就设置完成了
如果你不知道服务器当前时间,可以使用下面的命令,查看当前时间:
date -R
修改为当前时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
即修改服务器时区为上海。
参考文章:
如何将VPS上的网站数据定时自动备份到Dropbox
利用dropbox备份vps数据
可以看看用快盘的:https://github.com/wujiwh/kuaipan_uploader
本文所讲内容为如何将网站上的文件以及数据库中的内容定时自动备份到Dropbox上。
首先,需要创建一个Dropbox应用(Dropbox目前需要翻墙),可以从该网址进行创建:https://www.dropbox.com/developers/apps/create。
在这里,应用类型选择Dropbox API App,数据存储类型选择Files and datastores,权限选择Yes(应用只需要访问它创建的文件)。然后命名创建。
dropbox_uploader 是一个第三方Dropbox备份脚本,首先下载脚本:
curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh
然后,为该脚本添加执行权限:
chmod +x dropbox_uploader.sh
执行该脚本,绑定APP:
./dropbox_uploader.sh
根据提示输入Dropbox应用中的App key和App secret,许可类型选择a,确认y,复制给出的权限验证链接到浏览器,确认后回到终端按任意键完成。
之后可以执行下面的命令测试上传,提示Done就是绑定成功了:
./dropbox_uploader.sh upload /etc/passwd /backup/passwd.old
编写定时备份脚本,取名为backup.sh。其代码如下:
#!/bin/bash
# 定义需要备份的目录
WEB_DIR=/home/www # 网站数据存放目录
# 定义备份存放目录
DROPBOX_DIR=/$(date +%Y-%m-%d) # Dropbox上的备份目录
LOCAL_BAK_DIR=/home/backup # 本地备份文件存放目录
# 定义备份文件名称
DBBakName=DB_$(date +%Y%m%d).tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz
# 定义旧数据名称
Old_DROPBOX_DIR=/$(date -d -7day +%Y-%m-%d)
OldDBBakName=DB_$(date -d -10day +%Y%m%d).tar.gz
OldWebBakName=Web_$(date -d -10day +%Y%m%d).tar.gz
cd $LOCAL_BAK_DIR
#使用命令导出数据库
mongodump --out $LOCAL_BAK_DIR/mongodb/ --db bastogne
#压缩数据库文件合并为一个压缩文件
tar zcf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/mongodb
rm -rf $LOCAL_BAK_DIR/mongodb
#压缩网站数据
cd $WEB_DIR
tar zcf $LOCAL_BAK_DIR/$WebBakName ./*
cd ~
#开始上传
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName
#删除旧数据
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldWebBakName
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/
echo -e "Backup Done!"
其中,用户可以根据自己的需求改编需要备份的目录,以及保留旧数据的时长(比如我这里设置的是Dropbox保留7天,本地保留10天)。
接下来,为这个备份脚本增加执行权限:
chmod +x backup.sh
测试该备份脚本:
./backup.sh
执行:
crontab –e
添加:
30 3 * * * /root/backup.sh
这样,就可以每天凌晨3:30自动备份到Dropbox了。
service cron restart
重启之后就设置完成了
如果你不知道服务器当前时间,可以使用下面的命令,查看当前时间:
date -R
修改当前时区:
cp /usr/share/zoneinfo/主时区/次时区 /etc/localtime
例如:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
即修改服务器时区为上海。
本文部分内容参考自:
https://timeting.com/27/use-scripts-auto-backup-vps-to-dropbox/
http://www.pythoner.com/324.html
https://gist.github.com/tonek/5383455
nano backup.sh
放到哪里无所谓,记得赋予执行权限就可以了chmod +x backup.sh
#!/bin/bash
# Settings
DROPBOX_DIR="/Backups" #Dropbox中的文件夹名称
BACKUP_SRC="/home/wwwroot/website /home/wwwroot/database" #需要备份的文件夹路径,可以同时指定多个,32MB.CN用了Sqlite数据库,Sqlite以文件形式存放,故也要备份
BACKUP_DST="/miniVPS" #用来存放备份的文件夹路径
MYSQL_SERVER="127.0.0.1" #连接本地MySQL
MYSQL_USER="root" #本地MySQL的用户
MYSQL_PASS="123456" #本地MySQL的密码
# Stop editing here
NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tgz"
LAST=$(date -d "2 months ago" +"%Y.%m.%d") #这里的时间可以根据需要进行修改,如"3 months ago"
# Backup files
ps -e | grep -c mysql
if [ $? -eq 0 ]; then
echo "Dumping databases..."
/web/mysql/bin/mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --all-databases > "$BACKUP_DST/$NOW-Databases.sql" #这里的命令路径可以根据需要进行修改
else
echo "ERROR. Now exiting..."
exit 1
fi
if [ $? -eq 0 ]; then
echo "Packing files..."
tar -czf "$DESTFILE" $BACKUP_SRC "$BACKUP_DST/$NOW-Databases.sql"
else
echo "ERROR. Now exiting..."
exit 1
fi
if [ $? -eq 0 ]; then
/home/backup/dropbox_uploader.sh upload "$DESTFILE" "$DROPBOX_DIR/$NOW.tgz" #这里的脚本路径可以根据需要进行修改
else
echo "ERROR. Now exiting..."
exit 1
fi
# Delete old files
if [ $? -eq 0 ]; then
/home/backup/dropbox_uploader.sh delete "$DROPBOX_DIR/$LAST.tgz" #这里的脚本路径可以根据需要进行修改
else
echo "ERROR. Now exiting..."
exit 1
fi
if [ $? -eq 0 ]; then
echo "Cleaning the backups..."
rm -f "$BACKUP_DST/$NOW-Databases.sql"
rm -f "$BACKUP_DST/$LAST.tgz"
else
echo "ERROR. Now exiting..."
exit 1
fi
其中的dropbox_uploader.sh
是Dropbox上传下载脚本,
主页:http://www.andreafabrizi.it/?dropbox_uploader
apt-get install git
git clone http://github.com/andreafabrizi/Dropbox-Uploader.git
cd Dropbox-Uploader
chmod +x dropbox_uploader.sh
mv dropbox_uploader.sh /home/backup/
./dropbox_uploader.sh
初始化完成以后,便可以立即执行一次backup.sh脚本进行备份了
/home/backup/backup.sh
定时任务
光弄好了脚本可不行,没添加定时任务怎么定时备份。
crontab -e
设置为每天执行一次备份,具体时间可以根据需要进行修改
30 1 * * * sh /home/backup/bbackup.sh
from
转载:Debian vps进程监控并自动重启
使用过lnmp一键包的同学可能很多都遇到502错误,解决502错误比较好的一个方法是定时重启php进程。由于linux的机制,进程占用过多内存时会被kill掉,此时也需要重启该进程。今天tennfy来介绍下如何对debian vps中进程进行监控并自动重启。
运行想要监控的程序之后,执行以下命令:
ps -ef
会列出系统中所有的进程,在CMD一列里找到该程序对应的进程名。
在root目录下新建monitor脚本
vi /root/monitor.sh
添加以下内容,注意将procname替换为待监控的进程名,/etc/init.d/procname restart替换为该进程的重启命令
#! /bin/sh
proc_name="procname" # 待监控进程名
number=`ps -ef | grep $proc_name | grep -v grep | wc -l`
if [ $number -eq 0 ] # 判断进程是否存在
then
/etc/init.d/procname restart # 重启进程的命令,请相应修改
fi
添加完成后,输入:wq保存修改。
设置可执行权限
chmod a+x /root/monitor.sh
添加到crontab定时任务
设置好脚本之后,添加到crontab定时任务中,每分钟执行一次脚本
echo "* * * * * root /root/monitor.sh >/dev/null 2>&1" >>/etc/crontab
/etc/init.d/cron restart
如果你希望监控多个进程程序,添加多个脚本即可,该方法非常实用,很多时候都能用到。
最近要apt-add-repository 个 ppa装个东西,发现电信下那速度实在太慢了,无法,只能代理下了。LINUX下可以实现SSH全局代理的软件有tsocks和proxychains两种,但是个人感觉proxychains要更加稳定简单。
假设代理为127.0.0.1,端口为7000。我在Ubuntu下安装。
安装很简单:
sudo apt-get install proxychains
配置:
sudo vi /etc/proxychains.conf
要选 dynamic_chain,而不是random_chain和strict_chain。即注释掉strict_chain和random_chain那两行。
然后在最后的[ProxyList]下面添加: socks5 127.0.0.1 7000
使用方法:
proxychains <程序名>
即可让程序使用代理。
PS:7000端口是我本地的SSH端口,因为我用的是ssh -D 7000。
转载于:http://lesca.me/archives/iptables-examples.html
详情看:http://lesca.me/topics/network/iptables
看了那么多iptables的教程,这篇教程还是比较全面易懂的
其他:Debian VPS下使用iptables防火墙
iptables防火墙的实例教程
本文介绍25个常用的iptables用法。如果你对iptables还不甚了解,可以参考上一篇iptables详细教程:基础、架构、清空规则、追加规则、应用实例,看完这篇文章,你就能明白iptables的用法和本文提到的基本术语。
iptables -F (OR) iptables --flush
iptables的filter表中有三种链:INPUT, FORWARD和OUTPUT。默认的链策略是ACCEPT,你可以将它们设置成DROP。
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
你需要明白,这样做会屏蔽所有输入、输出网卡的数据包,除非你明确指定哪些数据包可以通过网卡。
以下规则将屏蔽BLOCK_THIS_IP所指定的IP地址访问本地主机:
BLOCK_THIS_IP="x.x.x.x" iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP (或者仅屏蔽来自该IP的TCP数据包) iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
本规则允许所有来自外部的SSH连接请求,也就是说,只允许进入eth0接口,并且目的端口为22的数据包
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
本规则和上述规则有所不同,本规则意在允许本机发起SSH连接,上面的规则与此正好相反。
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
以下规则仅允许来自192.168.100.0/24的网络:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
上例中,你也可以使用-s 192.168.100.0/255.255.255.0作为网络地址。当然使用上面的CIDR地址更容易让人明白。
以下规则仅允许从本地主机连接到192.168.100.0/24的网络:
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 1.允许HTTP连接:80端口 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # 2.允许HTTPS连接:443端口 iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
本规则可以允许用户从本地主机发起HTTPS连接,从而访问Internet。
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
类似的,你可以设置允许HTTP协议(80端口)。
通过指定-m multiport选项,可以在一条规则中同时允许SSH、HTTP、HTTPS连接:
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
如果你在使用NIS管理你的用户账户,你需要允许NIS连接。即使你已允许SSH连接,你仍需允许NIS相关的ypbind连接,否则用户将无法登陆。NIS端口是动态的,当ypbind启动的时候,它会自动分配端口。因此,首先我们需要获取端口号,本例中使用的端口是853和850:
rpcinfo -p | grep ypbind
然后,允许连接到111端口的请求数据包,以及ypbind使用到的端口:
iptables -A INPUT -p tcp --dport 111 -j ACCEPT iptables -A INPUT -p udp --dport 111 -j ACCEPT iptables -A INPUT -p tcp --dport 853 -j ACCEPT iptables -A INPUT -p udp --dport 853 -j ACCEPT iptables -A INPUT -p tcp --dport 850 -j ACCEPT iptables -A INPUT -p udp --dport 850 -j ACCEPT
以上做法在你重启系统后将失效,因为ypbind会重新指派端口。我们有两种解决方法:
1.为NIS使用静态IP地址
2.每次系统启动时调用脚本获得NIS相关端口,并根据上述iptables规则添加到filter表中去。
你可能启用了rsync服务,但是又不想让rsync暴露在外,只希望能够从内部网络(192.168.101.0/24)访问即可:
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
你可能启用了MySQL服务,但只希望DBA与相关开发人员能够从内部网络(192.168.100.0/24)直接登录数据库:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
邮件服务都使用了25端口,我们只需要允许来自25端口的连接请求即可。
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# IMAP:143 iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT # IMAPS:993 iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
# POP3:110 iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT # POP3S:995 iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
如果本地主机有两块网卡,一块连接内网(eth0),一块连接外网(eth1),那么可以使用下面的规则将eth0的数据路由到eht1:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
以下规则将会把来自422端口的流量转发到22端口。这意味着来自422端口的SSH连接请求与来自22端口的请求等效。
# 1.启用DNAT转发 iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to-destination 192.168.102.37:22 # 2.允许连接到422端口的请求 iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
假设现在外网网关是xxx.xxx.xxx.xxx,那么如果我们希望把HTTP请求转发到内部的某一台计算机,应该怎么做呢?
iptables -t nat -A PREROUTING -p tcp -i eth0 -d xxx.xxx.xxx.xxx --dport 8888 -j DNAT --to 192.168.0.2:80 iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT
当该数据包到达xxx.xxx.xxx.xxx后,需要将该数据包转发给192.168.0.2的80端口,事实上NAT所做的是修改该数据包的目的地址和目的端口号。然后再将该数据包路由给对应的主机。
但是iptables会接受这样的需要路由的包么?这就由FORWARD链决定。我们通过第二条命令告诉iptables可以转发目的地址为192.168.0.2:80的数据包。再看一下上例中422端口转22端口,这是同一IP,因此不需要设置FORWARD链。
如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j snat --to-source 192.168.5.3
对于snat,不管是几个地址,必须明确的指定要snat的IP。假如我们的计算机使用ADSL拨号方式上网,那么外网IP是动态的,这时候我们可以考虑使用MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
可以利用iptables的-m nth扩展,及其参数(–counter 0 –every 3 –packet x),进行DNAT路由设置(-A PREROUTING -j DNAT –to-destination),从而将负载平均分配给3台服务器:
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
# 1.新建名为LOGGING的链 iptables -N LOGGING # 2.将所有来自INPUT链中的数据包跳转到LOGGING链中 iptables -A INPUT -j LOGGING # 3.指定自定义的日志前缀"IPTables Packet Dropped: " iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7 # 4.丢弃这些数据包 iptables -A LOGGING -j DROP
[1] 25 Most Frequently Used Linux IPTables Rules Examples
[2] iptables: SNAT, DNAT, MASQUERADE的联系与区别