(870) 396-7435

家里有了外网ip,就想让家里路由器的小服务器可以在外网访问。
用ip访问,是可以的,但是感觉不cool,而且光猫一重启,或者运营商干啥了,ip就会变化,趁还没有配置更多服务的时候,配置一个动态dns就好了。

因为刚学这些东西,方法,代码都是来源于互联网,谢谢大家。
1、获取本地ip,因为对openwrt上的操作不太了解,用了一个本办法,在openwrt上定时执行一个py脚本,post一个vps服务器,让vps服务器做剩下的操作。其中学习了http协议头的一些规定,get和post方法的区别。要模拟两者时格式的差异。下面是post方法访问vps的一个php页面。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('xxxxxxx.com',80))
s.send(b'POST /xxx/index.php HTTP/1.1\r\nHost: xxxxxxxx.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 17\r\nConnection: close\r\n\r\nxxxxx=yyyyy')
buffer = []
while True:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data =b''.join(buffer)
s.close()

之前不知道要post穿数据,相应的content-Type要不一样的设置长度也填一下,试了半天没试对,传过去一个字符串xxxx=yyyyy,让vps端验证一下。
2、php页面 如果检测到ip和记录ip不一致,就调用updatadns。代码我不会写,抄的。把从阿里云获取的key和secret,要吐槽一下阿里的文档,垃圾的很,找这个申请key的地方找了10分钟给个链接会死?

关键是有密匙了,发个请求还各种加密,脱了裤子放屁。我用隔壁godaddy的没这么多要求。这个代码试了半天不成功,原来我的主机名,改成了“@”,这个符号可能需要转义吧,不成功,懒得试了。用www,可以改。改的前提是,先要有这么一条记录。
define('AccessKeyId', 'KEY');
define('AccessKeySecret', 'Secret');
date_default_timezone_set('UTC');
/**
* 获取本机 IP 地址
*/
function getIP() {
$url = '/ip.taobao.com/service/getIpInfo.php?ip=myip';
try {
$json = json_decode(file_get_contents($url));
} catch (Exception $e) {
$json = [];
}
if (isset($json->code) && $json->code == 0) {
return $json->data->ip;
}
return '';
}
/**
* 获取请求签名
*/
function getSign($add){
$nonce = time() . rand(11111, 99999);
$time = date('Y-m-d') . 'T' . date('H:i:s') . 'Z';
$data = array(
'AccessKeyId' => AccessKeyId,
'Format' => 'json',
'SignatureMethod' => 'HMAC-SHA1',
'SignatureNonce' => $nonce,
'SignatureVersion' => '1.0',
'Timestamp' => $time,
'Version' => '2015-01-09'
);
$data = array_merge($data, $add);
ksort($data);
$format = http_build_query($data);
$signUrl = 'GET&%2F&' . urlencode($format);
$sign = urlencode(base64_encode(hash_hmac('sha1', $signUrl, AccessKeySecret . '&', true)));
return array('url' => $format, 'sign' => $sign);
}
/**
* 获取域名解析记录
*/
function getDNS($domain) {
$sign = getSign(['Action' => 'DescribeSubDomainRecords', 'SubDomain' => $domain]);
$url = '/alidns.aliyuncs.com/?' . $sign['url'] . '&Signature=' . $sign['sign'];
$dns = json_decode(httpRequest($url));
if (isset($dns->DomainRecords->Record[0])) {
return $dns->DomainRecords->Record[0];
}
return '';
}
/**
* 更新域名解析
*/
function updateDNS($id, $name, $ip) {
$data = array(
'Action' => 'UpdateDomainRecord',
'RecordId' => $id,
'RR' => $name,
'Type' => 'A',
'Value' => $ip,
);
$sign = getSign($data);
$url = '/alidns.aliyuncs.com/?' . $sign['url'] . '&Signature=' . $sign['sign'];
return httpRequest($url);
}
/**
* 发起 HTTP 请求
*/
function httpRequest($url) {
$header = array(
'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0',
'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding: gzip, deflate',
'Connection: keep-alive',
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_ENCODING, 'gzip');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
if ($error) {
return $error;
} else {
return $data;
}
}
function main() {
$dns = getDNS('www.test.com');
$ip = getIP();
if (isset($dns->RecordId)) {
echo updateDNS($dns->RecordId, 'www', $ip);
}
}
main();

光猫和openwrt路由器上部署外网可以访问的ftp服务器

有外网ip,就不涉及动态dns了。
两个路由器,a路由器为外网路由器lan地址192.168.1.1,设置nat 转发21端口到b路由器的wan地址192.168.1.6,b路由器配置vsftpd。
在a路由器 应用——NAT配置——虚拟主机配置中添加端口转发内容

有一些需要注意的地方。
1、vsftpd在openwrt上,他的配置文件为/etc/vsftpd.conf,但是手动配置每次都被还原,我猜是因为安装了luci界面导致的。一些设置在vsftpd.conf.template修改。
2、vsftpd在openwrt上不支持虚拟用户模式,而且好像如果不打开本地用户登录,会报错。但是处于安全考虑,不应该使用root账户的登录,就增加一个ftp组的用户。
adduser -g ftp username
这个用户改/etc/passwd 掉 /bin/ash 为/false
3、使用userlist,deny掉root用户就行了。
4、b路由器防火墙设置,在iptables中需要打开wan口的外部21端口。

(因为操作路由器的电脑在a路由器的子网,可以打开80和22端口,如果在配置中ssh登录的范围做设置,lan,wan,如果不改,还需要做端口转发才行。)


5、不知道为什么,外网访问这样设置,只支持主动模式(Active Mode),不支持被动模式(Passive Mode)。有知道的告诉我一下。

 

openwrt ssh免密码登陆

和一般linux的配置方法不同
openwrt的公钥没有在~/.ssh中。而是在/etc/dropbear/目录下,的authorized_keys文件
chmod 600 /etc/dropbear/authorized_keys
还要注意的是,如果在windows中用puttygen生成密钥对。不需要保存公钥文件,直接复制界面中的字符串就可以了。

因为生成文件后要是 cat/xxx.pub > /etc/dropbear/authorized_keys
内容被分段了,不是一行。就会报错(不确定)。

在linux服务器上
ssh-keygen 三次回车
ssh-copy-id user@server
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
这个好像也可以localhost(不确定)。

完成

wordpress 部署笔记

照着网上的攻略自己部署完,就忘掉了,下次还要再查攻略。自己记录一下比较好。

第一步,部署apache,mysql/mariadb,php。
1、apache不同版本的config文件的配置可能不同,之前的服务器上安装之后是httpd.conf,第二个服务器安装的是apache2,配置文件是apache2.conf,如果要修改web根目录
vi /etc/apache2/apache2.conf,把文件里面的/var/www改成你的目标地址。
然后vi /etc/apache2/sites-enabled/000-default.conf,把文件里面的/var/www改成你的目标地址。
确定好你的网页根目录地址后,要赋予apache组/www-data组的权限。
sudo chown -R apache /var/www
sudo chgrp -R apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;

2、mysql/mariadb安装完成之后,要记得
sudo mysql_secure_installation
新建一个wp的database,和user。我对mysql语言完全不懂,再创建数据库和给用户数据库权限时要使用反引号,而不是引号。
CREATE DATABASE `wordpress-db`;
GRANT ALL PRIVILEGES ON `wordpress-db`.* TO “wordpress-user”@”localhost”;
3、安装php。

第二步,安装wordpress。
把wordpress文档复制到网页根目录下,
修改wordpress/wp-config.php,
在/api.wordpress.org/secret-key/1.1/salt/ 获取密钥 填到配置文件中。
修改httpd配置文件 :
Options Indexes FollowSymLinks
AllowOverride All

完成。