2014年7月28日 星期一

FreeBSD架設網頁伺服器,Apache,PHP,MySQL,phpmyadmin

Port位置
/usr/ports/www/apache24
/usr/ports/databases/mysql56-server
/usr/ports/www/mod_php55阿帕契的PHP套件
/usr/ports/lang/php55
/usr/ports/lang/php55-extensions函式庫
/usr/ports/databases/phpmyadmin

編輯/etc/rc.conf開機啟動
apache24_enable="YES"
mysql_enable="YES"

編輯apache設定檔
/usr/local/etc/apache24/httpd.conf

依個人喜好修改
依個人喜好修改
ServerRoot "/usr/local"
ServerAdmin you@your.address
ServerName www.example.com:80
DocumentRoot "/usr/local/www/apache24/data"網頁根目錄
Listen :80監聽埠

首頁預設名稱
DirectoryIndex index.php index.html

加入PHP支援
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
LoadModule php5_module        libexec/apache24/libphp5.so

加入phpMyAdmin支援
Alias /phpmyadmin "/usr/local/www/phpMyAdmin"

<Directory "/usr/local/www/phpMyAdmin">
Options None
AllowOverride None
Require all granted
</Directory>

語言選項
AddDefaultCharset On

做一個目錄
mkdir /usr/local/www/phpMyAdmin/config
hmod o+w /usr/local/www/phpMyAdmin/config權限不對沒辦法用
chmod o+r /usr/local/www/phpMyAdmin/config.inc.php
這檔案應該是從config.inc.php.sample還是 config.sample.inc.php或是/usr/local/etc/php.ini-development複製來的,忘了,內容好像都一樣

MYSQL設定ROOT密碼
/usr/local/bin/mysqladmin -u root password

登入MYSQL設定讓遠端可以連線
mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'mypassword' WI
TH GRANT OPTION;

複製MYSQL設定檔
cp /usr/local/share/mysql/my-default.cnf /etc/my.cnf

啟動apach、mysql
/usr/local/etc/rc.d/mysql-server start
/usr/local/sbin/apachectl start

寫一個index.php丟進網頁根目錄 /usr/local/www/apache24/data
<? php 
phpinfo();
?>

用瀏覽器有看到PHP資訊就是apache架設成功且可以正常解析PHP
再瀏覽IP/phpmyadmin/網頁,出現登入畫面表示phpmyadmin安裝成功,
可以登入看到MYSQL內建資料庫表示資料庫架設成功。

httpd,80Port mysqld,3306

FreeBSD使用MPD5架設VPN(PPTP協定)

參考參考2參考3參考4

Port位置 /usr/ports/net/mpd5/
複製範例,最終檔名為mpd.conf
cp /usr/local/etc/mpd5/mpd.conf.sample mpd.conf

設置參數/usr/local/etc/mpd5/mpd.conf
startup:
        # configure mpd users
        set user foo bar admin
        set user foo1 bar1
網頁登入,帳號:foo,密碼:bar,可修改

預設協定改為PPTP
default:
        #load dialup
        load pptp_server

找到pptp_server
# Define dynamic IP address pool.
        set ippool add pool1 192.168.2.50 192.168.2.99
此為要發給連進來的使用者的IP範圍

# Specify IP address pool for dynamic assigment.
        set ipcp ranges 192.168.2.1/32 ippool pool1設定mask,只須改ranges後面的IP
        set ipcp dns 168.95.1.1設定DNS
        #set ipcp nbns 192.168.1.4這不知道是啥,沒什麼作用,不註解好像也無所謂

# Configure PPTP
        set pptp self 172.16.0.151外網IP

設定VPN帳號,複製範例
cp /usr/local/etc/mpd5/mpd.secret.sample mpd.secret

編輯,格式為帳號 “密碼” 發給IP(若IP欄空白會自動發給)
vpntest         "a123456"  192.168.2.99

編輯/etc/rc.conf,開機啟動
mpd_enable="YES"

啟動
/usr/local/etc/rc.d/mpd5 start

到此為止已經可以連進VPN了,但無法連外網,
VPN伺服器有兩張網卡的話可以用PF架設NAT,將封包再轉到外網網卡。
若是只有一張網卡,一樣開啟PF,將送進來的封包再轉出去,
連進來的使用者網卡都是ng開頭,只需要改/etc/pf.conf為
if_int="ng*"
就可以再轉出去

使用5005、5006、1723port

FreeBSD架設NAT,使用PF(Packet Filter,封包過濾器)

需有兩張網路卡,對外(WAN),對內(LAN)
目前10.0 RELEASE核心預設就有PF,但還是需重新編譯核心,加入ALTQ,此功能不知是否必須,但若不加入,會一直出現訊息

重新編譯核心
cd /sys/amd64/conf

複製一個核心
cp GENERIC GENERIC_1

編輯GENERIC_1,加入ALTQ
options         ALTQ
options         ALTQ_CBQ        # Class Based Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)

開始編譯
config GENERIC_1
cd ../compile/ GENERIC_1
make depend all install

編輯/etc/rc.conf
ifconfig_em0="inet 172.16.0.151 netmask 255.255.255.0"對外網卡
ifconfig_em1="inet 192.168.2.1 netmask 255.255.255.0"對內網卡
pf_enable="YES"開機啟動PF
gateway_enable="YES"架NAT要開啟此項

編輯/etc/pf.conf
此檔案預設是沒有的,可以新增或cp /usr/share/examples/pf/pf.conf範例檔案
這個檔案也可以訂定各種封包過濾規則
if_ext="em0"對外網卡
if_int="em1"對內網卡
net_lan="192.168.2.1/24"內網區段mask

轉送封包
set skip on lo0
nat on $if_ext from $net_lan -> ($if_ext:0)
no nat on $if_ext from !$net_lan to any

這兩條規則會將試圖從外網連進來的擋掉
block in on $if_ext
pass out

接下來內網電腦就可以指向對內網卡的IP, bsd會將送進來的封包從對外網卡轉出去,外部送進來的轉送到來源端

FreeBSD建置Samba網路分享目錄

參考
參考2
參考3

Port位置 /usr/ports/net/samba36
/usr/local/etc/smb.conf.sample
這個檔案是設定檔範例,複製一份改為smb.conf.
cp /usr/local/etc/smb.conf.sample /usr/local/etc/smb.conf

修改設定檔
Global全域設定
workgroup,工作群組
server string,伺服器名稱
hosts allow = 192.168.1. 192.168.2. 127.
可限制連線IP,第四碼不填代表0~255,最後的127不知是啥
log file,紀錄檔路徑

Share Definitions分享設定,格式為
[public]對外的目錄名稱
   comment = %h Shared Public Directory註解
   path = /usr/home/samba/public在本機的路徑 
   public = yes是否公開
   writeable = yes是否可寫
   read only = no是否唯讀
   valid users = userName限制使用者

建立使用者、群組,samba登入密碼要另外設定
adduser
smbpasswd –a userName

設定開機啟動
/etc/rc.conf
samba_enable="YES"

啟動
/usr/local/etc/rc.d/samba start

使用tcp 445 139port(smbd)、udp 137 138(nmbd)

FreeBSD建置Git Server

參考
參考2
--bare參數參考
無法Push參考

Port位置 /usr/port/devel/git
加入使用者,此為外部連進來的帳密
adduser

在家目錄增加.ssh目錄
mkdir -p /home/git/.ssh

加入SSH密鑰
touch /home/git/.ssh/authorized_keys

修改權限
chmod 0700 /home/git/.ssh
chmod 0600 /home/git/.ssh/authorized_keys

修改啟動參數 /etc/rc.conf
git_daemon_enable="YES"
git_daemon_flags="--syslog --export-all"

若是無法啟動改為
git_daemon_flags="--syslog --export-all --reuseaddr --detach"

啟動daemon
/usr/local/etc/rc.d/git_daemon start

創建專案目錄並初始化倉庫
su git
cd /home/git/
mkdir project.git
cd project.git
git --bare init

git@[gitserver]:/home/git/project.git BSD帳號名稱@伺服器位置,可以是domain:專案位置
無法Push在專案倉庫執行這行
git config --bool core.bare true

占用9418port

SSH可用Root登入

參考
編輯 /etc/ssh/sshd_config
原本
#PermitRootLogin no

改為
PermitRootLogin yes

FreeBSD語系更改為UTF-8

預設為C Shell下只要修改 /etc/csh.cshrc 增加以下敘述即可
setenv LC_CTYPE en_US.ISO8859-1
setenv LC_ALL zh_TW.UTF-8
setenv LANG zh_TW.UTF-8

Port Tree

參考1
參考2

Portsnap Proxy Host
/etc/portsnap.conf

取得最新Port tree
portsnap fetch extract

更新Port tree
portsnap fetch update

常用指令,在一開始時確認完所有Config,安裝後清除暫存
make config-recursive install clean

反安裝
make deinstall clean

2014年7月20日 星期日

讓程式具有系統管理員權限

參考網站
加入一個"應用程式資訊清單",加入後檔名為app.manifest
這段是使用者帳戶控制層級,檔案裡的註解有提示,有三種層級,
一般使用者:asInvoker
管理員:requireAdministrator
最高權限:highestAvailable
<requestedExecutionLevel level="asInvoker" uiAccess="false" />

同步化TcpListener實作,利用網路傳送資料

伺服器端:
using System.Net;
using System.Net.Sockets;

//監聽所有可以達到本機的IP位置;9000port
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 9000);
TcpListener listener = new TcpListener(ipEndPoint);
listener.Start();

//無窮迴圈等待客戶端
while (true)
{
    TcpClient tcpClient = listener.AcceptTcpClient();

    //連上了就開始處理
    if (tcpClient.Connected)
    {
        //資料流指向tcpClient(客戶端)傳來的資料
        NetworkStream networkStream = tcpClient.GetStream();

        //傳進來是位元組
        byte[] receiveByte = new byte[tcpClient.ReceiveBufferSize];

        // ReceiveBufferSize好像是固定數值,真正讀到的長度Read()會回傳
        int resdByteLength = 
            networkStream.Read(receiveByte, 0, tcpClient.ReceiveBufferSize);

        //編碼成看得懂的字串
        string receiveString = 
            Encoding.Default.GetString(receiveByte, 0, resdByteLength);

        //在Connected區塊裡都是連接狀態,可以再發訊息給客戶端,
        //也是利用網路資料流的方式,離開後又回到無窮迴圈等下一次客戶端連線
    }
}
發送端:
using System.Net;
using System.Net.Sockets;

//伺服器端位置
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 9000);
TcpClient tcpClient = new TcpClient();

//連接伺服器
tcpClient.Connect(ipEndPoint);

if(tcpClient.Connected)
{
    //編碼成byte讓網路流傳遞
    string sendString = "這是要發送的訊息";
    byte[] sendByte = Encoding.Default.GetBytes(sendString);
    NetworkStream networkStream = tcpClient.GetStream();
    networkStream.Write(sendByte, 0, sendByte.Length);
}

Windows Management Instrumentation (WMI)

WMI包含的範圍很廣,參閱MSDN
左邊的選單就一堆,幾個比較實用的
using System.Management;

ManagementObjectSearcher searcher =
    new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem");
foreach (ManagementObject wmi in searcher.Get())
{
    //取得電腦名稱
    string computerName = wmi["Name"].ToString();
}

searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS");
foreach (ManagementObject wmi in searcher.Get())
{
    //取得BIOS序號
    string biosSerialNumber = wmi["SerialNumber"].ToString();
}

關閉應用程式幾種方式

//會通知所有的訊息幫浦,在處理訊息之後,關閉所有應用程式視窗。
Application.Exit();

//結束在目前的執行緒上的訊息迴圈,並關閉執行緒上的所有視窗。
Application.ExitThread();

//結束這個處理序,並將指定的結束代碼授予基礎作業系統。
Environment.Exit(Environment.ExitCode);
參考網站
Environment.Exit是最強制結束的