Přístup k datovým spojem pakety vrstvy




Chci vytvořit socket pro přístup IPv4 paketů z datové vrstvy. Od unix programování sítě V1,



```
socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))

```

1) jsem implementaci DHCP klienta, je to správný způsob, jak dělat, že? (znamená, že bez přístupu k datové vrstvy, nemohu přijmout odpověď ze serveru DHCP), nebo je tam jiný jednodušší způsob?
**Také, protože tento socket bude přijímat všechny pakety IPv4 určené pro můj systém, jak bych měl rozlišovat dhcp odpověď paket z dalších paketů?**


2), prosím naznačují mi dobré blog / tuorial pro **síťové programování s přístupem na datové vrstvy** . Ve výše uvedeném seznamu, není podrobný popis.


To je [můj kód](http://codepad.org/WdzbdHZC)
Potřebujete záhlaví link vrstvy příliš? Pokud tomu tak je, je třeba použít `SOCK_RAW`- `SOCK_DGRAM`bude před krmením do aplikace odstranit hlavičku linkové vrstvy.


Můžete určit požadavky DHCP podle zdrojové a cílové porty, protože DHCP generuje provoz na UDP portech 67 a 68.
<p><strong> <a href="http://en.wikipedia.org/wiki/ipconfig">ipconfig</a> </strong> (<strong> i </strong> nternet <strong> p </strong> rotocol <strong> config </strong> uration) v <strong> microsoft windows </strong> je aplikace konzoly, která zobrazuje všechny aktuální konfigurační hodnoty sítě tcp/ip a může upravovat nastavení dhcp a dns dns systému dynamic host configuration protocol.</p><p><strong> <a href="http://en.wikipedia.org/wiki/ifconfig">ifconfig</a> </strong> (zkratka pro <strong> i </strong> nter <strong> f </strong> eso <strong> config </strong> uration) je nástroj pro správu systému v <strong> unixové </strong> operační systémy pro konfiguraci, řízení a dotazování parametrů síťového rozhraní tcp/ip z rozhraní příkazového řádku (cli) nebo ve skriptech pro konfiguraci systému.</p><p><strong> <a href="http://wiki.linuxquestions.org/wiki/dhcpcd">dhcpcd</a> </strong> je klient dhcp. slouží k získání adresy ip a dalších informací ze serveru dhcp, obnovení doby zapůjčení adresy ip a automatické konfiguraci síťového rozhraní. program plní podobnou funkci jako dhclient.</p> Nějak nevím nač potřebuješ síť s 15bit maskou (131070 adres), ale to je tvůj problém. Aby ti vše fungovalo jako jedna velká, plochá síť, nesmíš uvnitř routovat.Požadavek na přidělení IP adresy je L2 broadcast, který L3 prvky (routery) normálně filtrují, aby se požadvky doručily na server v jiné síti, musíš nastavit přeposílání (cisco tomu říká ip-helper, mikrotik neznám). Na DHCP server dotaz dorazí se zdrojovu adresou LAN rozhraní odkud pochází, proto musíš mít na DHCP serveru nastavený pool pro danou síť, jinak server dotaz zahodí. Jestli jsem to dobre pochopil, tak: nastav na TCP/IP WiFiny adresu z rozsahu 192.168.O.X a na stejny rozsah nastav i DHCP. PC nepripojuj do WAN, ale do jednoho z LAN portu. nevim jak vypadaji ve windows takovi ti pruvodci next-next-finish, co se tvari ze umi vsechno a pritom nic ... , nepouzivam je, nicmene obecne staci proste otevrit nastaveni sitoveho adapteru, pridat TCP/IP protokol, dale protokol SMB pro sdileni prostredku v sitich windows a nakonec nastavit ve vlastnostech TCP/ip nejake rozumne adresy napriklad 192.169.0.X a masku na vsech pocitacich napriklad 255.255.255.0 ... to je cele. <p>pro zpracování příspěvku ewanm89 používá teamviewer dírku udp.</p><p>udp je protokol bez státní příslušnosti. to znamená, že pakety jsou vystřeleny na svém cíli bez ověření (na úrovni protokolu), zda byly přijaty nebo dokonce dosáhly cíle. firewally jsou navrženy tak, aby hledaly udp pakety a zaznamenávaly zdroj a cíl, jakož i časové razítko. pokud uvidí příchozí paket, který odpovídá odchozímu paketu, pak paket obvykle povolí, a to i bez zadání specifického pravidla v přístupovém seznamu brány firewall. to lze uzamknout na zařízeních podnikové třídy, ale obecně 90% firewallů tam umožní návratový provoz.</p><p>aby bylo možné připnout díru, má váš stroj (prohlížeč) připojení tcp) zpět k hlavnímu serveru teamviewer. cílový stroj (klient) má také připojení tcp) na hlavní server teamviewer. když stisknete připojení, váš počítač sdělí hlavnímu serveru jeho úmysl. hlavní server vám pak poskytne ip adresu klientského počítače. váš počítač poté začne na klienta střílet pakety udp. klient je signalizován, že má v úmyslu se připojit a je mu přidělena vaše ip. klient také na vás začne střílet udp pakety.</p><p><em>pokud jsou brány firewall "přátelské k p2p"</em>, způsobí to, že brány firewall (vaše i klientská) povolí přenos, a tím "děrují díry" v bráně firewall. konkrétně to vyžaduje, aby brány firewall <em>ne</em> změnily veřejný port odchozího paketu pouze proto, že se změnil jeho cíl; firewall musí znovu použít stejný veřejný port, dokud se nezmění zdroj paketu. pokud se vaše brány firewall nebudou chovat tak přátelsky, nebude to fungovat. mnoho firewallů se však chová takto.</p><p>teamviewer samozřejmě přidává určité zabezpečení provedením kontroly pin/hesla před tím, než hlavní server odešle ip informaci oběma stranám, ale získáte představu.</p> <p>pokud chcete přesměrovat připojení x přes ssh, musíte jej povolit na straně serveru i klienta. (v závislosti na distribuci může být ve výchozím nastavení povoleno nebo zakázáno.) na straně serveru se ujistěte, že máte <code>x11forwarding yes</code> v <a href="http://www.freebsd.org/cgi/man.cgi?query=sshd\_config&amp;sektion=5"><code>/etc/sshd\_config</code></a> (nebo <code>/etc/ssh/sshd\_config</code> nebo kdekoli je konfigurační soubor). na straně klienta předejte možnost <code>-x</code> <a href="http://www.freebsd.org/cgi/man.cgi?query=ssh&amp;sektion=1"><code>ssh</code> příkaz</a> , nebo vložte do svého <a href="http://www.freebsd.org/cgi/man.cgi?query=ssh\_config&amp;sektion=5"><code>forwardx11</code> <code>~/.ssh/config</code></a> .</p><p>pokud spustíte <code>ssh -x localhost</code>, měli byste vidět, že <code>$display</code> je (pravděpodobně) <code>localhost:10.0</code>. kontrast s <code>:0.0</code>, což je hodnota, když nejste připojeni přes ssh. (část <code>.0</code> může být vynechána; je to číslo obrazovky, ale více obrazovek se používá zřídka.) existují dvě formy x displejů, s nimiž se pravděpodobně setkáte:</p><ul> <li>místní displeje, s ničím před <code>:</code>.</li> <li>zobrazí se tcp s názvem hostitele před <code>:</code>.</li> </ul><p>s <code>ssh -x localhost</code> můžete přistupovat k x serveru přes obě displeje, ale aplikace budou používat jinou metodu: <code>:number</code> přistupuje k serveru prostřednictvím lokálních soketů a sdílené paměti, zatímco <code>hostname:number</code> přistupuje k serveru přes tcp, což je pomalejší a deaktivuje některá rozšíření.</p><p>nezapomeňte, že pro přístup k serveru x potřebujete formu autorizace nazvanou cookie a obvykle uloženou za scénami v souboru <code>~/.xauthority</code>. pokud používáte ssh pro přístup k jinému uživatelskému účtu nebo pokud vaše distribuce umístí soubory cookie do jiného souboru, možná zjistíte, že <code>display=:0</code> nefunguje v relaci ssh (ale <code>ssh -x</code>, pokud je to povoleno na serveru; při provádění <code>ssh -x</code> nemusíte nikdy mluvit s <code>xauthority</code>. pokud se jedná o problém, musíte <a href="https://unix.stackexchange.com/questions/10121/ssh-display-variable/10126#10126">nastavit proměnnou prostředí <code>xauthority</code></a> nebo <a href="https://unix.stackexchange.com/questions/1596/can-i-launch-a-graphical-program-on-another-users-desktop-as-root/1600#1600">získat soubory cookie jiného uživatele</a> .</p><p>chcete-li odpovědět na aktuální otázku:</p><ul> <li> <p>místní displeje odpovídají soketu v <code>/tmp/.x11-unix</code>.</p> <pre><code>(cd /tmp/.x11-unix &amp;&amp; for x in x*; do echo ":${x#x}"; done) </code></pre></li> <li> <p>vzdálené displeje odpovídají otevřeným tcp portům nad 6000; přístup k zobrazovacímu číslu n na počítači m se provádí připojením k portu tcp 6000 + n na počítači m. ze samotného stroje m:</p> <pre><code>netstat -lnt | awk ' sub(/.*:/,"",$4) &amp;&amp; $4 &gt;= 6000 &amp;&amp; $4 &lt; 6100 { print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000) }' </code></pre> <p>(zbytek této odrážky je pouze v akademickém zájmu.)</p> <p>z jiného počítače můžete pomocí <code>nmap -p 6000-6099 host\_name</code> zkoušet otevřené tcp porty v obvyklém rozsahu. dnes je vzácné, že x servery poslouchají na soketu tcp, zejména mimo rozhraní zpětného smyčky.</p> <p>přesně řečeno, jiná aplikace by mohla používat port v rozsahu obvykle používaném x servery. můžete zjistit, zda server x poslouchá kontrolou toho, který program má port otevřený.</p> <pre><code>lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}' </code></pre> <p>pokud se ukáže něco dvojznačného, ​​jako je <code>sshd</code>, neexistuje žádný způsob, jak zjistit, zda se jedná o server x nebo náhoda.</p> </li> </ul> Cez VPN-ku by to neslo?  
VPN klienta nechas po spusteni PC sa pripojit na server s verejnou IP a synchro software mozes pouzit podle libosti. Alebo si to hodis do naplanovanych uloh. <p>způsob, jak přejít přes brány firewall: dotaz přes typický port (80):<br> <code>sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7f0ceb10</code><br> dalším problémem může být síťový proxy server. pokud se potřebujete připojit k internetu přes proxy, exportovat nastavení proxy serveru do bash konfigurace - přidejte řádek s vaší proxy adresou (av případě potřeby: uživatelské jméno/heslo - bez toho, aby to bylo jen <code>http://proxyserver:port</code>): <br> <code>export http\_proxy=http://username:password@proxyserver:port/</code><br> na konci souboru <code>/etc/bash.bashrc</code><br></p> <p>sun poskytuje rozhraní api nazvané codemodel pro generování zdrojových souborů jazyka java pomocí rozhraní api. není to nejjednodušší získat informace, ale je to tam a funguje to velmi dobře.</p><p>nejjednodušší způsob, jak toho dosáhnout, je součástí jaxb 2 ri - generátor schématu xjc-to-java používá codemodel pro generování svého zdroje java a je to součást sklenic xjc. můžete jej použít pouze pro codemodel.</p><p>chyť to z <a href="http://codemodel.java.net/">http://codemodel.java.net/</a> </p> <p>můžete použít některou z těchto dvou jednoplášťových linek. oba přinášejí přesně stejný výkon na mém stroji a jsou přesnější než všechna dosud navrhovaná řešení (6. července 2014) v této otázce.</p><p><strong> pomocí <code>apt-mark</code>: </strong></p><pre><code>comm -23 &lt;(apt-mark showmanual | sort -u) &lt;(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^package: //p' | sort -u) </code></pre><p><strong> pomocí <code>aptitude</code>: </strong></p><pre><code>comm -23 &lt;(aptitude search '~i !~m' -f '%p' | sed "s/ *$//" | sort -u) &lt;(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^package: //p' | sort -u) </code></pre><p>jen velmi málo balíčků stále propadá trhlinami, ačkoliv mám podezření, že je uživatel skutečně nainstaloval <em> jsou</em>, a to buď hned po instalaci prostřednictvím nastavení lokalizace jazyka, nebo např. prostřednictvím instalátoru kodeků totem. také se zdá, že se hromadí i verze linuxových záhlaví, i když jsem nainstaloval pouze metapackage, který není specifický pro verzi. příklady:</p><pre><code>libreoffice-help-en-gb openoffice.org-hyphenation gstreamer0.10-fluendo-mp3 linux-headers-3.13.0-29 </code></pre><p><strong> jak to funguje: </strong></p><ol> <li>získejte seznam ručně nainstalovaných balíčků. pro aptitude další <code>sed</code> odstraní zbývající mezeru na konci řádku.</li> <li>seznam nainstalovaných balíčků získáte hned po nové instalaci.</li> <li>porovnejte soubory, vydejte pouze řádky v souboru 1, které nejsou v souboru 2.</li> </ol><p><strong> ostatní možnosti také nefungují: </strong></p><ul> <li>za použití <code>ubuntu-14.04-desktop-amd64.manifest</code> soubor ( <a href="http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest">zde</a> pro ubuntu 14.04) místo <code>/var/log/installer/initial-status.gz</code>. další balíčky jsou zobrazeny jako ručně nainstalované, i když nejsou.</li> <li>použitím <code>apt-mark showauto</code> namísto <code>/var/log/installer/initial-status.gz</code>. <code>apt-mark</code> například nezahrnuje balíček xserver-xorg, zatímco druhý soubor ano.</li> </ul><p>jako reference jsem použil různé další příspěvky stackexchange, žádné však nefungují a výše uvedené řešení:</p><ul> <li> <a href="https://unix.stackexchange.com/a/3624/49168">aptitude + manifest</a> </li> <li> <a href="https://unix.stackexchange.com/a/80520/49168">initial-status.gz + apt-mark showauto</a> </li> </ul><p>oba obsahují více balíčků než výše uvedené řešení.</p><p><strong> úprava: co dělat, pokud jste upgradovali z předchozí verze: </strong></p><p>pokud jste upgradovali ubuntu z jednoho vydání na další, budete pravděpodobně muset tento proces upravit. v takovém případě bych kromě souboru initial-status.gz z aktuální verze zkontroloval soubor manifestu novější verze (viz výše). můžete to snadno udělat pouhým přidáním dalšího srovnání. použití pouze souboru manifestu nebude fungovat, protože soubor manifestu bohužel neobsahuje vše, co soubor initial\_status.gz obsahuje (zaškrtl jsem).</p>